Skip to main content
Glama
ProofHoldings

@proof-holdings/mcp-server

Official

@proof-holdings/mcp-server

MCP (Model Context Protocol) server for the proof.holdings API. Exposes 167 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:

{ "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. GET /api/v1/mcp/connect always serves the current instructions.

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

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

Or run directly with npx (no install needed):

npx @proof-holdings/mcp-server

Related MCP server: vtimestamp-mcp

Configuration

Variable

Required

Default

Description

PROOF_API_KEY

No

—

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_URL

No

https://api.proof.holdings

API 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

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.

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:

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

Command

What it does

login

Signs in, confirms, creates and saves a key. --test creates a test key (pk_test_); --scopes a,b limits it (default: full access); --email you@example.com logs in by email.

status

Shows which key the server would start with and where it comes from. No network call.

logout

Removes 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:

{
  "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:

Client

Config 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 Code

Run 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 (167 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)

Tool

Description

create_verification

Create a verification challenge

get_verification

Get verification status

submit_verification_code

Submit a verification code

trigger_verification

Trigger a verification check

wait_for_verification

Poll until it completes

create_multi_channel_verification

One phone, up to three channels, first completion wins

create_verification_request

Create a multi-asset request

get_request_by_reference

Look a request up by reference id

Domains & DNS (23 tools)

Tool

Description

add_domain

Add a domain to verify

verify_domain

Check the challenge record and mint the proof

connect_cloudflare

Connect Cloudflare so records are written for you

verify_domain_with_credentials

Prove control using stored credentials

setup_domain_email

Set up sending from the domain

Account, settings & billing (37 tools)

Tool

Description

get_platform_summary

One-call snapshot of the account

get_usage

Quota and usage for the period

search

Search across the account

create_account

Bootstrap a new account (no key needed)

create_api_key

Create a scoped API key

list_assets

List verified assets and their proof handles

Tool

Description

create_hitl

Create a human-approval configuration

create_confirmation

Send an approval request to a person

wait_for_confirmation

Poll until a person approves or denies

create_authorization

Ask a person to consent to being contacted

revoke_authorization

Withdraw a consent

Circles & Proof of Me (15 tools)

Tool

Description

create_circle

Create a circle of trusted contacts

add_circle_member

Add a contact

invite_circle_member

Send a single-use enrollment link

create_identity_challenge

Run a cross-channel identity check

Public profiles (12 tools)

Tool

Description

create_profile

Create a public profile

claim_username

Claim a public username

update_public_proofs

Choose which proofs a profile shows

Templates & webhooks (11 tools)

Tool

Description

list_templates

List a project's message templates

render_template

Render a template with variables

list_webhook_deliveries

List webhook deliveries

retry_webhook_delivery

Retry a failed delivery

Delegations & proofs (10 tools)

Tool

Description

create_delegation

Authorize an artifact from a domain you have proven

revoke_delegation

Revoke a delegation

verify_delegation

Check whether an artifact is authorized by the domain it claims

validate_proof

Verify a signed proof token (no key needed)

get_proof_status

Read a proof's status by its public handle

list_revoked_proofs

Read the revocation list (no key needed)

Sign-in & sessions (9 tools)

Tool

Description

start_login

Begin a sign-in (no key needed)

wait_for_login

Poll until sign-in completes

get_current_user

Who the current session belongs to

render_auth_link

Render 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:

{
  "_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 for the listed scopes. 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.

When the card is published through the official MCP registry, the same entry is nested under _meta["io.modelcontextprotocol.registry/publisher-provided"] — readers should check both locations.

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:

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> --scope proof-verification

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.

{
  "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.

{
  "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, optional required_scopes) 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:

Outcome

Meaning

confirmed_valid

The delegation verified — same meaning as verify_delegation's verified: true.

confirmed_invalid

A genuine negative verdict: revoked, suspended, expired, a mismatched principal or delegate, an ungranted scope, or a malformed/untrusted/badly-signed token.

no_claim_found

The artifact publishes no delegation at all. An absence, never an accusation.

unconfirmed

We 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:

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.

License

MIT

Available Tools

167 tools
add_circle_memberAInspect

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. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesCircle ID to add the member to
nameYesDisplay name of the member
whatsapp_phoneNoE.164 WhatsApp phone with a leading + (optional, declared)

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only cover readOnlyHint=false and destructiveHint=false; the description adds real behavioural context beyond that: the member is created in a 'pending' state, the Telegram chat id is bound later when the deep link is tapped, and the tool is gated behind an authenticated Proof account. It does not disclose error behaviour, idempotency, or what the call returns, so not a full 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short, front-loaded paragraphs each doing distinct work: what the tool does, how it sequences with the sibling, and the auth prerequisite. No filler sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutating tool with annotations, full schema coverage, and no output schema, the description supplies the state (pending), the follow-up call, and the auth gate. It stops short of describing what is returned or what happens on failure, which is the only remaining gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so id, name, and whatsapp_phone are already fully documented including the E.164 pattern and optionality. The description only restates 'by name' and 'optional pre-declared WhatsApp phone', adding no syntax or format meaning beyond the schema — baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Add a pending member to a Circle') and immediately distinguishes itself from the neighbouring invite_circle_member by clarifying that this tool only registers the member while the enrollment link is minted elsewhere. An agent can select it without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit sequencing rule ('after adding a member, call invite_circle_member') plus a hard precondition ('needs a Proof account, set PROOF_API_KEY and restart') and an explicit exclusion ('start_login does NOT open this tool'). This is exactly the when/when-not/alternative guidance the dimension asks for.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

add_circle_member_channelAInspect

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. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesCircle ID
channelYesChannel type (telegram or whatsapp)
member_idYesMember ID to add the channel to
identifierYesTelegram chat id, or E.164 WhatsApp phone with a leading +

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only mark it as a non-read-only, non-destructive mutation. The description goes further by disclosing the 409 duplicate-channel-type response, server-side per-channel identifier validation, and the API-key prerequisite — concrete behavior an agent cannot get from the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action and error semantics, then the identifier formats, then access requirements. Two tight paragraphs with no filler sentences, though the ACCESS boilerplate is somewhat bulky relative to the payload.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description covers the failure mode (409), identifier formats, and auth setup, which is most of what an agent needs. It stops short of describing the success response or whether re-adding after removal behaves differently.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the four parameters are already documented. The description repeats the identifier format and adds that validation is server-side per channel, but contributes no new semantics for id, member_id, or channel. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (declare/add a channel for a Circle member) and names the artifact it operates on. It is recognizable against the sibling channel tools (list_circle_member_channels, remove_circle_member_channel) even though it never names them explicitly for contrast.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The ACCESS block gives a real prerequisite and one negative routing hint ('start_login does NOT open this tool'), but there is no guidance on when to choose this tool over add_circle_member, invite_circle_member, or the channel-list tools, nor what preconditions the member must satisfy.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

add_domainAInspect

Add a new domain to verify ownership. Optionally specify email sending intent and verification method.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainYesDomain name to add (e.g. example.com)
for_email_sendingNoWhether this domain is for email sending
verification_methodNoPreferred verification method

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=false and destructiveHint=false. The description adds genuinely useful behavioral context beyond that: the operation requires an authenticated Proof account, must have PROOF_API_KEY set (with a server restart), and can be reached via a start_login session. It does not describe side effects or rate limits, so it is not a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in a single sentence, followed by a clearly separated ACCESS paragraph. The auth note is somewhat long but earns its place by preventing failed calls; no filler sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers purpose, parameters, and the auth prerequisite, which is solid for a mutation tool. With no output schema, the description leaves unclear what a successful call returns or whether ownership is verified immediately, a meaningful gap for an add/verify flow.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents domain, for_email_sending, and verification_method. The description echoes the two optional params ('email sending intent and verification method') but adds no syntax or format detail beyond the schema, making the baseline 3 appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Add a new domain') and adds the goal ('to verify ownership'), which lets an agent understand the intent. However, it does not distinguish itself from the many sibling domain tools (verify_domain, start_domain_verification, delete_domain), so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives a prerequisite/route ('needs a Proof account' and use start_login if unauthenticated), which is useful invocation context. It does not, however, explain when to choose add_domain over the other domain-verification siblings, so usage guidance remains implied rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

add_verification_providerA
Destructive
Inspect

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. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesDomain ID
providerYesDNS provider identifier
credentialsYesProvider-specific credential key-value pairs

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare destructiveHint=true and readOnlyHint=false. The description adds a critical behavioral warning the annotations don't: credentials will be visible in AI conversation context, which is a real security disclosure useful to the agent. It also explains the auth flow. Missing detail on what the mutation does to existing providers, but strong overall.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and scope, followed by the security note and access info. Slightly more verbose on auth mechanics than necessary but every sentence carries weight.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no output schema, it covers access, precondition, and the credential-visibility caveat. Doesn't describe return values or effect on existing providers, but adequately complete for the agent to call it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema documents id, provider, and credentials. The description adds no syntax or format detail beyond what the schema provides. Baseline 3 is correct.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Add), resource (DNS provider for verification), and scope (to an already-verified domain). This distinguishes it from siblings like connect_dns_provider and verify_domain_with_credentials.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Specifies the precondition (an already-verified domain) and access requirements, which tells the agent when this applies. However, it doesn't explicitly name which sibling to use instead when the domain isn't yet verified.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cancel_user_requestA
Destructive
Inspect

Cancel a pending verification request. Only the creator can cancel.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesVerification request ID to cancel

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is known. The description adds real behavioral context beyond that: a creator-only authorization constraint and the exact auth flow (PROOF_API_KEY or start_login session) needed before the call succeeds. It stops short of describing post-cancel state (e.g., whether proofs are revoked).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first sentence, with the permission constraint immediately after. The ACCESS block is multi-line boilerplate but is genuinely actionable remediation for an auth failure rather than filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter destructive tool with no output schema, the definition covers purpose, permission scope, and authentication setup adequately. The main missing piece is disambiguation from cancel_verification_request and the resulting state after cancellation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter, and schema coverage is 100% with an explicit description ("Verification request ID to cancel"). The description adds no format or sourcing detail beyond the schema, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clear verb+resource ("Cancel a pending verification request") and it states the operation is limited to pending requests. However, it never distinguishes itself from the very similar sibling cancel_verification_request, and it uses "verification request" phrasing for a tool named cancel_user_request, which risks confusion with that sibling's family.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an important precondition ("Only the creator can cancel") and explains the account/auth prerequisite for calling it. It does not say when to prefer this over cancel_verification_request or other request tools, so usage is implied rather than fully guided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cancel_verification_requestA
Destructive
Inspect

Cancel a pending verification request. Only pending requests can be cancelled.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesVerification request ID

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true and readOnlyHint=false, so the safety profile is covered. The description adds real operational context beyond that: the state precondition (pending only) and the account/auth prerequisite (Proof account plus PROOF_API_KEY with a server restart). It does not describe what happens to state after cancellation, but the key blockers to a successful call are disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences leading with the action and precondition, followed by a clearly separated ACCESS block. Nothing is redundant, though the access block's phrasing is slightly informal for a tool definition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter mutation with destructiveness already declared in annotations and no output schema, the description covers the essential prerequisites and state constraint. An agent knows what it needs before calling and what condition the target must satisfy.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is a single parameter with 100% schema description coverage ('Verification request ID'), so the schema already carries the meaning. The description adds no format, ID source, or lookup guidance, making this a baseline case rather than a value-add.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Cancel a pending verification request') with an immediate scope qualifier. It is clearly distinguishable from most siblings, though it never contrasts itself with the near-neighbour cancel_user_request.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit applicability rule ('Only pending requests can be cancelled') and a useful negative routing hint ('start_login does NOT open this tool'), which prevents a common dead end. It stops short of naming cancel_user_request or list_verification_requests as the ways to find cancellable IDs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_domain_credentialsA
Read-only
Inspect

Check if stored DNS credentials have access to a domain. Use before triggering verification to confirm the credentials work.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesDomain ID to check credentials for

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=true, so the description carries most of the load and adds genuinely useful context: it is a non-mutating credential probe and it requires a Proof account, with two concrete paths to authenticate (PROOF_API_KEY or start_login). It does not describe what a failed check looks like or any rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose in the first sentence, followed by usage and then access notes. All three sentences carry distinct information; the ACCESS block could be tightened but is not wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter, no-output-schema read tool, the description covers purpose, sequencing, and the authentication prerequisite. The main gap is that it does not say what the check returns or how to interpret a negative result, but that is a minor omission for a read-only probe.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% for the single 'id' parameter ('Domain ID to check credentials for'), so the schema already does the work. The description adds no format or syntax detail beyond it, making the baseline 3 appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb+resource: checking whether stored DNS credentials have access to a domain. It distinguishes itself from the verification siblings by framing itself as a pre-flight credential test, though it does not explicitly name the sibling it differs from (e.g. verify_domain_with_credentials).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use it: 'Use before triggering verification to confirm the credentials work.' That gives a clear precondition and ordering relative to the verification flow. It does not spell out when NOT to use it, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_domain_email_statusB
Read-only
Inspect

Check the email sending setup status for a domain, including DNS record configuration progress.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesDomain ID

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description is consistent with readOnlyHint=true and adds useful context beyond the annotation: it requires a Proof account and either PROOF_API_KEY or a session opened via start_login. However, with no output schema it does not describe what the returned status looks like (e.g., verification states or DNS record fields), leaving the read's result shape undisclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences: the first front-loads the purpose, the second handles the access prerequisite. No wasted text, though the ACCESS clause is somewhat verbose for what it conveys.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter read-only tool whose safety profile is already covered by annotations, the description supplies purpose and the non-obvious auth prerequisite. Only the return-value shape is omitted, which is a minor gap given the tool is a status read.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% with a single parameter ('id' documented as 'Domain ID'), so the schema already carries parameter meaning. The description adds no extra syntax, format, or ID-sourcing detail, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (check) and resource (email sending setup status for a domain), plus the scope of what it inspects (DNS record configuration progress). It is clear on its own, but it does not explicitly differentiate itself from close siblings like check_domain_verification, setup_domain_email, or get_add_email_status, which an agent must disambiguate by name alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description never says when to call this versus setup_domain_email, start_domain_email_verification, confirm_domain_email_code, or check_domain_verification, nor what prerequisite state should precede it. Only the auth prerequisite (PROOF_API_KEY or start_login) is stated, which is access guidance rather than when-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_domain_verificationAInspect

Check the status of a pending domain verification. Triggers a DNS/HTTP check and returns the updated status.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesDomain verification ID

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only mark readOnlyHint=false and destructiveHint=false. The description earns credit by disclosing that this is not a passive read – it 'triggers a DNS/HTTP check' – and by stating the account/API-key prerequisite plus the non-obvious note that start_login does NOT grant access. Return content is only gestured at.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose, then side effect, then access requirement – front-loaded and tight, with no filler sentences. Both sentences earn their place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-param check tool with no output schema, the definition covers purpose, side effect, and the auth blocker. It could say more about what status values come back or whether repeated calls are rate-limited, but nothing critical for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Single parameter with 100% schema coverage ('Domain verification ID'), so the schema already carries full meaning. The description adds nothing about the id beyond the schema, which is the baseline-3 case for one param.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb+resource: 'Check the status of a pending domain verification.' The scope qualifier 'pending' and the named side effect distinguish it from start_domain_verification and wait_for_verification, though neither sibling is named explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied ('pending' verification, i.e. after starting one) but there is no explicit when-to-use or when-not-to-use guidance, and no routing to alternatives like wait_for_verification or get_domain. The ACCESS block is auth setup, not usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_user_domain_verificationAInspect

Trigger a check on the domain verification challenge. Call after placing DNS record or HTTP file.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault
session_idYesDomain verification session ID

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With annotations only declaring that this is not read-only and not destructive, the description adds real operational context: it requires a Proof account, an API key env var, or an interactive login via start_login before it will work. That auth prerequisite is the kind of thing annotations cannot express. It does not describe idempotency or rate limits, so it is not a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, action and trigger front-loaded, followed by the access note. No filler, though the access block is slightly dense and could be trimmed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter, no-output-schema tool, the description covers the action, the trigger condition, and the authentication path needed to invoke it. It omits what the check's result signifies (verified vs. pending), which would be the one remaining nicety.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is a single parameter with 100% schema description coverage ('session_id' documented as the domain verification session ID), so the schema already does the work. The description adds nothing about the parameter's origin or format beyond the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Trigger a check on the domain verification challenge') and clarifies the trigger point (after placing a DNS record or HTTP file). It reads clearly against most siblings, though it does not explicitly distinguish itself from the near-identically named check_domain_verification or get_user_domain_verification_status.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit precondition: 'Call after placing DNS record or HTTP file.' That is a clear when-to-use signal. It stops short of naming an alternative (e.g., wait_for_verification or get_user_domain_verification_status) or stating when not to call it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

claim_usernameAInspect

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. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault
usernameYesUsername to claim (3-30 chars, alphanumeric and underscores)

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false and destructiveHint=false, so the safety profile is partly covered. The description adds meaningful context: the username must be unique, its format constraints, and the auth requirement. It stops short of saying whether the username can later be changed or what failure looks like on collision.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight paragraphs, front-loaded with the action, then constraints, then access requirements. No filler, though the constraint sentence slightly duplicates the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter mutation with no output schema and minimal annotations, the description covers what it does, its constraint, and the auth precondition. It omits post-success behavior (return value, mutability of the username), a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the single parameter is already fully documented with pattern and length bounds. The description restates the same 3-30 / alphanumeric-underscore rule, adding no meaning beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (claim) and resource (username) with scope (authenticated user's public profile), plus uniqueness. Clear enough that an agent distinguishes it from profile/email/phone mutation siblings at a glance.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The ACCESS block gives clear precondition context: a Proof account is required and the agent should either set PROOF_API_KEY or sign in via start_login before calling. It doesn't name exclusions, but there is no direct alternative tool, so routing guidance is largely moot.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

confirm_domain_email_codeAInspect

Confirm domain email verification by submitting the code sent to the corporate email address.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesDomain ID
codeYesVerification code from the email

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare a non-read-only but non-destructive operation, and the description goes beyond that by disclosing the access requirements: a Proof account, PROOF_API_KEY, or an authenticated session via start_login. It does not say what a failed or already-consumed code returns, but for a write tool with annotation coverage this is solid added context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first sentence and the auth/session note is clearly separated as an ACCESS block. The operational aside about restarting the server is slightly chatty but genuinely useful rather than filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter write tool with a fully documented schema and no output schema, the definition covers purpose, prerequisites, and authentication path. It omits error/failure behaviour and sibling routing, which are the only meaningful gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% (id = Domain ID, code = Verification code with a 1-10 length constraint), so the schema already carries parameter meaning. The description only reinforces that the code comes from the corporate email; it adds no format or coupling detail beyond that, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Confirm) and resource (domain email verification) plus the mechanism (submitting the emailed code), which separates it from start_domain_email_verification, check_domain_email_status, and resend_domain_email in the sibling list. It does not name any sibling explicitly, so an agent must infer the ordering from the verb rather than being told.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the prerequisite (a code must already have been sent to the corporate email) and gives setup guidance for auth, but it never states when to call this versus the neighbouring domain-email tools or what to do if the code has expired. Usage is inferable but not spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

connect_cloudflareA
Destructive
Inspect

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. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesDomain ID
api_tokenYesCloudflare API token with DNS edit permissions

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false and destructiveHint=true, so the mutation profile is known. The description adds genuinely useful context beyond that: the API token will be exposed in the AI conversation, and authentication prerequisites are spelled out. It does not describe reversibility or what 'connecting' changes on the domain, keeping it short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action and purpose, followed by a security warning and the access requirement. Every sentence carries weight, though the ACCESS paragraph is somewhat long for what it conveys.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given a 2-param tool with full schema coverage and annotations, the description covers purpose, the security implication of passing a token, and the auth prerequisite. No output schema exists, so no return-value explanation is required; the main omission is what changes on the domain after connecting.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both parameters (id as Domain ID, api_token as a DNS-edit token) are already documented in the schema. The description adds no syntax or format detail beyond that, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (connect), resource (Cloudflare API token), and target (a domain) plus the outcome (automated DNS record management). The provider name inherently distinguishes it from siblings like connect_godaddy and connect_dns_provider, though it never explicitly contrasts them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The ACCESS block explains prerequisites (Proof account, PROOF_API_KEY, or start_login) which implies when the tool is callable, but it never states when to choose this tool over connect_dns_provider or connect_godaddy. Usage context is present but alternatives are not addressed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

connect_dns_providerA
Destructive
Inspect

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. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesDomain ID
providerYesDNS provider identifier
credentialsYesProvider-specific credential key-value pairs

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false, and the description adds genuinely new context: credentials will be exposed in conversation context, plus the auth/session prerequisite. It stops short of saying what gets persisted or how to reverse the connection, but the security warning is real value beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in one sentence, the credential-exposure warning follows immediately, and the access block is clearly separated. Slightly more prose than strictly necessary but nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, credential-bearing mutation with no output schema, the description covers the operation, the security caveat, and the auth prerequisite. It could say more about what state is created or whether the connection is reversible, but an agent has enough to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so id, provider, and credentials are already documented. The description only restates that credentials are provider-specific key-value pairs, adding no format, naming, or validation detail beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Connect a ... DNS provider to a domain') and the word 'generic' distinguishes it from the provider-specific siblings connect_cloudflare and connect_godaddy. An agent can identify the operation and its scope without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The ACCESS block gives concrete prerequisite handling (set PROOF_API_KEY, or use start_login then retry), which is useful. However it never says when to choose this tool over the specific-provider siblings like connect_cloudflare/connect_godaddy, so alternative selection is only implied by the word 'generic'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

connect_godaddyA
Destructive
Inspect

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. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesDomain ID
api_keyYesGoDaddy API key
api_secretYesGoDaddy API secret

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true and readOnlyHint=false, so the mutation profile is covered. The description adds non-obvious value beyond that: it warns that the API key and secret will be visible in the AI conversation context, a real security disclosure, and states the account/session prerequisite. It does not say whether existing credentials are replaced, but the extra context is substantive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, then the credential-visibility note, then access steps. Efficient and free of padding, though the ACCESS block reads slightly like procedural boilerplate and could be tighter.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive credential-connecting tool with no output schema, the definition covers purpose, security implications, and access prerequisites. It leaves some questions unanswered (what happens to prior credentials, whether the connection is validated), but the essentials needed to invoke it are present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% with all three parameters (id, api_key, api_secret) documented and required. The description adds no format or syntax detail beyond the schema, so the baseline 3 for high coverage applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Connect), resource (GoDaddy API credentials), target (a domain), and the benefit (automated DNS record management) in one sentence. An agent can distinguish this from connect_cloudflare and connect_dns_provider purely from the provider name in the description.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides access prerequisites (needs a Proof account; set PROOF_API_KEY or use start_login then re-call), which is useful context for invocation. However, it never explains when to choose this tool over sibling DNS-credential tools like connect_cloudflare, connect_dns_provider, or create_dns_credential, so selection guidance is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_accountAInspect

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. (4) On verified, JWT + refresh cookies are set; proceed with whatever follow-up the agent was asked to do.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailNoEmail address. Required for email channel.
channelYesAuthentication channel the user will verify through
phone_numberNoE.164 phone number. Required for SMS channel (determines DID routing).

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=false and destructiveHint=false, but the description adds substantial context: public/no-API-key access, a deliberately uniform response that avoids a user-enumeration oracle, email channel sending nothing with email_sent=false/send_required=true, and JWT+refresh cookies being set on verified. This is far beyond what the annotations convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose, response shape and the numbered agent workflow are front-loaded and well structured, and most sentences carry operational value. It is long and dense for a single tool, but the length is largely justified by the multi-step orchestration it must document.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, yet the description enumerates return fields (session id, channel instructions, deep_link, qr_code, qr_text, email_sent, send_required, sms_message) and explains the JWT/cookie outcome on verification. Combined with the full usage flow, an agent has everything needed to call and follow up correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents channel, email and phone_number, giving a baseline of 3. The description adds real meaning tied to the channel parameter — deep_link is populated only for telegram/whatsapp, empty for sms, and phone routing behavior — which helps the agent choose and interpret inputs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb+resource ('Create an account-bootstrap session for agent-driven onboarding') and immediately scopes it against siblings by naming send_account_email, render_auth_link and wait_for_account_creation as the follow-on calls. An agent can tell exactly what this does versus start_login, create_session or create_identity_challenge without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides an explicit numbered when-to-use workflow, including channel-specific routing (email → send_account_email, telegram/whatsapp → render_auth_link, sms → show sms_message), plus 'when-not' warnings (do not hand qr_text to a link renderer, do not invent an SMS number, render_auth_link will reject empty deep_link). Nothing about the decision path is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_api_keyAInspect

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 (project) via profile_id — outbound messages sent with the key are then branded as that project.

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. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoHuman-readable key name
scopesNoPermission scopes for the key
profile_idNoBind the new key to a sub-account (PublicProfile) project you own (24-hex id). Immutable after creation; omit for an unbound account-wide key.
environmentNoKey environment (default: production)

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations (readOnlyHint=false, destructiveHint=false) by disclosing that the secret is returned ONLY once, that it will be visible in the AI conversation context, that the operation requires an elevated 2FA session, and how to recover from a 403. This is exactly the behavioral context an agent needs for a credential-minting write operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the highest-risk fact (secret returned only in this response, visible in context) before the procedural 2FA steps and the access note. Every section is distinct and earns its place given the operation's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a credential-creation tool with no output schema, the description supplies the critical return-value warning, the full prerequisite flow, and the authentication context. Nothing an agent needs to invoke this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so name/scopes/environment are already documented, establishing a baseline of 3. The description adds real semantic value for profile_id by explaining the branding effect ('outbound messages sent with the key are then branded as that project'), which the schema's 'sub-account project' phrasing only hints at.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ('Create a new API key') and the description clearly differentiates this from siblings like list_api_keys, revoke_api_key, and regenerate_api_key. An agent can identify exactly what this tool does without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides an explicit, numbered prerequisite flow (start_2fa with action_type 'api_key_create' → wait for user → poll get_2fa_status → call this tool) plus a documented failure path (403 means session expired, restart). It also names the authentication alternatives (PROOF_API_KEY vs start_login), leaving nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_authorizationAInspect

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. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
bsuidNoWhatsApp Business-Scoped User ID (alternative to phone for WhatsApp channel)
phoneYesTarget phone number in E.164 format (e.g., +15551234567)
scopeNoAuthorization scope (default: confirmations)
channelYesChannel for sending confirmations
hitl_idYesHITL configuration ID to link this authorization to
recipientYesChannel-specific recipient identifier (chat_id for Telegram, phone/BSUID for WhatsApp)
expires_inNoExpiry in seconds (max 90 days, default 90 days)
business_nameYesBusiness name displayed to user during authorization
business_profile_idNoPublic profile ID for branding

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only cover the safety profile (readOnlyHint=false, destructiveHint=false). The description adds genuine behavioral context beyond that: a human-approval gate before confirmations work, plus an account/API-key prerequisite. It does not describe rate limits or the returned artifact, keeping it short of 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight paragraphs, purpose front-loaded, with the access prerequisite separated out. Every sentence carries weight; nothing is redundant, though the framing is slightly verbose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 9-param, 5-required create tool with no output schema, the description covers purpose, the human-approval workflow, and the account prerequisite. It omits what the creator receives back (e.g., an authorization identifier) and how to proceed afterward, which is the only notable gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all 9 parameters (including channel/scope enums and the bsuid alternative to phone) are documented in the schema itself. The description adds no field-level syntax or format detail, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Create a new authorization request') and explains the resource's role: granting permission to send confirmations via a channel. This meaningfully distinguishes it from siblings like create_confirmation and request_hitl_authorization, though it never names those siblings explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives the ordering constraint (user must approve before confirmations can be sent) and a clear ACCESS prerequisite (Proof account, PROOF_API_KEY, restart). The exclusion 'start_login does NOT open this tool' usefully prevents a wrong path, but no explicit alternative tool is named for edge cases.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_chat_id_discoveryAInspect

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. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With annotations only declaring readOnlyHint=false/destructiveHint=false, the description carries real extra weight: it enumerates the return payload, states an account/API-key prerequisite and that start_login does not open this tool, and warns that users never see folded tool results. That is substantial behavioral disclosure beyond the annotations, and nothing contradicts them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and return shape, then workflow instructions, then a prerequisite note. It is on the long side (~200 words) and the closing paragraph about clients folding tool results is somewhat tangential, but nearly every sentence carries actionable direction.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a multi-step create-to-verify flow with no output schema, the description covers the return fields, the next tool to call, the polling loop, the terminal-vs-link distinction, and the account prerequisite. An agent has everything needed to drive the full HITL setup correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is no parameter syntax to document and the baseline is 4. The description correctly focuses on the token it produces and the downstream calls instead of inventing parameter detail.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource: 'Create a Telegram chat ID discovery token,' then names the exact return fields. It is clearly distinguishable from siblings poll_chat_id_discovery and wait_for_chat_id_discovery, which handle later steps of the same flow.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-and-how guidance: pass `deep_link` to render_auth_link, never hand `qr_text` to a link renderer, print it in a fenced block only for terminals, then poll poll_chat_id_discovery with the token, and finally use the chat_id when creating a HITL config. Alternatives and sequencing are spelled out, not implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_circleAInspect

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. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesHuman-readable name for the Circle
membersNoInitial members (name + optional declared channels)
owner_nameNoHow this Circle's members know its owner ("Dad", "Giorgi"). The bots name the owner by it; while it is empty they name nobody — the Circle's name labels the group, never the person. Trimmed by the API; null or an empty value clears it.
profile_idNoPublic profile (sub-account) to bind for branded messages — create-only
proof_me_enabledNoEnable Proof-Me drills for this Circle

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare write/non-destructive, so the description carries most of the burden. It adds meaningful behavioral context the annotations cannot: the access prerequisite (PROOF account, PROOF_API_KEY env var) and the pre-launch/restart requirement. It also explains the invite-enrollment binding flow. It doesn't describe failure modes or rate limits, keeping it short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured and front-loaded: first sentence defines the entity, second the member seeding, third the workflow, fourth the access prerequisite. Slightly verbose in the 'powering Proof-Me and Approvals-on-Circle' parenthetical, but every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 5-param create tool with no output schema and minimal annotations, the description covers purpose, workflow sequencing, and the tricky auth/bootstrap requirement. A minor gap is that it doesn't state what the response returns (the created Circle id), but that is a small omission.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents every parameter including nested member fields. The description adds conceptual framing ('each member's declared channels are stored so they can be invited to enroll') but no syntax or constraints beyond the schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Create) and resource (Circle) and immediately defines what a Circle is — 'a named group of trusted contacts' — plus its role ('people-primitive powering Proof-Me and Approvals-on-Circle'). This distinguishes it clearly from siblings like update_circle, list_circles, and add_circle_member.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides an explicit agent workflow: create the Circle, then add members with add_circle_member (or seed them here), then invite_circle_member to mint the enrollment deep link. It names the alternative paths and their ordering, leaving nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_circle_member_drillAInspect

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.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesCircle ID
member_idYesMember ID to drill

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations (readOnlyHint=false, destructiveHint=false) already tell the agent this is a non-destructive write, and the description adds genuinely new behavioural context: the drill is a real challenge that hits the member, carries a scheduled-safety-check label, and requires a Proof account key that start_login cannot provision. It stops short of describing side effects like notifications sent to the member or rate limits on repeated drills.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the action and then the access prerequisite, which is the right ordering for an agent that must know the key requirement before calling. Slightly dense jargon and a parenthetical aside ('scheduled-safety-check label') cost a little, but overall it is well-sized with no redundant sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Coverage of what the tool does, its prerequisite, and its non-destructive nature is adequate, but with no output schema the description never says what a drill returns or how to track its progress (e.g. via get_identity_challenge or get_proof_status). For a tool that fires a real member-facing challenge, the missing return/tracking guidance is a real gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both id and member_id are already documented in the schema, making 3 the baseline. The phrase 'one enrolled member' adds a mild constraint (the member must already be enrolled) but no syntax, format, or behavioural detail beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Fire an on-demand Proof-Me drill against one enrolled member', clarifying it is a real cross-channel identity challenge rather than a simulated one. It distinguishes itself from the automated daily and monthly drills, though it does not clearly differentiate from neighbouring create-style siblings such as create_identity_challenge or add_circle_member.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context by framing this as the on-demand complement to the automated daily drill and monthly reinforcement sweeps, so an agent can infer it is the manual/interactive trigger. It also states the prerequisite (a Proof account / PROOF_API_KEY) and explicitly rules out start_login. What is missing is an explicit when-not / alternative-selection rule against sibling challenge tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_confirmationAInspect

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 use get_confirmation_approval_link to generate a fresh link for the user.

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. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
hitl_idYesHITL config ID whose channels will receive the approval request
messageYesThe client-encrypted ciphertext envelope as a JSON string (v1 or v2) — NOT the human-readable text. Encrypt the sentence the approver should read; passing it directly is refused with 400 `message_not_encrypted`, because the approval page can only decrypt an envelope.
proof_expiry_daysNoPer-request proof expiry override in days (7, 30, 90, or 365)

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only cover the safety profile (readOnlyHint=false, destructiveHint=false), but the description discloses far more: first-response-wins semantics, the mandatory encryption requirement, the exact 400 error codes (message_not_encrypted, message_key_mismatch, envelope_missing_approvers), v1 vs v2 envelope selection rules, AAD binding, and the Proof-account/PROOF_API_KEY prerequisite.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads purpose in one sentence, then separates operational guidance ('Agent usage:') from the encryption rules, which are organized as versioned bullets. It is dense and lengthy, but each section carries necessary failure-mode or format information rather than filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the burden well: it states what a confirmation does, what the response lifecycle looks like (approval/denial polling), auth prerequisites, and the encryption contract. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so a 3 is the baseline, but the description adds real meaning beyond the schema: it clarifies that `message` must be a sealed JSON envelope rather than human-readable text and explains how the envelope version relates to enrolled approvers and the `approver_ek` map. Only `proof_expiry_days` lacks added description (and its allowed values in schema are indirectly referenced in the prose).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Create a HITL confirmation request') and immediately names the mechanism (sends approval requests to channels on a referenced HITL config). It is clearly distinguishable from siblings like create_hitl, get_confirmation, and list_confirmations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells the agent when to use it and what to do on failure: if a 403/'not authorized' occurs, call request_hitl_authorization first, then wait; after creating, poll get_confirmation or use get_confirmation_approval_link. Alternatives and successors are named with unambiguous triggers.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_delegationAInspect

Create a delegation (Proof of Delegation): a control-proven domain authorizes a typed url/purl artifact for a set of capability scopes 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. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeYes1-32 capability scopes: lowercase kebab-case tokens, at most 64 characters each (e.g. send-email). NOT API scopes — an API-style resource:action such as payments:read is rejected with invalid_scope.
delegateYesThe typed artifact being authorized
expires_inNoLifetime in seconds (must not exceed the control proof's remainder)
control_proofYesPublic handle (ph_ctl_<32 hex>) of YOUR active domain control proof

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the readOnlyHint=false / destructiveHint=false annotations. It discloses billing ('each mint is a billable proof'), a hard failure mode ('a requested lifetime longer than the control proof's remainder is rejected, never truncated'), and the returned shape (publishable token plus DERIVED effective_status/is_valid, consistent with list/get tools).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the purpose and definition, then progressively adds billing, lifetime behavior, result shape, and access. Every sentence carries information, though the middle section is dense and the access note could be tightened.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutating tool with a nested object parameter, no output schema, and auth requirements, the description covers what is missing elsewhere: return shape, billing implications, the lifetime rejection rule, and the account/API-key prerequisite. An agent has what it needs to decide and call correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all four parameters, including the scope token format and the expires_in remainder constraint. The description adds only marginal parameter meaning ('rejected, never truncated' on lifetime), so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (create a delegation) and defines what a Proof of Delegation actually is: a control-proven domain authorizing a typed url/purl artifact for capability scopes, returning a publishable signed token. It also scopes the semantics precisely ('the domain's controller authorized this artifact — nothing more'), which lets an agent distinguish it from sibling verbs like list_delegations, get_delegation, and verify_delegation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides a clear prerequisite in the ACCESS section (needs a Proof account, set PROOF_API_KEY, restart) and an explicit when-not: 'start_login does NOT open this tool.' What is missing is any routing versus close siblings such as create_authorization or create_confirmation, which an agent might otherwise confuse with this minting operation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_dns_credentialA
Destructive
Inspect

Store DNS provider credentials for automated domain verification. Note: credentials will be visible in the AI conversation context.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault
providerYesDNS provider identifier (e.g. cloudflare, route53, digitalocean)
credentialsYesProvider-specific credential key-value pairs

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true, but the description adds genuinely new behavioral context: the credentials will be exposed in the AI conversation context, which is a material security disclosure an agent should surface. It still omits what happens if credentials already exist for a provider (overwrite vs. error) and what the call returns.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first sentence and the security warning immediately follows. The ACCESS block is slightly verbose but every clause is actionable; the trailing 'then call this tool again' is a bit awkward yet clear.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter secret-storing mutation with no output schema, the description covers purpose, auth prerequisites, and the key risk. The remaining gaps — overwrite semantics for an existing provider credential and the return value/shape — are modest but real.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the schema itself documents both 'provider' (with examples) and the free-form 'credentials' map. The description adds no parameter-level meaning, such as which key names a given provider expects, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb and resource ('Store DNS provider credentials') and states the purpose ('for automated domain verification'). However, it does not distinguish this tool from near-siblings like connect_dns_provider, connect_cloudflare, or add_verification_provider, so an agent cannot tell which to pick without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It supplies real prerequisite guidance (needs a Proof account; set PROOF_API_KEY and restart, or sign in via start_login) which tells the agent how to unblock the call. It never states when to use this tool instead of the connect_* / add_verification_provider siblings, so alternative selection is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_hitlAInspect

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. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesHuman-readable name for this HITL config
channelsYesMessaging channels for approval requests (telegram or whatsapp)
timeout_secondsNoDefault timeout in seconds (60–86400, default: 3600)

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag a non-destructive write, and the description adds real behavioral context beyond them: mandatory post-creation authorization step, channel-specific prerequisites, and an ACCESS note stating a Proof account with PROOF_API_KEY is required and that start_login does NOT unlock this tool. That auth-blocking detail is high-value transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core action, then separates "Agent usage" and "ACCESS" into scannable blocks. Every sentence carries distinct, actionable information with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a creation tool with nested channel configs, no output schema, and prerequisite steps, the description covers prerequisites and account access thoroughly. It is nearly complete, though it does not state whether the created config is immediately usable or what identifier is returned.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema documents name, channels, and timeout itself. The description still adds meaning by explaining the telegram chat_id must be obtained via create_chat_id_discovery and included in the channel config, which is guidance the schema cannot express.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ("Create a HITL config") and immediately clarifies what that object contains (channels that receive approval requests plus a default timeout). An agent understands the resource without opening the schema, and it is clearly distinct from the delete_hitl/update_hitl siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit workflow ordering: it names request_hitl_authorization as a required follow-up and create_confirmation as the downstream consumer, and tells the agent to use create_chat_id_discovery first for Telegram channels. This is exactly the when/how-to-use guidance that lets an agent sequence calls correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_identity_challengeAInspect

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. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
circle_idYesCircle that holds the member
member_idYesEnrolled Circle member initiating the check
suspicious_channelNoChannel the suspicious contact reached the member on; defaults to the member channel

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only say it is a non-read-only, non-destructive write, so the description carries the rest and does so well: it discloses that this is an asynchronous job whose outcome must be polled and enumerates the six terminal states (confirmed, denied, cancelled, failed, expired, revoked). It also flags the access prerequisite (PROOF_API_KEY plus restart) and explicitly notes that start_login does NOT unlock it, which is genuinely useful auth context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short, clearly labelled blocks: purpose first, then agent follow-up, then access prerequisites. Every sentence is load-bearing and the most important information (what it creates, how to poll it) is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by explaining that an ID is returned and must be polled via get_identity_challenge until a terminal state, covering the return-value gap. Access prerequisites and failure states are covered; only the comparison against sibling challenge creators is absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents circle_id, member_id and the suspicious_channel default. The description adds conceptual meaning for suspicious_channel (the channel contrast drives the cross-channel check) but no syntax or format detail beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Create a Proof-Me cross-channel identity challenge (CONFIRM)') plus the scope ('for an enrolled Circle member'), and the second sentence explains the mechanism (approval on a channel different from the suspicious contact's). It does not, however, differentiate itself from closely related siblings such as create_confirmation or create_multi_channel_verification, so the agent still has to infer which challenge creator to pick.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Agent usage' line gives a concrete workflow (poll get_identity_challenge until the status leaves pending) and names the terminal states, which is real next-step guidance. But it never states when to choose this over the other verification/confirmation creators in the sibling list, so the when-to-use decision is only implied by the scenario description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_multi_channel_verificationAInspect

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_) 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. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeYesAsset type — only "phone" is supported
channelsYes1-4 unique channels attempted in parallel (first to complete wins)
identifierYesPhone number in E.164 format
client_metadataNoCustom key-value metadata
external_user_idNoYour application user ID for grouping verifications
proof_expiry_daysNoPer-request proof expiry override in days (1-365)

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint=false/destructiveHint=false annotations, it discloses billing semantics (exactly one proof billed at the winning channel's completion, nothing at creation), that losing sibling channels are cancelled, and that most clients hide tool results so the agent must surface actionable content in its own reply. These are the kinds of side effects and UX constraints annotations cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is a long description, but it is front-loaded with purpose before agent instructions, then caveats, then access requirements, and each paragraph carries operative content (billing, link handling, QR verbatim rule, polling target). No sentence is purely decorative, though the length is near the upper bound for a single tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by documenting the response shape (group_id, channels array, deep_link, sms_message, qr_text) and the follow-up polling tool. Combined with the coverage of prerequisites, billing, and user-visible rendering rules, an agent has everything needed to invoke and complete the flow correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds genuine meaning: the channels list is attempted in parallel with first-wins cancellation, and responses carry group_id (vg_<hex>), a channels array with deep_link/sms_message, and qr_text as pre-rendered art rather than an alternate address. That clarifies semantics the schema alone does not.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence names a specific verb+resource (create a multi-channel phone verification) and immediately defines the distinctive mechanism: one phone number challenged over several channels at once with OR/first-wins semantics. That mechanism cleanly separates it from siblings such as create_verification, create_verification_request, and start_2fa without ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an explicit workflow: pass the returned deep_link to render_auth_link, poll get_multi_channel_verification_status with the group_id, and present the SMS text/number to the user. It also states a when-not (start_login does NOT open this tool) and a precondition (needs a Proof account with PROOF_API_KEY set).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_profileA
Destructive
Inspect

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. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
bioNoProfile bio
themeNoProfile theme settings
is_publicNoWhether the profile is publicly visible
avatar_urlNoAvatar as base64 data URI or URL (~75KB limit)
is_primaryNoSet as primary profile
email_themeNoTheme of this project's emails
is_businessNoWhether this is a business profile
display_nameNoDisplay name
business_nameNoBusiness name
support_emailNoSupport email this project's messages show

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false and destructiveHint=true, so the mutation/safety profile is covered. The description adds genuinely new behavioral context that annotations cannot carry: the account/auth prerequisite and how to satisfy it, plus the explicit note that start_login does not unlock this tool. It omits failure behavior, but the auth disclosure is real added value.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two compact sentences: purpose first, then a clearly delineated ACCESS note. Nothing is redundant and the prerequisite is easy to find. Minor room to be tighter, but no waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 10-parameter, all-optional creation tool with a nested theme object and no output schema, the description covers the field space and the auth prerequisite. It leaves out what the created profile returns (id, primary behavior), which would be the only notable gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, including the nested theme object, so the schema fully documents every field. The description only restates the field categories at a high level and adds no syntax, default, or interaction meaning beyond what the schema provides. Baseline 3 is correct.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb 'Create' plus resource 'profile', and it enumerates the optional content categories (display name, bio, avatar, business info, email branding, theme settings). This clearly separates it from update_profile and get_profile, though it never names a sibling explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The ACCESS block gives concrete context on when this tool will actually work (a Proof account plus PROOF_API_KEY) and explicitly rules out a tempting alternative path ('start_login does NOT open this tool'). It stops short of telling the agent when to prefer create_profile over update_profile or set_primary_profile, but the preconditions are clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_sessionAInspect

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. 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. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
channelYesVerification channel
metadataNoCustom key-value metadata
template_idNoCustom template ID
callback_urlNoURL to redirect after verification
phone_numberYesPhone number in E.164 format
external_user_idNoYour application user ID

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only cover the safety profile (readOnlyHint=false, destructiveHint=false), yet the description adds substantial undisclosed behavior: the exact return shape, the hosted-flow-with-callbacks model, auth requirements (Proof account, PROOF_API_KEY, server restart), and the UX caveat that the user does not see tool results.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and return values, then a clearly labeled 'Agent usage' block. Every sentence is actionable — the render_auth_link routing, the qr_text warning, the polling step, and the visibility caveat all earn their place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, and the description compensates by describing the return values (deep_link, qr_code, qr_text). Auth prerequisites, follow-up tools, and user-visibility behavior are all covered, so nothing needed to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the six parameters are already documented in the schema. The description adds workflow meaning (deep_link/qr_text are outputs, not params) but no extra syntax or constraint detail for channel, phone_number, metadata, etc. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Create a new phone verification session') and enumerates what it returns (deep_link, qr_code, qr_text). It also distinguishes itself from siblings by noting that start_login does NOT open this tool, so an agent can route correctly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use steps (pass deep_link to render_auth_link, then poll with wait_for_session until verified/failed/expired) and an explicit when-not ('Never hand qr_text to a link renderer'). Alternatives and conditions are named rather than inferred.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_user_requestBInspect

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. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault
assetsYesAssets to request, e.g. [{ "type": "email" }, { "type": "phone", "required": false }]
partial_okNoWhether partial asset sharing is acceptable (default: false)
action_typeNoPurpose of the request (default: verification); custom and confirmation also need an action_context title
callback_urlNoHTTPS webhook URL for request status updates
redirect_urlNoHTTPS URL to redirect the subject after completing the request
reference_idNoExternal reference ID for tracking
action_contextNoWhat the recipient is shown about why the assets are needed, e.g. { "title": "Confirm your contact details" }
expires_in_hoursNoHours until request expires (default: 168, i.e. 7 days)
public_profile_idNoPublic profile ID for branding
validity_requirementNoHow recently an existing proof must have been verified for the recipient to reuse it: a number and a unit, h hours, d days, w weeks or m months (30 days), e.g. "24h", "7d", "1m"

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false and destructiveHint=false, so the write-but-not-destructive profile is covered. The description adds real value by disclosing the account/auth prerequisite and the login flow that unlocks the tool, but says nothing about what happens after creation (request state, notifications, idempotency, or rate limits).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short, front-loaded paragraphs: the core action first, then the access prerequisite. No filler or repetition, though the inline asset example is arguably redundant given the schema's own example.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 10-parameter tool with nested objects and no output schema, the description covers the action and the auth gate but omits the return shape (request ID, link, status) and any lifecycle context, which an agent needs since no output schema fills that gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% across all 10 parameters, including enums and nested action_context, so the schema carries the semantic load. The description's asset example ({ "type": "email" }) only restates what the schema already documents, so it adds no meaning beyond the structured field. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Create a new verification request') and clarifies the goal ('ask another user to share verified assets'), which is more than a name restatement. However, it never distinguishes itself from the many near-identical siblings in this namespace (create_verification_request, create_verification, create_authorization, create_confirmation, create_hitl), so an agent cannot tell which creation tool to pick from the description alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The ACCESS paragraph gives a genuine prerequisite (needs a Proof account; set PROOF_API_KEY or sign in via start_login, which opens this tool). That is useful when-to-use context, but it is auth onboarding rather than routing guidance — nothing says when to use this over create_verification_request or the other request-creating siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_verificationAInspect

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 "user@example.com"). 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. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeYesAsset type being verified
channelYesVerification channel (must match the asset type, e.g. sms/whatsapp/telegram for phone)
bot_tokenNoTelegram bot token (required for channel "telegram_bot_token")
identifierYesThe asset identifier to verify (E.164 phone, email address, domain, handle, wallet address, ...)
dns_providerNoDNS provider credentials (required for channel "auto")
email_prefixNoMailbox prefix for domain email verification
client_metadataNoCustom key-value metadata
external_user_idNoYour application user ID for grouping verifications
proof_expiry_daysNoPer-request proof expiry override in days (1-365)

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare write/non-destructive; the description adds substantial beyond-schema behavior: telegram_bot with a LIVE key completes immediately returning status: verified with a proof token and no challenge, whereas pk_test_ stays pending; no qr_text is ever returned; the credential requirement (PROOF_API_KEY, start_login does not unlock it); and that clients hide tool output from the user.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first sentence, followed by usage, behavioral caveats, and the client-visibility note in a logical progression. It is dense and long, but nearly every sentence carries actionable information (deep_link routing, live-vs-test asymmetry, reply-text requirement), so little feels like padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 9-parameter, nested-object tool with no output schema, the description covers the response shape (challenge object, challenge.deep_link, status/proof token), the key branching behavior, auth prerequisites, and what the agent must relay to the user. Nothing an agent needs to call it correctly appears to be missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema carries the per-parameter burden and baseline 3 applies. The description goes beyond it by showing worked type/channel/identifier combinations and the cross-parameter constraint that channel must match the asset type, which the schema only loosely hints at.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

It states a specific verb and resource ('Create a new identity verification') and describes the flow's scope (asset-based, channel-delivered). It routes to related tools (get_verification, wait_for_verification, render_auth_link) but does not differentiate itself from the many near-name siblings such as trigger_verification, create_verification_request, or create_multi_channel_verification.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit 'Agent usage' instructions with concrete type/channel/identifier examples and conditional behavior for LIVE vs pk_test_ keys, plus clear next-step guidance (poll get_verification / wait_for_verification for OTP, pass deep_link to render_auth_link for messengers). It stops short of naming when to prefer this over sibling creation endpoints like create_verification_request or trigger_verification.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_verification_requestAInspect

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. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
assetsYesArray of assets to verify (1-10)
expires_inNoRequest expiry in seconds (default: 604800, i.e. 7 days; max: 2592000, i.e. 30 days)
partial_okNoAllow partial completion (default: false)
action_typeNoPurpose of the verification (default: verification)
callback_urlNoWebhook URL for status updates (HTTPS only)
redirect_urlNoURL to redirect user after verification completes (HTTPS only)
reference_idNoYour unique reference ID for this request
action_contextNoContext displayed to user during verification
proof_expiry_daysNoPer-request proof expiry override in days (7, 30, 90, or 365)
public_profile_idNoPublic profile ID for branding

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=false and destructiveHint=false. The description adds real behavioral context beyond that: this creates a multi-asset flow, it is gated behind Proof account credentials, and restarting the server is required. It does not mention that the request is likely async (wait_for_request, get_request_proofs siblings exist) or any rate/limit behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight paragraphs with the capability stated first and the access precondition second; no filler. The access sentence is slightly awkward ('then call this tool again') but it is front-loaded and earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 10-parameter tool with nested objects, enums, and no output schema, the description covers the credential gate but says nothing about what is returned (request id, per-asset status) or how the caller is expected to follow up. Enough to invoke, incomplete for driving the resulting workflow.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% across 10 parameters with nested asset objects, so the schema already carries the parameter semantics. The description only restates the asset type list and adds nothing about defaults, channel selection, or the action_context/expires_in interactions. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (create a multi-asset verification request) and enumerates the seven asset types it covers, so the agent understands scope. It does not name the near-identical siblings (create_verification, create_multi_channel_verification), so sibling differentiation is left implicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides a concrete precondition (needs a Proof account; set PROOF_API_KEY and restart) and a negative hint that start_login does not unlock it, which is genuinely useful. However, with ~140 siblings including create_verification, create_multi_channel_verification, create_confirmation and create_authorization, the description never says when this multi-asset form is preferred over those alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_circleA
Destructive
Inspect

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. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesCircle ID to archive

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds substantial context beyond annotations: the operation is a soft, recoverable archive even though destructiveHint=true, and it documents the auth prerequisite (Proof account, PROOF_API_KEY, restart required, start_login does NOT unlock this tool). This is exactly the kind of non-obvious behavior an agent needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action and its soft-delete semantics, then the recovery path, then the access caveat. Every sentence earns its place, though the access block is slightly verbose for a description field.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, but the description covers the observable result (removal from default listing), the recovery mechanism, and the authentication barrier. Nothing needed to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the single id parameter is already documented with its pattern. The description adds no format or syntax detail beyond what the schema provides, which is the baseline-3 case for a one-param tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Archive a Circle") and immediately disambiguates the implementation: a soft delete that sets status to archived. An agent can distinguish it from hard-delete siblings like delete_profile or delete_domain without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains the operational consequence (stops appearing in the default list) and the recovery path (list_circles with status="archived"), plus an explicit access precondition. It does not explicitly compare against update_circle, but the soft-delete framing is enough context to select correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_dns_credentialA
Destructive
Inspect

Delete a stored DNS provider credential. Domains using this credential will need new credentials for automated verification.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesDNS credential ID to delete

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true and readOnlyHint=false, but the description adds genuine extra context: the downstream impact on domain verification and the concrete auth prerequisites (PROOF_API_KEY + server restart, or start_login session). It doesn't state reversibility or error behavior, but it goes meaningfully beyond the annotations and does not contradict them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core action and its consequence are front-loaded in the first two sentences. The ACCESS block is somewhat verbose and reads as boilerplate, but it is genuinely actionable for an unauthenticated caller.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter destructive tool with annotations covering the safety profile and no output schema, the description is nearly complete: it covers the action, its consequence, and authentication. Minor gap is the absence of any note on reversibility or failure modes.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter (id) with 100% schema description coverage ('DNS credential ID to delete'), so the schema carries the semantic load. The description adds no format or sourcing detail for the id, making the baseline 3 appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb (delete) plus resource (stored DNS provider credential), clearly distinguishable from siblings like create_dns_credential and list_dns_credentials. The added consequence sentence ('Domains using this credential will need new credentials for automated verification') further sharpens what this tool actually does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives a clear decision-relevant consequence for deleting (downstream domains lose automated verification), which helps an agent judge whether to call it. It does not, however, explicitly point to alternatives such as revoking or re-creating credentials via create_dns_credential, so it stops short of full when/when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_domainA
Destructive
Inspect

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. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesDomain ID to delete

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this destructiveHint=true / readOnlyHint=false, but the description far exceeds them: it discloses irreversibility ('Cannot be undone'), that re-adding the domain will not restore delegations, that some external cleanup may be incomplete (Resend sending domain, _proof TXT record 'where we can'), and that the response returns a manual-removal checklist.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action and its destructive consequences before the auth mechanics, and every sentence carries information. The dense parentheticals and the appended access/setup block make it slightly heavier than necessary, but nothing is padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, yet the description covers the return value ('the response lists what is left for you to remove by hand'). Combined with the auth prerequisites and full cascade disclosure, an agent has everything needed to invoke this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter ('id') with 100% schema description coverage, so the schema already carries the semantics. The description only reinforces that the target is 'this domain id' via the 2FA targets list, adding little beyond the structured data — the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a concrete verb+resource ('Remove a domain from the account') and immediately enumerates the cascade: proofs, delegations, domain records, _proof TXT record, Resend sending domain. It also distinguishes itself from revoke_asset by naming that sibling when only proofs need revoking.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names the alternative (revoke_asset) and the condition selecting it ('Need only a fresh proof? ... which keeps the domain'), and states the preconditions: owner only, start_login session, one 2FA code via start_2fa_for_action with action_type domain_remove and targets [this domain id].

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_domain_verificationA
Destructive
Inspect

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. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesDomain verification ID (24 hex characters)

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only say readOnlyHint=false and destructiveHint=true; the description refines this by clarifying that deleting an unverified attempt revokes nothing, and contrasts it with the case that does revoke proofs and delegations. It also discloses an access prerequisite (Proof account, PROOF_API_KEY, restart) and that start_login does not open this tool, which is behavior no annotation conveys.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose and scope are front-loaded in the first clause, and every clause carries information. The refusal case sentence is a run-on that packs the error code, the revocation consequence, and the alternative tool into one clause, which slightly hurts readability but wastes no words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter mutation with no output schema, the description covers the happy path, the refusal path with its error code, the consequence gap versus delete_domain, and the access precondition. Nothing an agent needs in order to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% with a single parameter whose format (24 hex characters) and pattern are already documented in the schema. The description adds no further meaning about the id, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (delete a domain verification attempt) and immediately bounds the scope to unverified attempts (pending, verifying, failed). It also names the sibling it must not be confused with — delete_domain, which acts on verified domains — so an agent can pick between them without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-it-works (unverified attempts) and when-it-is-refused (verified or needing re-verification, returns domain_verified), plus the alternative route for that case (delete_domain in a start_login session or the dashboard). Both branches and the fallback are covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_hitlA
Destructive
Inspect

Delete (archive) a HITL config. Sets status to archived. Cannot be used for new confirmations after deletion.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesHITL config ID to delete

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, but the description adds genuinely new behavior: deletion is a soft archive that sets status to archived, and it has a downstream consequence (no new confirmations). It also discloses an authentication prerequisite (Proof account, PROOF_API_KEY, restart the server) and explicitly rules out start_login as a path to enabling this tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core behavior is front-loaded in one dense sentence, with the access prerequisite separated into its own block so it does not obscure the purpose. Slightly verbose in the access paragraph, but every line carries actionable information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter destructive tool with no output schema and annotations covering the safety profile, the description covers purpose, soft-delete semantics, downstream impact, and auth gating. It leaves minor gaps (fate of in-flight confirmations, reversibility/unarchive path) but is sufficient to call correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter, and schema description coverage is 100%, so the schema already documents 'id'. The description adds no format, source, or lookup guidance for the ID beyond what the schema provides, which is the baseline expectation here.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (delete a HITL config) and immediately clarifies the semantics of 'delete' as archive. This distinguishes it from the similarly-named delete_hitl_keys sibling as well as from create_hitl/update_hitl, since the agent knows exactly which resource and operation is involved.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied (you delete an existing HITL config) and the description notes the post-deletion constraint ('cannot be used for new confirmations'), but it never states when to prefer this over alternatives such as delete_hitl_keys or update_hitl, nor any precondition for the target config. The ACCESS note is a prerequisite, not usage routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_hitl_keysA
Destructive
Inspect

Delete the encryption keypair from a HITL config. WARNING: Existing ciphertexts will become permanently unreadable.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
hitl_idYesHITL config ID

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, but the description adds the concrete downstream consequence that existing ciphertexts become permanently unreadable and documents the auth requirement. Those are exactly the behavioral details the structured hints do not convey, so it materially adds beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The action and its destructive warning are front-loaded in the first sentence, and the access note is isolated in a separate block. It is efficient; the access paragraph is slightly verbose but every part (env var, restart, start_login caveat) is actionable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter destructive tool with annotations and no output schema, the definition covers the safety warning and the auth gate adequately. Nothing critical is missing, though it does not note whether the deletion is idempotent or what the response looks like.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single hitl_id parameter is documented in the schema. The description adds no syntax, format, or acceptance detail beyond what the schema already provides, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Delete) and resource (the encryption keypair) scoped to a HITL config, so an agent can distinguish it from delete_hitl (which removes the config) and from get_hitl_keys/upload_hitl_keys. The resource is named precisely rather than as a vague 'hitl operation'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The ACCESS block gives clear prerequisites (needs a Proof account, set PROOF_API_KEY and restart) and explicitly warns that start_login does NOT unlock this tool, which prevents a common failed-attempt path. It never spells out when to prefer this over delete_hitl or revoke-style alternatives, so it stops short of full when/when-not routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_profileA
Destructive
Inspect

Delete a project (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 project cannot be deleted; deleting the primary project 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 project id]. With an API key alone only an EMPTY project (no API keys, HITL setups or pending requests) can be deleted; anything else answers owner_session_required. Cannot be undone.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault
profile_idYesProfile ID

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructive=true, but the description adds substantial context beyond them: exactly what is revoked/archived/declined/deleted, that history is kept and unlinked, the username is retired for good, the primary-promotion behavior, and that the action cannot be undone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Long, but front-loaded with the core action and side effects before auth mechanics. Each sentence carries distinct operational information (cascade effects, edge cases, authentication path), though the access/restart paragraph is somewhat boilerplate-heavy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by noting the response names the promoted primary project, and it fully covers authentication, failure conditions, irreversible consequences, and edge cases for a single-parameter destructive tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter with 100% schema description coverage, so the schema does the documentation work. The description references 'this project id' and 'targets [this project id]', which confirms identity but adds no format or constraint detail beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ('Delete a project (profile)') and immediately enumerates the concrete side effects, so an agent can distinguish it from delete_circle, delete_template, or delete_hitl without inspecting schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

States explicit preconditions and exclusions: the last project cannot be deleted, deleting the primary promotes the oldest remaining, API-key-only callers may delete only an EMPTY project, and 2FA via start_2fa_for_action is required in a start_login session. Alternatives and failure modes (owner_session_required) are named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_templateA
Destructive
Inspect

Delete a sub-account's (project's) custom template, reverting that project to the default template for the channel and message type.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
channelYesMessage channel
profile_idNoThe sub-account (project) to act on; omitted → your key's project, or the primary project for an account-wide key
message_typeYesMessage type (e.g. verification_request, login_request)

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag this as destructive and non-readonly, but the description adds value beyond them: the deletion is not permanent disappearance of configuration, it reverts the project to the channel/type default, and it requires a Proof account with PROOF_API_KEY configured. It stops short of saying whether the deleted template is recoverable or whether other channel/type templates are unaffected.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The first sentence is front-loaded and carries the whole purpose and side effect with no waste. The second paragraph is useful but slightly operational in tone (restart instructions) relative to the core semantics.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive three-parameter tool with full schema coverage and no output schema, the description covers purpose, resulting state, and access requirements. It omits edge-case behavior such as what happens when no custom template exists, which is the main remaining gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3, but the description ties the parameters to an outcome: channel + message_type define which template is reverted to default, and profile_id is the sub-account/project scope. That adds a small amount of semantic meaning over the schema's field-level text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (delete) and resource (a sub-account's custom template) and goes further by naming the resulting state: the project reverts to the default template for that channel and message type. This distinguishes it cleanly from update_template, get_template, and list_templates without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied rather than stated: the agent can infer this is the tool to remove a customization, but there is no explicit when-to-use/when-not guidance or comparison to siblings such as update_template. The ACCESS paragraph is a useful prerequisite (account type, PROOF_API_KEY) but addresses setup, not tool selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

export_authorizationsA
Read-only
Inspect

Export authorizations as CSV or JSON. Supports date range and status filtering. Maximum 10,000 records.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoEnd date filter (ISO 8601)
fromNoStart date filter (ISO 8601)
formatNoExport format (default: json)
statusNoFilter by status

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=true, so the description carries the rest and does so well: it discloses the 10,000-record cap and the authentication prerequisite with a negative instruction about start_login. What it omits is how results are delivered (file path, stream, or URL) and what happens when the cap is exceeded.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose, capability, and the record cap are front-loaded in one tight sentence, and the access prerequisite is cleanly separated. The budget is well spent, though the restart instruction is operational noise an agent cannot act on within a session.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description should say what an export returns and how to retrieve it, which it never does; pagination behavior at the 10,000 cap is also unstated. Access and filtering are covered adequately, but a data-export tool leaves the delivery mechanism to inference.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema description coverage and enums on format and status, the schema already documents every parameter including ISO 8601 date formats. The description only restates format and filter concepts, adding no syntax or default information beyond what the schema provides, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

It names a specific verb and resource ('Export authorizations'), states the output formats (CSV or JSON), and lists the filter dimensions, so an agent knows exactly what the call produces. It does not, however, distinguish itself from the sibling 'export_data' or explain why one would export rather than call 'list_authorizations'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The ACCESS block gives a genuine prerequisite (a Proof account, PROOF_API_KEY set, server restart) and even rules out a wrong path by stating start_login does not unlock this tool. But there is no guidance on when to choose this over 'list_authorizations' or 'export_data', nor any exclusion criteria for the filters.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

export_dataAInspect

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. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault
export_idNoRead this export's status instead of the latest one

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=false / destructiveHint=false, so the description carries the behavioral burden and does so richly: background preparation, email/login-channel delivery, a link that only works while signed in, the tool never returning data itself, one export per 24h (no limit during deletion scheduling), and 7-day retention. This is exactly the kind of context annotations cannot express.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then auth prerequisite, then polling/limits — a logical order with little waste. The trailing ACCESS block partly repeats the start_login guidance already given earlier, which is the only redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an async, owner-gated export with no output schema, the description covers the full lifecycle an agent needs: how to start, how to poll, what is returned (nothing — data arrives by email), auth requirements, and rate/retention constraints. Nothing material is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema coverage on a single optional param, the schema already documents export_id with its pattern. The description's 'Pass export_id to read one export's status' restates the schema rather than adding format or edge-case meaning, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Export a complete copy of your account's data') and anchors it to GDPR Articles 15 and 20, which immediately distinguishes it from sibling listing tools like export_authorizations. An agent can tell what this does without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly covers when to use it (owner-only data export), the prerequisite auth path (start_login; API-key-only connections refused with user_session_required), the call-again-to-poll pattern, and the 24h/7-day limits. Alternatives and exclusions are stated, not inferred.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

extend_requestAInspect

Extend the expiration time of a pending verification request.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesVerification request ID to extend

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false and destructiveHint=false, so the mutation profile is covered. The description adds real context beyond that: it operates on pending requests only and requires a Proof account via PROOF_API_KEY or start_login. It stops short of describing the resulting expiration value or whether extension can be repeated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose sentence is front-loaded and wastes no words. The ACCESS block is somewhat verbose and slightly repetitive ('then call this tool again'), but it conveys actionable setup information rather than filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter mutation tool with annotations covering the safety profile and no output schema, the description covers purpose, precondition, and auth setup adequately. The only real gap is the resulting expiration behavior, which is minor here.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% for the single 'id' parameter, so the schema already carries parameter meaning. The description adds nothing about parameter format or constraints, which is the expected baseline-3 outcome when the schema does the work.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (extend) and resource (the expiration time of a pending verification request), which an agent can clearly distinguish from siblings like cancel_verification_request or get_verification_request. It does not explicitly name the sibling it contrasts with, so it lands at 4 rather than 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'pending' qualifier implies the tool only applies to still-pending requests, giving implicit state guidance, but there is no explicit when-to-use vs alternatives (e.g., when to extend versus cancel or re-create). Usage is implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_2fa_statusA
Read-only
Inspect

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. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault
session_idYes2FA session ID

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With readOnlyHint already covering the safety profile, the description still adds substantial behavioral context: polling cadence, the meaning of each terminal state, and the requirement that the caller's reply text must surface the link/SMS before polling. It does not quantify rate limits or backoff, but the cadence guidance goes well beyond the annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and return states, then usage, then auth access. Every paragraph is functional, though the 'Agent usage' block runs somewhat long relative to a single-parameter read tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only single-param tool with no output schema, the description compensates well by enumerating the returned states and stating the Proof account/API-key prerequisite. It stops short of situating itself against the sibling set (verify_2fa, wait_for_2fa), which is the remaining completeness gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% for the single session_id parameter, so the schema already carries the full parameter definition. The description adds only the tie-in to start_2fa ('a challenge you created') and no format or provenance details, so baseline 3 is correct.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb and resource ('Check the status of a 2FA session by session ID') and enumerates the possible outcomes (completed, pending, expired). An agent can distinguish this from get_verification or get_proof_status without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear when-to-use context ('Poll this after calling start_2fa. Check every few seconds') and maps terminal states to next actions ('expired' → restart with start_2fa). It never mentions wait_for_2fa, a sibling that appears to serve the blocking alternative to polling, which leaves one routing decision to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_add_email_statusA
Read-only
Inspect

Check the status of an in-progress email addition by session ID.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault
session_idYesAdd-email session ID

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true, and the description adds meaningful context beyond that: it requires a Proof account, PROOF_API_KEY, and a restart or start_login flow before it will work. It does not describe polling behavior, terminal states, or rate expectations, which is a minor gap for a status-check tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded one-line purpose followed by a clearly labeled ACCESS block; every sentence earns its place. The flow instruction is slightly procedural but genuinely useful for invocation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only status tool the coverage is close to adequate, and annotations cover the safety profile. However, with no output schema, the description says nothing about what status values or fields are returned, which an agent polling for completion would benefit from.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is a single required parameter with 100% schema coverage, so the schema already carries the semantics. The phrase 'by session ID' merely restates it without adding format, provenance, or validity details (e.g., where the session ID comes from is only implied by the start_login hint).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Check the status of an in-progress email addition') and scopes it to a session ID, which distinguishes it from siblings like start_add_email and verify_email_otp. It stops short of explicitly naming the sibling it is not (e.g., get_add_phone_status or verify_email_otp).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives real workflow context: the session is opened by start_login and the caller should 'call this tool again' after authenticating. It clarifies when the tool becomes usable, though it never states when NOT to use it or which alternative covers a completed/failed addition.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_add_phone_statusA
Read-only
Inspect

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. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault
session_idYesAdd-phone session ID

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only provide readOnlyHint=true, so the description usefully adds the polling contract ('until terminal state') and the auth prerequisite (PROOF_API_KEY or a session opened by start_login). It doesn't describe the returned status values or the response shape, which remains undisclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first sentence and the polling directive is adjacent. The UX aside about showing the user the link is somewhat tangential but genuinely actionable, and the ACCESS block is slightly verbose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only polling tool with no output schema, the description covers auth and polling cadence but never explains what statuses or terminal states an agent should expect, leaving the return contract implied.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With one parameter and 100% schema description coverage, the schema already carries the semantics of session_id. The description's phrase 'by session ID' adds nothing beyond what the schema states, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource+scope: 'Check the status of an in-progress phone addition by session ID.' This clearly distinguishes it from the sibling start_add_phone (initiates) and from get_add_email_status (email variant).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Tells the agent to 'Poll until terminal state,' implying this is called after start_add_phone while the flow is in progress. It also routes auth setup via start_login. It stops short of explicitly naming start_add_phone as the prerequisite or stating what the terminal states are.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_api_key_usageA
Read-only
Inspect

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. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe API key id to fetch usage for
environmentNoScope metrics to test or production data (default: production)

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond readOnlyHint, it discloses non-obvious traits: counts are aggregates only with no recipient identifiers, counts include the key plus every key it replaced (replaced_key_ids), and there is an account/self-scoping authorization rule. The ACCESS paragraph also documents auth requirements and the start_login fallback.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads what the tool returns, then covers scope and access in a separate paragraph, with zero filler sentences. It is somewhat dense but every clause carries information, so it stays appropriately sized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by enumerating the returned metrics and attribution fields, and it states the auth/scope constraints an agent needs. Nothing required to select or invoke the tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters (id, environment) are already documented in the schema. The description reinforces the id's meaning ('for a given key id') but adds no syntax or default detail beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (per-API-key usage for a given key id) and enumerates the returned breakdowns: verification counts by type/channel/status, request/confirmation/authorization totals, and attribution context. This clearly distinguishes it from siblings like get_usage, get_platform_summary, and get_self_api_key.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context: scoped to the authenticated account, and an API-key caller may read only its own key, plus the PROOF_API_KEY / start_login prerequisites. However, it never explicitly names when to prefer this over get_usage or get_self_api_key, so no exclusion/alternative guidance is present.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_assetA
Read-only
Inspect

Get a single verified asset by ID. Returns details including type, value, status, and verification timestamps.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesAsset ID

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=true, so the description adds real value: it identifies the tool as a read of a single asset, lists what is returned, and surfaces an account/auth prerequisite plus a routing warning that start_login will not unlock it. It stops short of disclosing error behavior for unknown IDs or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences: return contents first, then the access constraint, front-loaded and waste-free. The auth paragraph is slightly long relative to the tool's simplicity but each clause carries actionable information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description correctly compensates by enumerating the returned fields, and it supplies the account prerequisite an agent needs before calling. The only gap is what happens on a missing/unauthorized ID, which is minor for a simple single-resource read.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter, with 100% schema description coverage ('Asset ID'), so the schema already carries the semantics. The description adds no format, source, or lookup guidance for the ID beyond what the schema states – the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get a single verified asset by ID') and enumerates the returned fields (type, value, status, verification timestamps). The 'single ... by ID' phrasing implicitly separates it from list_assets and revoke_asset, though it never names those siblings explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives a strong prerequisite ('needs a Proof account. Set PROOF_API_KEY and restart this server') and clarifying exclusions ('start_login does NOT open this tool'), but it never says when to reach for get_asset versus list_assets, get_profile_assets, or get_verified_user. Usage is implied rather than directed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_authorizationA
Read-only
Inspect

Get an authorization by ID. Returns the current state of the authorization including status and usage statistics.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesAuthorization ID

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation already establishes safety, but the description adds meaningful context: it returns status and usage statistics, and requires a Proof account plus PROOF_API_KEY to invoke. It stops short of covering error behavior or permission scopes, so it is strong but not exhaustive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short paragraphs: purpose and return value first, then access requirements. Every sentence carries useful information, and nothing is buried or redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple single-parameter read tool with no output schema, the description covers purpose, return highlights, and access prerequisites. It does not detail status values or usage-statistics fields, but it is otherwise sufficient for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single 'id' parameter is already documented as 'Authorization ID'. The description only repeats 'by ID' without adding format, validation, or lookup semantics beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get an authorization by ID') and distinguishes itself from list/create/revoke siblings through the 'by ID' scope. It also describes what the response contains: current state, status, and usage statistics.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides a clear access precondition: a Proof account with PROOF_API_KEY set and server restart. It also explicitly warns that start_login does NOT open this tool, which is a useful when-not note, but it does not name alternative retrieval tools such as list_authorizations.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_circleA
Read-only
Inspect

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. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesCircle ID

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, but the description adds real behavioral detail: the return shape (members plus per-member channel presence booleans) and a deliberate security constraint ("an identifier is NEVER returned — SEC-PM-006"). The auth prerequisite is also disclosed, which is exactly the kind of context annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, followed by return contents and then access requirements, so the most important information comes first. The SEC-PM-006 reference and restart instructions add length but each earns its place; slightly dense for a single-parameter read.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description correctly shoulders the return-value burden by naming the members collection and the channel-presence booleans, plus the identifier omission. Auth setup and the sibling exclusion round it out, leaving only deeper field-level detail unstated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single id parameter already carries its 24-hex-char pattern in the schema. The description only restates "by ID" without adding format, sourcing, or lookup guidance beyond what the schema provides, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ("Get a Circle") and scopes it to a single record via "by ID", which cleanly separates it from list_circles, create_circle, update_circle and delete_circle without opening any schema. It also previews the payload (members, per-member channel presence booleans), so an agent knows what kind of retrieval this is.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear operational context for when the tool will work ("needs a Proof account... Set PROOF_API_KEY and restart this server") and gives an explicit exclusion relative to a sibling: "start_login does NOT open this tool." It stops short of stating when to prefer this over list_circles, so it is context-rich but not fully alternative-routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_confirmationA
Read-only
Inspect

Get a confirmation by ID. Returns the full confirmation including status, response, and proof token.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesConfirmation ID

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so safety is covered. The description adds value beyond that by disclosing the auth requirement and the return payload (status, response, proof token), which an agent needs to know before calling and interpreting results.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with the core purpose front-loaded and the access caveat clearly separated. The ACCESS note is slightly verbose but every clause is operative; nothing is padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only single-ID fetch with no output schema, the description supplies both return content and the auth prerequisite, which is enough for correct invocation. Only a pointer to related tools (e.g. wait_for_confirmation) is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with a single described 'id' parameter, so the schema carries the semantics. The description repeats 'by ID' without adding format, source, or lookup guidance, warranting the baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Get') and resource ('a confirmation') scoped 'by ID', which distinguishes it from sibling list_confirmations, create_confirmation, and get_confirmation_approval_link. It stops short of naming those siblings explicitly, so differentiation is inferred rather than stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides a real precondition (needs a Proof account, set PROOF_API_KEY and restart) and rules out a tempting wrong path ('start_login does NOT open this tool'). It does not clarify when to prefer this over get_confirmation_approval_link or wait_for_confirmation, but the access guidance is concrete and actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_current_userA
Read-only
Inspect

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. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=true, so the description carries the rest: it discloses the required auth context, the inability to authenticate via API key alone, and the login flow ordering. It does not describe pagination or the response shape, but for a no-argument self-read tool that gap is minor.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and the sibling routing are front-loaded in the first two sentences, which is the right ordering. The ACCESS block, however, restates the start_login/wait_for_login sequence already given above, adding length without new information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only, zero-parameter tool with no output schema, the description supplies everything an agent needs: what it returns at a high level, the mandatory login prerequisite, and the authenticated-vs-API-key access distinction. No material gap remains.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters, so the schema baseline is 4. The description correctly implies no inputs are needed and adds no contradictory parameter guidance.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb+resource ("Get the signed-in user's account details, plan and settings") with the subject-scope (signed-in user, not the API key's account) made explicit. It names the siblings that cover adjacent cases (get_self_api_key, get_settings), so an agent can distinguish it without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use (a login session is required) and when-not-to-use ("An API key alone cannot read this"), with named alternatives for the excluded case. The prerequisite call sequence (start_login then wait_for_login) is spelled out, leaving nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_default_templatesA
Read-only
Inspect

Get all default message templates. These are the built-in templates a project sends when it has no custom template of its own.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, and the description goes beyond that with non-obvious access context: it needs a Proof account, PROOF_API_KEY must be set with a restart, and start_login will NOT unlock it. That auth-disclosure is genuinely useful and not derivable from structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first sentence, and the access caveat is isolated in its own labeled paragraph. No filler, though the second paragraph is slightly long for a single prerequisite.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter read-only list tool with no output schema, the description covers purpose, scope, and access prerequisites. Nothing an agent needs to invoke it correctly is missing; only an explicit sibling comparison would push it higher.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline is 4 per the rubric. Schema coverage is 100% and there is nothing param-related the description needs to compensate for.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get all default message templates') and defines what 'default' means ('built-in templates a project sends when it has no custom template of its own'). This meaningfully distinguishes it from siblings like list_templates and get_template, though it never names them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'when it has no custom template' clause implies the motivating condition, and the access note clarifies the prerequisite. However, it never explicitly contrasts with list_templates/get_template to tell the agent which to call for custom vs. built-in templates.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_delegationA
Read-only
Inspect

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. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesDelegation ID (24-hex Mongo id or ph_dlg_<32 hex> handle)

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint, but the description goes well beyond that: it discloses that the response carries a stored publishable token plus DERIVED effective_status/is_valid, and explains the derivation rule (a revoked/suspended/expired control proof invalidates it; expires_at caps it independently). That derivation logic and the auth prerequisite are exactly the behavioral context structured fields cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads purpose, then the derived-status semantics, and ends with access prerequisites — a sensible ordering with no filler. The ACCESS sentence ('Set PROOF_API_KEY and restart this server, then call this tool again') is a touch verbose but operationally useful, so it earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the return-value burden and does so by naming the token and derived status fields. Combined with the explicit auth/access prerequisites, an agent has everything needed to call this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% for the single id parameter, including the regex pattern, so the schema already carries the semantics. The description's 'Mongo id or ph_dlg_* handle' merely restates the accepted formats, adding no syntax detail beyond it — baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Get one of your delegations') and the two accepted identifier forms (Mongo id or ph_dlg_* handle). The singular 'one of your delegations' cleanly separates it from list_delegations without needing to name it, so the agent can route correctly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear usage context via the ACCESS block: a Proof account is required, PROOF_API_KEY must be set, and notably start_login does NOT unlock this tool, which is a real exclusion that saves the agent a dead end. It stops short of routing to named alternatives (e.g. list_delegations vs verify_delegation), so it is not a full 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_dns_providersA
Read-only
Inspect

Get metadata for all supported DNS providers, including required credential fields and documentation links.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so safety is covered. The description adds value beyond that: it discloses the return content (credential fields, doc links) and the authentication requirement with two concrete paths (env var + restart, or start_login). The 'a session opens this tool' phrasing is slightly confusing but the auth behavior is disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first sentence and the access prerequisite follows. No filler, though the second sentence's clause about a session opening the tool is a bit awkwardly worded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the burden of describing return values and does so ('required credential fields and documentation links'). For a zero-param read-only tool this is largely sufficient; only the sibling routing is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline is 4. The description correctly implies a parameterless enumeration of all providers, adding nothing that conflicts with the empty schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Get metadata for all supported DNS providers') and specifies the payload ('required credential fields and documentation links'). This distinguishes it from mutation siblings like connect_dns_provider or create_dns_credential, though it never names an alternative explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The ACCESS paragraph gives a real prerequisite (a Proof account, via PROOF_API_KEY or start_login), which is genuine usage context. However, it does not state when to prefer this tool over connect_dns_provider/connect_cloudflare/connect_godaddy or that it is the discovery step preceding them, leaving the routing implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_domainA
Read-only
Inspect

Get details of a specific domain by ID, including verification status, DNS records, and provider connections.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesDomain ID

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With readOnlyHint=true already declaring the safe-read profile, the description adds real value: it lists what the payload contains (verification status, DNS records, provider connections) and documents a concrete auth prerequisite and recovery path (PROOF_API_KEY or start_login). It stops short of describing not-found/error behavior, but the auth detail is above the annotation bar.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in sentence one, with the access/remediation block clearly separated. The ACCESS paragraph is slightly long and repeats the account requirement, but every element (env var, restart, fallback login flow) is actionable rather than filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description compensates by summarizing the returned fields, and it covers the auth gate that would otherwise block invocation. It is complete enough to call correctly, with only minor gaps around failure modes.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

One parameter with 100% schema coverage, so the schema already documents 'id' as the Domain ID. The description only restates 'by ID' and adds no format, sourcing, or lookup guidance beyond the schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Get) and resource (domain) with a scoping key (by ID) and enumerates the returned content (verification status, DNS records, provider connections). This clearly distinguishes it from list_domains and the add/delete/verify_domain siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'by ID' phrasing implies you must already have a domain ID (from list_domains), which hints at usage order, but the description never explicitly says when to use this vs list_domains or the verify_* siblings. Usage is implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_hitlA
Read-only
Inspect

Get a HITL config by ID. Returns the config including channels, timeout, and status.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesHITL config ID

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds genuine behavioral context: the auth requirement (Proof account, PROOF_API_KEY) and the fields returned. This is real value beyond the annotation, though it omits error/not-found behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core action and return fields, then a separate ACCESS block for the prerequisite. Well-organized and mostly waste-free, though the quoted access note is slightly verbose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-param read-only lookup with no output schema, the description covers purpose, return fields, and auth prerequisites. An agent has what it needs to call it correctly; only edge cases (invalid ID) are unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with a single 'id' parameter already documented in the schema. The description's 'by ID' adds no meaning beyond what the schema provides, so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (get) and resource (HITL config), and 'by ID' implicitly distinguishes it from the list_hitls sibling. It also previews the return shape (channels, timeout, status). However, it never names a sibling explicitly, so the CRUD-family differentiation is only implied.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives a prerequisite (needs a Proof account, set PROOF_API_KEY, restart) and a when-not hint ('start_login does NOT open this tool'). But it never states when to prefer this over list_hitls or get_hitl_keys, so alternative selection is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_hitl_keysA
Read-only
Inspect

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. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
hitl_idYesHITL config ID

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint annotation, it discloses the full auth/profile requirement, the environment variable needed, and two distinct permission-scoped return shapes (private-key material vs public_key/kid only). This is exactly the kind of behavior an agent cannot derive from the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the purpose before the permission and access detail. Every sentence carries information; the ACCESS block is compact and non-redundant, though the two-paragraph split is slightly verbose for one operation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by enumerating the returned fields for both permission cases (public_key, encrypted private key, KDF salt, kid). Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter with 100% schema description coverage ('HITL config ID'), so the schema already carries the semantics. The description adds no additional syntax or format detail beyond the schema, matching the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb+resource: 'Get the encryption keypair for a HITL config,' immediately distinguishing it from siblings like upload_hitl_keys, delete_hitl_keys, and get_hitl. An agent knows exactly what operation this performs without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clarifies permission-gated usage (hitl:read vs confirmations:create), the account prerequisite, and notes that start_login does NOT open this tool — a genuinely useful negative. It stops short of naming sibling alternatives to use instead, so it is strong context without explicit routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_identity_challengeA
Read-only
Inspect

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. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesIdentity challenge ID

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint=true is covered by annotations, but the description adds substantial behavioral context: the full status enumeration (pending, confirmed, denied, cancelled, failed, expired, revoked, suspended), what the CONFIRM channel reveals, and the fact that proof token/proof_id only appear after a decision. It also documents an auth requirement (PROOF_API_KEY) and clarifies that start_login does not unlock this tool, which is valuable over the bare annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The first sentence front-loads purpose; the second enumerates outcomes and the polling directive; the third addresses auth prerequisites. Slightly dense but every sentence earns its place. The status list is long but genuinely useful. A minor deduction for packing the auth note into the same block without a clearer separation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, yet the description compensates by listing the possible status values and explaining when the proof token/proof_id become available. It also covers the auth requirement and rules out start_login as an unlock path. The main remaining gap is that it doesn't describe error behavior for an invalid/expired ID or polling cadence guidance.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single 'id' parameter is documented with a pattern in the schema itself. The description only restates that it takes an ID, adding no new syntax or format guidance, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb (Get) + resource (Proof-Me identity challenge) + identifier (by ID). It clearly distinguishes from sibling create_identity_challenge and the many get_* tools by specifying the Proof-Me challenge domain and the ID-based retrieval.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Poll this for resolution', which is a clear usage instruction and implies it's the read counterpart to create_identity_challenge. It does not, however, name a specific alternative tool or state when NOT to use it, so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_multi_channel_verification_statusA
Read-only
Inspect

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. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
group_idYesMulti-channel verification group ID (format vg_<hex>)

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint=true already covers the safety profile, and the description adds real context beyond it: the full set of returned fields and status values, the expires_at semantics, the auth prerequisite, and a non-obvious caller obligation to surface the link/SMS in reply text rather than only in a tool result. No return-format disclosure is needed since no output schema exists, but it provides it anyway.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads purpose, then behavior, then access in clearly separated blocks. The middle paragraph about reply text is unusually specific but purposeful, and each sentence carries distinct information; only slightly long.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description fully enumerates the return contents (aggregate status, winning_channel, per-channel statuses, proof token with expires_at) and covers the auth prerequisite and caller-side UX obligation. An agent has everything needed to call and interpret it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single parameter already documents the vg_<hex> format. The description restates 'by its group_id' without adding syntax or meaning beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Get) and resource (status of a multi-channel verification group) keyed by group_id. It also implicitly distinguishes itself from the crowded get_verification / get_verification_request / get_proof_status siblings by naming the multi-channel group scope explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context for use ('for a challenge you created') and a prerequisite (needs a Proof account), but does not explicitly route the agent away from alternatives such as get_verification or get_proof_status. Clear context without exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_my_profileA
Read-only
Inspect

Get the current user's primary profile. Returns profile details, theme, custom links, and public proof display settings.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint=true already covers the safety profile, so the bar is lower. The description adds genuine value by disclosing the return envelope (theme, custom links, public proof display settings) and the account/auth prerequisite, plus the non-obvious note that start_login does NOT unlock this tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the purpose, then separates the ACCESS prerequisite into its own labeled block. Every sentence carries information; the only mild slack is that the return-value list could conceivably be trimmed given how generic it is.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description usefully enumerates the returned data and flags the auth prerequisite, which is exactly what a 0-param read tool needs. The one gap is the absence of any sibling routing (get_profile vs get_current_user), which keeps it short of fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters, so there is nothing for the description to disambiguate; the baseline for a no-param tool is 4. No wording misleads about inputs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get the current user's primary profile') and enumerates the returned data (profile details, theme, custom links, proof display settings). The 'my/primary' framing implicitly distinguishes it from get_profile and list_profiles, but it never names those siblings explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The ACCESS block gives real operational guidance on preconditions (needs a Proof account, set PROOF_API_KEY, restart), which is useful. However, it offers no routing versus adjacent tools like get_profile, get_current_user, or list_profiles, so when-to-use-which is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_platform_summaryA
Read-only
Inspect

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. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
environmentNoScope request/channel/HITL metrics to test or production data (default: production)

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, but the description adds meaningful non-obvious behavior: the hitl_channels sub-object requires the hitl:read scope, and the tool requires a Proof account with PROOF_API_KEY configured plus a server restart. These auth/scope prerequisites are exactly the kind of context that prevents failed invocations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the valuable content (what the snapshot contains) in the first sentence and keeps the rest short. The ACCESS block is slightly verbose and arguably belongs in server documentation, but it is materially useful and does not obscure the main purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description correctly compensates by enumerating the returned data, and it covers the auth/scope prerequisites an agent needs before calling. For a one-optional-parameter read tool this is close to complete; only a note on pagination or freshness is absent, and neither appears relevant here.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single 'environment' parameter is fully documented in-schema (enum plus default). The description never mentions 'environment', so it adds no parameter semantics beyond the schema — baseline 3 is correct when the schema does all the work.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Get a one-call account snapshot') and then enumerates exactly what the snapshot contains: quota projection, request health, per-channel completion rates, HITL counts, API key count. This lets an agent distinguish it from siblings like get_usage, get_subscription, or get_current_user without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear context ('the same data the dashboard home renders') that tells the agent when this aggregate view is appropriate, and explicitly excludes a tempting but wrong path ('start_login does NOT open this tool'). It stops short of naming an alternative aggregate tool, but the routing guidance is solid.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_profileA
Read-only
Inspect

Get a specific profile by ID. Returns full profile details including theme, custom links, and verification display settings.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
profile_idYesProfile ID

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so safety is covered; the description adds value beyond that by disclosing the return surface (theme, custom links, verification display settings) and a concrete auth prerequisite with a remediation step. It does not mention pagination or error behavior, but for a single-record read that is minor.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and return contents, then a clearly separated ACCESS block. Slightly verbose for the amount of information conveyed, but every sentence is actionable and nothing is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description appropriately summarizes the return payload, and it covers the non-obvious auth barrier that would otherwise cause a failed call. Only the relationship to closely named siblings (list_profiles, get_my_profile) is left unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% for the single profile_id parameter, so the schema does the documentation work. The description only echoes 'by ID' and adds no format, source, or lookup guidance, putting it at the baseline for a fully-covered schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get a specific profile by ID') and enumerates what the response contains. It implicitly separates itself from the plural list_profiles, but never names siblings like get_my_profile or get_profile_assets, so an agent must infer which 'get profile' variant applies.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage context is implied by 'by ID' and there is a genuine negative hint ('start_login does NOT open this tool'), but the text is dominated by credential setup rather than when-to-choose-this-tool. No guidance on where to obtain a profile_id or when to prefer get_my_profile.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_profile_assetsA
Read-only
Inspect

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. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint annotation, the description discloses both the return content (assets eligible for public proof display) and a concrete auth prerequisite (Proof account, PROOF_API_KEY, restart). Disclosing auth requirements is exactly the added value annotations don't carry; pagination and result size remain unstated, keeping it from a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short, front-loaded blocks with the purpose first and the access caveat second. There is mild redundancy between 'can be displayed on the user's profile' and 'eligible for public proof display', but no padding otherwise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a no-param, no-output-schema read tool, the description covers purpose, return semantics, and the auth prerequisite that gates invocation. The access note is the key operational detail an agent would otherwise miss, so the definition is essentially complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, which is the baseline-4 case; there is nothing for the description to clarify beyond what the empty schema already communicates.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get available verified assets') and adds a scoping qualifier ('can be displayed on the user's profile' / 'eligible for public proof display'). It is clearly distinguishable from the broader list_assets/get_asset siblings by the profile-display scope, though it never names those alternatives explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives real usage context: the tool requires a Proof account, and it explicitly routes the agent away from start_login ('start_login does NOT open this tool') with the remedy (set PROOF_API_KEY and restart). It doesn't, however, contrast with sibling asset tools like list_assets or get_asset, so 'vs alternatives' is only partially covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_proof_statusA
Read-only
Inspect

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. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPublic proof handle (ph_ctl_* / ph_dlg_*) or verification ID

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the safety profile is covered; the description adds genuine value by disclosing the returned status vocabulary (active/suspended/expired/revoked) and clarifying that a live proof reads 'active'. The credential/auth prerequisite is also disclosed, which the annotations do not carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action and return semantics, then the access prerequisite as a separate short block. Nearly every sentence earns its place; only the slightly redundant restatement of the handle formats costs a point.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by enumerating the possible status values the tool returns. Combined with the stated auth requirement and identifier formats, an agent has everything needed to call this read-only tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single 'id' parameter is already documented with the exact same handle format text, so the description adds no syntax or format detail beyond the schema. Baseline 3 applies when the schema does all the parameter work.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get the status of a proof') and names the two accepted identifier families (ph_ctl_* / ph_dlg_* handles or verification IDs). It even enumerates the returned states, which cleanly separates it from siblings like validate_proof, revoke_proof, and list_revoked_proofs without opening their schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear usage precondition (a Proof account, PROOF_API_KEY set, restart) and an explicit exclusion ('start_login does NOT open this tool'), which heads off a plausible wrong path. It stops short of routing the agent to a sibling for adjacent needs (e.g., list_revoked_proofs), so it is context-rich but not fully alternative-aware.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_request_by_referenceA
Read-only
Inspect

Get a verification request by its reference ID (your unique identifier).

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
reference_idYesYour unique reference ID

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds context beyond the readOnlyHint annotation: the tool requires a configured Proof account/API key and cannot be unlocked via the login flow, which is actionable information an agent needs before calling. It does not describe error behavior for an unknown reference ID, keeping it short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two compact elements: a front-loaded one-line purpose and a clearly labelled ACCESS note. Nothing is wasted and the critical constraint is easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter read tool with no output schema, the definition covers lookup and access prerequisites, but says nothing about what a request contains or what happens when the reference ID is unknown. Adequate but with a clear gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With a single parameter and 100% schema description coverage, the schema fully documents reference_id. The parenthetical '(your unique identifier)' essentially restates the schema description, adding negligible new meaning, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (get) and resource (verification request) and adds the lookup key (reference ID), which distinguishes it from siblings that key off other identifiers. It does not, however, explicitly contrast itself with get_verification_request or list_verification_requests, so an agent must infer the boundary.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The ACCESS block gives a real precondition (Proof account, PROOF_API_KEY) and explicitly rules out one path (start_login does not open this tool), which is useful negative guidance. It still never states when to prefer this over get_verification_request, so usage is only partially covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_request_proofsA
Read-only
Inspect

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. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesVerification request ID

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true, so safety is already covered. The description adds real value beyond that: it discloses the output content (proof tokens usable for offline verification) and a hard auth gate requiring PROOF_API_KEY and a server restart, which an agent could not infer from annotations alone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short paragraphs, front-loaded with the core action followed by the access constraint. Nothing is padded, though the ACCESS note is slightly clipped in tone.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description usefully summarizes the return (proof tokens for offline verification), and covers the auth prerequisite. For a one-parameter read tool this is nearly complete; only sibling differentiation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% with a single, clearly documented 'id' parameter (Verification request ID). The description adds no syntax or format detail beyond the schema, so the baseline 3 for schema-driven params is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: fetching proof tokens for verified assets within a given verification request, and clarifies they enable offline verification. It is distinguishable from siblings like get_verification_request or list_verification_requests, though it does not explicitly name them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides a prerequisite and one exclusion: a Proof account with PROOF_API_KEY is required, and start_login does NOT unlock this tool. However, it never contrasts this with adjacent proof tools (validate_proof, get_proof_status, revoke_proof) or explains when to prefer it, so usage is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_self_api_keyA
Read-only
Inspect

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. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Consistent with readOnlyHint=true and adds behavioral facts the annotation cannot express: the key hash and full secret are never returned, and the failure mode for session-based auth is spelled out with the exact error code. It also discloses the account/setup prerequisite.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tightly packed sentences, front-loaded with what the tool returns, then safety scoping, then access requirements. No filler; every clause carries decision-relevant information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, yet the description enumerates the returned fields and the excluded secret material, plus the auth prerequisite and error behavior. An agent has everything needed to decide whether to call it and what to expect.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is no parameter semantics to document and the baseline is 4. The description instead usefully characterizes the response payload, though that belongs more to return-value than parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb+resource ('Get the calling API key's own redacted metadata') and enumerates the exact returned fields (id, name, key_prefix, environment, scopes, last_used_at, revoked_at, created_at). The 'own' scoping clearly separates it from the sibling list_api_keys, which returns keys broadly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly frames the use case ('agent self-inspection'), states the required auth mode, and gives the negative condition: a JWT session returns 400 api_key_required. It even preempts the most likely wrong move by noting start_login does NOT open this tool, and points to PROOF_API_KEY setup.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_sessionA
Read-only
Inspect

Get a session by ID. Returns the session status, verification details, and proof token if verified.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesSession ID

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, and the description adds real context beyond them: the authentication prerequisite and the fact that the proof token is only returned if verified. It does not mention rate limits or error behavior, keeping it below a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the purpose and return values, then the access caveat in a separate, clearly labeled block. No wasted sentences, though the restart-the-server instruction is slightly verbose for a tool description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description usefully summarizes what comes back (status, verification details, proof token). Combined with the auth requirement, an agent has what it needs to call this simple single-parameter read tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% for the single 'id' parameter, so the schema already fully documents it. 'By ID' in the description adds nothing the schema doesn't already say; baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Get a session by ID') and even previews the return payload (status, verification details, proof token). It does not explicitly distinguish itself from close siblings like wait_for_session or list_auth_sessions, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear precondition ('needs a Proof account. Set PROOF_API_KEY and restart this server') and an explicit exclusion ('start_login does NOT open this tool'). It never names the alternative to pick instead (e.g. wait_for_session for pending sessions), so it lacks the full when/when-not/alternatives package.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_settingsA
Read-only
Inspect

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 (project): 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. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, but the description goes well beyond: it discloses that the webhook signing secret is never returned to an API key, that webhook.secret_set is reported instead, and where the actual value can be seen. That is meaningful return-shape and security behavior an agent cannot infer from the annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with what is returned, then alternatives, then security caveat, then access prerequisites — a logical order. Each sentence carries non-redundant information, though the block is a touch long for a zero-argument getter; nothing is truly wasted but the access note is slightly verbose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description must carry return-value burden, and it does — listing the webhook endpoint, its event subscriptions, the default proof lifetime, and the secret_set surrogate. It stops short of describing the full response envelope, but for a settings getter the key fields are covered.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema is an empty object with zero parameters, so there are no parameter semantics to document; per the rubric a 0-param tool baselines at 4. The description correctly adds no parameter noise, and schemas add nothing an agent would miss.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ('Get account settings') and then enumerates exactly which settings — the outbound webhook endpoint with its event subscriptions and the default proof lifetime. It explicitly separates what it does NOT cover (branding, which is per sub-account) and names the sibling that covers it, so an agent can distinguish it from get_profile without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes branding reads to get_profile and points to update_settings for the rotated secret, giving named alternatives with the conditions that select them. The ACCESS block adds the prerequisite (Proof account, PROOF_API_KEY, restart) and explicitly warns that start_login does NOT open this tool, closing a common dead-end.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_subscriptionA
Read-only
Inspect

Get the current subscription details including plan, status, billing period, and usage limits.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=true; the description adds meaningful behavioral context beyond that (account prerequisite, API-key configuration, restart requirement, and the negative note about start_login). It discloses no return format or rate-limit behavior, but for a read-only getter the auth context is the salient trait.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the purpose sentence, then separates access prerequisites into a labeled ACCESS block, which is easy to scan. Slightly more text than strictly needed, but every sentence carries useful information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless read tool with no output schema and a single readOnly annotation, the description covers purpose plus the critical account/API-key prerequisites. The only omission is return shape, which is minor given the enumerated fields.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With zero parameters and 100% schema coverage, the baseline is 4. There is nothing further for the description to disambiguate, and it introduces no parameter-related confusion.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Get the current subscription details') and enumerates the returned fields (plan, status, billing period, usage limits), so an agent knows exactly what this tool surfaces. It does not explicitly differentiate itself from near-siblings like get_usage or get_platform_summary, which keeps it at a 4.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The ACCESS block gives concrete conditions for use: a Proof account is required, PROOF_API_KEY must be set and the server restarted, and it explicitly says start_login does NOT open this tool. This is actionable when/when-not guidance naming an alternative, though it stops short of describing broader routing vs other account tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_templateA
Read-only
Inspect

Get the template a sub-account (project) sends for a channel and message type: its custom template if set (scope "project"), otherwise the default (scope "default"). The response names the project in profile_id.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
channelYesMessage channel
profile_idNoThe sub-account (project) to act on; omitted → your key's project, or the primary project for an account-wide key
message_typeYesMessage type (e.g. verification_request, login_request)

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint already covers the safety profile, yet the description adds real value: the fallback behavior (custom if set, otherwise default), the scope labels returned, that the response names the project in profile_id, and a concrete access prerequisite including the explicit warning that start_login does NOT unlock this tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Core behavior is front-loaded in a single dense sentence, and the separate ACCESS paragraph is clearly demarcated. Slightly verbose but every element (scope, response field, auth prerequisite) earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description usefully discloses what the response contains (the resolving project in profile_id) and how to gain access, which is the main open question for this read tool. Only the routing against its three template-read siblings is left unstated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema already describes profile_id's fallback-to-default behavior and the channel enum, so the description is largely reinforcing existing text. Baseline 3 is appropriate; it does not add new syntax or format detail about message_type beyond the schema's examples.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get the template') scoped to a sub-account, channel and message type, and clarifies the resolution order (custom 'project' scope vs 'default'). It implies but does not explicitly name the sibling alternatives (get_default_templates, list_templates), so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the resolution semantics – you call it when you want the effective template that would actually be sent – but there is no explicit 'use this instead of X' routing against get_default_templates or list_templates. The ACCESS block explains prerequisites, not tool selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_usageA
Read-only
Inspect

Get usage metrics for the authenticated account. Shows verification counts, API calls, and quota usage.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
monthsNoNumber of months of history
periodNoMonth to query in YYYY-MM format (e.g. 2026-01)

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint=true already declares the safety profile, and the description adds genuinely non-redundant behavior: the account-level auth requirement and the fact that completing start_login will not unlock this tool. It does not mention rate limits, error modes, or pagination, but for a read-only metrics call those gaps are modest.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with the purpose front-loaded and the access constraint clearly separated by an 'ACCESS:' label, so the agent can scan it quickly. The environment-variable advice is slightly verbose for a mid-session caller, but it earns its place as a prerequisite.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only metrics tool with full schema coverage, the description covers what is measured and the account prerequisite. With no output schema, it should ideally say more about the returned metric shape or whether months/period are exclusive; that is the main residual gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% – both 'months' (1-12) and 'period' (YYYY-MM) are fully documented with format and bounds in the schema. The description adds nothing about them, notably not whether months and period are mutually exclusive or how they interact. Baseline 3 when the schema carries all parameter meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get usage metrics for the authenticated account') and enumerates the payload (verification counts, API calls, quota usage), so the agent knows what it returns. It does not distinguish itself from close siblings such as get_api_key_usage or get_platform_summary, so a routing agent must still guess which usage view it wants.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a concrete prerequisite (needs a Proof account, PROOF_API_KEY must be set with a server restart) and an explicit negative case: 'start_login does NOT open this tool,' which closes off a plausible but wrong path. It stops short of naming alternatives like get_api_key_usage or get_platform_summary for narrower/aggregate usage views.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_user_domain_verification_statusA
Read-only
Inspect

Get the current status of a domain verification session, including challenge details.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault
session_idYesDomain verification session ID

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With readOnlyHint=true already covering the safety profile, the description adds genuinely new context: the account/auth requirement, the API-key-or-login setup path, and the fact that challenge details are returned. It stops short of describing rate limits or pagination, so it is strong but not exhaustive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short paragraphs, front-loaded with the purpose and followed by the access caveat. Every sentence carries weight, though the ACCESS note is somewhat verbose for the information it conveys.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter read-only getter with no output schema, the definition covers purpose, return content, and auth prerequisites. The one notable gap is sibling disambiguation, which the description never addresses.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single session_id parameter is fully documented in the schema. The description adds no format, sourcing, or syntax detail beyond it, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb+resource ('Get the current status of a domain verification session') and adds scope detail ('including challenge details'). It does not, however, distinguish itself from nearby siblings like check_user_domain_verification or check_domain_verification, leaving the agent to guess which status-check applies.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The ACCESS block explains prerequisites (Proof account, PROOF_API_KEY, or signing in via start_login), which is useful setup context. But it never states when to choose this tool over the sibling status-checkers, so usage guidance is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_verificationA
Read-only
Inspect

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. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesVerification ID

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only say readOnlyHint=true, so the description carries real added weight: it discloses the auth prerequisite (needs a Proof account, set PROOF_API_KEY and restart) and clarifies that start_login does not grant access. It also describes the return contents, useful since no output schema exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the purpose and return contents, then layers the presentation warning and access requirement. Three short paragraphs with no filler, though the mid-paragraph UX aside is longer than strictly necessary for tool selection.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only single-param getter with no output schema, it covers auth setup, return shape, and the user-facing presentation caveat. It lacks any statement of error behavior for missing/invalid IDs, a minor gap given the simplicity of the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% for the single 'id' parameter, so the schema already documents it. The description's 'by ID' adds no syntax, format, or sourcing detail beyond what the schema provides, making the baseline 3 appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get a verification by ID') and previews the returned payload (status, channel, proof token). However, it never distinguishes itself from the many similar retrieval siblings such as get_multi_channel_verification_status, get_proof_status, or wait_for_verification.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides a workflow guideline about surfacing the actionable link/SMS to the user before calling, which is real context. But it offers no guidance on when to choose this over wait_for_verification or the multi-channel status tool, and the 'challenge you created' phrasing leaves the triggering condition implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_verification_requestA
Read-only
Inspect

Get a verification request by ID. Returns the request with all its asset verification statuses.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesVerification request ID

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only cover readOnlyHint=true, so the description carries the rest and delivers: it discloses what is returned (the request plus all asset verification statuses) and an auth/setup requirement plus the non-obvious fact that start_login will not unlock this tool. Missing only error/not-found behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose sentence followed by return content and a terse ACCESS note; every sentence carries information. The ACCESS block is slightly disjointed in tone but is not padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter read tool with no output schema, the description covers purpose, return payload, and the account/auth prerequisite that would otherwise cause a failed call. Only failure modes and the exact shape of the nested statuses are left unstated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter, and schema description coverage is 100%, so the schema already defines 'id' as the verification request ID. The description's 'by ID' phrasing confirms but adds nothing beyond the schema; baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get a verification request by ID') and clarifies the lookup key, which implicitly separates it from get_request_by_reference and list_verification_requests. It never names those siblings explicitly, so differentiation is inferential rather than stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a real precondition (needs a Proof account; set PROOF_API_KEY and restart) and one explicit negative ('start_login does NOT open this tool'), which is useful. However it never says when to prefer this over the closely related get_request_by_reference, get_request_proofs, or wait_for_request siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_verified_userA
Read-only
Inspect

Get a single verified user and their verifications by external user ID.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
external_user_idYesThe external user ID

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint=true already covers the safety profile, and the description adds real context beyond it: the tool requires a Proof account, depends on an environment variable being set with a server restart, and is explicitly not opened by start_login. Return shape and pagination are not described, but the access preconditions are actionable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core purpose in one sentence and segregates the access caveat into a labeled second block. Efficient overall, though the restart instruction is slightly more procedural detail than the selection task strictly needs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter read tool with full schema coverage and readOnlyHint annotations, the description supplies everything needed to attempt a correct call, including the non-obvious account prerequisite. No output schema exists, but the return format is mentioned in prose ('and their verifications').

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and there is only one parameter, so the baseline is 3. 'By external user ID' frames the lookup but adds no format, validation, or resolution detail beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (get), resource (a single verified user plus their verifications), and lookup key (external user ID). The word 'single' implicitly contrasts with list_verified_users, but that sibling is never named, so differentiation rests on inference rather than explicit statement.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides a prerequisite gate ('needs a Proof account, set PROOF_API_KEY and restart') and a useful exclusion ('start_login does NOT open this tool'), which tells the agent it cannot be unlocked via that flow. However, it gives no positive when-to-use guidance and never routes to alternatives such as list_verified_users or get_verification.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_webhook_deliveryA
Read-only
Inspect

Get details of a single webhook delivery attempt including request/response payloads and retry history.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesWebhook delivery ID

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint=true already covers the safety profile, so the bar is lower, and the description still adds real behavioral context: the prerequisites (account + PROOF_API_KEY env var, server restart) and the important negative fact that start_login does not unlock this tool. It does not mention pagination or error behavior for a missing/invalid delivery ID.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the purpose, then the access caveat — the ordering is right. The access note is procedural but earns its place because the start_login distinction is non-obvious. Slight redundancy in restating account setup as three steps.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description correctly compensates by naming what the call returns (payloads, retry history). Remaining gap is the absence of sibling-routing context versus list_webhook_deliveries and retry_webhook_delivery, which an agent in this large tool set would benefit from.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter with 100% schema description coverage, so the schema already documents 'id' as the webhook delivery ID. The description adds nothing about ID format or where to obtain it (e.g., from list_webhook_deliveries), making the baseline 3 correct.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get details of a single webhook delivery attempt') and enumerates the payload returned (request/response payloads, retry history). The word 'single' implicitly separates it from sibling list_webhook_deliveries, letting an agent pick the right tool without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The access guidance is explicit and useful ('needs a Proof account', PROOF_API_KEY, restart, and the counter-intuitive note that start_login does NOT open this tool). However, it never states when to choose this tool over list_webhook_deliveries or when to follow up with retry_webhook_delivery — the sibling-routing guidance is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_webhook_statsA
Read-only
Inspect

Get webhook delivery statistics including total deliveries, success/failure counts, and recent activity.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds genuinely useful, non-obvious behavioral context: a Proof account is required, PROOF_API_KEY must be set with a restart, and notably start_login does not unlock this tool. It does not mention pagination or rate limits, but the access disclosure is valuable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first sentence, which earns its place. The access note is useful but slightly clunky ('Set PROOF_API_KEY and restart this server, then call this tool again'), adding a redundant call-again instruction that could be tightened.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description partially compensates by listing the metrics returned. Combined with the explicit account/API-key prerequisite, an agent has enough to invoke it correctly, though return format specifics (e.g., shape of 'recent activity') remain unspecified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline of 4 applies. There is nothing for the description to disambiguate beyond the fact that no filtering arguments exist.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Get') and resource ('webhook delivery statistics') and enumerates the returned content (total deliveries, success/failure counts, recent activity). This clearly separates it from siblings like list_webhook_deliveries and get_webhook_delivery, which deal with individual deliveries rather than aggregates.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied (use for aggregate stats rather than per-delivery inspection), but the description never explicitly contrasts this with list_webhook_deliveries or get_webhook_delivery. The second sentence is an auth prerequisite, not a when-to-use rule, so guidance stays at the inferred level.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

invite_circle_memberAInspect

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. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesCircle ID
member_idYesMember ID to invite

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only say readOnlyHint=false and destructiveHint=false. The description goes well beyond by disclosing that the invite is single-use, that it returns Telegram/WhatsApp deep links and a QR code, and that the member binds their messenger identity by tapping the channel-matched link. The auth prerequisite is a genuinely useful operational detail. It does not cover invite expiry, re-invocation behavior, or whether an unused invite can be revoked.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with what the tool produces and what the caller gets back, then a separate ACCESS block for the prerequisite. Every sentence earns its place; no restating of the name or schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema, yet the description compensates by naming the return payload (deep links + QR code). Inputs are simple and fully documented. Lifecycle details (invite expiry, whether a new invite supersedes an old one, error cases) are the only notable gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% with two 24-hex-char ID parameters fully documented ('Circle ID', 'Member ID to invite'), so the schema carries the parameter burden. The description adds no format, constraint, or relationship detail about id/member_id beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Mint a single-use enrollment invite for a Circle member') and immediately clarifies the mechanism: channel-matched deep links plus QR code. An agent can distinguish this from the nearby add_circle_member / add_circle_member_channel siblings, which do not involve an invite artifact.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a concrete precondition (needs a Proof account; set PROOF_API_KEY and restart the server) and an explicit negative: 'start_login does NOT open this tool,' which prevents a plausible wrong path. It stops short of saying when to choose an invite over directly adding a member/channel, so an alternative-selection rule is still missing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_api_keysA
Read-only
Inspect

List all API keys for the authenticated account. Returns key metadata (not the secret key values).

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=true, so the description adds real value: it specifies that secret key values are NOT returned, and it discloses the auth/enablement prerequisite (Proof account, PROOF_API_KEY env or start_login flow). This is meaningful behavioral context beyond the annotation, though it doesn't cover ordering/pagination.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and return scope are front-loaded in the first two sentences, and the ACCESS block is set off clearly. The access instructions are somewhat verbose relative to the tool's simplicity, but every part is actionable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only listing tool with no output schema, the description covers purpose, return scope (metadata only), and auth requirements. It does not describe the shape of the returned list, but the key exclusion of secret values is the main thing an agent needs.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline of 4 applies. There is nothing for the description to disambiguate or document.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("List all API keys for the authenticated account") and clarifies the returned scope (metadata, not secret values). This distinguishes it from the singular get_self_api_key by implication, but it never names a sibling or scopes against get_api_key_usage, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides a genuine prerequisite section (needs a Proof account; set PROOF_API_KEY or sign in via start_login). However, it gives no guidance on when to call this versus create_api_key, revoke_api_key, regenerate_api_key, or get_api_key_usage — the reader must infer that from the verb.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_assetsA
Read-only
Inspect

List all verified assets for the authenticated user. Assets are verified identities (phones, emails, domains).

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number
typeNoFilter by asset type
limitNoItems per page
statusNoFilter by status

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only cover readOnlyHint, so the description usefully adds the authentication requirement (needs a Proof account, set PROOF_API_KEY, restart the server). This is real behavioral context beyond the annotation, though return shape and pagination behavior are not disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the purpose in the first sentence, then defines the resource and states the access constraint. No filler, though the three-part access instruction is somewhat verbose relative to the core listing description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema and no pagination guidance despite page/limit parameters, so an agent calling with defaults gets no expectation of result size or paging behavior. The access requirement is complete, but the listing semantics are under-specified for a paginated read tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% with two enums documented, so the schema already carries parameter meaning. The description adds nothing about type/status/page/limit semantics, and 'List all' slightly undersells the available filters. Baseline 3 for full schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List all verified assets') and helpfully defines what an asset is ('verified identities (phones, emails, domains)'). However, it does not differentiate from overlapping siblings like list_phones, list_emails, list_domains, or get_profile_assets, so an agent cannot tell whether this supersedes the type-specific listers.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides a clear access prerequisite and one explicit exclusion ('start_login does NOT open this tool'), which is genuine routing guidance. But it never says when to use this aggregate lister versus the per-type listers or get_profile_assets, so the main selection decision is left implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_authorizationsA
Read-only
Inspect

List authorizations with optional filters. Returns paginated results.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number
limitNoItems per page
phoneNoFilter by phone number
statusNoFilter by authorization status
channelNoFilter by channel

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so safety is covered; the description adds behavior not in the annotations — paginated result shape and hard authentication/setup requirements. No rate limits or failure modes are described, so it stops short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short, front-loaded blocks; the purpose and pagination note come before the setup instructions. The ACCESS wording ('Set PROOF_API_KEY and restart this server, then call this tool again') is slightly repetitive but each sentence carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a five-parameter, read-only, filter-and-paginate list tool with no output schema, the definition covers purpose, pagination, and access blockers. It omits what an authorization record contains and the default page/limit behavior, which would have made it fully self-contained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and two enum parameters are fully enumerated, so the schema carries the parameter burden. The description only says 'optional filters' without adding meaning (e.g., how filters combine, whether status/channel are conjunctive), so baseline 3 is correct.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List authorizations') plus scope ('with optional filters') and return shape ('paginated results'). An agent knows what it does, but there is no differentiation from adjacent siblings such as list_revoked_proofs, export_authorizations, or get_authorization.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives real preconditions (needs a Proof account, PROOF_API_KEY must be set, server restarted) and an explicit negative route: 'start_login does NOT open this tool,' which heads off a plausible wrong action. It still does not say when to pick this over export_authorizations or the single get_authorization call.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_auth_sessionsA
Read-only
Inspect

List all active authentication sessions for the current user. Shows session details including channel, user agent, and expiry. When called via API key, no session is marked as is_current.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=true, which already covers the safety profile. The description adds real behavioral detail beyond that: the returned fields, the is_current semantics under API-key auth, and the account/API-key requirement. It stops short of pagination or ordering behavior, but is notably richer than the annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and return content are front-loaded in the first two sentences, with the ACCESS block clearly separated. Slightly verbose, but every line (including the start_login warning) carries non-redundant information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and no parameters, the description carries the burden and mostly discharges it: it names the returned fields, discloses the auth prerequisite, and clarifies is_current behavior. Minor gaps remain around result ordering and whether pagination applies.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so per the rubric the baseline is 4. There is no parameter semantics to clarify, and the description correctly does not invent any.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (list) and resource (active authentication sessions) scoped to the current user, and previews the returned fields (channel, user agent, expiry). It implicitly separates itself from revoke_auth_session by verb, but does not explicitly name or contrast with any sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It supplies useful usage context: the auth prerequisite (Proof account, PROOF_API_KEY) and the disambiguation that start_login does NOT open this tool, which preempts a likely agent mistake. However, it never names a sibling alternative or states when-not to use it, so the guidance is context rather than true routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_circle_member_channelsA
Read-only
Inspect

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. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesCircle ID
member_idYesMember ID

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint, so the description carries most of the behavioral burden and does so well: it discloses the returned fields (channel, status, verified_at) and the security-relevant constraint that an identifier is NEVER returned (SEC-PM-006). It does not cover pagination or empty-result behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short, front-loaded blocks: the purpose and return-shape note first, then the access prerequisite. Every sentence carries weight, and the critical security note is prominent rather than buried.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description usefully specifies the return fields and the identifier exclusion, and it documents the auth prerequisite. Together with the 100%-covered schema, an agent has enough to invoke this correctly; only pagination/edge-case behavior is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and both parameters (id as Circle ID, member_id as Member ID) are fully documented with patterns. The description adds no additional meaning beyond the schema, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: list a Circle member's channels. An agent can distinguish this from siblings like list_circle_members, add_circle_member_channel, or remove_circle_member_channel without opening the schema. It stops short of naming those siblings explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides real usage guidance on the access path (requires a Proof account, set PROOF_API_KEY and restart, and start_login does NOT open this tool), which is valuable. However, it offers no when-to-use guidance relative to alternatives such as list_circle_members or list_circles.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_circle_membersA
Read-only
Inspect

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. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesCircle ID

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=true, but the description adds real behavioral context: the returned fields (has_telegram/has_whatsapp booleans, enrolled_phone_hint) and the security guarantee that a full identifier is NEVER returned. Auth requirements are also disclosed. It could still say more about pagination or empty-circle behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the purpose, then a short return-shape sentence, then a clearly labeled ACCESS block. Two compact paragraphs, all of it functional. The access note is slightly verbose but earns its place by preventing a predictable failure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description supplies the return shape and the security constraint on returned fields, plus the auth prerequisite. An agent has everything needed to decide to call it and to interpret the response correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% (the single 'id' parameter is documented as 'Circle ID' with a 24-hex pattern), so the schema already does the work. The description adds no syntax or format detail beyond that, which is the expected baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('List a Circle's members'), which clearly separates it from list_circles and get_circle in the sibling set. It also reinforces purpose by describing what each returned member carries. It does not explicitly name the alternatives it is not, so it falls just short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear prerequisite and routing rule: it needs a Proof account, PROOF_API_KEY must be set, and importantly 'start_login does NOT open this tool' — a non-obvious negative that prevents a failed call. It stops short of explicit when-to-use guidance vs list_circles/list_circle_member_channels.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_circlesA
Read-only
Inspect

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. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number (default 1)
limitNoItems per page (default 20, max 100)
statusNoFilter by status (archived excluded unless requested)
profile_idNoFilter by bound public profile (sub-account)
environmentNoFilter by environment (production or test)

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds real behavioral context beyond that: the default exclusion of archived items, the paginated return shape, and a hard access requirement (Proof account with PROOF_API_KEY, and the explicit note that start_login does not grant access). That last point is genuinely useful routing information.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences front-load the purpose and the archived-filter behavior, followed by a separately labeled ACCESS block. Every line earns its place; 'Returns paginated results' is the only mildly generic sentence, preventing a full 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 5 optional parameters, no output schema, and a read-only annotation, the description covers listing scope, default filtering, pagination, and authentication prerequisites. It stops just short of exhausting detail because it neither describes filter interactions nor explicitly confirms the shape of returned items.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter (page, limit, status, profile_id, environment) is already documented in the schema. The description's mention of status="archived" restates the schema's own note ('archived excluded unless requested') and adds no new syntax or constraint detail. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List Circles') and immediately scopes it with 'with optional filters'. This distinguishes it cleanly from the get_circle/create_circle/update_circle/delete_circle siblings without needing to name them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a concrete usage condition: archived Circles are excluded by default and status="archived" surfaces them. However it does not name alternatives (e.g. get_circle for a single Circle) or state when this tool should NOT be used, so it stops short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_confirmationsA
Read-only
Inspect

List confirmations with optional filters. Returns paginated results with status and HITL config filtering.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number
limitNoItems per page
statusNoFilter by confirmation status
hitl_idNoFilter by HITL config ID

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, and the description adds meaningful extras: results are paginated, filtering is supported on status and HITL config, and the tool requires a Proof account with PROOF_API_KEY configured and a restart. This is real context beyond the annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The functional purpose is front-loaded in the first sentence, and the access prerequisite is separated into its own labeled block. Slightly verbose on the login caveat but nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list tool with a fully-covered schema and no output schema, the definition covers filters, pagination, and the auth/setup precondition. Return shape is not described, but pagination behavior is disclosed, leaving only minor gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so page/limit/status/hitl_id are already fully documented in the schema, including the status enum and hitl_id pattern. The description's 'optional filters' phrasing adds no syntax or meaning beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List confirmations') and identifies the filterable dimensions (status, HITL config). It's clearly distinguished from get_confirmation/create_confirmation by the plural list framing, but it never explicitly names those siblings to route the agent.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use vs alternatives guidance; the agent gets no signal on how this differs from list_hitls or get_confirmation, or when a filtered list is preferred. The ACCESS block addresses setup prerequisites rather than selection between tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_delegationsA
Read-only
Inspect

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. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number
limitNoItems per page
statusNoFilter by the delegation's OWN stored status (active|revoked). Does NOT filter the derived effective_status — status=active still returns delegations whose control proof died, and ones that simply ran out.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only cover readOnlyHint=true; the description carries the rest, disclosing the derived-vs-stored status model, that status reads 'active' after control-proof revocation/suspension/expiry, that effective_status reflects the earlier of two lifetimes, and that tokens are omitted. This is exactly the behavioral context annotations do not provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose sentence, then everything else earns its place except the status discussion, which partially restates the schema's status description. Length is justified given the non-obvious derived-status semantics.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description still tells the agent what each item carries (stored status plus derived effective_status/is_valid) and what is missing (tokens). Access prerequisites are spelled out, so an agent has everything needed to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds genuine meaning by hammering the distinction between the stored-status filter and the derived effective_status, steering the agent away from a common misinterpretation of the status param. It slightly repeats the schema's own status note, holding it below 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List your own delegations') and immediately scopes it against the sibling get_delegation by saying tokens are excluded. It also rules out a third-party enumeration case, so the agent can distinguish this from adjacent list/get tools without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Names the alternative explicitly ('use get_delegation for the stored token'), states a case where no tool applies ('no public enumeration of third-party delegations'), and gives the access precondition (Proof account, PROOF_API_KEY). When-to-use and when-not-to-use are both present.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_dns_credentialsA
Read-only
Inspect

List all stored DNS provider credentials for the authenticated account. Returns credential metadata (not secret values).

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=true, so the description earns credit for adding that the response contains 'credential metadata (not secret values)' — a meaningful disclosure about what is and is not exposed. It also documents the account/auth prerequisite. It stops short of full transparency only because pagination or result shape details are absent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded in one sentence, followed by a compact ACCESS block that gives the two concrete setup paths. Both paragraphs carry useful information, though the ACCESS section is slightly verbose for a no-argument list tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no parameters and no output schema, the description covers what the agent needs: the result nature (metadata, no secrets) and the auth prerequisite. Only minor gaps remain, such as result volume or pagination behavior for an account with many credentials.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so per the rubric the baseline is 4. There is nothing for the description to clarify, and it introduces no misleading parameter implications.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (List) and resource (stored DNS provider credentials) with the scope 'for the authenticated account', which cleanly separates it from create_dns_credential and delete_dns_credential. It does not explicitly name a sibling or contrast with get_dns_providers, so it lands just short of full differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the read-only 'List' framing and by the sibling set (create/delete credentials exist for the mutations), and the ACCESS paragraph gives setup conditions. However, there is no explicit when-to-use/when-not or statement of when to prefer this over get_dns_providers or check_domain_credentials.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_domainsA
Read-only
Inspect

List all domains for the authenticated account. Returns domain metadata including verification status.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint=true already declares the safety profile, so the bar is lower; the description still adds genuine context by disclosing the auth requirement to reach this tool and by describing the returned content (domain metadata with verification status). It stops short of noting pagination or result limits, but the added auth and return context is substantive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action in one sentence, then a clearly separated ACCESS block. The access note is slightly verbose but earns its place because it names the exact remediation path (API key or start_login). No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only, zero-parameter list tool with no output schema, the description covers what is returned ('domain metadata including verification status') and how to gain access. Little an agent needs is missing; only sibling disambiguation and any pagination/count behavior are absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is no parameter semantics to explain; the baseline of 4 applies. The description correctly implies no arguments are needed to enumerate all domains.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List all domains') scoped to 'the authenticated account', plus what it returns ('domain metadata including verification status'). It reads clearly against siblings like get_domain or add_domain, though it never names them explicitly, so it falls short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The ACCESS block gives real preconditions (needs a Proof account, set PROOF_API_KEY or sign in via start_login). However it frames these as authentication steps rather than when-to-use-vs-alternatives guidance, and never distinguishes this from get_domain or list_verified_users. Usage is implied rather than directed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_emailsA
Read-only
Inspect

List all email addresses associated with the authenticated account.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true, so the safety profile is already covered. The description adds valuable auth context: it needs a Proof account, requires PROOF_API_KEY or an active session via start_login, and notes that a session opens this tool. However, it doesn't disclose return format, pagination, or whether it filters by profile — modest value beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the core action followed by the access constraint. No wasted words, though the auth sentence is slightly dense and could be split for a callout.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple zero-param list tool with no output schema, the description covers what it does and the prerequisite auth setup. It lacks any note on return shape (e.g., list vs paginated) or ordering, but that's a minor gap given the simplicity and annotations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters, so baseline 4 applies. The description correctly implies no filtering arguments are needed, and the schema has 100% coverage on an empty object. No missed parameter documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (List) and resource (email addresses) scoped to the authenticated account. An agent can immediately tell what it returns and distinguish it from siblings like list_phones or list_circles.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit when-to-use or when-not-to-use guidance. The access note implies this is a read operation on the current account, but nothing distinguishes it from alternatives or states prerequisites beyond the auth requirement.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_hitlsA
Read-only
Inspect

List HITL configs with optional filters. Returns paginated results.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number
limitNoItems per page
statusNoFilter by status (active or archived)
environmentNoFilter by environment (production or test)

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only supply readOnlyHint=true; the description adds real operational context — results are paginated, requires a Proof account with PROOF_API_KEY set, and notably that start_login does NOT unlock this tool, saving an agent a failed auth path.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the action and return shape, followed by the access precondition. The ACCESS block is slightly verbose but every sentence carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only, four-parameter list tool with no output schema, the definition covers purpose, pagination, and the auth prerequisite. Filter semantics (e.g. whether status and environment combine) are the only minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so page/limit/status/environment are fully documented in the schema. The description only restates 'optional filters' generically and adds no syntax, defaults, or filter-combination semantics beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb + resource ('List HITL configs') with a scope note ('with optional filters') that separates it from create_hitl/get_hitl/update_hitl/delete_hitl. It does not name a sibling explicitly, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the resource and the access prerequisite is stated, but there is no explicit when-to-use/when-not guidance or routing to alternatives among the many list_* siblings (list_templates, list_domains, list_circles).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_incoming_requestsA
Read-only
Inspect

List incoming verification requests where the authenticated user is the subject.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description earns credit by adding behavior an agent cannot see in the annotations: the call requires an authenticated Proof account, how auth can be satisfied (env var plus server restart, or a session opened via start_login), and that it must be re-called after authenticating. That is genuinely actionable context for a zero-param read tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the operation, followed by the access requirement. The auth sentence carries real weight rather than filler, though the em-dash aside about start_login is dense and could be tightened.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description is the only source for what comes back — and it says nothing about the shape of the request list, ordering, or whether results are paginated. Combined with no indication of how 'incoming' differs from the other request-listing siblings, the definition is adequate but leaves visible gaps. Annotations cover the safety profile, limiting the damage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes no parameters, so there are no semantics to document or clarify; per the baseline this sits at 4. The schema is an empty object and the description correctly does not invent parameter talk.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('List incoming verification requests') plus a scoping qualifier ('where the authenticated user is the subject'), which sharpens it against the many sibling list tools. It does not name or contrast the close siblings list_verification_requests or list_my_requests, so an agent must infer the distinction from position in the API rather than being told.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit prerequisite guidance ('needs a Proof account') with two concrete remediation paths (set PROOF_API_KEY, or sign in with start_login) — better than nothing. However, it offers no guidance on when to choose this tool over the adjacent list_my_requests / list_verification_requests tools, which is the primary selection ambiguity for an agent here.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_my_requestsA
Read-only
Inspect

List verification requests created by the authenticated user.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint=true already declares the safety profile, so the description's added value is the auth/session workflow (set PROOF_API_KEY or sign in via start_login, then re-invoke). That is real operational context beyond the annotation. It still says nothing about pagination or result size, keeping it below a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first sentence, with setup requirements quarantined in a labelled ACCESS block. Both sentences earn their place, though the ACCESS block is slightly longer than strictly necessary for the information conveyed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless, read-only list tool with no output schema, the definition covers what is needed: what it returns conceptually (the caller's own requests) and the prerequisite to run it. The absence of any hint about result volume or filtering is a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there are no argument semantics for the description to carry; the 4 baseline applies. Nothing here misleads about inputs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a clear verb and resource ("List verification requests") and adds a scope qualifier, "created by the authenticated user," the same scoping pattern the calibration example rewarded. It differentiates reasonably from siblings like list_incoming_requests, though it never names one explicitly, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The ACCESS block explains the precondition for calling it (a Proof account, API key, or start_login), which is genuine usage context. However, it gives no guidance on when to prefer this tool over near-neighbours such as list_verification_requests or list_incoming_requests, leaving the choice to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_phonesA
Read-only
Inspect

List all phone numbers associated with the authenticated account.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnlyHint=true, so the safety profile is covered; the description adds genuinely useful context by disclosing that authentication is required and that this tool is unavailable to a session-less caller. It still says nothing about ordering, pagination or how many results to expect.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core action is front-loaded in one sentence, with the access requirement isolated in a clearly labeled block. The ACCESS block is slightly wordy for a simple list tool, but no sentence is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no parameters and no output schema, the only real burden on the description was stating the scope and any preconditions, both of which it covers. It could go further by hinting at what a phone entry contains or whether the result set is bounded, but nothing essential to calling it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is nothing for the description to disambiguate and the baseline for a parameterless tool applies. No misleading parameter language is present.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource — 'List all phone numbers' — scoped to the authenticated account. Among the many adjacent list_* siblings (list_emails, list_api_keys, list_circles), the phone resource is unambiguous and there is no competing tool that lists phone numbers.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly states the prerequisite context ('needs a Proof account') and two concrete paths to satisfy it (set PROOF_API_KEY and restart, or sign in with start_login then retry). It does not state any when-not condition or contrast with siblings such as get_current_user, but the invocation path is fully spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_profilesA
Read-only
Inspect

List all profiles for the authenticated account. Returns all profiles including primary and secondary.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint=true already tells the agent this is a safe read, so the bar is lower; the description still adds value by disclosing the authentication prerequisite and the non-obvious fact that start_login does not grant access. It stops short of describing pagination or ordering of the returned list.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short blocks, front-loaded with what the call returns, followed by the access requirement. Every sentence carries information; the ACCESS paragraph is slightly verbose in its procedural detail but earns its place given the auth gate.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no parameters and no output schema, the description supplies everything an agent needs: the scope of the result set, that it is a safe read via annotations, and the account/key prerequisite. Nothing material is missing for a correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, which is the baseline-4 case; there is nothing for the description to disambiguate beyond confirming the listing is account-wide rather than filtered.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (List) and resource (profiles) scoped to the authenticated account, and clarifies the return set includes primary and secondary profiles. It does not, however, distinguish itself from nearby siblings like get_profile or get_my_profile, so an agent must infer when a single-profile fetch is preferred over this bulk list.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a real prerequisite ('needs a Proof account', set PROOF_API_KEY and restart the server) and explicitly rules out start_login as a way to unlock it, which is genuinely useful. But it never says when to choose list_profiles over get_profile, get_my_profile, or list_profile_templates, so alternative selection is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_revoked_proofsA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint=true annotation, the description discloses two non-obvious behavioral traits: a 5-minute cache lifetime and a 1-hour offline signature verifiability window. These are exactly the operational facts an agent needs and are not derivable from the annotations or schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with purpose and return value, with caching semantics trailing. Every sentence earns its place, though the final clause about offline verifiability is slightly dense and would read better split out.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and no parameters, the description carries the return-value burden itself ('signed list of all revoked proof IDs') and adds caching/offline behavior. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the schema has nothing to document and the description correctly adds no parameter detail. Baseline 4 applies for a parameterless tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource ('Get the revocation list') and immediately clarifies the return value ('a signed list of all revoked proof IDs') and its context ('for offline proof validation'). This cleanly separates it from the mutation sibling revoke_proof and the status reader get_proof_status.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear operational guidance on reuse: cache the fetched list for up to 5 minutes and re-fetch to observe new revocations. However, it never names an alternative tool or an explicit when-not-to-use condition, so routing guidance is contextual rather than comparative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_templatesA
Read-only
Inspect

List the custom message templates of one sub-account (project), organized by channel and message type. Templates belong to a project, not to the account: profile_id picks it — omitted, a project-bound key lists its own project and an account-wide key the primary project.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
profile_idNoThe sub-account (project) to act on; omitted → your key's project, or the primary project for an account-wide key

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint already covers the safety profile, and the description adds genuinely new behavioral context: it requires a Proof account, PROOF_API_KEY must be set with a server restart, and crucially that start_login does NOT unlock this tool. That last point prevents a plausible failed workflow. It does not describe the grouping/return structure in detail.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first sentence, with the parameter nuance second and access requirements last. Slightly verbose in the access paragraph, but every sentence carries operational value and nothing is redundant filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only single-optional-param lister with no output schema, the definition covers purpose, parameter fallback, and auth gating. It only gestures at the return shape ('organized by channel and message type') without describing the grouping or fields an agent would receive.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema description already documents the profile_id omission fallback in nearly identical wording, so the description largely restates structured data. Baseline 3 applies since the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List the custom message templates') plus scope ('of one sub-account (project), organized by channel and message type'). The word 'custom' and the plural listing distinguish it from siblings like get_template, get_default_templates, and render_template without needing the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains the profile_id fallback context at length (project-bound key vs account-wide key) and states the access precondition for calling it at all. It stops short of explicitly naming an alternative tool or a when-not-to-use rule, so no explicit sibling routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_verification_requestsA
Read-only
Inspect

List verification requests with optional filters. Returns paginated results.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number
limitNoItems per page
statusNoFilter by status. 'active' = live (not-yet-expired) pending or partial requests; persisted statuses are time-aware.
reference_idNoFilter by reference ID

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds genuinely useful behavioral context beyond annotations: results are paginated, and the tool is gated behind an API-key/account prerequisite rather than the login flow. It does not describe ordering or result size defaults, keeping it short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short, front-loaded sentences followed by a clearly separated ACCESS note. Nothing is padded, though the ACCESS phrasing ('call this tool again') is slightly redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only, filterable list tool with a fully documented schema and an explicit auth prerequisite, the description covers what an agent needs to invoke it. The main remaining gap is that it never clarifies how this listing differs from the sibling request-listing tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and all four parameters (page, limit, status, reference_id) are documented in the schema, including a detailed enum explanation for status. The description contributes nothing beyond that, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List verification requests') and adds that filters are optional and results are paginated. However, it does not distinguish this tool from close siblings like list_verifications, list_my_requests, or list_incoming_requests, leaving the agent to guess which list it wants.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The ACCESS paragraph gives a real prerequisite (needs a Proof account, PROOF_API_KEY set, server restart, and explicitly that start_login does not unlock it) and states filters are optional, but there is no guidance on when to choose this over the many other request-listing siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_verificationsA
Read-only
Inspect

List verifications with optional filters. Returns paginated results.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number
limitNoItems per page
statusNoFilter by status
channelNoFilter by channel
external_user_idNoFilter by external user ID

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so safety is covered. The description adds real value beyond that: the result set is paginated, and the tool is gated behind an API-key/account requirement that otherwise would only surface as a runtime failure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose sentence leads, followed by a short, clearly labeled ACCESS block. Every line is actionable; the only minor cost is that the restart instruction is phrased verbosely.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description usefully notes paginated results, and it fully explains the access prerequisite. For a zero-required-parameter read tool this covers what an agent needs, though it omits default page size and ordering behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with enum values for status and channel documented in the schema, so the baseline is 3. The description only hints at "optional filters" and pagination without adding format, default, or combination semantics beyond what the schema already states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ("List verifications") plus scope ("with optional filters") and output shape ("paginated results"). It does not explicitly distinguish itself from similarly named siblings such as list_verification_requests, list_revoked_proofs, or list_verified_users, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a concrete precondition (needs a Proof account; set PROOF_API_KEY and restart) and explicitly rules out a tempting alternative path by noting that start_login does NOT unlock this tool. That is genuine when/when-not guidance, though it says nothing about choosing between this and other list endpoints.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_verified_usersA
Read-only
Inspect

List verified users grouped by external_user_id. Shows all verifications per user.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number
limitNoItems per page

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint already covers the safety profile, but the description adds genuinely useful context beyond it: the credential precondition (PROOF_API_KEY + restart) and the explicit warning that start_login does not unlock this tool. This avoids a common failed-invocation path.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core behavior is front-loaded in the first sentence, followed by compact access notes. No wasted words, though the two-line ACCESS block is slightly repetitive in tone.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description usefully explains the grouping/return shape and the access prerequisite. It is complete enough for a simple paginated list tool, missing only page-size defaults and pagination edge behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so page and limit are already documented in the schema. The description adds nothing further about pagination limits or defaults, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List verified users') and adds scoping detail ('grouped by external_user_id', 'all verifications per user'). This distinguishes it from the singular get_verified_user sibling, though it never names that sibling explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The ACCESS block gives an important precondition (needs a Proof account, PROOF_API_KEY must be set) and warns that start_login does not open this tool. However, it offers no guidance on when to prefer this over list_verifications or get_verified_user, so alternative routing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_webhook_deliveriesA
Read-only
Inspect

List webhook delivery attempts with pagination and filtering. Shows delivery status, response codes, and timestamps.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number
limitNoItems per page
statusNoFilter by delivery status
event_typeNoFilter by event type (e.g. verification.completed)

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=true, and the description stays consistent with that. It adds genuinely non-obvious behavioral context: the tool requires a Proof account, needs PROOF_API_KEY set with a server restart, and explicitly notes that start_login does NOT unlock this tool — an important failure mode for an agent. It stops short of describing pagination behavior or whether results are ordered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short paragraphs, front-loaded with the purpose and followed by the access prerequisite, with no filler. The only minor cost is that the ACCESS block, while valuable, is somewhat abrupt and could be tightened, but nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only, four-parameter list tool with 100% schema coverage and no output schema, the description covers purpose, filtering, and the auth prerequisite that would otherwise cause a silent failure. What is missing is the relationship to the sibling single-delivery and stats tools and any pagination semantics.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all four parameters (page, limit, status, event_type) are already documented in the schema, including the enum values and example event type. The description only restates 'pagination and filtering' generically, adding no syntax or constraint detail beyond the schema. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence names a specific verb and resource ('List webhook delivery attempts') and adds scope details (pagination and filtering) plus the payload contents shown. It is clear, though it never names the sibling get_webhook_delivery or explains how single-delivery lookup differs from listing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied by the verb 'list' plus the mention of filtering; there is no explicit statement of when to call this versus get_webhook_delivery, get_webhook_stats, or retry_webhook_delivery. The ACCESS block does give a clear precondition (a Proof account with PROOF_API_KEY), which is useful routing guidance but not when-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

poll_chat_id_discoveryA
Read-only
Inspect

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. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
tokenYesDiscovery token from create_chat_id_discovery

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

It discloses the completion condition (user must interact with the bot), the return payload, and an explicit auth prerequisite (needs a Proof account / PROOF_API_KEY, and that start_login does not open this tool). The only gap is polling cadence/timeout behavior, but the readOnlyHint annotation already covers the safety profile and the description adds real operational context beyond it.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and return values are front-loaded in the first sentence, followed by the user-facing UX caveat and an ACCESS block. It is slightly long, but each block (return contract, UX warning, auth) earns its place and none is redundant with the schema or annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description correctly specifies the return fields, and it covers the auth prerequisite and the prerequisite flow (token from create_chat_id_discovery). What remains thin is polling/timeout guidance and the contrast with wait_for_chat_id_discovery, but overall an agent has enough to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single token parameter is documented in the schema as coming from create_chat_id_discovery. The description adds no syntax, format, or expiry detail beyond that, so the baseline 3 applies when the schema carries the parameter meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Poll') and resource ('chat ID discovery token') and describes what comes back (Telegram chat ID, user ID, username). It is distinguishable from create_chat_id_discovery by the verb, but it never explicitly contrasts with the sibling wait_for_chat_id_discovery, leaving the poll-vs-wait distinction to inference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description ties the tool to create_chat_id_discovery as the token source and gives a when-to-prepare rule about surfacing links to the user, which is genuinely useful context. However, it never says when to prefer this over wait_for_chat_id_discovery, so the key selection decision between the two polling/waiting siblings is left to the agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

preview_templateA
Read-only
Inspect

Preview a template with sample data before saving, as a sub-account (project) would send it. Shows how the message will look with placeholder variables filled in.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYesTemplate body text
channelYesMessage channel
subjectNoEmail subject line
profile_idNoThe sub-account (project) to act on; omitted → your key's project, or the primary project for an account-wide key
button_textNoButton text
message_typeYesMessage type
button_url_templateNoButton URL template

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint=true already covers the safety profile, but the description adds real context beyond annotations: it requires a Proof account, needs PROOF_API_KEY set with a server restart, and explicitly warns that start_login does NOT unlock this tool. It also discloses that placeholder variables get filled in, which tells the agent what the preview actually contains.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first sentence, with the access caveat isolated in a second block so it is easy to scan. Only minor redundancy ("Shows how the message will look" largely restates "preview with sample data").

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only preview tool with full schema coverage and no output schema, the description covers what it does, the pre-save timing, and the account/key prerequisite. Missing only return-content detail, which is largely excused by the absence of an output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter including channel, message_type enums and profile_id is already documented in the schema. The description adds only the notion that output is rendered as a sub-account would send it, which loosely relates to profile_id but adds no syntax or format detail beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ("Preview a template with sample data") and adds scope ("as a sub-account (project) would send it", "before saving"). It broadly distinguishes itself from render_template via the pre-save preview framing, but never names the sibling that a confused agent would most likely reach for.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"before saving" implies the use window (prior to update_template), and the access note gives a hard prerequisite. However, no alternative tool is named and no explicit when-not guidance is offered, leaving the agent to infer whether render_template or get_template is the better fit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

regenerate_api_keyA
Destructive
Inspect

Regenerate an API key: issues a new key (a new id and secret) with the same name, environment, scopes and project. 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. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesAPI key ID to regenerate

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the destructiveHint=true annotation by disclosing that the old key stops working immediately, that the new secret is returned ONLY in this response, that it is visible in AI conversation context, and that replaced_key_ids preserves request/usage history. These are high-value operational and security facts an agent cannot infer from annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then consequences, then the 2FA steps and access notes. Every sentence carries weight, though the multi-section layout (note + agent usage + access) makes it longer than most definitions; still efficient for a destructive multi-step operation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, 2FA-gated tool with no output schema, the description fills all gaps: return semantics (secret shown once, new id), side effects (old key dies), and the exact 2FA/auth path. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% for the single id parameter, so the schema already documents it fully and the baseline is 3. The description adds only indirect context ("use the id in this response from now on") rather than new meaning about the input id itself.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (regenerate) and resource (API key), and pins down the exact semantics: new id and secret, same name/environment/scopes/project. It distinguishes itself from siblings like create_api_key and revoke_api_key by describing what is preserved and what changes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides an explicit prerequisite workflow (start_2fa with action_type "api_key_regenerate", wait, poll get_2fa_status until verified) and states what to do with the response id. The access section adds the auth condition (Proof account / PROOF_API_KEY / start_login), so when-to-use and prerequisites are fully covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

remove_circle_memberA
Destructive
Inspect

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. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesCircle ID
member_idYesMember ID to remove

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true, but the description goes well beyond them by naming exactly what is destroyed: the member's channels and any live authorizations routed through them. It also states the auth requirement and the recovery step (set key and retry). This is rich, non-redundant behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences front-load the operation and its destructive scope, followed by a compact access block. No filler; every sentence carries actionable information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive two-param tool with no output schema, the description covers purpose, side effects, and access prerequisites, which is everything an agent needs to call it safely. Nothing material is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both parameters (id, member_id) are already documented with patterns. The description does not add syntax or format detail beyond the schema, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource combination ('Remove a member from a Circle') and immediately scopes the effect (channels deleted, authorizations revoked). This clearly distinguishes it from siblings like add_circle_member, remove_circle_member_channel, and delete_circle.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The ACCESS block gives explicit prerequisites (Proof account, PROOF_API_KEY, restart) and an exclusion ('start_login does NOT open this tool'). It does not, however, contrast use against close siblings such as remove_circle_member_channel or delete_circle, so full alternative-routing guidance is absent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

remove_circle_member_channelA
Destructive
Inspect

Remove a channel from a Circle member. Removing the last channel is allowed (the member simply becomes unreachable).

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesCircle ID
member_idYesMember ID
channel_idYesChannel ID to remove

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, so the destructive nature is covered. The description goes beyond them by disclosing the consequence of removing the final channel (the member becomes unreachable) and the authentication requirement with its remediation step — real behavioral context an agent needs before invoking a destructive tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two compact blocks: the operation plus its edge case first, then the access requirement. Front-loaded and free of filler, though the access paragraph is largely boilerplate that could be shorter.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 3-parameter destructive mutation with no output schema, the definition covers the key unknowns: the last-channel edge case and the account/API-key prerequisite. It is essentially complete, with only the response behavior left unspecified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and all three parameters (id, member_id, channel_id) carry clear descriptions and ID patterns, so the schema does the heavy lifting. The description adds no parameter-level detail, making the baseline 3 appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Remove a channel from a Circle member'), which is immediately distinguishable from the sibling add_circle_member_channel. It does not explicitly name the counterpart tool, but the inverse verb makes the intent unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description supplies a genuine precondition (needs a Proof account with PROOF_API_KEY, and start_login will not surface this tool) plus an edge-case rule that the last channel may be removed. However it offers no when-to-use/when-not guidance relative to alternatives like remove_circle_member, leaving the routing implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

remove_emailA
Destructive
Inspect

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. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesEmail record ID

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Far exceeds the annotations (destructiveHint=true, readOnlyHint=false) by enumerating concrete side effects: revokes proofs, declines pending confirmations, relocates Lookalike Watch alerts, deletes the record, signs out other devices, and names the new primary email. It also states irreversibility ('Cannot be undone.') and the 2FA/auth requirement, which annotations do not cover — exactly the kind of context the bar asks for.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action, followed by effects, refusal cases, and access requirements in a logical order; every sentence carries operational weight. It is dense but not padded, with only mild verbosity in the ACCESS paragraph.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex, irreversible mutation with one parameter, no output schema, and only destructive annotations, the description supplies everything an agent needs: preconditions, full effect list, refusal conditions, auth/access requirements, and irreversibility. Nothing material is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% for the single 'id' parameter, so baseline is 3. The description adds real semantic value by clarifying that this same email id must appear in the 2FA code's 'targets' array, linking the parameter to a required prerequisite flow rather than mere schema restatement.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence states a specific verb and resource ('Remove an email address from the account'), cleanly distinguishing it from siblings like set_primary_email, remove_phone, and revoke_proof. An agent can identify the operation without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit preconditions (needs a Proof account, requires start_2fa_for_action with action_type email_remove and targets [this email id]) and explicit refusal conditions (the signed-in address, or your only way to sign in). It does not, however, route the agent to an alternative tool (e.g., set_primary_email) when the target is ineligible, so usage guidance is clear but not fully comparative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

remove_phoneA
Destructive
Inspect

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. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPhone record ID

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true, but the description goes far beyond them: it lists revoked proofs and consents, declined pending confirmations, flagged approver-less setups, deleted messenger links, sign-out of other devices, new primary selection, and states 'Cannot be undone.' This is unusually rich behavioral disclosure for a mutation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action and the mandatory 2FA prerequisite before the effect list and refusal rules. The effects are packed into one long run-on sentence, which is dense but every clause conveys a distinct consequence, so little could be cut without losing value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers action, prerequisite auth flow, exhaustive side effects, refusal conditions with remedies, irreversibility, and access setup. With no output schema needed for a delete operation, nothing an agent needs to invoke this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter ('id', Phone record ID) with 100% schema description coverage, so the schema already carries the semantics. The description adds only the indirect hint that this id is the target used in the 2FA code flow, not extra format or sourcing detail. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Remove a phone number from the account') and is trivially distinguishable from siblings like remove_email or set_primary_phone. The scope of what is removed and the effects are made explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states the prerequisite 2FA flow (start_2fa_for_action with action_type phone_remove and targets [this phone id]) and enumerates the exact conditions under which the call is refused (signed-in number, only sign-in method, last phone with active circles), including the remediation ('add another phone first, or archive the circles').

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

render_templateA
Read-only
Inspect

Render the template a sub-account (project) sends — its custom template, otherwise the default — with provided variables. Returns the fully rendered message content.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
channelYesMessage channel
variablesNoVariables to substitute into the template
profile_idNoThe sub-account (project) to act on; omitted → your key's project, or the primary project for an account-wide key
message_typeYesMessage type

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint=true already covers the safety profile, so the bar is lower, and the description clears it by disclosing the template resolution fallback chain and the auth prerequisite plus an explicit dead-end warning about start_login. It does not describe output shape beyond 'fully rendered message content', but that is minor for a read-only renderer.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The functional sentence is front-loaded with zero waste, and the access note is separated out so it can be skimmed or skipped. The PROOF_API_KEY/restart sentence is slightly procedural for a tool description but earns its place by preventing a failed call.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only renderer with no output schema, the description covers resolution logic, inputs, the return value, and the auth gate. What remains unstated — pagination/format of rendered content and behavior when a variable is missing — is modest relative to the structured fields available.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents channel, message_type, profile_id and each variable. The description only echoes 'with provided variables' and adds no format, required-variable, or fallback behavior beyond what the schema states — the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Render the template') and adds resolution semantics — the sub-account's custom template, otherwise the default — which an agent cannot get from the name alone. It stops short of distinguishing itself from the closely-named sibling preview_template.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives actionable access guidance (needs a Proof account, set PROOF_API_KEY and restart, and start_login does NOT open this tool), which prevents a wasted attempt. However, it offers no guidance on when to prefer this over preview_template, which is the nearest alternative in the sibling list.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

request_hitl_authorizationAInspect

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. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesHITL config ID to request authorization for

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only say readOnlyHint=false and destructiveHint=false, but the description discloses a large amount beyond that: the request is delivered to each channel with no link to show, the returned `authorizations` array shape, the meaning of 'pending' vs 'active' per entry, the misleading `message` on the empty branch, and the hang risk when no recipient resolves. This is exactly the kind of non-obvious behavior that prevents a bad call.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The action and its dependency are front-loaded in the first sentence, and most of the length is load-bearing (status interpretation, empty-array trap). It is on the verbose side and the 'Agent usage' paragraph could be tightened, but every clause conveys a distinct behavior rather than padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the full burden of return-value explanation and does so thoroughly, including the per-entry fields and the dangerous empty-array interpretation. It also documents the Proof account / PROOF_API_KEY access requirement and the fact that start_login does not unlock this tool, which closes the two gaps that would otherwise cause repeated failed calls.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is a single parameter with 100% schema description coverage, so the schema already carries the semantics and the baseline is 3. The description only reinforces that the id is a 'HITL config' without adding format, sourcing, or lookup guidance beyond what the schema states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource — 'Request authorization for a HITL config' — and immediately clarifies the mechanism ('sends consent requests to all configured channels'). The reader can distinguish it from siblings like create_authorization, create_confirmation, and get_hitl without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states the ordering constraint against a named sibling: 'This must be completed before create_confirmation will work for this HITL config.' It also gives the post-call condition ('you can proceed once the user confirms they have approved'), so both the trigger and the exit condition are documented.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

resend_domain_emailAInspect

Resend the domain verification email. Rate limited to 3 requests per minute.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesDomain ID
email_prefixNoEmail prefix to resend verification to

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false and destructiveHint=false, so the mutation/safety profile is covered. The description goes beyond that with a concrete rate limit ('3 requests per minute') and explicit authentication requirements, both of which meaningfully affect how and when an agent should invoke it.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then rate limit, then a clearly labeled ACCESS block. Every sentence is functional. The ACCESS sentence is slightly long, but the structure is easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, but this is a simple fire-and-forget action, so return values matter little. The description supplies the auth prerequisites and rate limit an agent needs to call it correctly, leaving only sibling disambiguation as a gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with both 'id' (Domain ID) and 'email_prefix' (enum of admin/administrator/etc.) documented in the schema itself. The description adds no parameter meaning beyond that, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Resend the domain verification email'. This is clear and unambiguous about the action. However, it does not differentiate itself from siblings like start_domain_email_verification or resend_verification, so an agent must infer which of several resend/verification tools applies.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied (resend an already-initiated verification email) and the ACCESS paragraph gives useful prerequisite context. But it never states when to use this versus siblings such as start_domain_email_verification, resend_verification, or resend_email_otp.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

resend_email_otpAInspect

Resend the OTP code for an in-progress email addition.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault
session_idYesAdd-email session ID

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false / destructiveHint=false, so the safety profile is largely covered. The description adds real value by stating the auth prerequisite and the restart/re-login workaround, but omits key behavioral traits for an OTP resend: whether rate limits apply, and whether a new code invalidates the previous one or its expiry window.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The action is front-loaded in one short sentence, and the prerequisite note is separated into a distinct ACCESS block. The phrasing 'a session opens this tool — then call this tool again' is slightly circuitous but still compact.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter tool with no output schema, the description covers what the tool does and the auth gate, which is the main thing an agent needs. It stops short of describing the outcome of a successful resend (new code delivery, expiry, invalidation of the old code) or failure modes for an expired session.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter (session_id) and schema description coverage is 100%, so the schema already documents it. The description adds no format, sourcing, or validity detail for the session ID beyond implying it comes from the add-email flow. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (resend) and resource (OTP code) scoped to 'an in-progress email addition', which differentiates it from siblings like resend_verification or resend_domain_email. It does not name those siblings explicitly, so the distinguishing is by scope rather than routing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Establishes the context of use (only within an already-started add-email flow) and the prerequisite (a Proof account plus PROOF_API_KEY, or an active session from start_login). It does not say what to do when no session is in progress or how this differs from other resend tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

resend_verificationAInspect

Resend a verification message (email channel only). Generates and sends a new code.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesVerification ID

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations establish a non-read-only, non-destructive write, so the bar is lower; the description still adds real context: email-channel scope, that a NEW code is generated and sent, and that a Proof account with PROOF_API_KEY is required. It omits whether the previous code is invalidated, code expiry, and rate limits, which matter for a resend operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose sentence followed by a compact ACCESS block; every line is relevant, including the 'start_login does NOT open this tool' disambiguation. Slightly verbose in the setup instructions but not wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter mutation with no output schema, the description covers purpose, channel, and auth prerequisites, which is reasonable. It leaves out the behavior an agent would want before triggering a new verification code: whether the prior code is invalidated, expiry, and any send limits.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single 'id' parameter is documented as 'Verification ID', so the schema carries the load. The description adds no syntax, format, or sourcing guidance for that ID, making the baseline 3 correct.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Resend a verification message') plus the scope qualifier '(email channel only)' and the effect 'Generates and sends a new code'. It does not differentiate from the closely named siblings resend_email_otp and resend_domain_email, so an agent may hesitate between them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied – you resend when a code needs regenerating – but the description never states when to choose this over resend_email_otp, resend_domain_email, or create_verification. The ACCESS block addresses how to enable the tool, not when it is the right tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

retry_webhook_deliveryAInspect

Retry a failed webhook delivery. Creates a new delivery attempt with the same payload to the configured endpoint.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesWebhook delivery ID to retry

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=false and destructiveHint=false; the description adds real value beyond them by explaining that a brand-new attempt is created reusing the same payload against the configured endpoint, and by flagging the account/auth requirement and restart step needed to use it.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core action in the first sentence, then the mechanism, then a clearly delineated ACCESS block. Every sentence earns its place; only the mechanism line is slightly redundant with the headline.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter mutation tool with no output schema, the description covers the action, the resulting side effect, and the authentication prerequisite. Return value details are correctly omitted, though noting what a retry returns (or that it can fail again) would round it out.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% for the single 'id' parameter, so the schema already documents it ('Webhook delivery ID to retry'). The description implies the ID references the failed delivery but adds no format or sourcing detail beyond the schema, matching the baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Retry a failed webhook delivery') and goes further to explain the mechanism: it 'Creates a new delivery attempt with the same payload to the configured endpoint.' This clearly separates it from siblings like get_webhook_delivery and list_webhook_deliveries, which only inspect deliveries.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context: only failed deliveries are retried, and it discloses a prerequisite (a Proof account with PROOF_API_KEY set). It does not, however, point the agent to a sibling for locating a failed delivery ID or state exclusions, so it stops short of full when/when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

revoke_api_keyA
Destructive
Inspect

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. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesAPI key ID to revoke

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false, and the description goes well beyond them: it states the effect is immediate, that it is irreversible, that 2FA is mandatory, and which account/session state is required. That is rich behavioral disclosure that changes how an agent plans the call.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and irreversibility, then clearly labeled "Agent usage" and "ACCESS" blocks. The auth flow is worth its length, though the generic server-level ACCESS paragraph (env var setup, restart) reads as boilerplate that may be repeated across every tool in this server.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter destructive tool this covers purpose, irreversibility, and the full 2FA/auth prerequisite chain. The only omission is any indication of what a successful revoke returns, which is minor given the absence of an output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is a single parameter (id) whose schema description coverage is 100% ("API key ID to revoke"). The description's "by ID" adds nothing beyond the schema, so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (revoke), resource (API key), and lookup key (by ID), then immediately clarifies the effect: the key stops working at once. An agent can distinguish this from create_api_key, regenerate_api_key, and list_api_keys without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly lays out the required precondition sequence — start_2fa with action_type "api_key_revoke", user verification, polling get_2fa_status until "verified", then this call — and adds an access precondition (Proof account / start_login session). This is exactly the when-and-how-to-use guidance an agent needs before invoking.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

revoke_assetA
Destructive
Inspect

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. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesAsset ID

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false and destructiveHint=true, so the destructive nature is covered structurally. The description goes well beyond that by disclosing irreversibility, that domain delegations are revoked for good and not restored by re-verification, propagation timing (~1 minute for status-checking verifiers, token lifetime for signature-only), and the fresh-proof behavior on re-signin — genuinely rich context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and scope, then layered with prerequisites, edge-case behavior, and alternatives. It is dense and every sentence carries information, though the multiple parenthetical asides and long final clauses make it heavier than strictly necessary.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, irreversible operation with no output schema, the description covers auth requirements, the full 2FA flow, per-asset-type consequences, propagation timing, and reversibility. An agent has everything needed to call it correctly and warn the user.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% for the single 'id' parameter, so the schema already documents it. The description references the asset id only obliquely ('targets [this asset id]') without adding format or sourcing guidance beyond the schema, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Revoke the proofs of one of your assets'), names the asset types covered, and immediately distinguishes scope from siblings by noting 'the asset stays on the account.' An agent can separate it from revoke_proof and suspend_proof without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use with named alternatives and conditions: use revoke_proof for key-only connections, suspend_proof for a temporary stop on a domain proof. It also spells out the owner-only prerequisite and the exact 2FA call sequence (start_2fa_for_action with action_type revocation_bulk, wait_for_2fa, call again).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

revoke_authorizationA
Destructive
Inspect

Revoke an active or pending authorization. Only authorizations with status "active" or "pending" can be revoked.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesAuthorization ID to revoke
reasonNoReason for revocation

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false, so the mutation hazard is covered. The description adds genuinely useful behavior beyond that: the status eligibility constraint and the PROOF_API_KEY account requirement (and the warning that start_login does not satisfy it). It omits what happens post-revocation (reversibility, return shape), keeping it from a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core action and its eligibility constraint are front-loaded in the first sentence, with the access prerequisite kept separate. Slightly verbose in the ACCESS block, but every element earns its place by preventing a failure mode.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive mutation with full annotation coverage and no output schema, the description covers eligibility, access prerequisites, and the sibling trap (start_login). Return behavior is not described, but with no output schema that is a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both 'id' and 'reason' are already documented in the schema. The description adds no syntax, format, or constraint detail beyond that, making the baseline 3 appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Revoke an active or pending authorization') and scopes it by eligible statuses. It does not explicitly differentiate from the many sibling revoke_* tools (revoke_proof, revoke_auth_session, revoke_api_key, revoke_delegation), so a 4 rather than 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a clear precondition ('Only authorizations with status "active" or "pending" can be revoked') and access requirements, which is implied usage guidance. However, it never says when to reach for this versus alternatives like revoke_proof or revoke_auth_session, leaving the agent to infer routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

revoke_auth_sessionA
Destructive
Inspect

Revoke a specific authentication session by ID. When called via JWT, cannot revoke the current session. When called via API key, any session can be revoked.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
session_idYesSession ID to revoke

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag this as a non-read-only, destructive operation, so the safety profile is covered. The description adds real context beyond that: the JWT vs API-key revocation constraint and the Proof account / PROOF_API_KEY access requirement. It stops short of stating whether revocation is reversible or what the response returns.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core action, then the auth-method constraint, then access requirements. The ACCESS block is slightly boilerplate but every sentence carries actionable information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter destructive tool with annotations covering the safety profile, the description supplies the missing behavioral and access context. No output schema exists, but the return value is not something an agent strictly needs here.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with a single self-explanatory parameter (session_id). The description only restates 'by ID' and adds no format or sourcing detail beyond the schema, so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Revoke a specific authentication session by ID.' The resource (auth session) is distinct enough from siblings like revoke_proof, revoke_api_key, and revoke_delegation to be identifiable, though it never explicitly names a sibling to contrast with.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides concrete operational guidance: JWT callers cannot revoke the current session, while API-key callers can revoke any session. This is meaningful when-to-use context, but it doesn't mention finding session IDs (e.g., via list_auth_sessions).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

revoke_delegationA
Destructive
Inspect

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. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesDelegation ID (24-hex Mongo id or ph_dlg_<32 hex> handle)
reasonNoReason for revocation

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only say this mutates and is destructive; the description adds substantial context beyond them: idempotent repeat-revoke behavior with the same response body, the contrast with a PROOF that returns already_revoked, propagation into the proof registry so CRL/status list/public lookup reflect it, and that the result carries a derived effective_status/is_valid. This is exactly the behavioral detail annotations cannot supply.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The scope-limiting first sentence is front-loaded, followed by the idempotency contrast and the access requirement. It is dense but each sentence carries distinct information; slight redundancy in restating handle forms keeps it from a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by telling the agent what the response contains (derived effective_status/is_valid beside stored status). Combined with the access requirement and the idempotency guarantee, an agent has everything needed to invoke and interpret this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both id (24-hex or ph_dlg_ handle) and the reason enum are already documented in the schema. The description reinforces the ph_dlg_ handle form but adds no syntax or format beyond what the schema states. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Revoke ONE delegation') and immediately bounds the scope by noting that the domain control proof and sibling delegations stay valid. This distinguishes it from revoke_proof, which the description names explicitly, so an agent can route correctly without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains the relationship to revoke_proof with the ph_dlg_ handle and clarifies that both paths are idempotent, which is real routing guidance. It also states the account prerequisite. What it lacks is an explicit 'use this when X, not Y' decision rule for the primary case, but the context is otherwise clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

revoke_proofA
Destructive
Inspect

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. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPublic proof handle (ph_ctl_* / ph_dlg_*) or verification ID
reasonNoReason for revocation

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes far beyond the destructiveHint/readOnlyHint annotations: it discloses irreversibility, the full blast radius (status endpoint, public validator, revocation list, Token Status List), cascading delegation revocation, the required scopes (proofs:write plus delegations:write), and the refusal behavior. This is rich behavioral context an agent needs before invoking a destructive tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and accepted ids, then layers scope/permission/consequence details. It is dense and slightly long with some repetition around the 'domain you own' case, but nearly every sentence carries load-bearing caveat information, so it is appropriately sized for a destructive cascading operation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, cascade-prone tool with no output schema and only coarse annotations, the description covers prerequisites (API key, account requirement), irreversibility, cascade rules, and the exact alternative tool. An agent has everything needed to call it correctly or choose suspend_proof.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds genuine meaning: it explains what the two id forms are (control vs delegation handles), where they come from ('the same addresses get_proof_status takes'), and how the handle type changes the output effect. This exceeds the schema's plain type description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Revoke a proof') and immediately qualifies the accepted identifiers (ph_ctl_* / ph_dlg_* or verification ID). It is clearly distinguishable from sibling mutations like revoke_delegation, revoke_api_key, revoke_asset, and revoke_authorization, and from the near-sibling suspend_proof named later.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names the alternative for a different intent ('Need a temporary stop? Use suspend_proof instead') and distinguishes the two. It also spells out when the operation cascades (domain CONTROL proof, domain ownership), when a pre-re-verification handle does not reach, and the hard exclusion 'Cannot be undone.'

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

send_account_emailAInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesAccount session id from create_account

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=false and destructiveHint=false; the description goes well beyond by disclosing the public/no-API-key endpoint, the one-email-per-session invariant, the 410 already_sent semantics (material gone, do not claim delivery), the 404 for cancelled/expired sessions, and the email_sent=false retryable failure mode.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first sentence and the when/when-not routing follows immediately. It is longer than typical, but the length is spent on genuinely load-bearing idempotency and error semantics rather than filler, so the density justifies most of it.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, yet the description explains the meaningful response outcomes (410 already_sent, 404, email_sent=false) and the retry path. For a one-parameter send tool, nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with a single well-documented parameter ('Account session id from create_account'), so the schema carries the parameter semantics. The description reinforces the id's origin but adds no format or syntax detail beyond it, making the baseline 3 appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: deliver the verification email for an account-bootstrap session created with channel 'email'. It explicitly distinguishes itself from create_account and from the other channel flows, so an agent can identify its role without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use (session created with channel 'email'), when-not (telegram/whatsapp/sms sessions never need it), and a hard procedural instruction to confirm the address with the user rather than call it automatically after create_account. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_primary_emailB
Destructive
Inspect

Set an email address as the primary email for the account.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesEmail record ID to set as primary

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false and destructiveHint=true, so the mutation risk is known. The description usefully adds the authentication prerequisite, but it never explains the destructive consequence: what happens to the previously primary email address. That is the key behavioral fact an agent would want, so it adds some value without closing the loop.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded in one short sentence, followed by a compact prerequisites block. The ACCESS text is somewhat long for a one-parameter tool but every clause carries actionable information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter mutation with annotations covering the safety profile and no output schema, the description covers authentication but omits the effect on the prior primary email and any confirmation/return behavior. Adequate but with a clear gap around the mutation's consequence.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema itself is precise ('Email record ID to set as primary'), but the description describes the input loosely as 'an email address', which conflicts with the ID-based parameter and could lead an agent to pass an email string instead of a record ID. The description adds no clarifying syntax beyond the schema and introduces mild ambiguity.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Set an email address as the primary email for the account.' It is distinguishable from siblings like set_primary_phone and set_primary_profile by the 'email' resource, though it never names or contrasts those siblings explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The ACCESS block gives actionable prerequisites (needs a Proof account; set PROOF_API_KEY or sign in via start_login, then call again), which is genuine usage guidance. However, it says nothing about when this tool is appropriate versus the other primary-setting siblings, so selection guidance is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_primary_phoneA
Destructive
Inspect

Set a phone number as the primary phone for the account.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPhone record ID to set as primary

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false and destructiveHint=true, so the mutation safety profile is covered. The description adds genuinely useful context beyond that: the tool requires an authenticated Proof account and a valid session/API key, including the exact remediation steps. It does not disclose what happens to the previously-primary phone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, purpose front-loaded before the access note, with no filler. The access instructions are somewhat verbose but each sentence earns its place by giving the agent an actionable recovery path.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter mutation tool with annotations covering the destructive hint and full schema coverage, the description supplies the missing piece (auth requirements). It stops short of explaining side effects on the prior primary phone or any prerequisite that the phone be verified, but is otherwise sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% for the single 'id' parameter ('Phone record ID to set as primary'), so the schema carries the meaning. The description adds no additional syntax or format guidance for the id, making the baseline 3 appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Set a phone number as the primary phone for the account.' This clearly distinguishes it from the sibling list_phones, remove_phone, and start_add_phone, though it does not name those alternatives explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides strong prerequisite guidance (needs a Proof account, set PROOF_API_KEY or sign in via start_login), but offers no when-to-use-vs-alternatives reasoning, such as when to prefer set_primary_phone over remove_phone or start_add_phone. Usage context is implied by the auth flow rather than explained.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_primary_profileA
Destructive
Inspect

Set a profile as the primary profile. The previous primary profile becomes secondary.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
profile_idYesProfile ID to set as primary

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare destructiveHint=true and readOnlyHint=false, and the description reinforces this by explaining exactly what is mutated: the previous primary profile is demoted to secondary. It also adds non-obvious access context (requires a Proof account, PROOF_API_KEY must be set and the server restarted, and start_login does not unlock this tool). It does not state whether the change is reversible or what happens if the target is already primary.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences lead with the action and its side effect before the access caveat, so the critical information is front-loaded. The ACCESS block is longer boilerplate but is genuinely actionable rather than filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter mutation with annotations covering the safety profile and no output schema, the description covers purpose, side effect, and the authentication gate. It stops just short of completeness by omitting error conditions (e.g., invalid or unknown profile_id) and whether the prior primary must exist.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is a single parameter with 100% schema description coverage ('Profile ID to set as primary'), so the schema already carries the semantics. The description adds nothing about the ID format or provenance, which is the expected baseline when coverage is complete.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb and resource ('Set a profile as the primary profile') and immediately names the observable effect (previous primary becomes secondary). The resource word 'profile' cleanly separates it from the sibling set_primary_email and set_primary_phone without needing to open a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to choose this over related profile tools such as update_profile, get_my_profile, or list_profiles, and no note on prerequisites like the profile having to exist or already being part of the account. The access note is an authentication prerequisite rather than a when-to-use rule.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

setup_domain_emailAInspect

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. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesDomain ID
from_emailNoCustom from email address for the domain

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the readOnlyHint=false/destructiveHint=false annotations: it discloses the auth requirement, the shape of the returned DNS records (`resend.dkim_records` and their status), the constraint that from_email must belong to the domain, and the non-obvious caveat that Proof does not actually send from customer domains yet. The last point is exactly the kind of hidden behavior an agent needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first sentence, with return values and caveats following in a logical order and a separate access paragraph. Slightly dense, but every sentence carries information an agent can act on.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description correctly compensates by describing the return payload (DKIM/SPF records + status), and it covers auth. It does not address re-invocation behavior (overwrite vs. append) or error cases, which is the remaining gap for a mutation tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds genuine semantics: `from_email` must be on this domain, is stored as the preferred sender, and is currently unused. The only gap is that `id` is still just 'Domain ID' with no clarification of provenance (e.g. from add_domain/list_domains).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Register a verified domain with Proof's email provider (Resend) for sending') and immediately scopes the outcome to DKIM/SPF record provisioning. An agent can distinguish this from add_domain/verify_domain/start_domain_email_verification without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The ACCESS block gives real prerequisites (PROOF_API_KEY or the start_login session flow), which is useful. However it never states when to choose this tool over the many sibling flows (start_domain_email_verification, confirm_domain_email_code, check_domain_email_status, resend_domain_email), so alternative selection is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

share_request_emailAInspect

Send an email notification to the subject of a verification request.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesVerification request ID

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare a non-read-only, non-destructive mutation, and the description adds real value beyond that: it clarifies the side effect is an email notification (not a data change) and discloses the required account/key setup and login prerequisite. It stops short of stating idempotency or rate limits for repeated sends.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The action is front-loaded in the first sentence with zero waste. The ACCESS block is longer boilerplate but is genuinely actionable (env var, login flow) rather than filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-param notification tool with no output schema and clear annotations, purpose plus auth prerequisites cover what an agent needs. Missing only alternative-tool routing, which is a minor gap at this complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter (id) with 100% schema description coverage ('Verification request ID'). The description implies the target is the request's subject but adds no syntax or format detail beyond the schema, so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (send email notification) and the precise resource/recipient (subject of a verification request), so the agent knows exactly what effect it produces. It does not, however, distinguish itself from the many sibling notification tools (resend_verification, resend_domain_email, send_account_email), leaving that inference to the agent.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied rather than stated: the tool notifies the subject of an existing verification request. The description instead devotes its guidance to auth prerequisites (PROOF_API_KEY, start_login), which is useful context but not a when-to-use/when-not or alternative-selection rule.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

start_2faAInspect

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. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault
channelYesChannel to receive the verification code
targetsNoThe ids the step-up is FOR — the grant is bound to exactly these and refused for any other request (`reason: target_mismatch`). revocation_bulk: the asset id you will pass to revoke_asset (one code per asset); phone_remove / email_remove: the phone or email record id; domain_remove: the domain id; profile_delete: the project id; account_delete: your own user id (get_current_user). Leave out for the other action types.
email_idNoSpecific email ID for email channel (optional)
action_typeYesThe sensitive action requiring 2FA

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=false and destructiveHint=false, but the description adds substantial operational behavior: which channel actually dispatches, that a 200 with `requires_email_selection: true` means nothing was sent and no session exists, that the grant is bound to `targets` and refused with `reason: target_mismatch`, and that users never see tool results. This is exactly the context annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then the flow in numbered steps, so scanning is easy and the renderer/polling warnings earn their place. It is dense and long for a 4-parameter tool, with some repetition about channels, but nearly every sentence carries actionable routing or safety information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, and the description compensates fully by naming the returned fields (session ID, deep_link, qr_code, qr_text, instructions, sms_message, sms_dids, requires_email_selection, available_emails) and what each means for the agent's next step. Nothing needed to invoke the tool or handle its result is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so baseline is 3, but the description still adds meaning beyond it: it directs `email_id` usage when `requires_email_selection` is returned, ties `channel` to concrete downstream behavior, and warns never to pass `qr_text` to a link renderer. It adds channel-level semantics the enum alone does not convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Start a two-factor authentication challenge for a sensitive operation,' and the following flow sentence clarifies scope precisely. However, a near-identical sibling `start_2fa_for_action` exists and the description never distinguishes this tool from it or from `start_2fa_for_action`'s role, so an agent must guess between two similarly named starters.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit numbered flow (call start_2fa, present challenge, poll get_2fa_status, then proceed), names the alternatives (`get_2fa_status` for polling, `render_auth_link` for telegram/whatsapp links, `create_api_key` as the downstream protected op), and states channel-specific when/when-not rules (email dispatches, telegram/whatsapp/sms require the user to send the message).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

start_2fa_for_actionAInspect

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_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. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
channelYesChannel for the 2FA challenge — must differ from the user's last login channel
targetsNoThe ids the step-up is FOR — the grant is bound to exactly these and refused for any other request (`reason: target_mismatch`). revocation_bulk: the asset id you will pass to revoke_asset (one code per asset); phone_remove / email_remove: the phone or email record id; domain_remove: the domain id; profile_delete: the project id; account_delete: your own user id (get_current_user). Leave out for the other action types.
email_idNoOptional: specific UserEmail id for email-channel 2FA
phone_idNoOptional: specific UserPhone id for phone-channel 2FA
single_useNoWhether the grant is consumed on first use. Server forces true for destructive action types. Defaults to true.
action_typeYesThe sensitive action the 2FA grant will authorize. Destructive scopes (api_key_*, account_delete, phone_remove, email_remove, phone_primary, email_primary, revocation_bulk, domain_remove, profile_delete) are capped at 5 min TTL + forced single-use. Configuration scopes (settings_write, profile_update, templates_write) allow up to 24h TTL with caller-chosen single_use. See config/twoFAPolicy.ts on the backend for the canonical policy.
ttl_secondsNoRequested grant lifetime in seconds. Server caps to 300s for destructive action types, 86400s for configuration scopes. Defaults to 300 if omitted.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=false and destructiveHint=false, and the description goes far beyond them: 5-minute TTL caps and forced single-use for destructive scopes, 24h TTL for config scopes, grant binding to `targets` with `target_mismatch` refusal, the no-session-started email-selection response, and the fact that users never see tool results. It also states the account prerequisite (PROOF_API_KEY). No contradiction with the annotations — the tool starts a challenge, it does not itself destroy anything.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is long, but the size is justified by the multi-step workflow and the policy branching. Structure is front-loaded: purpose, then policy tiers, then numbered agent steps, then presentation caveats. Some redundancy exists (the destructive/config TTL policy is stated in the prose and again in the action_type and ttl_seconds schema descriptions), which keeps it from a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the return-value burden and does so — `deep_link`, `sms_message` plus number, the `requires_email_selection` / `available_emails` 200 response, and `qr_text` as pre-rendered QR art. Combined with the auth prerequisite and the surrounding call sequence, nothing an agent needs to invoke this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds behavioral meaning beyond the schema: it explains that a step-up for revocation_bulk/phone_remove/email_remove/domain_remove/profile_delete/account_delete is bound to the exact `targets` ids the protected call will carry, and that policy caps override requested ttl_seconds/single_use. The per-parameter schema text largely duplicates this, hence not a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence names a specific verb and resource ('Start a 2FA challenge that grants ... permission to perform a sensitive action') and immediately explains the mechanism (grant keyed by user id + action_type, read by middleware on the protected endpoint). It also explicitly separates itself from start_login ('start_login does NOT open this tool') and slots itself into the start_2fa_for_action -> wait_for_2fa -> retry flow, so an agent can place it among the many 2FA siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Agent usage' block gives an explicit five-step when-to-use procedure triggered by a literal `403 2fa_required`, plus a when-not: the channel must differ from the login channel, and email requires an `email_id` selection step first. It also tells the agent what NOT to do (do not tell the user to open a mailbox, never hand `qr_text` to a link renderer).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

start_add_emailAInspect

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. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailYesEmail address to add

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only cover the read/destructive profile; the description goes well beyond by disclosing the external side effect (an OTP email is sent), the return artifact (a session ID), and the precise authentication prerequisite (PROOF_API_KEY or start_login). This is exactly the behavioral context an agent needs before invoking.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and mechanics are front-loaded in the first two sentences, with the ACCESS provisioning note clearly separated below. Efficient overall, though the ACCESS paragraph is slightly long relative to the one-parameter scope.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter initiation tool, the description covers purpose, side effects, the returned session ID, and the auth prerequisite. Nothing an agent needs to call it correctly is missing, and there is no output schema that would need explaining.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with a single well-described 'email' field, so the schema carries the param burden. The description only confirms the destination of the OTP, adding no format or constraint detail beyond the schema; baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Start adding a new email address') and immediately clarifies the mechanism ('Sends an OTP code', 'Returns a session ID'). This clearly separates it from siblings like start_add_phone, verify_email_otp, and list_emails.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description establishes the multi-step workflow (start → OTP → verify with session ID), so an agent understands where this tool fits and what follows it. It lacks an explicit 'use this instead of X' comparison, but context for selection is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

start_add_phoneAInspect

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. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault
channelYesChannel for phone verification

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=false and destructiveHint=false, so the description carries most of the disclosure burden and does it well: nothing is sent before the user acts, which response fields exist per channel, that sms lacks deep_link, that empty dids mean unconfigured regions, and that the user never sees tool output. However, it omits session expiry, rate limits, and what happens if a session is abandoned.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The 'Agent usage:' divider cleanly separates the return-shape description from the operational routing instructions, and the closing paragraph about clients folding tool results is uniquely valuable. The second sentence is a long run-on enumerating fields, which costs a point on structure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description fully documents the return surface per channel, plus the auth prerequisite (PROOF_API_KEY or start_login) and the critical behavior that tool results are hidden from the user, telling the agent to relay the link or SMS text itself. Nothing needed to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single `channel` parameter is fully documented in the schema at 100% coverage with an enum, so the baseline is 3. The description does add real meaning by mapping each enum value to a different response shape and rendering path, going modestly beyond the schema's terse 'Channel for phone verification'.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

'Start adding a new phone number by reverse OTP' gives a specific verb, resource and mechanism, immediately distinguishing it from start_add_email, delete_circle and the get_add_phone_status polling sibling. It also states the initiator of the exchange, which is the key semantic of this tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It spells out the exact follow-on flow per channel: pass deep_link to render_auth_link on telegram/whatsapp, render sms_message plus a non-empty did on sms, and then poll get_add_phone_status with the session ID. It even carries an explicit exclusion ('Never hand a qr_text to a link renderer').

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

start_domain_email_verificationAInspect

Start domain verification via corporate email. Sends a verification code to a standard admin email address at the domain.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesDomain ID
email_prefixNoEmail prefix to send verification to (default: admin)

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (readOnlyHint=false, destructiveHint=false), and the description adds real behavioral context beyond them: it discloses the side effect of dispatching a code to a standard admin mailbox and the authentication precondition (API key or active session). It stops short of saying whether this can be re-invoked, how codes expire, or how to complete verification.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The action and its effect are front-loaded in the first sentence, and the ACCESS block is clearly segmented rather than buried in prose. It is appropriately sized for a two-parameter tool, with only mild redundancy between the title-level phrasing and the body.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a small, enum-bearing tool with no output schema and full schema coverage, the description covers the action and the auth gate adequately. It omits the natural next step (confirming the emailed code, e.g. via confirm_domain_email_code) and any note on code lifetime, which an agent orchestrating the flow would want.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents both 'id' and the enumerated 'email_prefix' with its default. The description only loosely echoes the email-prefix concept ('standard admin email address') without adding format or constraint detail, so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Start domain verification via corporate email') and adds what actually happens ('sends a verification code to a standard admin email address at the domain'). This is clear, though it does not distinguish itself from close siblings like start_domain_verification or setup_domain_email, so an agent cannot fully rule out the alternatives from the description alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives useful prerequisite guidance (needs a Proof account, PROOF_API_KEY, or a session opened via start_login), which tells the agent when it is callable. It does not, however, say when to choose this over the many related siblings such as start_domain_verification or setup_domain_email, so the selection guidance is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

start_domain_verificationAInspect

Start a B2B domain verification. Creates a verification record and returns DNS/HTTP instructions for the customer to complete.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainYesDomain to verify (e.g. example.com)
customer_idNoCustomer identifier for B2B tracking
verification_methodNoVerification method (default: manual_dns)

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish readOnlyHint=false and destructiveHint=false, so the write profile is covered; the description adds genuine value beyond them by disclosing the auth prerequisite (Proof account + PROOF_API_KEY + server restart) and that the call emits DNS/HTTP instructions for the customer. It omits expiry/idempotency behavior and whether a duplicate call for the same domain creates a second record.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded: the core action and its output come first, followed by the access constraint as a clearly separated block. No filler sentences, though the ACCESS paragraph is slightly verbose for what it conveys.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, and the description compensates by stating what comes back (DNS/HTTP instructions) and by covering the account/API-key prerequisite that would otherwise block a call. What remains thin is the workflow context — no pointer to check_domain_verification/delete_domain_verification for the follow-up states a B2B flow implies.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents domain, customer_id, and the manual_dns/http_file enum. The description only implicitly maps 'DNS/HTTP instructions' onto the two verification methods and adds no format, default, or constraint detail beyond the schema — the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Start a B2B domain verification') and adds what it produces: 'Creates a verification record and returns DNS/HTTP instructions.' That separates it from read-side siblings like check_domain_verification or get_verification, but it never names the near-identical siblings (start_domain_email_verification, start_user_domain_verification, verify_domain), so differentiation still requires reading the tree.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a concrete precondition ('needs a Proof account. Set PROOF_API_KEY and restart this server, then call this tool again') and an explicit exclusion ('start_login does NOT open this tool'), which is real routing guidance. It does not say when to prefer this over the other domain-verification starters or which tool to call afterward to poll status.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

start_loginAInspect

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. Terminal states: "verified" (login succeeded), "failed", "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.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailNoEmail address (required for email channel)
channelYesAuthentication channel
phone_numberNoPhone number in E.164 format (required for SMS channel)

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=false and destructiveHint=false; the description adds substantial behavior beyond that: per-channel return shapes, that deep_link is an empty string on SMS and render_auth_link will reject it, that suggested_region may lack a matching sms_dids entry, that delivery failure surfaces as an error and creates no session, and that tool results are folded away from the user so replies must be composed manually.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with a one-sentence purpose followed by a numbered flow, and each sentence generally carries channel-specific operational detail rather than filler. It is nonetheless long and relies on heavy ALL-CAPS and parenthetical caveats that could be tightened, so it is efficient but not maximally tight.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description must carry the return-value burden and it does: it documents deep_link/qr_code/qr_text for Telegram and WhatsApp, sms_message/sms_dids for SMS, and that email returns nothing displayable. It also covers terminal states (verified, failed, expired) and the delivery-failure error path, leaving nothing an agent needs to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real per-parameter semantics: phone_number is required only for SMS, email only for email, and channel selection determines which fields come back and what to do with each. That is more than the schema's field-level notes, though it does not add syntax detail for phone_number beyond E.164 already in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Start a login session by sending an authentication challenge') and enumerates the exact channel set (Telegram, WhatsApp, SMS, email). It further disambiguates by naming the downstream siblings it pairs with (render_auth_link, wait_for_login), so an agent can place it in the auth flow without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides an explicit numbered flow: (1) call start_login with channel plus phone_number/email, (2) present the challenge, (3) call wait_for_login with the returned session ID. It also gives when-NOT guidance — do not call wait_for_login after a challenge_delivery_failed error because no session exists — and tells the agent to retry or offer another channel instead.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

start_user_domain_verificationAInspect

Start a self-service domain verification session. The user proves ownership of a domain via DNS or HTTP challenge.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainYesDomain name to verify (e.g. example.com)
channelNoVerification channel (default: dns)

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=false and destructiveHint=false, so the description carries real weight and does so: it explains the required account, the PROOF_API_KEY vs start_login paths, and the odd detail that a session can open this tool, requiring a re-call. It still omits what state gets created and how to progress afterward (e.g., check_user_domain_verification).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then a clearly separated ACCESS block. Both sentences earn their place, though the second sentence is dense and slightly awkward with the em-dash construction.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter tool with no output schema, the description covers authentication but not the follow-up path. In a namespace crowded with domain-verification siblings, it should direct the agent to the status-check tool (check_user_domain_verification) and would benefit from distinguishing 'user' verification from the other start_* verification tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters (domain, channel enum dns/http) are already documented in the schema. The description echoes the DNS/HTTP distinction but adds no format, default, or constraint detail beyond what the schema already provides. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Start a self-service domain verification session.' It also names the mechanism (DNS or HTTP challenge). However, it does not distinguish itself from closely named siblings like start_domain_verification, start_domain_email_verification, or start_domain_email_verification, which an agent could easily confuse it with.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives context ('user proves ownership of a domain') and covers the auth prerequisite ('needs a Proof account ... sign in with start_login'), which is genuinely useful. It does not say when to prefer this over the similarly named start_domain_verification sibling, so usage routing is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

submit_verification_codeAInspect

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. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesVerification ID
codeYesThe OTP or challenge code to submit

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=false and destructiveHint=false. The description adds substantial context beyond that: the out-of-band delivery precondition, the exact 400 unsupported_for_type failure mode, and the account/credential prerequisite (Proof account, PROOF_API_KEY, restart, and that start_login does not unlock it).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core action, then the acceptance constraint and the alternative routing, then the access prerequisite. Despite being detailed, every sentence carries distinct, decision-relevant information and none is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-param mutation tool with no output schema, it covers the safety profile (via annotations plus stated error behavior), the precondition for success, the failure path, alternative tools, and the authentication requirement. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% for both id and code, so the schema already carries parameter meaning. The description clarifies that the code is an OTP/challenge submitted for a pending verification but adds no format or value details beyond the schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (submit) and resource (OTP/challenge code) scoped to a pending verification. It further narrows the accepted type/channel combinations, so an agent can distinguish it from trigger_verification and the other verification siblings without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names when the tool applies (type email; type domain with channel email) and when it does not (any other pair returns 400 unsupported_for_type). It routes the agent to trigger_verification for domain over dns/http/auto and explains how phone, social, and telegram_bot complete instead.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

test_verifyAInspect

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. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesVerification ID

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations establish that this is not read-only and not destructive. The description adds important behavioral context beyond that: it requires a Proof account, PROOF_API_KEY must be set, the server must be restarted, and start_login does not expose this tool. It still does not describe the exact mutation result or side effects beyond auto-completion.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose and test-mode constraint are front-loaded, followed by a short access/setup note. Every sentence contributes useful information, and there is no redundant or filler text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a test-only mutation tool with no output schema, the description covers the critical operational context: test-key requirement, account setup, and the fact that start_login does not open this tool. It could additionally mention what the tool returns after auto-completion, but the practical invocation guidance is strong.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the single parameter 'id' is already documented in the schema as 'Verification ID.' The description does not add any further syntax, format, or source-of-id detail, so the schema carries the parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Auto-complete a verification in test mode.' It also names the key constraint (pk_test_* API keys only) and the testing use case, which distinguishes it from real verification tools such as submit_verification_code or trigger_verification.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Clearly says when to use it: test mode only, with pk_test_* keys, for testing without real OTP delivery. It also gives the auth setup prerequisite. It does not explicitly name the production alternative, but the test-mode context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

trigger_verificationBInspect

Trigger a DNS/HTTP verification check for a pending domain verification.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesVerification ID

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false and destructiveHint=false, so the mutation/non-destructive profile is already covered. The description adds genuine value with the auth precondition (needs a Proof account, PROOF_API_KEY + restart) and the negative note that start_login does NOT open this tool. It still omits what triggering actually does (re-runs the check? consumes the verification? rate limits?), so it's adequate but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight parts: the action sentence is front-loaded, then the access precondition. No filler, though the ACCESS note is somewhat verbose for a precondition and could be shortened.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter mutation tool with annotations covering the safety profile and no output schema, the description covers purpose and auth but leaves the actual side effect of the trigger unstated. It is minimally complete but misses behavioral context an agent would want before invoking.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single 'id' parameter is already documented as 'Verification ID' in the schema. The description's reference to a 'pending domain verification' adds only marginal meaning beyond that. Baseline 3 is appropriate when the schema carries the parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: 'Trigger a DNS/HTTP verification check' and scopes it to 'a pending domain verification.' This is clear enough to distinguish from readers like get_verification or list_verifications, though it doesn't explicitly contrast with near-neighbors such as check_domain_verification or start_domain_verification.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by 'for a pending domain verification,' giving context for when to invoke it, and the ACCESS paragraph gives a setup precondition. However, it never states when to prefer this over the many verification siblings (check_domain_verification, submit_verification_code, resend_verification), so alternatives are left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_circleA
Destructive
Inspect

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. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesCircle ID
nameNoNew name for the Circle
owner_nameNoHow this Circle's members know its owner ("Dad", "Giorgi"). The bots name the owner by it; while it is empty they name nobody — the Circle's name labels the group, never the person. Trimmed by the API; null or an empty value clears it.

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false and destructiveHint=true; the description adds beyond that by disclosing PATCH semantics ("Omitted fields are left unchanged") and the create-only nature of the profile/identity binding. The auth prerequisite (Proof account / PROOF_API_KEY) is behavioral context the annotations do not carry. It does not explain what makes the call destructive or how owner_name clearing interacts with member naming.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose sentence is front-loaded and the mutation constraint follows immediately; the access block is set off on its own line and is directly actionable. Slightly verbose in the access paragraph ("restart this server, then call this tool again"), but no sentence is wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and only three well-documented parameters, the description covers the essentials an agent needs: what is mutable, partial-update semantics, and the authentication requirement. The only minor gap is that it does not state whether the updated Circle is returned or how to observe the change.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so id, name, and owner_name are already documented in the schema, including the owner_name clearing semantics. The description's mapping ("name and/or owner name") and the omitted-fields-unchanged note add optionality meaning, but per-parameter syntax detail is left to the schema. Baseline 3 applies when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource scoped precisely: "Update a Circle's name and/or owner name." It further disambiguates from the create path by noting the profile/identity binding is create-only, so an agent knows this tool cannot rebind identity. It stops short of naming sibling tools (create_circle, delete_circle) explicitly, so it is clear but not maximally distinguished.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives real workflow context: it needs a Proof account, tells the agent to set PROOF_API_KEY and restart, and warns that start_login does NOT open this tool — steering the agent away from a wrong access route. It does not contrast against sibling mutation tools such as create_circle or add_circle_member, so 'when to use this vs others' is only partially covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_hitlA
Destructive
Inspect

Update a HITL config. Can change name, channels, or timeout.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesHITL config ID
nameNoNew name (null to clear)
channelsNoUpdated channels
timeout_secondsNoUpdated timeout in seconds (60–86400)

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false and destructiveHint=true. The description goes beyond them by disclosing a non-obvious auth behavior — that this tool requires PROOF_API_KEY and that start_login does NOT grant access — which prevents the agent from pursuing the wrong auth path. It still doesn't say what a destructive update actually destroys (e.g., channel replacement semantics).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the purpose in one short sentence, followed by a clearly separated ACCESS block. Every element is relevant; the field enumeration is slightly redundant with the schema but harmless.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive mutation with annotations covering the safety profile and full schema coverage, the description supplies the missing piece (auth requirements) and needs no return-value explanation since there is no output schema. It could say more about the effect of the update, but nothing critical is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Parameter description coverage is 100%, so the schema already documents id, name ("null to clear"), channels, and timeout_seconds ranges. The description only restates the updatable fields at a high level, adding no syntax, format, or replace-vs-merge semantics beyond the schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ("Update a HITL config") and enumerates the mutable fields (name, channels, timeout), which plainly distinguishes it from create_hitl, get_hitl, list_hitls, and delete_hitl. It never names a sibling explicitly, so it falls short of 5, but the purpose is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The ACCESS block gives a real usage prerequisite (Proof account + PROOF_API_KEY) not found in the schema, which helps. However, there is no guidance on when to update vs. create/delete a HITL config or whether the change replaces or merges existing values, leaving usage largely implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_my_profileB
Destructive
Inspect

Update the current user's primary profile. Supports display name, bio, avatar, theme, custom links, and verification display settings.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
bioNoProfile bio
themeNoProfile theme settings
is_publicNoWhether the profile is publicly visible
avatar_urlNoAvatar (HTTPS URL or base64 data URI, null to remove)
custom_linksNoCustom links (max 20)
display_nameNoDisplay name
show_proof_channelsNoShow proof channels
show_verification_datesNoShow verification dates

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare destructiveHint=true and readOnlyHint=false, so the mutation profile is already known; the description's added value is the auth/environment prerequisite and the start_login exclusion. It still does not disclose what destruction means here (e.g. that passing a new custom_links array replaces the old one, or that avatar_url=null removes the avatar), which is the key behavioral detail an agent needs for a destructive write.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short blocks: capability first, then access requirements, which is reasonably front-loaded and free of padding. The phrasing 'restart this server, then call this tool again' is a little awkward but costs no real clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 8-parameter nested mutation tool with no output schema, the auth prerequisite is covered but the update semantics (merge vs replace, null handling, array replacement) and any confirmation of what is returned are not. Adequate but with clear gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all 8 parameters including nested theme and custom_links fields. The description's field list ('display name, bio, avatar, theme, custom links, verification display settings') is largely a restatement and adds no format, null-semantics, or omission-behavior detail beyond it. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Update the current user's primary profile') and enumerates the mutable field groups, which is enough to separate it from get_my_profile and list_profiles. It never explicitly distinguishes itself from the sibling update_profile, so an agent must infer the difference from the 'current user's / my' scoping.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the 'my profile' scoping, and the ACCESS block gives a real prerequisite (Proof account, PROOF_API_KEY, and the explicit warning that start_login does NOT open this tool). However there is no guidance on when to prefer this over update_profile, or on partial vs full updates.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_profileB
Destructive
Inspect

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. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
bioNoProfile bio
themeNoProfile theme settings
is_publicNoWhether the profile is publicly visible
avatar_urlNoAvatar (base64 or URL, null to remove)
is_primaryNoSet as primary profile
profile_idYesProfile ID
email_themeNoTheme of this project's emails
is_businessNoWhether this is a business profile
custom_linksNoCustom links (max 20)
display_nameNoDisplay name
business_nameNoBusiness name
support_emailNoSupport email this project's messages show (null to remove)
show_proof_channelsNoShow proof channels on public profile
show_verification_datesNoShow verification dates on public profile

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false, so the write risk is conveyed structurally. The description adds genuinely useful auth context (Proof account required, PROOF_API_KEY, start_login won't help), but it never clarifies what the destructive update overwrites, whether omitted fields are preserved, or how the avatar/support_email null-to-remove semantics behave.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The capability statement is a single tight sentence and the ACCESS note is clearly separated and front-loaded. Slight overhead from repeating field groups already visible in the schema, but nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 14-parameter mutation tool with no output schema, the definition covers the auth prerequisite and the field categories but omits what happens on partial updates, whether changes are reversible, and any side effects. The ACCESS note helps but the destructive semantics remain underspecified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the 14 parameters are already documented with descriptions, formats, and constraints. The description groups them into themes (display info, email branding, theme, custom links, verification display) but adds no syntax or format detail beyond what the schema provides, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource ("Update a profile by ID") and enumerates the field groups that can be changed, so the agent knows exactly what the tool mutates. It does not, however, distinguish itself from siblings like update_my_profile or update_profile_proofs, which would require different scoping rules.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: "by ID" suggests it targets an arbitrary profile rather than the caller's own, and the ACCESS block tells you the prerequisite (a Proof account / PROOF_API_KEY) and that start_login does not unlock it. It never explicitly states when to prefer this over update_my_profile, set_primary_profile, or update_profile_proofs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_profile_proofsB
Destructive
Inspect

Update which verified assets (proofs) are displayed on a specific profile. Controls visibility, privacy masking, ordering, and labels.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
proofsYesProofs to display on profile
profile_idYesProfile ID

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is covered. The description adds useful access context but never discloses the replacement semantics of the destructive operation — that proofs not included in the array may be removed. With annotations carrying the safety signal, this partial disclosure merits a 3.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core operation and then a compact ACCESS paragraph. Both sentences carry functional information (what it controls, how to gain access), with no padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive mutation with no output schema and annotations present, the description covers the operation and access prerequisite but omits the important replacement/destructive semantics of the proofs array. It is adequate but leaves a meaningful behavioral gap for an agent to fill.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters (profile_id and the nested proofs array) are already fully documented in the schema. The description's mention of visibility, masking, ordering, and labels maps to those fields but adds no syntax or constraint detail beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Update which verified assets (proofs) are displayed on a specific profile') and enumerates the controlled facets (visibility, privacy masking, ordering, labels). The 'specific profile' scope implicitly differentiates it from the sibling update_public_proofs, though that sibling is never named.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a clear access prerequisite ('needs a Proof account. Set PROOF_API_KEY...') and explicitly excludes start_login as a path ('start_login does NOT open this tool'). However, it offers no guidance on when to choose this tool over alternatives like update_public_proofs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_public_proofsB
Destructive
Inspect

Update which verified proofs are visible on the user's public profile, including visibility, masking, and display order.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault
proofsYesArray of proof display configurations (max 50)

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is covered. The description adds real value with the authentication prerequisite, but it never explains the replace-vs-merge semantics — e.g. whether proofs omitted from the array are removed — which matters a lot for a destructive operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with a clear purpose sentence followed by a compact access note; both earn their place. Slightly verbose in the access paragraph but no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, single-parameter mutation tool with no output schema, the description tells the agent what it edits and how to authenticate but omits the critical behavioral detail of whether unlisted proofs are dropped. Given annotations carry the safety flag, this is adequate but not complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all nested fields (asset_id, label, is_visible, mask_level, display_order, the 50-item cap) are already documented in the schema. The description's mention of visibility/masking/order merely echoes field names and adds no syntax or defaulting detail beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Update which verified proofs are visible on the user's public profile') and even enumerates the editable aspects (visibility, masking, display order). It does not, however, distinguish itself from the very similar sibling update_profile_proofs, leaving the agent to guess which one to pick.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The ACCESS section gives a prerequisite (Proof account via PROOF_API_KEY or start_login), which is useful, but there is no explicit when-to-use guidance and no mention of alternatives such as update_profile_proofs or update_profile. Usage is only implied by the resource being the public profile.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_settingsA
Destructive
Inspect

Update account settings: the outbound webhook endpoint with its event subscriptions, and the default proof lifetime. Branding belongs to each sub-account (project): 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. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
webhookNoOutbound webhook configuration. Deliveries carry an HMAC-SHA256 X-Proof-Signature over "<X-Proof-Timestamp>.<body>".
proof_expiry_daysNoDefault proof-token lifetime in days for newly issued proofs

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true, and the description adds real behavioral content on top: setting the first webhook endpoint mints a signing secret, that secret is returned only when this call created or rotated it, and it must be recorded at that moment. It also discloses the auth precondition. It doesn't spell out the destructive consequence of a null url beyond what the schema says, but the added disclosure is substantive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The first sentence front-loads the two things that can be changed and the sibling exclusion; the second paragraph covers the auth requirement and the secret-return nuance. Every sentence earns its place, though the access paragraph is slightly long for what it conveys.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description usefully explains the one return value that matters (the signing secret and when it appears). Nested webhook fields, auth requirements, and the profile-vs-account boundary are all covered. Minor gaps remain around webhook removal semantics and error conditions, but nothing blocking a correct call.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds meaning the schema does not: the ordering/one-shot nature of the signing-secret return (only on creation or rotation), which is the key operational subtlety of the webhook parameter. It also frames proof_expiry_days as applying to 'newly issued proofs,' reinforcing the schema's wording.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Update account settings') and enumerates exactly what is mutable: the outbound webhook endpoint with event subscriptions and the default proof lifetime. It goes further by explicitly carving out branding as belonging to sub-accounts and routing that work to update_profile, so the agent can separate this tool from a large sibling set without reading schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Names the sibling alternative (update_profile) together with the condition that selects it (branding is per sub-account/project), and adds an explicit when-not: 'start_login does NOT open this tool.' It also states the access precondition (a Proof account with PROOF_API_KEY set and server restarted) so the agent knows the call will fail without it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_templateA
Destructive
Inspect

Create or update a sub-account's (project's) custom template for a channel and message type, replacing the default for that project only. Name the brand with {{business_name}}: a template spelling out a project's own name is refused (template_hardcoded_name).

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYesTemplate body text with variable placeholders
channelYesMessage channel
subjectNoEmail subject line (email channel only)
profile_idNoThe sub-account (project) to act on; omitted → your key's project, or the primary project for an account-wide key
button_textNoButton text (email channel only)
message_typeYesMessage type (e.g. verification_request, login_request)
button_url_templateNoButton URL template with placeholders

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag readOnlyHint=false and destructiveHint=true, and the description adds real behavior on top: the write replaces the *default* for that project only (scoping the blast radius), and a hardcoded project name is refused with the specific error code template_hardcoded_name. Auth setup requirements are also spelled out, which annotations cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and scope come first, followed by the naming rule and then the access block, so the critical routing information is front-loaded. The access paragraph is slightly long for a single prerequisite but each sentence carries actionable information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 7-parameter mutation tool with no output schema, the description covers the destructive scope, the auth prerequisite and a known validation failure. It does not mention whether subject/button_text become required for the email channel or what the call returns, but those are modest gaps given the annotation coverage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description goes beyond the schema by prescribing the {{business_name}} placeholder convention for the body, a template-authoring rule that is not encoded anywhere in the parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (create/update a custom template) plus the exact scope: a sub-account's template for one channel and message type, replacing the default for that project only. That scope statement cleanly separates it from list_templates, get_template, get_default_templates and delete_template in the sibling set.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides a concrete prerequisite (needs a Proof account; set PROOF_API_KEY and restart) and an explicit exclusion (start_login does NOT open this tool). It stops short of routing between create vs. update semantics or pointing at get_default_templates as the inspection counterpart, so it is clear context without full alternative mapping.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upload_hitl_keysA
Destructive
Inspect

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. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
hitl_idYesHITL config ID
kdf_saltYesBase64url-encoded PBKDF2 salt
public_keyYesPEM-encoded RSA-4096 SPKI public key
encrypted_private_keyYesJSON-serialized encrypted private key envelope (PBKDF2-SHA256+AES-256-GCM)

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes beyond the annotations (destructiveHint=true) by disclosing the security model: the server validates the RSA-4096 public key, computes the key ID, and never sees the user's password because the private key is encrypted client-side. It also surfaces the auth requirement (PROOF_API_KEY), which the annotations do not. It stops short of stating what happens to existing keys on overwrite.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action and its effect, followed by a security note and a clearly delimited ACCESS block. Efficient overall, though the restart instruction is mildly procedural for a tool description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a four-param mutation with no output schema, the description covers purpose, prerequisites, validation behavior, and the security model. The main gap is not saying whether uploads replace existing keys or how key IDs are returned, which matters given destructiveHint=true.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, and the description adds real meaning: it explains that public_key is validated as RSA-4096 and that encrypted_private_key is a client-side password-encrypted envelope the server cannot read. kdf_salt and hitl_id get no added semantics, but the security-relevant params are clarified.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Upload an encryption keypair for a HITL config") and immediately describes the server-side behavior. An agent can distinguish it from get_hitl_keys and delete_hitl_keys without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides strong prerequisite guidance (needs a Proof account, set PROOF_API_KEY, restart, then retry) and explicitly routes away from start_login as a way to unlock it. It does not, however, compare against the sibling key tools or say when uploading keys is appropriate versus regenerating them.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

validate_proofA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
identifierNoOptional: the identifier this proof should be about (phone, email, domain, ...). When supplied, a proof about anything else answers valid:false with reason "identifier_mismatch"; a proof of an encrypted decision answers "identifier_unverifiable".
proof_tokenYesThe JWT proof token to validate

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=true; the description adds meaningful behavioral context beyond that — it names the server-side checks performed (signature, expiry, revocation) and states 'Public endpoint — no API key required', which affects how an agent may call it. It does not contradict the readOnly annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with the core action, followed by the checks performed and then the optional-parameter and access notes. No filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter, read-only validation tool with no output schema, the description covers purpose, checks, optional filtering, and access. The only gap is that it doesn't describe the shape of the validation result, though the schema hints at a valid/reason structure.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents both proof_token and identifier in detail (including the identifier_mismatch and identifier_unverifiable outcomes). The description restates the identifier purpose at a high level but adds no syntax or format detail beyond the schema, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Validate a proof token') and enumerates the concrete operations performed: signature, expiry, and revocation checks. This distinguishes it from siblings like get_proof_status, revoke_proof, and list_revoked_proofs without ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage (validating a token you hold) and explains the optional identifier check, but never states when to prefer this over get_proof_status or verify_delegation, nor any exclusion conditions. Usage context is implied rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

verify_2faAInspect

Submit a verification code to complete a 2FA challenge. Rate limited to 10 attempts per minute.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesVerification code
session_idYes2FA session ID

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false and destructiveHint=false, so the safety profile is known. The description adds valuable behavioral context beyond annotations: a rate limit of 10 attempts per minute and authentication requirements (Proof account, API key or start_login session). It does not detail success/failure side effects, but the added constraints are substantive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose and a key behavioral note (rate limit), followed by a separate ACCESS paragraph. It is efficient with no redundant sentences, though the ACCESS section is slightly verbose for its informational value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (2FA verification), the absence of an output schema, and the presence of annotations covering safety, the description provides enough context: what it does, rate limits, and authentication prerequisites. It lacks detail on what happens after successful verification (e.g., returned tokens or session state), but that may be inferable from the 2FA flow.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% description coverage for both parameters ('code' and 'session_id'), so the schema already fully documents them. The description adds no additional parameter-level meaning, such as format hints or constraints beyond what the schema provides. Baseline 3 is appropriate when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Submit') and resource ('verification code') and clarifies the goal ('complete a 2FA challenge'). This distinguishes it from siblings like start_2fa (which initiates) or get_2fa_status (which checks status), but it does not explicitly name any alternative tool, leaving that differentiation implicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'to complete a 2FA challenge' implies the tool is used after a challenge has been started, and the ACCESS section provides prerequisite context (need a Proof account, sign in with start_login). However, it gives no explicit guidance on when to choose this tool over alternatives like verify_2fa_magic_link or submit_verification_code, nor does it state exclusion conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

verify_delegationA
Read-only
Inspect

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 for these scopes — NOT that the artifact is safe, audited or endorsed.

ParametersJSON Schema
NameRequiredDescriptionDefault
cardNoThe MCP server card or A2A agent card to read the delegation from
tokenNoA raw delegation token, when you already have it instead of a card
delegateYesThe artifact identity you resolved independently. Required: this comparison is what defeats a copied token.
check_statusNoDefault true. When false the signature and claims are checked but revocation is NOT — treat the result as "not revoked-checked", never as "not revoked".
required_scopesNoCapability scopes the delegation must grant
expected_principalYesRequired. The domain you expect to have authorized this artifact (e.g. postmarkapp.com) — an issuer binds the artifact to nothing, so any domain owner can mint a valid delegation for someone else's package. Without this pin the answer is only "some domain claims this".

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the readOnlyHint=true annotation: states no API key is required, discloses the internal walk (signature → principal → delegate → revocation status, including the cascade to domain control proof), and explicitly bounds the meaning of a verified result ('NOT that the artifact is safe, audited or endorsed'). This is unusually rich behavioral context for a read-only tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first clause and each subsequent sentence carries real guidance (identity sourcing, honest-answer rule, verdict meaning). It is dense and long, with some redundancy against the schema's own field descriptions, but the length is defensible for a security-sensitive verifier.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, yet the description supplies what an agent needs to interpret results, including the meaning of a positive verdict and the check_status=false caveat. Combined with 100% schema coverage and the non-contradictory readOnly annotation, nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description adds rationale beyond the field descriptions — why both delegate and expected_principal are mandatory ('a verdict without both pins would mean some domain said something about some artifact') and the check_status caveat that a non-checked result is not 'not revoked'. Some of this overlaps the schema text, keeping it from a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb ('verify') and a precise resource ('a Proof of Delegation — the attestation that a domain authorized a specific agent artifact'), then defines what the verdict actually means. It clearly distinguishes this from the sibling get/list/create/revoke delegation tools and from a vague 'verify' by scoping it to signature-to-domain-control validation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit operating conditions and exclusions: pass a card or raw token PLUS two self-established facts, and if no independently resolvable identity exists, report that rather than a mismatch. It also warns against reusing stale in-conversation values. It does not name sibling alternatives (e.g. verify_delegations) as a routing choice, so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

verify_delegationsA
Read-only
Inspect

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, optional required_scopes) 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsYes1-50 artifacts to verify in this call, each shaped like a verify_delegation call

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare only readOnlyHint=true, but the description adds substantial behavioral context beyond that: items verified independently with no cross-item state, nothing persisted, revocation always checked (no check_status:false), no API key required, and per-item checked_at semantics. It also enumerates the full outcome taxonomy and warns that 'unconfirmed' must never be read as a bad verdict — a genuinely load-bearing disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and alternative, and nearly every sentence carries information. It is a dense single paragraph, and a few clauses (e.g. the trust-boundary restatement) repeat points made elsewhere, costing some tightness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by fully enumerating the outcome values and their meanings and explaining checked_at. Together with the input contract and the explicit scope boundaries, an agent has everything needed to call and interpret it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: the card-XOR-token shape, the 'delegate is the artifact you act on, never a value read from inside the artifact you check' identity rule, and the rationale for expected_principal. These clarify semantics rather than merely restate the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a concrete verb+resource+scale ('Batch-verify up to 50 Proof of Delegation artifacts in one call') and immediately frames its role as the inventory half of the checker, explicitly contrasting it with the per-artifact sibling verify_delegation. An agent can distinguish it from verify_delegation and the list_* tools without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives the selecting condition directly ('re-check everything you already trust instead of one verify_delegation call per artifact') and states two explicit exclusions ('does NOT discover what you have installed', 'does NOT fetch anything on your behalf'). It also clarifies the trust boundary is the same as verify_delegation's, leaving little to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

verify_domainAInspect

Trigger domain verification. Checks DNS records or other verification method to confirm domain ownership.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesDomain ID to verify

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=false and destructiveHint=false, so the safety profile is thin. The description adds genuine behavioral context the annotations do not: the account/API-key requirement and the fact that a session opened by start_login is what unlocks this tool, which is meaningful for an action-triggering call.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first sentence followed by a one-line elaboration, and the ACCESS requirements are separated into their own block. Every sentence earns its place with no redundancy, though the two-block format is slightly verbose for a single-parameter tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter trigger with annotations and no output schema, the description covers what it does and the auth prerequisites needed to invoke it. It does not explain how the result is surfaced (given no output schema) or differentiate from sibling verification tools, leaving a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter (id), and schema description coverage is 100%, so the schema already documents 'Domain ID to verify'. The description adds no format or source detail for the id, so the baseline 3 for fully-covered schemas applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Trigger domain verification') and clarifies the mechanism ('Checks DNS records or other verification method to confirm domain ownership'). This is clearly more than a restated title, but it does not distinguish itself from the many related siblings like start_domain_verification, check_domain_verification, or verify_domain_with_credentials.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The ACCESS block gives real preconditions (needs a Proof account, set PROOF_API_KEY, or sign in via start_login), which is useful setup guidance. However, it gives no guidance on when to use this tool versus the numerous alternative domain-verification siblings, so the when-to-use dimension is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

verify_domain_with_credentialsAInspect

Verify a pending domain using previously stored DNS credentials. Use when credentials are already connected.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesDomain ID to verify

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false and destructiveHint=false, so the agent knows this mutates state without destroying it. The description adds substantive context beyond that: it requires a Proof account and explains the two auth paths (set PROOF_API_KEY and restart, or sign in via start_login). This auth requirement is genuinely useful behavioral disclosure not covered by annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short paragraphs: purpose first, then an ACCESS block. Front-loaded and free of filler, though the ACCESS paragraph is somewhat verbose for a note that could be tighter. Every sentence still carries useful information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter mutation tool with annotations and full schema coverage, the description covers purpose, precondition, and the authentication requirement, which is the main non-obvious friction. No output schema exists, so return values need not be described. Only the alternative-tool routing is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single 'id' parameter is documented as 'Domain ID to verify.' The description reinforces that the domain must be 'pending' but adds no syntax, format, or lookup guidance for the id beyond the schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (verify) and resource (pending domain) plus the distinguishing mechanism: 'using previously stored DNS credentials.' This separates it from the sibling verify_domain, which presumably relies on manual DNS records, even though the alternative is not named outright. Slightly short of 5 because the differentiation is implied rather than explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Use when credentials are already connected' gives an explicit precondition that tells the agent which situation selects this tool over the credential-less verification path. It stops short of stating the when-not case (e.g., use connect_dns_provider/create_dns_credential when no credentials exist), so it lacks full alternative routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

verify_email_otpAInspect

Submit the OTP code to verify an email addition. Completes the add-email flow if the code is correct.

ACCESS: needs a Proof account. Set PROOF_API_KEY and restart this server, or sign in with start_login — a session opens this tool — then call this tool again.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesOTP code received via email
session_idYesAdd-email session ID

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only provide readOnlyHint=false and destructiveHint=false; the description adds meaningfully to that by disclosing the account/auth prerequisite (PROOF_API_KEY or start_login) and the fact that a correct code finalizes the add-email flow. It omits failure behavior (invalid/expired code) or retry limits, so it stops short of full disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short blocks: purpose first, then an ACCESS note. Front-loaded and mostly waste-free, though the ACCESS paragraph is slightly long relative to the core two-sentence purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 2-param, no-output-schema tool with annotations covering the safety profile, the description covers purpose, flow position, and auth prerequisites. The main gap is what happens on an incorrect or expired code, which an agent would want to know before retrying.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, with both session_id and code already documented in the schema. The description adds no syntax, format, or sourcing detail beyond what the schema provides, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Submit the OTP code to verify an email addition') and ties it to a named flow ('Completes the add-email flow'). It is distinguishable from cousins like resend_email_otp and start_add_email, though it does not explicitly disambiguate from other OTP-consuming siblings such as submit_verification_code or confirm_domain_email_code.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the flow language ('Completes the add-email flow if the code is correct') and by the ACCESS note explaining the sign-in prerequisite. However, it never explicitly names the alternative (e.g., resend_email_otp when the code never arrives) or states when NOT to use this versus the other code-consuming tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

wait_for_2faA
Read-only
Inspect

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. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
session_idYes2FA session ID from start_2fa
timeout_secondsNoMaximum wait time in seconds (default: 50, max: 600). Keep it under your MCP client's request timeout (the SDK default is 60 s) — a longer wait is cut off by the client while the server is still polling. On timeout the tool answers status "pending"; call it again with the same identifier.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=true; the description goes far beyond by disclosing the backoff schedule (2s initial, 1.5x, 30s max, jitter), timeout behavior (returns 'pending' and must be re-called with the same identifier), terminal states, and an auth prerequisite (Proof account, PROOF_API_KEY, restart required). No contradiction with readOnlyHint — polling is a read.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well front-loaded and sectioned (purpose, agent usage, rendering caveat, access), and every section carries information. It loses a point for the third paragraph, which restates the 'user does not see tool results' rendering point already covered in the usage paragraph.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description takes on the return-value burden and delivers: the two terminal states, the 'pending' timeout state, and the required follow-up call. Combined with the rendering and auth notes, nothing an agent needs to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents both session_id and timeout_seconds (including defaults, max, and the client-timeout caveat). The description only adds marginal reinforcement ('with the returned session_id', 'call it again with the same identifier'). Baseline 3 is appropriate when the schema carries the weight.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence states a specific verb and resource ('Poll a 2FA session until the user completes the challenge') and immediately distinguishes itself from sibling pollers like get_2fa_status by its blocking/polling nature. An agent can tell it apart from wait_for_login, wait_for_session, and verify_2fa without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly prescribes sequencing ('Call this after start_2fa with the returned session_id'), names the terminal states and what to do in each ('expired' → restart with start_2fa), and routes to render_auth_link on telegram/whatsapp vs sms_message on sms. This is when/when-not plus alternatives, fully spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

wait_for_account_creationA
Read-only
Inspect

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". 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesAccount session id from create_account
timeout_secondsNoMaximum wait time in seconds (default: 50, max: 600). Keep it under your MCP client's request timeout (the SDK default is 60 s) — a longer wait is cut off by the client while the server is still polling. On timeout the tool answers status "pending"; call it again with the same identifier.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations supply only readOnlyHint, but the description adds substantial behavior: exponential backoff parameters, terminal states ("verified", "expired"), the meaning of "pending", session retention for the connection, and the `user_id` field in the terminal body. This goes well beyond what the annotation conveys.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads purpose, then a clearly labeled 'Agent usage' block; every paragraph is actionable. The backoff internals (1.5x multiplier, jitter) are mildly decorative since only the 30s cap affects the agent's timeout choice, which is the only reason this is not a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by naming the terminal statuses and the identifying `user_id` field, and it covers retry semantics and the new-vs-existing-user equivalence. An agent has everything needed to call and re-call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both `id` (from create_account) and `timeout_seconds` (range, default, client-timeout caveat) are already fully documented in the schema. The description reinforces the id's provenance and the pending-on-timeout outcome but adds no syntax or format detail the schema lacks.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Poll an account-bootstrap session until the user completes verification') and ties itself directly to its predecessor ('Call this after create_account with the returned session id'), which separates it from the many other wait_for_* siblings. An agent can identify the tool without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit about when to call it (after create_account, with the returned session id), what to do when the wait times out ('status "pending" ... call this tool again with the same id'), and even the pre-call UX prerequisite about surfacing the link/OTP to the user. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

wait_for_chat_id_discoveryA
Read-only
Inspect

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. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
tokenYesDiscovery token from create_chat_id_discovery
timeout_secondsNoMaximum wait time in seconds (default: 50, max: 600). Keep it under your MCP client's request timeout (the SDK default is 60 s) — a longer wait is cut off by the client while the server is still polling. On timeout the tool answers status "pending"; call it again with the same identifier.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With readOnlyHint=true already covering safety, the description adds genuinely new behavior: exponential backoff parameters (2s initial, 1.5x, 30s max, jitter), the client-timeout interaction and re-call-on-pending semantics, the requirement for a Proof account with PROOF_API_KEY, and the warning that tool results are folded away by most clients.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core operation and backoff characteristics, then layered with usage and access notes. Every paragraph carries actionable content, though the paragraph about tool results being hidden is about agent reply composition rather than this tool specifically and slightly dilutes focus.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, yet the description enumerates the terminal status values, the pending/timeout case, the credentials prerequisite, and the surrounding call sequence. An agent has everything needed to invoke this correctly and interpret the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both token and timeout_seconds are already fully documented, establishing a baseline of 3. The description's polling advice restates the timeout behavior rather than adding format or value semantics beyond what the schema already says.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (poll/wait) and resource (chat ID discovery token) plus the terminating condition (user interacts with the Telegram bot). It clearly separates itself from create_chat_id_discovery, but does not explain how it differs from the near-identically named sibling poll_chat_id_discovery, which an agent could easily confuse it with.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit ordered workflow: call after create_chat_id_discovery, present deep_link with render_auth_link, then poll with the returned token. It also enumerates terminal states (completed/expired) and the meaning of pending, so the agent knows what to do in every outcome.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

wait_for_confirmationA
Read-only
Inspect

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. If the approver needs one anyway, call get_confirmation_approval_link for a fresh 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. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesConfirmation ID from create_confirmation
timeout_secondsNoMaximum wait time in seconds (default: 50, max: 600). Keep it under your MCP client's request timeout (the SDK default is 60 s) — a longer wait is cut off by the client while the server is still polling. On timeout the tool answers status "pending"; call it again with the same identifier.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only carry readOnlyHint=true, so the description does the heavy lifting: exponential backoff parameters (2s initial, 1.5x, 30s max, jitter), the timeout→pending continuation semantics, the terminal states and what to do on approval (check proof_token), and the auth requirement to even call it. This is unusually rich behavioral context beyond the annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core behavior and terminal states are front-loaded and waste no words. The long approval-link clause and the ACCESS paragraph earn their place but are dense and slightly over-extended for a single tool entry.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description must describe return states — and it does (pending/approved/denied plus proof_token guidance). Combined with backoff, timeout, and auth coverage, an agent has everything needed to call and interpret this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters are already documented in the schema, and the description adds little new about `id` or `timeout_seconds` themselves (it restates the pending-on-timeout behavior that the schema already covers). Baseline 3 applies; the description's param-adjacent value is really about return states, not parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Poll a confirmation until the approver responds,' immediately separating it from read-once siblings like get_confirmation and list_confirmations. The terminal-state vocabulary (approved/denied/pending) further pins down what the tool returns, so the agent knows this is a blocking wait, not a fetch.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Call this after create_confirmation with the returned confirmation ID' gives explicit sequencing, and the description names the alternative (get_confirmation_approval_link) along with the exact conditions that select it and the timeout_at precondition where it refuses. It even states the prerequisite to enable the tool (PROOF_API_KEY) and explicitly rules out start_login.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

wait_for_loginA
Read-only
Inspect

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". 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesAuth session ID from start_login
timeout_secondsNoMaximum wait time in seconds (default: 50, max: 600). Keep it under your MCP client's request timeout (the SDK default is 60 s) — a longer wait is cut off by the client while the server is still polling. On timeout the tool answers status "pending"; call it again with the same identifier.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=true, but the description adds real behavioral context beyond that: the exponential-backoff schedule (2s/1.5x/30s max with jitter), the four possible outcomes, and the non-obvious side effect that a 'verified' session persists for the connection and signs a wide range of the caller's account records. That last point materially changes how an agent should treat the session.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then usage, then the reply-text caveat — a sensible ordering. The parenthetical enumerating everything the session signs (emails, phones, domains, API keys, 2FA, DNS credentials, verification requests, profile username and proof list) is long, but it does convey the blast radius of the credential, so it mostly earns its space.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, and the description fully compensates by naming every return state ('verified', 'failed', 'expired', 'pending') and what each means for the caller. Combined with the retry guidance and the UX reminder, an agent has everything needed to drive the poll loop correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% — both `id` and `timeout_seconds` are documented in the schema, including the client-timeout caveat. The description reinforces the retry loop ('call this tool again with the same id') and implies the timeout/pending relationship, but adds no syntax or format detail the schema lacks. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource — 'Poll a login session until the user completes authentication' — and ties itself to start_login, which distinguishes it from the crowded wait_for_* family (wait_for_2fa, wait_for_session, wait_for_confirmation). An agent can pick this tool without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit precondition ('Call this after start_login with the returned session ID'), enumerates terminal states, and prescribes the exact recovery path for the non-terminal case ('status "pending" ... call this tool again with the same id'). The pre-call reminder about surfacing the link in reply text is actionable guidance, not filler.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

wait_for_requestA
Read-only
Inspect

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. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesVerification request ID to poll
timeout_secondsNoMaximum wait time in seconds (default: 50, max: 300). Keep it under your MCP client's request timeout (the SDK default is 60 s) — a longer wait is cut off by the client while the server is still polling. On timeout the tool answers status "pending"; call it again with the same identifier.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond readOnlyHint=true it discloses the polling mechanics (2s initial, 1.5x backoff, 30s cap, jitter), the terminal-state set, and the auth/restart gating requirement. It omits return shape and whether polling consumes quota, but the operational profile is well beyond what the annotation conveys.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and termination conditions are front-loaded in the first sentence, with polling mechanics immediately after. The ACCESS block is a little ceremonious but carries a genuine gating constraint, so it earns its space.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries return-semantics burden and does enumerate the terminal states an agent will observe on completion, plus the timeout->pending path documented in the schema. It stops short of describing the full response shape or failure modes.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%: 'id' and 'timeout_seconds' are both fully documented in the schema, including the client-timeout caveat and re-call behavior. The description adds no parameter detail, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (poll/wait) and a precise resource (verification request), and enumerates the terminal states (completed, expired, cancelled). The resource naming distinguishes it from the nearby wait_for_verification sibling, which targets verifications rather than requests.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear blocking semantics and an explicit precondition (Proof account + PROOF_API_KEY) plus a negative rule ('start_login does NOT open this tool'). It does not, however, contrast this blocking poll against the non-blocking get_verification_request, so the agent must infer when to block versus check once.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

wait_for_sessionA
Read-only
Inspect

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. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesSession ID to poll
timeout_secondsNoMaximum wait time in seconds (default: 50, max: 300). Keep it under your MCP client's request timeout (the SDK default is 60 s) — a longer wait is cut off by the client while the server is still polling. On timeout the tool answers status "pending"; call it again with the same identifier.

TDQS

A3.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well past the readOnlyHint annotation: it discloses the polling strategy and backoff parameters (2 s initial, 1.5x, 30 s max, jitter), the timeout return semantics (status "pending"), and an auth prerequisite (PROOF_API_KEY must be set and the server restarted). That is exactly the operational context annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first sentence and the three paragraphs are cleanly separated (behavior, usage caution, access). Every sentence carries information, though the exact backoff constants are more detail than most callers need.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by naming the terminal states and the pending-on-timeout return value, and it flags the required credential. Minor gaps remain: it doesn't say what the session object looks like or how to distinguish which session type is expected.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both id and timeout_seconds are already fully documented in the schema, including the 60 s SDK client-timeout interaction. The description repeats the pending-on-timeout behavior but adds no new per-parameter meaning, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (poll/wait) plus resource (session) and enumerates the terminal states (verified, failed, expired), which tells an agent when the call resolves. However, it never distinguishes itself from the many sibling waiters (wait_for_verification, wait_for_login, wait_for_request, wait_for_2fa) or ties itself to create_session/get_session, so the agent must infer which 'session' this applies to.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a genuine precondition ('before calling this for a challenge you created, make sure your reply text already shows the user what to act on') and tells the agent to re-call with the same identifier on timeout. It gives no guidance on when to prefer this over the other wait_for_* siblings or when to skip polling in favor of a single get_session call, so selection guidance is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

wait_for_verificationA
Read-only
Inspect

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. Set PROOF_API_KEY and restart this server, then call this tool again. start_login does NOT open this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesVerification ID to poll
timeout_secondsNoMaximum wait time in seconds (default: 50, max: 300). Keep it under your MCP client's request timeout (the SDK default is 60 s) — a longer wait is cut off by the client while the server is still polling. On timeout the tool answers status "pending"; call it again with the same identifier.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=true, so the description carries substantial extra weight and delivers: exponential backoff parameters (2s initial, 1.5x, 30s max) with jitter, the exact timeout behavior (returns status 'pending' and must be re-called), the lifecycle semantics that make cancelled/revoked final, and the auth requirement. The UX caveat about surfacing the link in reply text is genuine behavioral guidance not available anywhere else.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and terminal states are front-loaded in the first sentence, with supporting semantics, the UX caveat, and the access prerequisite following in tight, distinct paragraphs. Every sentence carries unique information — no repetition of the schema or annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description still conveys the key return signal (timeout yields status 'pending'; terminal states are the success/failure outcomes) and covers auth and retry behavior. It does not describe the fuller payload a caller might receive on success, which is a minor gap for an otherwise complete definition.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the schema already documents both id and timeout_seconds in depth (default 50, max 300, MCP client timeout interaction). The description adds no parameter-level detail beyond what the schema states, so the baseline of 3 applies for a tool whose schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Starts with a specific verb+resource ('Poll a verification') and enumerates the terminal states that end the poll (verified, failed, expired, revoked, or cancelled). The framing as a wait-until-terminal operation clearly separates it from the one-shot get_verification sibling, which it implicitly contrasts by saying the wait 'returns rather than polling on.'

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear usage context: it must be called only after the user can already see something actionable, and it describes the timeout/retry loop ('call it again with the same identifier'). The ACCESS note states a hard prerequisite (Proof account, PROOF_API_KEY, restart, and that start_login does NOT open this tool). It stops short of naming an explicit alternative (e.g. get_verification) for non-blocking checks.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 13 tool updatesv1.7.0
    • Changedcreate_profile2 fields changed
      • addedInput schema / properties / email_theme
        Added value: +{
        +  "description": "Theme of this project's emails",
        +  "enum": [
        +    "dark",
        +    "light"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / support_email
        Added value: +{
        +  "description": "Support email this project's messages show",
        +  "format": "email",
        +  "maxLength": 254,
        +  "type": "string"
        +}
    • Removeddelete_profile_template
    • Changeddelete_template1 field changed
      • addedInput schema / properties / profile_id
        Added value: +{
        +  "description": "The sub-account (project) to act on; omitted → your key's project, or the primary project for an account-wide key",
        +  "pattern": "^[0-9a-fA-F]{24}$",
        +  "type": "string"
        +}
    • Changedget_template1 field changed
      • addedInput schema / properties / profile_id
        Added value: +{
        +  "description": "The sub-account (project) to act on; omitted → your key's project, or the primary project for an account-wide key",
        +  "pattern": "^[0-9a-fA-F]{24}$",
        +  "type": "string"
        +}
    • Removedlist_profile_templates
    • Changedlist_templates2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / profile_id
        Added value: +{
        +  "description": "The sub-account (project) to act on; omitted → your key's project, or the primary project for an account-wide key",
        +  "pattern": "^[0-9a-fA-F]{24}$",
        +  "type": "string"
        +}
    • Removedpreview_profile_template
    • Changedpreview_template1 field changed
      • addedInput schema / properties / profile_id
        Added value: +{
        +  "description": "The sub-account (project) to act on; omitted → your key's project, or the primary project for an account-wide key",
        +  "pattern": "^[0-9a-fA-F]{24}$",
        +  "type": "string"
        +}
    • Changedrender_template1 field changed
      • addedInput schema / properties / profile_id
        Added value: +{
        +  "description": "The sub-account (project) to act on; omitted → your key's project, or the primary project for an account-wide key",
        +  "pattern": "^[0-9a-fA-F]{24}$",
        +  "type": "string"
        +}
    • Changedupdate_profile2 fields changed
      • addedInput schema / properties / email_theme
        Added value: +{
        +  "description": "Theme of this project's emails",
        +  "enum": [
        +    "dark",
        +    "light"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / support_email
        Added value: +{
        +  "anyOf": [
        +    {
        +      "anyOf": [
        +        {
        +          "not": {}
        +        },
        +        {
        +          "format": "email",
        +          "maxLength": 254,
        +          "type": "string"
        +        }
        +      ],
        +      "description": "Support email this project's messages show"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Support email this project's messages show (null to remove)"
        +}
    • Removedupdate_profile_template
    • Changedupdate_settings1 field changed
      • removedInput schema / properties / branding
        Removed value: -{
        -  "additionalProperties": false,
        -  "description": "Branding settings to update",
        -  "properties": {
        -    "business_name": {
        -      "description": "Business name displayed in verifications",
        -      "maxLength": 100,
        -      "type": "string"
        -    },
        -    "email_theme": {
        -      "description": "Email template theme",
        -      "enum": [
        -        "dark",
        -        "light"
        -      ],
        -      "type": "string"
        -    },
        -    "logo_url": {
        -      "anyOf": [
        -        {
        -          "anyOf": [
        -            {
        -              "not": {}
        -            },
        -            {
        -              "format": "uri",
        -              "type": "string"
        -            }
        -          ]
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "description": "HTTPS URL to business logo"
        -    },
        -    "primary_color": {
        -      "description": "Primary brand color (hex, e.g. #FF5733)",
        -      "pattern": "^#[0-9A-Fa-f]{6}$",
        -      "type": "string"
        -    },
        -    "support_email": {
        -      "description": "Support email shown in verification messages",
        -      "format": "email",
        -      "type": "string"
        -    }
        -  },
        -  "type": "object"
        -}
    • Changedupdate_template1 field changed
      • addedInput schema / properties / profile_id
        Added value: +{
        +  "description": "The sub-account (project) to act on; omitted → your key's project, or the primary project for an account-wide key",
        +  "pattern": "^[0-9a-fA-F]{24}$",
        +  "type": "string"
        +}
  2. 17 tool updatesv1.6.0
    • Removedadd_challenger
    • Removedclaim_request_assets
    • Changedcreate_circle1 field changed
      • addedInput schema / properties / owner_name
        Added value: +{
        +  "anyOf": [
        +    {
        +      "maxLength": 100,
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "How this Circle's members know its owner (\"Dad\", \"Giorgi\"). The bots name the owner by it; while it is empty they name nobody — the Circle's name labels the group, never the person. Trimmed by the API; null or an empty value clears it."
        +}
    • Changedcreate_confirmation2 fields changed
      • changedInput schema / properties / message / description
        Previous value: -"Human-readable description of what needs approval"New value: +"The client-encrypted ciphertext envelope as a JSON string (v1 or v2) — NOT the human-readable text. Encrypt the sentence the approver should read; passing it directly is refused with 400 `message_not_encrypted`, because the approval page can only decrypt an envelope."
      • changedInput schema / properties / message / maxLength
        Previous value: -2000New value: +10000
    • Changedcreate_identity_challenge6 fields changed
      • removedInput schema / properties / challenger_id
        Removed value: -{
        -  "description": "Enrolled challenger initiating the check",
        -  "pattern": "^[0-9a-fA-F]{24}$",
        -  "type": "string"
        -}
      • addedInput schema / properties / circle_id
        Added value: +{
        +  "description": "Circle that holds the member",
        +  "pattern": "^[0-9a-fA-F]{24}$",
        +  "type": "string"
        +}
      • removedInput schema / properties / hitl_id
        Removed value: -{
        -  "description": "HITL config that holds the challenger",
        -  "pattern": "^[0-9a-fA-F]{24}$",
        -  "type": "string"
        -}
      • addedInput schema / properties / member_id
        Added value: +{
        +  "description": "Enrolled Circle member initiating the check",
        +  "pattern": "^[0-9a-fA-F]{24}$",
        +  "type": "string"
        +}
      • changedInput schema / properties / suspicious_channel / description
        Previous value: -"Channel the suspicious contact reached the challenger on; defaults to the challenger channel"New value: +"Channel the suspicious contact reached the member on; defaults to the member channel"
      • changedInput schema / required
        Previous value: -[
        -  "hitl_id",
        -  "challenger_id"
        -]New value: +[
        +  "circle_id",
        +  "member_id"
        +]
    • Changedcreate_user_request23 fields changed
      • addedInput schema / properties / action_context / additionalProperties
        Added value: +false
      • changedInput schema / properties / action_context / description
        Previous value: -"Additional context about why assets are needed"New value: +"What the recipient is shown about why the assets are needed, e.g. { \"title\": \"Confirm your contact details\" }"
      • addedInput schema / properties / action_context / properties
        Added value: +{
        +  "amount": {
        +    "exclusiveMinimum": 0,
        +    "type": "number"
        +  },
        +  "currency": {
        +    "maxLength": 10,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  "description": {
        +    "maxLength": 500,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  "entity": {
        +    "maxLength": 200,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  "title": {
        +    "maxLength": 100,
        +    "minLength": 1,
        +    "type": "string"
        +  }
        +}
      • changedInput schema / properties / action_context / type
        Previous value: -"string"New value: +"object"
      • changedInput schema / properties / action_type / description
        Previous value: -"Purpose of the request (default: verification)"New value: +"Purpose of the request (default: verification); custom and confirmation also need an action_context title"
      • changedInput schema / properties / action_type / enum
        Previous value: -[
        -  "verification",
        -  "onboarding",
        -  "compliance"
        -]New value: +[
        +  "verification",
        +  "2fa",
        +  "login",
        +  "custom",
        +  "confirmation",
        +  "authorization"
        +]
      • changedInput schema / properties / assets / description
        Previous value: -"Asset type identifiers to request (e.g. email, phone, identity)"New value: +"Assets to request, e.g. [{ \"type\": \"email\" }, { \"type\": \"phone\", \"required\": false }]"
      • addedInput schema / properties / assets / items / additionalProperties
        Added value: +false
      • addedInput schema / properties / assets / items / properties
        Added value: +{
        +  "allowed_channels": {
        +    "description": "Channels the recipient may choose from",
        +    "items": {
        +      "enum": [
        +        "whatsapp",
        +        "telegram",
        +        "sms",
        +        "email",
        +        "dns",
        +        "http",
        +        "auto",
        +        "github",
        +        "google",
        +        "facebook",
        +        "x",
        +        "linkedin",
        +        "instagram",
        +        "youtube",
        +        "tiktok",
        +        "ethereum",
        +        "solana",
        +        "bitcoin",
        +        "coinbase",
        +        "kraken",
        +        "telegram_bot_token"
        +      ],
        +      "type": "string"
        +    },
        +    "maxItems": 10,
        +    "type": "array"
        +  },
        +  "channel": {
        +    "description": "Verification channel to use for this asset",
        +    "enum": [
        +      "whatsapp",
        +      "telegram",
        +      "sms",
        +      "email",
        +      "dns",
        +      "http",
        +      "auto",
        +      "github",
        +      "google",
        +      "facebook",
        +      "x",
        +      "linkedin",
        +      "instagram",
        +      "youtube",
        +      "tiktok",
        +      "ethereum",
        +      "solana",
        +      "bitcoin",
        +      "coinbase",
        +      "kraken",
        +      "telegram_bot_token"
        +    ],
        +    "type": "string"
        +  },
        +  "identifier": {
        +    "description": "The exact value to verify (e.g. an email address); omit to let the recipient choose",
        +    "maxLength": 500,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  "required": {
        +    "description": "Whether this asset must be verified (default: true)",
        +    "type": "boolean"
        +  },
        +  "type": {
        +    "description": "What to verify",
        +    "enum": [
        +      "phone",
        +      "email",
        +      "domain",
        +      "social",
        +      "wallet",
        +      "telegram_bot"
        +    ],
        +    "type": "string"
        +  }
        +}
      • addedInput schema / properties / assets / items / required
        Added value: +[
        +  "type"
        +]
      • changedInput schema / properties / assets / items / type
        Previous value: -"string"New value: +"object"
      • changedInput schema / properties / callback_url / description
        Previous value: -"Webhook URL for request status updates"New value: +"HTTPS webhook URL for request status updates"
      • addedInput schema / properties / callback_url / maxLength
        Added value: +2000
      • addedInput schema / properties / callback_url / pattern
        Added value: +"^https:\\/\\/"
      • changedInput schema / properties / expires_in_hours / description
        Previous value: -"Hours until request expires (default: 24)"New value: +"Hours until request expires (default: 168, i.e. 7 days)"
      • addedInput schema / properties / public_profile_id / pattern
        Added value: +"^[0-9a-fA-F]{24}$"
      • changedInput schema / properties / redirect_url / description
        Previous value: -"URL to redirect the subject after completing the request"New value: +"HTTPS URL to redirect the subject after completing the request"
      • addedInput schema / properties / redirect_url / maxLength
        Added value: +2000
      • addedInput schema / properties / redirect_url / pattern
        Added value: +"^https:\\/\\/"
      • addedInput schema / properties / reference_id / maxLength
        Added value: +255
      • addedInput schema / properties / reference_id / minLength
        Added value: +1
      • changedInput schema / properties / validity_requirement / description
        Previous value: -"Required validity level for shared assets"New value: +"How recently an existing proof must have been verified for the recipient to reuse it: a number and a unit, h hours, d days, w weeks or m months (30 days), e.g. \"24h\", \"7d\", \"1m\""
      • addedInput schema / properties / validity_requirement / pattern
        Added value: +"^\\d+[hdwm]$"
    • Changedcreate_verification_request1 field changed
      • changedInput schema / properties / expires_in / description
        Previous value: -"Request expiry in seconds (default: 86400, max: 604800)"New value: +"Request expiry in seconds (default: 604800, i.e. 7 days; max: 2592000, i.e. 30 days)"
    • Addeddelete_domain_verification
    • Changedexport_data2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / export_id
        Added value: +{
        +  "description": "Read this export's status instead of the latest one",
        +  "pattern": "^[a-f0-9]{24}$",
        +  "type": "string"
        +}
    • Removedinvite_challenger
    • Removedlist_challengers
    • Removedremove_challenger
    • Changedstart_2fa2 fields changed
      • changedInput schema / properties / action_type / enum
        Previous value: -[
        -  "api_key_view",
        -  "api_key_create",
        -  "api_key_revoke",
        -  "api_key_regenerate",
        -  "phone_add",
        -  "phone_remove",
        -  "email_add",
        -  "email_remove",
        -  "account_delete"
        -]New value: +[
        +  "api_key_view",
        +  "api_key_create",
        +  "api_key_revoke",
        +  "api_key_regenerate",
        +  "phone_add",
        +  "phone_remove",
        +  "email_add",
        +  "email_remove",
        +  "account_delete",
        +  "revocation_bulk",
        +  "domain_remove",
        +  "profile_delete",
        +  "phone_primary",
        +  "email_primary"
        +]
      • addedInput schema / properties / targets
        Added value: +{
        +  "description": "The ids the step-up is FOR — the grant is bound to exactly these and refused for any other request (`reason: target_mismatch`). revocation_bulk: the asset id you will pass to revoke_asset (one code per asset); phone_remove / email_remove: the phone or email record id; domain_remove: the domain id; profile_delete: the project id; account_delete: your own user id (get_current_user). Leave out for the other action types.",
        +  "items": {
        +    "maxLength": 256,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  "maxItems": 25,
        +  "minItems": 1,
        +  "type": "array"
        +}
    • Changedstart_2fa_for_action3 fields changed
      • changedInput schema / properties / action_type / description
        Previous value: -"The sensitive action the 2FA grant will authorize. Destructive scopes (api_key_*, account_delete, phone_remove, email_remove, revocation_bulk) are capped at 5 min TTL + forced single-use. Configuration scopes (settings_write, profile_update, templates_write) allow up to 24h TTL with caller-chosen single_use. See config/twoFAPolicy.ts on the backend for the canonical policy."New value: +"The sensitive action the 2FA grant will authorize. Destructive scopes (api_key_*, account_delete, phone_remove, email_remove, phone_primary, email_primary, revocation_bulk, domain_remove, profile_delete) are capped at 5 min TTL + forced single-use. Configuration scopes (settings_write, profile_update, templates_write) allow up to 24h TTL with caller-chosen single_use. See config/twoFAPolicy.ts on the backend for the canonical policy."
      • changedInput schema / properties / action_type / enum
        Previous value: -[
        -  "api_key_create",
        -  "api_key_revoke",
        -  "api_key_regenerate",
        -  "api_key_view",
        -  "phone_remove",
        -  "email_remove",
        -  "account_delete",
        -  "revocation_bulk",
        -  "settings_write",
        -  "profile_update",
        -  "templates_write"
        -]New value: +[
        +  "api_key_create",
        +  "api_key_revoke",
        +  "api_key_regenerate",
        +  "api_key_view",
        +  "phone_remove",
        +  "email_remove",
        +  "account_delete",
        +  "revocation_bulk",
        +  "domain_remove",
        +  "profile_delete",
        +  "phone_primary",
        +  "email_primary",
        +  "settings_write",
        +  "profile_update",
        +  "templates_write"
        +]
      • addedInput schema / properties / targets
        Added value: +{
        +  "description": "The ids the step-up is FOR — the grant is bound to exactly these and refused for any other request (`reason: target_mismatch`). revocation_bulk: the asset id you will pass to revoke_asset (one code per asset); phone_remove / email_remove: the phone or email record id; domain_remove: the domain id; profile_delete: the project id; account_delete: your own user id (get_current_user). Leave out for the other action types.",
        +  "items": {
        +    "maxLength": 256,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  "maxItems": 25,
        +  "minItems": 1,
        +  "type": "array"
        +}
    • Removedtrigger_drill
    • Changedupdate_circle1 field changed
      • addedInput schema / properties / owner_name
        Added value: +{
        +  "anyOf": [
        +    {
        +      "maxLength": 100,
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "How this Circle's members know its owner (\"Dad\", \"Giorgi\"). The bots name the owner by it; while it is empty they name nobody — the Circle's name labels the group, never the person. Trimmed by the API; null or an empty value clears it."
        +}
    • Changedupdate_settings2 fields changed
      • addedInput schema / properties / proof_expiry_days
        Added value: +{
        +  "description": "Default proof-token lifetime in days for newly issued proofs",
        +  "maximum": 365,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / webhook
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Outbound webhook configuration. Deliveries carry an HMAC-SHA256 X-Proof-Signature over \"<X-Proof-Timestamp>.<body>\".",
        +  "properties": {
        +    "events": {
        +      "description": "Subscription patterns: an exact event type, a family wildcard such as \"proof.*\", or \"*\". An empty list means every event.",
        +      "items": {
        +        "type": "string"
        +      },
        +      "maxItems": 32,
        +      "type": "array"
        +    },
        +    "rotate_secret": {
        +      "description": "Replace the signing secret and return the new value. The previous value stops verifying immediately.",
        +      "type": "boolean"
        +    },
        +    "url": {
        +      "anyOf": [
        +        {
        +          "format": "uri",
        +          "maxLength": 2000,
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "HTTPS endpoint outbound webhooks are delivered to, at most 2000 characters; null removes it. Private, loopback and link-local addresses are refused."
        +    }
        +  },
        +  "type": "object"
        +}
  3. 176 tool updatesv1.1.0
    • First observedadd_challenger
    • First observedadd_circle_member
    • First observedadd_circle_member_channel
    • First observedadd_domain
    • First observedadd_verification_provider
    • First observedcancel_user_request
    • First observedcancel_verification_request
    • First observedcheck_domain_credentials
    • First observedcheck_domain_email_status
    • First observedcheck_domain_verification
    • First observedcheck_user_domain_verification
    • First observedclaim_request_assets
    • First observedclaim_username
    • First observedconfirm_domain_email_code
    • First observedconnect_cloudflare
    • First observedconnect_dns_provider
    • First observedconnect_godaddy
    • First observedcreate_account
    • First observedcreate_api_key
    • First observedcreate_authorization
    • First observedcreate_chat_id_discovery
    • First observedcreate_circle
    • First observedcreate_circle_member_drill
    • First observedcreate_confirmation
    • First observedcreate_delegation
    • First observedcreate_dns_credential
    • First observedcreate_hitl
    • First observedcreate_identity_challenge
    • First observedcreate_multi_channel_verification
    • First observedcreate_profile
    • First observedcreate_session
    • First observedcreate_user_request
    • First observedcreate_verification
    • First observedcreate_verification_request
    • First observeddelete_circle
    • First observeddelete_dns_credential
    • First observeddelete_domain
    • First observeddelete_hitl
    • First observeddelete_hitl_keys
    • First observeddelete_profile
    • First observeddelete_profile_template
    • First observeddelete_template
    • First observedexport_authorizations
    • First observedexport_data
    • First observedextend_request
    • First observedget_2fa_status
    • First observedget_add_email_status
    • First observedget_add_phone_status
    • First observedget_api_key_usage
    • First observedget_asset
    • First observedget_authorization
    • First observedget_circle
    • First observedget_confirmation
    • First observedget_confirmation_approval_link
    • First observedget_current_user
    • First observedget_default_templates
    • First observedget_delegation
    • First observedget_dns_providers
    • First observedget_domain
    • First observedget_hitl
    • First observedget_hitl_keys
    • First observedget_identity_challenge
    • First observedget_multi_channel_verification_status
    • First observedget_my_profile
    • First observedget_platform_summary
    • First observedget_profile
    • First observedget_profile_assets
    • First observedget_proof_status
    • First observedget_request_by_reference
    • First observedget_request_proofs
    • First observedget_self_api_key
    • First observedget_session
    • First observedget_settings
    • First observedget_subscription
    • First observedget_template
    • First observedget_usage
    • First observedget_user_domain_verification_status
    • First observedget_verification
    • First observedget_verification_request
    • First observedget_verified_user
    • First observedget_webhook_delivery
    • First observedget_webhook_stats
    • First observedinvite_challenger
    • First observedinvite_circle_member
    • First observedlist_api_keys
    • First observedlist_assets
    • First observedlist_auth_sessions
    • First observedlist_authorizations
    • First observedlist_challengers
    • First observedlist_circle_member_channels
    • First observedlist_circle_members
    • First observedlist_circles
    • First observedlist_confirmations
    • First observedlist_delegations
    • First observedlist_dns_credentials
    • First observedlist_domains
    • First observedlist_emails
    • First observedlist_hitls
    • First observedlist_incoming_requests
    • First observedlist_my_requests
    • First observedlist_phones
    • First observedlist_profile_templates
    • First observedlist_profiles
    • First observedlist_revoked_proofs
    • First observedlist_templates
    • First observedlist_verification_requests
    • First observedlist_verifications
    • First observedlist_verified_users
    • First observedlist_webhook_deliveries
    • First observedpoll_chat_id_discovery
    • First observedpreview_profile_template
    • First observedpreview_template
    • First observedregenerate_api_key
    • First observedremove_challenger
    • First observedremove_circle_member
    • First observedremove_circle_member_channel
    • First observedremove_email
    • First observedremove_phone
    • First observedrender_auth_link
    • First observedrender_template
    • First observedrequest_hitl_authorization
    • First observedresend_domain_email
    • First observedresend_email_otp
    • First observedresend_verification
    • First observedretry_webhook_delivery
    • First observedrevoke_api_key
    • First observedrevoke_asset
    • First observedrevoke_auth_session
    • First observedrevoke_authorization
    • First observedrevoke_delegation
    • First observedrevoke_proof
    • First observedsearch
    • First observedsend_account_email
    • First observedset_primary_email
    • First observedset_primary_phone
    • First observedset_primary_profile
    • First observedsetup_domain_email
    • First observedshare_request_email
    • First observedstart_2fa
    • First observedstart_2fa_for_action
    • First observedstart_add_email
    • First observedstart_add_phone
    • First observedstart_domain_email_verification
    • First observedstart_domain_verification
    • First observedstart_login
    • First observedstart_user_domain_verification
    • First observedsubmit_verification_code
    • First observedtest_verify
    • First observedtrigger_drill
    • First observedtrigger_verification
    • First observedupdate_circle
    • First observedupdate_hitl
    • First observedupdate_my_profile
    • First observedupdate_profile
    • First observedupdate_profile_proofs
    • First observedupdate_profile_template
    • First observedupdate_public_proofs
    • First observedupdate_settings
    • First observedupdate_template
    • First observedupload_hitl_keys
    • First observedvalidate_proof
    • First observedverify_2fa
    • First observedverify_2fa_magic_link
    • First observedverify_delegation
    • First observedverify_delegations
    • First observedverify_domain
    • First observedverify_domain_with_credentials
    • First observedverify_email_otp
    • First observedwait_for_2fa
    • First observedwait_for_account_creation
    • First observedwait_for_chat_id_discovery
    • First observedwait_for_confirmation
    • First observedwait_for_login
    • First observedwait_for_request
    • First observedwait_for_session
    • First observedwait_for_verification

TDQS

A3.5/5.0

Scored across 167 tools

Disambiguation2/5

The set spans many overlapping verification and authentication flows—create_verification, create_session, create_multi_channel_verification, create_verification_request, and multiple start_domain*/verify_domain/check_domain_verification tools—so an agent can easily pick the wrong flow despite detailed descriptions. Overlaps around wait_for_* polling, revoke_*, and account/login helpers also blur boundaries at this scale.

Naming Consistency5/5

Names are overwhelmingly snake_case with a consistent verb_noun or noun pattern (list_*, get_*, create_*, update_*, delete_*, start_*, wait_for_*). Minor outliers like search, test_verify, render_auth_link, and export_data are still readable and do not break the convention.

Tool Count1/5

167 tools is far beyond the 3–15 well-scoped range and even beyond the 50+ extreme-mismatch threshold. The surface is fragmented into many fine-grained operations that force an agent to navigate a huge namespace.

Completeness4/5

The set covers CRUD/lifecycle for most domains: verifications, proofs, requests, domains, DNS credentials, API keys, 2FA/login, Circles, HITL, confirmations, authorizations, delegations, profiles, templates, settings, webhooks, usage, and billing. Minor gaps like account deletion (referenced only as a 2FA action type) and plan management keep it from a perfect score, but core workflows are well covered.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Enables AI agents to retrieve real-time data on wallet DeFi positions, token balances, and NFT holdings across multiple blockchains. It supports hundreds of protocols and provides specialized tools for chain-specific or protocol-specific portfolio analysis.
    8
    8 npm
    3
    MIT
  • A
    license
    A
    quality
    F
    maintenance
    Enables AI agents to verify document timestamps and list all recorded proofs on the Verus blockchain using a VerusID. It queries public Verus RPC endpoints to facilitate hash verification without requiring API keys or authentication.
    3
    17 npm
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    Issues accountable identities for AI agents before they interact with tools, with tools for identity management and receipt export.
    -