Proof Holdings
Server Details
One API, all things verified — control, delegation, human approval, anti-impersonation.
- Status
- Healthy
- Uptime
- 71.1% over 42 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- ProofHoldings/mcp-server
- GitHub Stars
- 0
- Server Listing
- @proof-holdings/mcp-server
TDQS
Scored across 167 tools
Many tools overlap heavily across verification and domain flows: create_verification, create_verification_request, create_multi_channel_verification, create_session, and create_account all start adjacent flows. Domain checks are split across check_domain_verification, check_user_domain_verification, verify_domain, verify_domain_with_credentials, and trigger_verification, making misselection likely despite detailed descriptions.
Names are overwhelmingly snake_case verb_noun and readable throughout. Minor deviations such as search, test_verify, get_my_profile vs get_profile, and delete_profile meaning project deletion keep it from being perfect.
167 tools is far beyond a well-scoped MCP surface and sits in extreme-mismatch territory. The count is inflated by many near-duplicate verification, domain, 2FA, and profile tools, which will overwhelm agent selection.
The surface covers account/auth, 2FA, phone/email/domain verification, verification requests, HITL confirmations, circles, profiles, API keys, templates, webhooks, delegations, and revocation/public validation. Lifecycle coverage appears comprehensive for the identity-proof domain.
Available Tools
167 toolsadd_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. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Circle ID to add the member to | |
| name | Yes | Display name of the member | |
| whatsapp_phone | No | E.164 WhatsApp phone with a leading + (optional, declared) |
TDQS
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 burden and delivers real context: the member is 'pending', the Telegram chat id is bound later via a deep link, and the tool needs an authenticated Proof account (with a note that start_login does NOT unlock it). It does not state rate limits or what happens to duplicate members, so 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short paragraphs, front-loaded with the action before the follow-up workflow and the access note. Every sentence carries information; it is slightly longer than strictly necessary but no sentence is waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating tool with no output schema, it covers authentication, the pending-state lifecycle, and the next-tool handoff. What remains uncovered (duplicate handling, error/return behavior) is minor but leaves a small gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 id, name and whatsapp_phone with patterns and lengths; baseline is 3. The description adds only the temporal semantics of the phone ('pre-declared') and the name binding, which is useful but marginal.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb, resource and scope ('add a pending member to a Circle by name, with an optional pre-declared WhatsApp phone'), and clarifies the member-vs-channel distinction against the sibling add_circle_member_channel family. An agent knows exactly what object is being created 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit sequencing ('after adding a member, call invite_circle_member to mint the single-use enrollment link') and states the authentication prerequisite. It stops short of naming when NOT to use it versus alternatives such as add_circle_member_channel or create_circle_member_drill, so it falls just below a 5.
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. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Circle ID | |
| channel | Yes | Channel type (telegram or whatsapp) | |
| member_id | Yes | Member ID to add the channel to | |
| identifier | Yes | Telegram chat id, or E.164 WhatsApp phone with a leading + |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=false and destructiveHint=false already declared, the description adds meaningful behavior beyond annotations: the 409 response when the channel type already exists, server-side per-channel format validation, and the authentication gate. It does not describe what the successful response contains, but the disclosure of error and auth behavior is strong.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then error behavior, then access requirements. Two sentences are efficient, though the ACCESS block is slightly verbose for a 4-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 failure mode (409 duplicate channel) and the auth requirement, which are the key things an agent needs to call this correctly. Only the success return shape is left unspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 and the enum. The description restates the identifier format and adds that validation happens server-side, which is marginal added value over the schema rather than new semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Declare a channel for a Circle member'), so the agent knows exactly what operation is performed. It does not explicitly contrast with the sibling add_circle_member or the remove/list channel tools, but the resource is narrow enough that confusion is unlikely.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a concrete access prerequisite (needs a Proof account, authenticate first, and start_login does NOT open this tool), which is useful operational guidance. However, it says nothing about when to prefer this tool over alternatives or what conditions make it appropriate.
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. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Domain name to add (e.g. example.com) | |
| for_email_sending | No | Whether this domain is for email sending | |
| verification_method | No | Preferred verification method |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations only declare readOnlyHint=false and destructiveHint=false; the description goes beyond that by disclosing the account requirement and the full auth/session-then-retry flow, which is exactly the kind of context that cannot be inferred from the schema. It still omits the resulting state — whether the domain lands unverified awaiting a separate verification step, and whether re-adding an existing domain errors.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action is front-loaded in the first sentence, with optional parameters immediately after and the auth prerequisite separated into its own labeled ACCESS block. The auth paragraph is slightly verbose (naming both a UI path and a tool fallback), but every sentence conveys actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with annotations covering the safety profile and no output schema, the description covers the prerequisite and parameters but leaves the post-call lifecycle unexplained — what the add returns, and which sibling (start_domain_verification, verify_domain, connect_dns_provider) an agent should call next. That next-step linkage is the main gap given the dense domain-verification sibling set.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the enum values for verification_method are enumerated in the schema, so the structured data already carries the parameter burden. The description adds only the relatively weak signal that email-sending intent and verification method are optional (the schema's required list already shows this), which is baseline-level value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Add a new domain') and adds the purpose clause 'to verify ownership', so an agent knows exactly what is being created. It does not, however, distinguish itself from the many verification siblings (start_domain_verification, verify_domain, check_domain_verification) that also operate on domains, so an agent must infer which one actually performs the add step.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The ACCESS block gives concrete usage context: a Proof account is required, the client must be authenticated (via /mcp or start_login), and the tool must be re-invoked after a session opens. That is a clear precondition and sequence. What is missing is routing guidance — nothing says whether verification happens here or requires a separate start_domain_verification/verify_domain call, and no exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_verification_providerADestructiveInspect
Add an additional DNS provider for verification to an already-verified domain. Note: credentials will be visible in the AI conversation context.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Domain ID | |
| provider | Yes | DNS provider identifier | |
| credentials | Yes | Provider-specific credential key-value pairs |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=true, so the safety profile is partially covered. The description adds genuinely useful context beyond that: credentials will be exposed in the AI conversation context, and the tool requires an authenticated session established via a second call. It does not clarify what the 'destructive' aspect means (e.g., whether existing providers are replaced).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action in the first sentence, followed by the credential-sensitivity warning and then the access prerequisites. Every sentence earns its place; the only mild redundancy is restating the credential warning and auth flow at some length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with destructive annotations and no output schema, the description covers the prerequisites and a notable security caveat (credential visibility). It leaves open what the destructive side effect is and what happens to previously configured providers, 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with id, provider, and credentials each documented in the schema, so the schema carries the parameter burden. The description adds no format or syntax detail beyond what is already there. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource plus a meaningful qualifier: 'Add an additional DNS provider for verification to an already-verified domain.' That scope constraint distinguishes it from the broader set of connect_*/create_dns_credential siblings, though no sibling is named explicitly. Clear enough that an agent knows what the 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives real preconditions: the domain must already be verified, a Proof account is required, and it spells out the auth flow (authenticate via /mcp or start_login, then re-call). It does not explicitly contrast with alternatives like connect_dns_provider or create_dns_credential, so it stops short of a 5, but the when-to-use context is concrete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_user_requestADestructiveInspect
Cancel a pending verification request. Only the creator can cancel.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Verification request ID to cancel |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the agent knows this mutates state. The description adds the creator-only authorization constraint and the pending-state requirement, which are genuinely useful behavioral details not in annotations. It does not however say whether cancellation is reversible or what happens to already-collected proofs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and creator constraint are front-loaded in the first two sentences, which is ideal. The third paragraph is somewhat verbose authentication boilerplate that could be terser, but it is properly relegated to the end.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 description covers the key agent needs: what it does, who may call it, and how to authenticate. Only the post-cancellation state and reversibility are left unstated, and these are minor gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 fully documented in-schema as 'Verification request ID to cancel.' The description adds nothing beyond the schema about the parameter, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (cancel) and resource (pending verification request), and adds a crucial distinguishing constraint: 'Only the creator can cancel.' Among many cancel/revoke siblings (cancel_verification_request, revoke_authorization, etc.) this scope and restriction make the tool's identity unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'only the creator can cancel' rule effectively tells the agent the precondition for use, which is useful guidance. However, it does not explain when to reach for this vs. the near-identical sibling cancel_verification_request, nor does it state the resulting state of the request after cancellation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_verification_requestADestructiveInspect
Cancel a pending verification request. Only pending requests can be cancelled.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Verification request ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the description's job is supplementary — and it does add real context: the pending-only gating rule and the Proof account authentication requirement. The client-specific /mcp authenticate aside is procedural noise rather than behavioral disclosure, but the gating rule is genuinely useful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose and precondition are front-loaded in two tight sentences. The ACCESS block is slightly verbose and client-specific, but it is short and separated from the primary function statement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter destructive mutation with annotations covering the safety profile and no output schema, the description supplies the one thing the structured fields lack: the pending-only precondition and auth requirement. Nothing critical is missing, though the failure mode for a non-pending ID is unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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, so the baseline is 3. The description adds no extra meaning about the ID (e.g. where to obtain it), but the schema already carries the burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Cancel a pending verification request') and immediately narrows scope with a precondition. It does not, however, distinguish itself from the near-identical sibling cancel_user_request, leaving that routing decision 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear use condition ('Only pending requests can be cancelled') and explicit access prerequisites, including a warning that start_login does not grant access. It stops short of naming an alternative tool or stating what to do when the request is no longer pending.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_domain_credentialsARead-onlyInspect
Check if stored DNS credentials have access to a domain. Use before triggering verification to confirm the credentials work.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Domain ID to check credentials for |
TDQS
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 valuable non-annotation context: it requires a Proof account and an authenticated session, with concrete steps ( /mcp authenticate or start_login). It does not describe what a negative result means or whether the check has side effects, but the auth disclosure is genuinely useful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Core purpose and usage are front-loaded in the first sentence, with auth prerequisites separated into a clearly labeled ACCESS block. The auth prose is slightly verbose but earns its place for a tool that fails without a session.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read-only check with annotations covering safety and no output schema, the description supplies the missing prerequisite information (account and session requirements). Only the semantics of the boolean/result outcome are left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a single well-described `id` parameter, so the schema carries parameter meaning. The description adds nothing about the id's format or source 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.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: checks whether stored DNS credentials can access a domain. This distinguishes it from the many domain/verification siblings such as verify_domain_with_credentials and check_domain_verification, though it does not name 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use before triggering verification to confirm the credentials work" gives clear sequencing guidance relative to the verification flow. It provides no explicit when-not or named alternative, but the intended usage context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_domain_email_statusARead-onlyInspect
Check the email sending setup status for a domain, including DNS record configuration progress.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Domain ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe read. The description adds real behavioral context beyond the annotation: the account requirement and the session/auth flow that must happen before the call succeeds. It does not describe return shape, but the safety profile is covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, purpose front-loaded and the access caveat clearly separated. Nothing is redundant, though the authentication aside is somewhat verbose relative to the tool's simplicity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 what the tool reports (sending setup status plus DNS record progress) and the prerequisite to get a result. For a single-parameter read-only status check this is close to complete, with only the exact return fields left unspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and there is only one parameter (id, 'Domain ID'), so the schema carries the parameter meaning. The description's phrase 'for a domain' corroborates but adds no syntax, format, or lookup detail beyond what the schema provides, making baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (check) and resource (email sending setup status for a domain) and adds scope detail (DNS record configuration progress). It is distinguishable from verification-oriented siblings like check_domain_verification or get_user_domain_verification_status, though it never names those neighbors explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains the access prerequisite (needs a Proof account, authenticate or use start_login then retry), which is genuinely useful context. However, it offers no guidance on when to prefer this over adjacent tools such as check_domain_credentials, check_domain_verification, or get_domain.
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. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Domain verification ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=false, which the description is consistent with: it discloses that the call triggers an outbound DNS/HTTP check rather than passively reading. It also flags the authentication prerequisite, which is real behavioral context beyond the annotations. No return payload shape or rate-limit info, hence 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The behavioral sentence is front-loaded and wastes nothing. The ACCESS block is slightly verbose for what it conveys, but it is clearly separated and actionable rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter status-check with no output schema, the definition covers purpose, the network side effect, what is returned, and the auth prerequisite. An agent could call it correctly; only routing against sibling verification tools is left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter and schema coverage is 100%, so the schema already documents 'id' as the domain verification ID. The description adds nothing about the parameter's format or where to obtain it, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Check the status') and resource ('pending domain verification') and adds what the call actually does ('Triggers a DNS/HTTP check and returns the updated status'). It does not name or differentiate itself from close siblings such as verify_domain, get_domain, or start_domain_verification, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The word 'pending' implies this is called after start_domain_verification or verify_domain, but no alternative is named and no when-not condition is given. The access block adds practical invocation guidance (account required, authenticate first), which is helpful but not selection 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. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | Domain verification session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations say readOnlyHint=false and destructiveHint=false, so the agent knows it mutates state harmlessly. The description adds real context beyond that: the tool requires an authenticated Proof account and describes the auth flow (/mcp Authenticate or start_login). It doesn't say whether the check is synchronous or requires polling, which is a gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The behavioral instruction is front-loaded and short; the auth paragraph is longer but earns its place by explaining a non-obvious prerequisite. Slightly verbose in the parenthetical CLI detail, but not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 clarify what a check returns (pass/fail, or a result requiring a separate status call to get_user_domain_verification_status). It covers auth and timing but leaves the outcome/polling model unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 semantics. The description adds nothing about the session_id's origin or format, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('Trigger a check') and resource ('domain verification challenge'), which distinguishes it from read-only siblings like get_user_domain_verification_status. It stops short of explicitly naming which sibling to prefer, but the action is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear timing context: 'Call after placing DNS record or HTTP file.' It also states the precondition that a Proof account is required. It does not name alternative tools (e.g. get_user_domain_verification_status for polling results), so it falls 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.
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. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
| username | Yes | Username to claim (3-30 chars, alphanumeric and underscores) |
TDQS
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 adds genuinely useful behavior context beyond that: the auth requirement and the /mcp or start_login flow. It omits what happens if the username is already taken, which is the main remaining gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, constraints follow, then access notes. Efficient overall, though the length/character constraints duplicate what the schema already states, which is mildly wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter mutation with no output schema and annotations covering the safety profile, this covers purpose, constraints, and auth. Only minor omissions remain, such as conflict/failure behavior when a username is unavailable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter fully documents pattern, min/max length. The description's '3-30 characters, alphanumeric and underscores' repeats the schema verbatim rather than adding 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.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource ('Claim a unique username') scoped to the authenticated user's public profile. No sibling tool in the list does anything similar, so an agent can identify it immediately 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear prerequisite context: needs a Proof account, and either authenticate the client or sign in via start_login, then re-call this tool. This explains the preconditions for use well, but doesn't explicitly contrast with alternatives (e.g., update_profile's username handling).
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. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Domain ID | |
| code | Yes | Verification code from the email |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag this as non-read-only and non-destructive, so the safety profile is partly covered. The description adds valuable behavioral context by requiring a Proof account and describing the auth sequence, but says nothing about failure modes (wrong/expired code), side effects of confirming, or whether the operation is reversible.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in one sentence, followed by a clearly labeled ACCESS block. The auth note is somewhat verbose with client-specific detail, but every sentence contributes actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a non-destructive mutation with annotations and no output schema, the description covers purpose, the prerequisite account/auth flow, and how to resume after sign-in. The remaining gap is what confirmation returns or how verification status changes, which is acceptable given the missing output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters (id, code) are already documented in the schema. The description reinforces that the code comes from the corporate email but adds no syntax, format, or length detail beyond what the schema provides. Baseline 3 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.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (confirm) and resource (domain email verification) plus the mechanism (submitting the code sent to the corporate email address). It is clear what the tool does, though it does not explicitly name the closest siblings (submit_verification_code, check_domain_email_status) to help disambiguate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It supplies an explicit access precondition and workflow: authenticate the client or sign in via start_login, then call this tool again. This tells the agent when the tool is callable. It stops short of contrasting with the similarly named submit_verification_code, so it is not a full when-vs-alternative guide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
connect_cloudflareADestructiveInspect
Connect a Cloudflare API token to a domain for automated DNS record management. Note: the API token will be visible in the AI conversation context.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Domain ID | |
| api_token | Yes | Cloudflare API token with DNS edit permissions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=true. The description adds two things annotations cannot: a security disclosure that the API token is visible in the conversation context, and the authentication/session workflow needed to invoke the tool. It does not elaborate on what aspect is destructive, keeping it just 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, followed by the security warning and then the access block. Every sentence is functional; the access block is slightly long but directly actionable, so the size is justified.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 the prerequisite account/session flow and the security implication of passing a token, which are the main invocation blockers. It stops short of mentioning post-connection state or error behavior, but nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (id, api_token) are fully documented in the schema. The description maps the token to a domain conceptually but adds no syntax, format, or permission detail beyond what the schema already states. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 scope (to a domain for DNS record management). The Cloudflare name distinguishes it from siblings connect_godaddy and connect_dns_provider without requiring schema inspection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The ACCESS block gives clear prerequisites (Proof account) and two concrete paths to satisfy them, with a pointer to start_login and the session requirement. It does not explicitly say when to prefer this over connect_godaddy/connect_dns_provider, but the provider name in the description acts as the selector.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
connect_dns_providerADestructiveInspect
Connect a generic DNS provider to a domain using provider-specific credentials. Note: credentials will be visible in the AI conversation context.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Domain ID | |
| provider | Yes | DNS provider identifier | |
| credentials | Yes | Provider-specific credential key-value pairs |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=true, and the description adds meaningful context beyond that: credentials will be visible in the AI conversation context (a security caveat the agent needs) and the required auth flow. It does not explain what 'connecting' changes for the domain or reversibility, 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short, front-loaded blocks: the action sentence with the credential-visibility warning, then the ACCESS note. Nothing is redundant, though the access block is slightly verbose relative to the core action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a 3-param mutation tool with a nested credentials object, no output schema, and destructiveHint, the description covers the essentials an agent needs: what it does, the auth precondition, and the credential-exposure caveat. Only the alternative-tool routing and post-connect effects are missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 in the schema. The description only adds the phrase 'provider-specific credentials,' which reinforces but does not extend schema meaning. Baseline 3 applies when the schema carries the parameter detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('connect a generic DNS provider to a domain'), and the word 'generic' implicitly contrasts with sibling tools connect_cloudflare and connect_godaddy. It is clear what the tool does, though it never names the provider-specific alternatives explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides access prerequisites (needs a Proof account, authenticate via /mcp or start_login before calling again), which is useful operational guidance. However, it does not say when to use this generic connector versus connect_cloudflare/connect_godaddy or create_dns_credential, so the key selection decision 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.
connect_godaddyADestructiveInspect
Connect GoDaddy API credentials to a domain for automated DNS record management. Note: the API key and secret will be visible in the AI conversation context.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Domain ID | |
| api_key | Yes | GoDaddy API key | |
| api_secret | Yes | GoDaddy API secret |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true and readOnlyHint=false, and the description adds genuinely new context: the security disclosure that 'the API key and secret will be visible in the AI conversation context' plus the authentication flow. It stops short of explaining what the destructive hint means in practice (e.g., whether existing DNS credentials or records are overwritten).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose, then a security note, then an actionable access block. Every element is useful, though the parenthetical CLI instructions make it slightly longer than a pure description needs to be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a credential-binding tool with no output schema, the description covers purpose, the sensitive-data warning, and the authentication prerequisite well. It omits what happens on success/failure and whether an existing GoDaddy connection is replaced, which matters given the destructive annotation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with three self-documenting parameters (id, api_key, api_secret), so the schema already carries the semantics. The description adds no format, sourcing, or provenance detail for the credentials, giving baseline performance only.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 outcome ('automated DNS record management'). This is clearly distinguishable from siblings like connect_cloudflare, connect_dns_provider, and create_dns_credential, which an agent could otherwise confuse.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The ACCESS block gives concrete preconditions and a recovery path ('needs a Proof account', '/mcp → Authenticate', or 'sign in with start_login ... then call this tool again'). It does not, however, contrast this tool against the other provider-connection or credential-creation siblings, so the agent must infer when GoDaddy-connect is correct.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| No | Email address. Required for email channel. | ||
| channel | Yes | Authentication channel the user will verify through | |
| phone_number | No | E.164 phone number. Required for SMS channel (determines DID routing). |
TDQS
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.
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.
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.
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.
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.
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. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Human-readable key name | |
| scopes | No | Permission scopes for the key | |
| profile_id | No | Bind the new key to a sub-account (PublicProfile) project you own (24-hex id). Immutable after creation; omit for an unbound account-wide key. | |
| environment | No | Key environment (default: production) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnlyHint=false and destructiveHint=false. The description adds critical non-obvious behavior: the secret is returned only once, it is exposed in conversation context, 2FA elevation is required, 403 signifies expired 2FA session, and profile_id is immutable after creation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the operation and the one-time secret warning, then a compact auth/2FA section. Slightly long but every sentence carries a distinct operational fact; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-param creation tool with no output schema, the description covers the one-time secret handling, 2FA prerequisite chain, failure recovery, and account/auth requirement. 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameters are already documented (each including the immutable profile_id note). The description restates the profile_id binding and branding effect but adds no syntax 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.
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 API key') and immediately clarifies the key differentiator vs siblings like regenerate_api_key and revoke_api_key: the secret is returned only once. The profile_id binding behavior further distinguishes its effect.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit prerequisites (2FA flow with the exact action_type 'api_key_create'), the ordered steps, the alternative tool names to call (start_2fa, get_2fa_status), and a 403 recovery path. This is rare, actionable 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.
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. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| bsuid | No | WhatsApp Business-Scoped User ID (alternative to phone for WhatsApp channel) | |
| phone | Yes | Target phone number in E.164 format (e.g., +15551234567) | |
| scope | No | Authorization scope (default: confirmations) | |
| channel | Yes | Channel for sending confirmations | |
| hitl_id | Yes | HITL configuration ID to link this authorization to | |
| recipient | Yes | Channel-specific recipient identifier (chat_id for Telegram, phone/BSUID for WhatsApp) | |
| expires_in | No | Expiry in seconds (max 90 days, default 90 days) | |
| business_name | Yes | Business name displayed to user during authorization | |
| business_profile_id | No | Public profile ID for branding |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=false and destructiveHint=false already indicating a non-destructive write, the description adds useful behavior: the authorization requires user approval, confirmations cannot be sent until approved, and authentication is required. It does not cover idempotency, rate limits, or what happens if an authorization already exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action, followed by a compact explanation of approval workflow and a clearly separated ACCESS note. Every sentence contributes useful information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter create tool with full schema coverage and no output schema, the description covers purpose, workflow, and authentication prerequisites well. It could be stronger by describing the immediate return behavior or how to check approval status afterward, but the core invocation context is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already documents all 9 parameters, including formats, enums, defaults, and limits. The description adds only high-level context about sending confirmations via a specific channel and does not provide additional parameter-level syntax or constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource: 'Create a new authorization request.' It then explains what an authorization does and its approval workflow, making the tool's role clear relative to sibling tools such as revoke_authorization, list_authorizations, and get_authorization.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the prerequisite context clearly: a Proof account is required, the client must be authenticated, and start_login does not open this tool. It also implicitly explains when to use it by saying authorizations must be approved before confirmations can be sent, though it does not explicitly compare against all alternative authorization or confirmation tools.
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. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only flag readOnlyHint=false and destructiveHint=false; the description adds substantial context beyond that: the exact return payload, the auth requirement (Proof account plus client authentication), and the non-obvious client behavior that the user does not see tool results. This is exactly the behavioral disclosure 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and return values, then action sequence, then the user-visibility caveat, then access. Dense and mostly waste-free, though the three-paragraph layout is longer than strictly necessary and the ACCESS block is somewhat bolted on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema present, the description fully compensates by explaining the returned fields, the polling follow-up, and the authentication prerequisite. Nothing an agent needs to invoke and sequence this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 usefully documents the return shape (deep_link, qr_code, qr_text) even though there are no inputs to disambiguate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource ('Create a Telegram chat ID discovery token') and immediately states what it returns (deep_link, qr_code, qr_text) and why (reveals the user's chat ID for HITL config). An agent can distinguish this from siblings like create_hitl or poll_chat_id_discovery 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit chain: pass deep_link to render_auth_link, never feed qr_text to a link renderer, then poll poll_chat_id_discovery until chat_id appears, then use that chat_id in a HITL config. It names both the downstream tool and the follow-up tool, plus the pitfall to avoid.
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. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Human-readable name for the Circle | |
| members | No | Initial members (name + optional declared channels) | |
| owner_name | No | 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. | |
| profile_id | No | Public profile (sub-account) to bind for branded messages — create-only | |
| proof_me_enabled | No | Enable Proof-Me drills for this Circle |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnlyHint=false and destructiveHint=false, so the description usefully adds the auth requirement/flow and the side effect that declared channels are stored for later enrollment. It does not cover failure modes, rate limits, or idempotency, and the owner_name naming behavior is largely mirrored in the schema, 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with what a Circle is and what the tool does, then a compact 'Agent usage' sequencing block, then access prerequisites. No filler sentences; each line adds routing or prerequisite information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 ideally say what the call returns (e.g. a circle id needed for subsequent add/invite calls); it only gestures at the follow-up steps without identifying the returned handle. Otherwise it is complete for a 5-param create tool with full schema coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 beyond the schema by framing `members` as optional seeding and explaining that declared channels are persisted for enrollment, and it flags `profile_id` semantics (bind for branded messages). It does not clarify whether seeded members auto-receive invites, which would push it higher.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Create) and resource (Circle), defines the concept inline (a named group of trusted contacts) and anchors it to the product domain (Proof-Me, Approvals-on-Circle). It is clearly distinguishable from siblings like add_circle_member and invite_circle_member, which are named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit sequence: create, then add_circle_member (or seed here), then invite_circle_member to mint the enrollment link. It also states the prerequisite (Proof account, authenticate via /mcp) and an exclusion — start_login does NOT open this tool, which prevents the obvious wrong alternative.
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. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Circle ID | |
| member_id | Yes | Member ID to drill |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=false; the description is consistent, describing a non-destructive write that fires a real cross-channel identity challenge with a 'scheduled-safety-check' label. It also adds useful operational detail the annotations lack — the Proof account requirement and that start_login does NOT unlock this tool — which is genuinely helpful 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action in the first clause, then adds the complement/scope context and access instructions. Slightly dense with parenthetical framing ('the account owner practices confirming'), but every sentence carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-parameter non-destructive mutation with a fully documented schema and no output schema, the description covers purpose, prerequisites, and auth flow adequately. It omits what the drill returns to the caller or how the member experiences it, which is a minor gap given no output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both `id` (Circle ID) and `member_id` documented including their 24-hex-char patterns. The description adds no additional parameter semantics 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.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: 'Fire an on-demand Proof-Me drill against one enrolled member.' It clarifies the scope (one member, cross-channel identity challenge) and situates the tool as the manual complement to the automated daily/monthly sweeps, which distinguishes it from bulk verification tools. It doesn't name a specific sibling by name, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear usage context: on-demand manual drill vs the automated daily drill and monthly reinforcement sweeps, plus an explicit prerequisite (needs a Proof account and client authentication). It provides no exclusion rules or named alternatives among the many verification/challenge siblings, so 4 rather than 5.
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_ekmap, so every approver can decrypt. Build it with the SDKencryptMessageV2(plaintext, ownerPublicKey, hitlId, approverKeys)after fetching the approvers via the SDKgetApproverKeys(hitlId)(GET /api/v1/hitl/:id/approver-keys). AAD is thehitlId.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| hitl_id | Yes | HITL config ID whose channels will receive the approval request | |
| message | Yes | 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. | |
| proof_expiry_days | No | Per-request proof expiry override in days (7, 30, 90, or 365) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only tell the agent this is not read-only and not destructive. The description goes far beyond: mandatory keypair encryption, specific 400 error codes (message_not_encrypted, message_key_mismatch, envelope_missing_approvers), the v1 vs v2 recipient rules, AAD binding, and the required account authentication step. This is unusually rich 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and routing, then encryption rules in a scannable bullet list. It is long, and the plaintext-refusal rule is stated both in the description and the `message` schema field, so there is mild redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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, the description supplies everything needed: auth prerequisite, failure modes with codes, envelope construction path, and how to observe the result (poll or generate a link). Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 real meaning for `message` by explaining the v1/v2 envelope decision rule (owner-only vs enrolled approvers) and the SDK helpers to build it. hitl_id and proof_expiry_days gain little beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Create a HITL confirmation request') and immediately describes the mechanism: an approval request sent to the channels on the referenced HITL config, with 'first response wins' semantics. It is clearly distinguishable from siblings like get_confirmation, list_confirmations, and create_hitl.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly covers when-to-use and the routing logic: hitl_id must be authorized first, and on a 403/'not authorized' the agent should call request_hitl_authorization and wait. It also names the follow-up alternatives — get_confirmation for polling and get_confirmation_approval_link for a fresh link.
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. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| scope | Yes | 1-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. | |
| delegate | Yes | The typed artifact being authorized | |
| expires_in | No | Lifetime in seconds (must not exceed the control proof's remainder) | |
| control_proof | Yes | Public handle (ph_ctl_<32 hex>) of YOUR active domain control proof |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations only declaring readOnlyHint=false and destructiveHint=false, the description carries the rest: it discloses that each mint is a billable proof, that an over-long lifetime is rejected rather than truncated, that the result carries both the publishable token and the DERIVED effective_status/is_valid, and that this pair is stable across verbs. These are non-obvious operational traits an agent must know before calling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action and its constraints are front-loaded, and the ACCESS block is clearly separated at the end. The middle sentences ('nothing more; it says nothing about the artifact or the business behind it') are somewhat discursive for a tool description, but they do carry semantic boundaries rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 return payload (publishable token plus derived effective_status/is_valid). Combined with auth requirements, billing implications, lifetime rejection behavior, and nested-object parameter meaning, 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.
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 goes beyond the schema by framing scope as 'capability scopes' tied to the delegation's authorization semantics and by clarifying that the control proof belongs to the caller's active domain control proof. The explicit invalid_scope note partially duplicates the scope schema description, so the added value is real but moderate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise verb+resource ('Create a delegation (Proof of Delegation)') and immediately defines the resulting semantic: a control-proven domain authorizes a typed url/purl artifact for capability scopes and returns a signed token. It also scopes the meaning ('the domain's controller authorized this artifact — nothing more'), which prevents an agent from over-reading the artifact. It references the sibling list/get tools whose output shape it shares, giving light disambiguation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Prerequisites are explicit and actionable: a Proof account is required, the client must be authenticated, and the description warns that start_login does not open this tool. It also gives the rejection rule for over-long lifetimes. It stops short of contrasting against other create_* siblings (e.g. create_authorization), so an agent has clear context but no explicit when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_dns_credentialADestructiveInspect
Store DNS provider credentials for automated domain verification. Note: credentials will be visible in the AI conversation context.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
| provider | Yes | DNS provider identifier (e.g. cloudflare, route53, digitalocean) | |
| credentials | Yes | Provider-specific credential key-value pairs |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=true, so safety is partly covered. The description adds genuinely useful context beyond the annotations: credentials become visible in the AI conversation context (a security caveat an agent must surface), plus the authentication/session prerequisite. It does not explain storage durability or whether re-storing overwrites.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short blocks, purpose front-loaded ahead of the caveat and access requirements. The 'Note:' and ACCESS run-on are slightly chatty but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema is needed for a store operation, and annotations carry the safety profile. With a nested credential object and a security/privacy caveat, the description covers what an agent needs to call it correctly; only sibling differentiation and overwrite/return behavior are absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with provider and credentials both documented inline including examples and a nested arbitrary-key object. The description adds no additional meaning about accepted provider identifiers or expected credential keys, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear verb+resource: 'Store DNS provider credentials for automated domain verification' tells the agent exactly what is persisted and why. It does not, however, distinguish itself from near-siblings such as connect_dns_provider, add_verification_provider, or verify_domain_with_credentials, so the agent cannot route on 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The access note gives a real precondition (Proof account + authenticate via /mcp or start_login) which is actionable usage guidance. But there is no guidance on when to choose this tool over the other credential/connection tools, and no explicit when-not-to-use.
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. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Human-readable name for this HITL config | |
| channels | Yes | Messaging channels for approval requests (telegram or whatsapp) | |
| timeout_seconds | No | Default timeout in seconds (60–86400, default: 3600) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=false, so safety is partly covered. The description adds genuinely non-structured context: the required Proof account, the authenticate-then-retry loop, and the 'start_login does NOT open this tool' exclusion. It does not describe failure modes or the created object's persisted identity, so it stops 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three clearly labeled blocks (purpose, Agent usage, ACCESS) with the core purpose front-loaded. The parenthetical Claude Code UI instruction is slightly operational noise, but the sequencing detail earns its length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and a fully documented 3-parameter schema, the description supplies everything else an agent needs: the prerequisite chain, the consuming tool, and the auth precondition. Nothing required 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.
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 adds value beyond the schema by explaining that 'channels' determines approval request routing and that Telegram channel entries need a chat_id obtained via create_chat_id_discovery, tightening the meaning of the only non-obvious parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 ... config') and immediately clarifies what the resource controls ('which messaging channels receive approval requests and the default timeout'). The 'Create' verb plus the resource name distinguishes it from update_hitl, delete_hitl, and list_hitls without needing schema inspection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly sequences this tool against named siblings: request_hitl_authorization must be called afterward, create_chat_id_discovery is required first for Telegram channels, and the config is consumed by create_confirmation. This is exactly when/when-not/alternative guidance.
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. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| circle_id | Yes | Circle that holds the member | |
| member_id | Yes | Enrolled Circle member initiating the check | |
| suspicious_channel | No | Channel the suspicious contact reached the member on; defaults to the member channel |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real context beyond the annotations (readOnlyHint=false, destructiveHint=false): the tool creates a pending challenge that a human approves/denies out-of-band, that it requires an authenticated Proof account, and that it stays pending until one of six terminal states. Auth requirements and lifecycle are disclosed. It stops short of describing expiry timing, notification behavior, or idempotency, so 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short, well-front-loaded blocks: purpose, agent usage, access. Each sentence carries information, though the ACCESS paragraph is slightly tangential to the tool's semantics and could be tighter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 compensates by telling the agent the returned ID is the polling handle and enumerating terminal states. Missing only failure/timeout expectations and the shape of the returned object, which keeps it at 4 for a stateful multi-step tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3, but the description adds genuine meaning to suspicious_channel by explaining it drives which channel the approval must come from ('different from the one the suspicious contact reached the member on') — the security-relevant relationship the schema alone does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb and resource ('Create a Proof-Me cross-channel identity challenge (CONFIRM) for an enrolled Circle member') and explains the mechanism — the holder approves on a different channel than the suspicious contact used. It is specific, but it does not explicitly contrast itself with lookalike siblings such as create_multi_channel_verification, create_confirmation, or create_hitl.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operational context: use for an enrolled Circle member whose suspicious contact needs cross-channel confirmation, then poll get_identity_challenge with the returned ID until it leaves pending. It names the follow-up tool and terminal states, but never states when NOT to use this versus other verification/confirmation creation tools.
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. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | Asset type — only "phone" is supported | |
| channels | Yes | 1-4 unique channels attempted in parallel (first to complete wins) | |
| identifier | Yes | Phone number in E.164 format | |
| client_metadata | No | Custom key-value metadata | |
| external_user_id | No | Your application user ID for grouping verifications | |
| proof_expiry_days | No | Per-request proof expiry override in days (1-365) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false and destructiveHint=false, yet the description adds substantial behavior: losing sibling channels are cancelled, exactly one proof is billed at the winning channel and nothing at creation, and the tool requires an authenticated Proof account (start_login does not unlock it). These are non-obvious side effects and prerequisites 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: the first sentence nails the core mechanic, the billing constraint follows, then agent usage and the rendering caveat. Every sentence carries operational information, though the block is long enough that a reader must work through three paragraphs to reach the polling instruction.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description fully documents the return shape (group_id, channels array with deep_link/sms_message/qr_text), the follow-up polling tool, the billing model, and the auth prerequisite. Nothing needed to invoke and correctly handle this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 beyond it: it explains the first-wins semantics of the channels array and documents the response shape (group_id vg_<hex>, per-channel deep_link vs sms_message, and qr_text as pre-rendered art rather than an alternate address).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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-channel phone verification') and immediately defines the mechanism: one number challenged over several channels with OR / first-wins semantics. This distinguishes it from the single-channel create_verification / start_add_phone siblings without the agent needing to open either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete follow-up routing: pass deep_link to render_auth_link, poll get_multi_channel_verification_status with the group_id, and an explicit caveat about not relying on tool-result rendering. It never explicitly states when to prefer this over create_verification (single channel), so it stops just short of a full when/when-not treatment.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_profileBDestructiveInspect
Create a new profile with optional display name, bio, avatar, business info, email branding (theme, support email), and theme settings.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| bio | No | Profile bio | |
| theme | No | Profile theme settings | |
| is_public | No | Whether the profile is publicly visible | |
| avatar_url | No | Avatar as base64 data URI or URL (~75KB limit) | |
| is_primary | No | Set as primary profile | |
| email_theme | No | Theme of this project's emails | |
| is_business | No | Whether this is a business profile | |
| display_name | No | Display name | |
| business_name | No | Business name | |
| support_email | No | Support email this project's messages show |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=true, so the agent knows this is a mutating operation with destructive potential. The description adds the authentication prerequisite, which is genuinely useful behavior context. But it does not explain what gets destroyed or made irrecoverable despite the destructiveHint, nor what the response looks like.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the core action and followed by access guidance. The field enumeration is slightly redundant with the schema but not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the action and auth prerequisite, and the schema fully documents all 10 optional parameters including nesting. However, for a destructive create with no output schema, the description omits what a created profile returns and what destructive effects the destructiveHint implies, leaving gaps an agent may need.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with per-property descriptions, enums and patterns, so the schema carries the parameter burden. The description only groups field names (display name, bio, avatar, business info, email branding, theme) which roughly maps to parameters but adds no format, default, or interaction semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb (Create) and resource (new profile) and enumerates the configurable fields in one sentence. It does not explicitly differentiate itself from siblings like update_profile, update_my_profile, or set_primary_profile, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The ACCESS note gives a clear prerequisite and recovery step (authenticate the client, then retry; start_login does not open this tool). However, it never contrasts create_profile with update_profile or set_primary_profile, leaving the choice between them only implied by the verb 'Create'.
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. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| channel | Yes | Verification channel | |
| metadata | No | Custom key-value metadata | |
| template_id | No | Custom template ID | |
| callback_url | No | URL to redirect after verification | |
| phone_number | Yes | Phone number in E.164 format | |
| external_user_id | No | Your application user ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the mutation safety profile (readOnlyHint=false, destructiveHint=false), and the description goes well beyond that: it enumerates the three return artifacts, defines the terminal states (verified, failed, expired), and warns that clients fold tool results away so the agent must surface the link/text in its own reply. It also discloses the authentication prerequisite and that start_login does not cover 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and return values are front-loaded, and the workflow guidance is actionable rather than filler. It runs to four paragraphs and the "user does not see tool results" note is a general client-behavior aside that is slightly tangential to this specific tool, but nearly every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 explaining returns and does so concretely (deep_link, qr_code as base64 PNG, qr_text as terminal-display QR art). Combined with the auth requirement, the downstream wait/poll path, and terminal states, an agent has everything needed to create and follow through on a session.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and each parameter (channel, phone_number, metadata, template_id, callback_url, external_user_id) is documented in the schema itself. The description adds no parameter-level meaning such as format hints, defaults, or interactions, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 adds scope context ("hosted verification flow with callbacks"), which helps separate it from plain create_verification. However, it never explicitly distinguishes itself from close siblings like create_verification, create_multi_channel_verification, or create_verification_request, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit ordered workflow: pass deep_link to render_auth_link, then use wait_for_session to poll to a terminal state. It also states a clear when-not rule ("Never hand qr_text to a link renderer") and names the alternative tools by name, so selection and sequencing require no inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_user_requestAInspect
Create a new verification request to ask another user to share verified assets. Each asset is an object naming its type, e.g. { "type": "email" }.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
| assets | Yes | Assets to request, e.g. [{ "type": "email" }, { "type": "phone", "required": false }] | |
| partial_ok | No | Whether partial asset sharing is acceptable (default: false) | |
| action_type | No | Purpose of the request (default: verification); custom and confirmation also need an action_context title | |
| callback_url | No | HTTPS webhook URL for request status updates | |
| redirect_url | No | HTTPS URL to redirect the subject after completing the request | |
| reference_id | No | External reference ID for tracking | |
| action_context | No | What the recipient is shown about why the assets are needed, e.g. { "title": "Confirm your contact details" } | |
| expires_in_hours | No | Hours until request expires (default: 168, i.e. 7 days) | |
| public_profile_id | No | Public profile ID for branding | |
| validity_requirement | No | 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" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish the safety profile (readOnlyHint=false, destructiveHint=false). The description adds non-obvious behavior beyond the annotations: the request targets another user, the session/auth flow required to make the call succeed, and the shape of each asset object. It still says nothing about request lifecycle (e.g., what happens on expiry or partial sharing), but the auth disclosure is substantive 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short blocks: purpose first, then the access prerequisite. The single illustrative asset example is arguably redundant with the schema, but nothing is padded and the most decision-relevant information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter mutation tool with nested objects and no output schema, the description covers purpose and auth but omits tool-selection context against numerous siblings and any note on the request's lifecycle or response. It is adequate to invoke the tool, but not complete enough to route confidently among the create_* family.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and every one of the 10 parameters, including the nested asset object and action_context, is documented in the schema with defaults and constraints. The description's asset example ({"type": "email"}) only restates what the schema already provides, so it earns the baseline 3 with no compensating detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ("Create a new verification request") and clarifies the object ("ask another user to share verified assets"), which is more informative than the bare name. However, it never distinguishes this tool from close siblings such as create_verification_request, create_verification, or create_multi_channel_verification, leaving the agent to guess which request-creating tool applies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The ACCESS paragraph gives a real precondition (a Proof account) and an actionable recovery path (authenticate via /mcp or call start_login, then retry). That is genuine usage context, but there is no guidance on when to choose this tool over the many other create_* request tools, so selection among alternatives is left entirely to inference.
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. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | Asset type being verified | |
| channel | Yes | Verification channel (must match the asset type, e.g. sms/whatsapp/telegram for phone) | |
| bot_token | No | Telegram bot token (required for channel "telegram_bot_token") | |
| identifier | Yes | The asset identifier to verify (E.164 phone, email address, domain, handle, wallet address, ...) | |
| dns_provider | No | DNS provider credentials (required for channel "auto") | |
| email_prefix | No | Mailbox prefix for domain email verification | |
| client_metadata | No | Custom key-value metadata | |
| external_user_id | No | Your application user ID for grouping verifications | |
| proof_expiry_days | No | Per-request proof expiry override in days (1-365) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false/destructiveHint=false; the description goes well beyond that, disclosing the key-dependent branch where a telegram_bot call with a LIVE key returns status 'verified' with a proof token and no challenge while a pk_test_ key stays pending, that deep_link is returned on messenger channels, that no qr_text is returned, and the auth prerequisite for the Proof account. This is rich behavioral context an agent cannot get 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well front-loaded: purpose first, then agent usage, then the channel-specific behavior, then the critical note that users don't see tool results. It is long and carries some detail that could be trimmed (e.g. the parenthetical enumeration of asset types), but nearly every sentence conveys actionable behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter, nested-object, no-output-schema creation tool, the description covers the required inputs, the channel-dependent response shape, the follow-up polling/link path, and the auth requirement, which is everything an agent needs to call it correctly. The absence of an output schema is compensated by the explicit description of the challenge/status/proof-token responses.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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, and the description adds concrete value by pairing parameter values in examples (type 'phone', channel 'sms', identifier '+37060000000'; type 'email', channel 'email'), clarifying how the three required fields combine. It does not explain the optional fields (bot_token, dns_provider, email_prefix, proof_expiry_days), but the schema already documents those.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 identity verification') and enumerates the asset types it covers (phone, email, domain, social, wallet, account, Telegram bot), which is far more than a restatement of the name. It does not, however, differentiate itself from near-identical siblings like create_verification_request, create_multi_channel_verification, or trigger_verification, leaving an agent to guess which creation entrypoint applies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides concrete invocation guidance ('pass the asset type, the delivery channel, and the identifier') with worked examples, and explains the downstream flow (poll get_verification or use wait_for_verification for OTP; deep link for Telegram/WhatsApp). It stops short of stating when to prefer this tool over the sibling creation tools, so the guidance is clear but not exclusionary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_verification_requestBInspect
Create a multi-asset verification request. Allows verifying multiple assets (phone, email, domain, social, wallet, account, telegram_bot) in a single flow.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| assets | Yes | Array of assets to verify (1-10) | |
| expires_in | No | Request expiry in seconds (default: 604800, i.e. 7 days; max: 2592000, i.e. 30 days) | |
| partial_ok | No | Allow partial completion (default: false) | |
| action_type | No | Purpose of the verification (default: verification) | |
| callback_url | No | Webhook URL for status updates (HTTPS only) | |
| redirect_url | No | URL to redirect user after verification completes (HTTPS only) | |
| reference_id | No | Your unique reference ID for this request | |
| action_context | No | Context displayed to user during verification | |
| proof_expiry_days | No | Per-request proof expiry override in days (7, 30, 90, or 365) | |
| public_profile_id | No | Public profile ID for branding |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=false, which frames the write-but-non-destructive nature. The description adds genuinely valuable behavioral context the annotations lack: the authentication/access requirement and the fact that start_login will not unlock this tool. It says nothing about side effects (what request records are created, whether requests are cancellable), so with annotations carrying part of the load a 3 is right.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight paragraphs, front-loaded with the core purpose and followed by a clearly labelled ACCESS block. No filler, though the purpose sentence and the asset-type list have some redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 access model well and the schema covers inputs fully. It omits anything about the return value (request ID, status handle) and how the created request is later consumed — e.g., get_verification_request or wait_for_verification — which an agent needs to complete the workflow.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and every parameter — assets, expires_in, partial_ok, action_type, callback_url, proof_expiry_days, etc. — is self-documented in the schema. The description adds no syntax, defaults, or format detail beyond what the schema already states, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 asset types it handles, which distinguishes it from single-asset tools like create_verification. However, it never explicitly differentiates itself from the very similarly named sibling create_multi_channel_verification, leaving the agent to guess between the two.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a real usage prerequisite — a Proof account is required and the client must authenticate first, plus a useful exclusion ('start_login does NOT open this tool'). But it gives no guidance on when to choose this over create_verification or create_multi_channel_verification, which is the key routing decision implied by the sibling set.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_circleADestructiveInspect
Archive a Circle (soft delete — sets status to archived). It stops appearing in the default list but is recoverable via list_circles with status="archived".
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Circle ID to archive |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true, but the description corrects the over-broad reading by disclosing this is a non-permanent archive with a documented restore path — exactly the kind of nuance annotations cannot express. It also states the authentication prerequisite and the required re-invocation after authenticating.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the operation and its soft-delete semantics in the first clause, with supporting detail after. The auth note is a separate paragraph and earns its space, though the phrasing is slightly repetitive ('Authenticate this client' / 'start_login does NOT open this tool').
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 no output schema, the description covers what changes, the observable effect (drops out of the default list), recoverability, and the auth gate. An agent has everything needed to invoke it correctly or recover from an auth failure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 'Circle ID to archive' with a hex pattern. The description adds no format, source (where to obtain the ID), or validation 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.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource (archive a Circle) and immediately qualifies it as a soft delete that sets status to archived. This distinguishes it from hard-delete siblings like delete_domain or delete_template, which an agent browsing the large sibling list would otherwise conflate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete consequences and a recovery path (recoverable via list_circles with status="archived"), and adds an important routing caveat that start_login does not unlock this tool. It does not compare against update_circle for non-destructive status changes, so the alternative comparison is only implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_dns_credentialADestructiveInspect
Delete a stored DNS provider credential. Domains using this credential will need new credentials for automated verification.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | DNS credential ID to delete |
TDQS
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 beyond that: it discloses the downstream effect on domain verification and the authentication prerequisite, including the session flow via start_login and the /mcp authenticate step.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The destructive effect is front-loaded in the first two sentences, with the auth instructions clearly separated. The auth paragraph is a bit long but every line conveys actionable information about how to obtain access.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter destructive tool with no output schema, this covers the essential concerns: what is destroyed, the downstream impact, and how to authenticate. Nothing critical is missing, though explicit routing to sibling tools could improve it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 it fully. The description adds no additional meaning about the id format or source, matching the baseline 3 for schema-documented params.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete a stored DNS provider credential'), which is distinguishable from create_dns_credential, list_dns_credentials, and check_domain_credentials. It does not explicitly name those siblings, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the consequence of deletion (affected domains need new credentials for automated verification), which implies when the tool matters, but it never states when to use this versus alternatives or prerequisites for choosing a credential to delete. 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.
delete_domainADestructiveInspect
Remove a domain from the account. Revokes every proof of the domain and every delegation issued from it (for good — re-adding the domain does not bring them back), deletes the domain and its records, and removes our _proof TXT record and the Resend sending domain where we can; the response lists what is left for you to remove by hand. Owner only, in a start_login session, with one code: start_2fa_for_action with action_type domain_remove and targets [this domain id]. Need only a fresh proof? Revoke the proofs instead (revoke_asset), which keeps the domain. Cannot be undone.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Domain ID to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond destructiveHint=true: discloses that it revokes all proofs and delegations irreversibly (re-adding doesn't restore them), deletes records, removes _proof TXT/Resend sending domain where possible, lists leftover manual cleanup in the response, and requires owner auth plus 2FA. This is exactly the context annotations can't carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: irreversible consequences first, then auth prerequisites, then the alternative. Long sentences but every clause carries needed warning. Slightly heavy but justified for a destructive op.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete for a destructive single-param tool: covers cascade effects, irreversibility, auth/2FA flow, leftover cleanup, and an alternate path. No output schema, so noting the response content (list of manual leftovers) fills that gap too.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single id is documented ('Domain ID to delete'); description reinforces that id is the domain id used as target but adds little beyond schema. Baseline 3-4 appropriate given full coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Remove a domain') and precisely enumerates the cascade consequences. Distinguishes clearly from revoke_asset and delete_domain_verification by naming them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the alternative 'revoke_asset' for the case of only needing a fresh proof, and states the exact precondition (owner, start_login session, start_2fa_for_action with action_type domain_remove and targets [id]). When-to-use/when-not are unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_domain_verificationADestructiveInspect
Delete a domain verification attempt that is not verified (pending, verifying or failed) — nothing is revoked. A verified domain, or one that needs re-verification, is refused with domain_verified: removing it revokes its proofs and every delegation issued from it, which is delete_domain in a start_login session (or the dashboard).
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Domain verification ID (24 hex characters) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint annotation, the description discloses that nothing is revoked for unverified attempts, the exact error code (domain_verified) for the refused case, what revocation would entail, and the authentication requirement for a Proof account. It also warns that start_login does not open this tool, which is a non-obvious access constraint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and efficiently separated into an ACCESS note. The first sentence is long and slightly tangled (the delete_domain/start_login clause is hard to parse on first read), but overall it earns its length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete for a destructive one-parameter tool with no output schema: it covers the eligible states, the refusal case and error code, the auth precondition, and the sibling alternative. 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with a single fully-documented id parameter, so the schema already carries the parameter burden. The description adds nothing about the id format or origin 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.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (delete a domain verification attempt) and narrows scope precisely to the non-verified states (pending, verifying, failed). It explicitly distinguishes itself from delete_domain, so an agent can tell the two apart 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the exclusion clearly — verified or needs-re-verification domains are refused with domain_verified — and routes the agent to the correct alternative (delete_domain in a start_login session or the dashboard). This is explicit when/when-not guidance with a named fallback.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_hitlADestructiveInspect
Delete (archive) a HITL config. Sets status to archived. Cannot be used for new confirmations after deletion.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | HITL config ID to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, but the description adds real value beyond them: the operation is an archive rather than an irreversible purge, the resulting state is 'archived', and downstream confirmations stop working. It also discloses the auth precondition, which annotations do not cover.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core operation and its consequence are front-loaded in two tight sentences. The trailing ACCESS block is boilerplate-heavy and the clause 'start_login does NOT open this tool' is awkwardly worded, slightly diluting the otherwise efficient structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter mutation with no output schema and safety already covered by annotations, the description supplies the lifecycle consequence and auth requirement an agent needs. The oddly phrased auth note leaves minor ambiguity about the exact authentication flow.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single required 'id' parameter, so the schema already documents it fully. The description adds no format, sourcing, or validation detail for the ID, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete (archive) a HITL config') and immediately clarifies that deletion is a soft-archive via status change, which separates it from hard-delete siblings like delete_hitl_keys. 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a usage consequence ('Cannot be used for new confirmations after deletion') and an access precondition (needs a Proof account, authenticate first). It does not explicitly route to alternatives such as update_hitl or delete_hitl_keys, so it falls short of a full when/when-not statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_hitl_keysADestructiveInspect
Delete the encryption keypair from a HITL config. WARNING: Existing ciphertexts will become permanently unreadable.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| hitl_id | Yes | HITL config ID |
TDQS
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 substantially more: the concrete consequence that existing ciphertexts become permanently unreadable, plus the auth requirement and the fact that start_login does not unlock this tool. This is exactly the extra context the 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The destructive warning is front-loaded in the first sentence, which is the right ordering. The ACCESS paragraph is somewhat boilerplate and slightly verbose, but each part (warning, prerequisite, auth steps) carries actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive one-parameter tool with no output schema, the description covers the critical unknowns: irreversibility, auth prerequisites, and the workaround path. It falls short only in not relating the tool to its near-neighbor delete_hitl, which would help disambiguation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter (hitl_id) with 100% schema description coverage, so the schema already documents it fully. The description adds no syntax, format, or sourcing detail for the ID, which is acceptable given the high coverage but earns only the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Delete the encryption keypair from a HITL config.' This distinguishes it from siblings such as delete_hitl, get_hitl_keys, and upload_hitl_keys, so an agent can identify the exact target of the operation 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear prerequisite ('needs a Proof account', authenticate then retry) but never states when to choose this tool over alternatives like delete_hitl, nor when not to delete keys. Prerequisite guidance is present; alternative-selection guidance is absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_profileADestructiveInspect
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. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
| profile_id | Yes | Profile ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructive=true and readOnly=false, and the description goes well beyond by disclosing exactly what is destroyed vs. preserved (history kept but unlinked, username retired for good), irreversibility ('Cannot be undone'), auth requirement ('needs a Proof account'), and the 2FA gate with concrete parameters. This is the level of behavioral detail an agent needs before invoking an irreversible mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and its effects, then layers the preconditions and auth flow in a logical order. Dense but every sentence carries operational weight. The ACCESS paragraph is slightly verbose but necessary given the auth complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, irreversible mutation with no output schema, the description covers what is destroyed, what is preserved, the last-project/primary constraint, the empty-project-only restriction under API-key auth, the 2FA requirement with exact call parameters, irretrievability, and the response hint ('the response names it'). Nothing an agent needs to call this safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds real value by tying profile_id to the 2FA action targets ('targets [this project id]'), clarifying the parameter's role in the auth flow. Only the bare schema field name 'Profile ID' is otherwise undocumented, but the description compensates adequately.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (delete) and resource (project/profile), then enumerates precisely what deletion entails: revoking API keys, archiving HITL setups, declining pending requests, unlinking history, deleting templates, retiring the username. Distinguishes itself from update_profile/create_profile and other delete_* siblings through the profile scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly covers when it can and cannot be used: last project cannot be deleted, primary deletion reassigns primary to oldest remaining, and with an API key only an EMPTY project can be deleted (otherwise owner_session_required). Names the required start_2fa_for_action call with exact action_type and targets. This is a textbook when/when-not/precondition specification.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_templateADestructiveInspect
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. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| channel | Yes | Message channel | |
| profile_id | No | The sub-account (project) to act on; omitted → your key's project, or the primary project for an account-wide key | |
| message_type | Yes | Message type (e.g. verification_request, login_request) |
TDQS
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 genuine value beyond them: the exact effect of deletion (revert to channel/message-type default) and the authentication requirement, which 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and its effect in one tight sentence; the ACCESS paragraph is separated and scannable. The auth note is slightly verbose but earns its place as an operational prerequisite.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, no-output-schema mutation tool, the description covers the effect, the auth prerequisite, and the parameter-driven default. It omits edge-case behavior (e.g. what happens if no custom template exists) and reversibility, which would make it fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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, and profile_id (including the omitted-profile default behavior). The description only frames that the default is determined by channel and message type, adding marginal meaning over the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('delete ... custom template') and adds the consequential effect (reverting the project to the default template for the channel and message type). This clearly distinguishes it from siblings like update_template, get_template, and list_templates.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a concrete prerequisite for use: a Proof account with an authenticated client, and explicitly notes that start_login does NOT open this tool (a useful exclusion that prevents a wrong path). It does not explicitly name an alternative tool for modifying vs. removing templates, so it falls 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.
export_authorizationsARead-onlyInspect
Export authorizations as CSV or JSON. Supports date range and status filtering. Maximum 10,000 records.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | End date filter (ISO 8601) | |
| from | No | Start date filter (ISO 8601) | |
| format | No | Export format (default: json) | |
| status | No | Filter by status |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses the 10,000-record cap, the supported filter dimensions, and a critical auth caveat (needs a Proof account; start_login does NOT open this tool). That last point actively prevents a wrong recovery path an agent would otherwise attempt.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose, filters and limit in one compact sentence, then a clearly separated ACCESS block. The Claude Code parenthetical adds a little verbosity but carries actionable routing detail, so it largely earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a four-optional-parameter read-only export with full schema coverage and no output schema, the description covers what matters: formats, filters, record ceiling, and authentication. It does not mention pagination/truncation behavior when the 10,000 cap is hit, a minor remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both enums are documented in the schema, so the baseline of 3 applies. The description adds no per-parameter detail (e.g., date format nuances or default behavior) beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Export authorizations") plus output formats, so an agent knows exactly what it produces. It does not explicitly distinguish itself from siblings like export_data or list_authorizations, which is the only reason 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context: use when you need CSV/JSON export with date-range and status filtering, and states the access prerequisite. It never names alternatives such as list_authorizations or export_data for when a plain listing or different dataset is wanted, so no explicit when-not guidance.
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. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
| export_id | No | Read this export's status instead of the latest one |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (readOnlyHint=false, destructiveHint=false) by explaining that the export is prepared asynchronously in the background, that the data is delivered via an emailed link rather than returned by the tool, the 24-hour rate limit (waived for deletion-scheduled accounts), and the 7-day retention. These are exactly the operational traits an agent needs and that 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose then behavior, and nearly every sentence carries unique information. Slight redundancy: authentication is covered both in the main body ("sign in with start_login first") and again in the trailing ACCESS paragraph.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 compensates by explaining that the tool never returns the data itself and how delivery occurs. Auth requirements, rate limits, retention, and re-call semantics are all present, so an agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one optional parameter, and schema coverage is 100%, so the schema already documents export_id. The description's "Pass export_id to read one export's status" largely restates the schema text, adding only minor reinforcement; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Export a complete copy of your account's data") and explicitly covers the dual mode ("or check on one"). It cites the legal basis (GDPR Articles 15 and 20), which disambiguates it from the similarly-named export_authorizations sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use mechanics: first call starts the export, subsequent calls report readiness, and export_id reads a specific one. It also states prerequisites (owner only, sign in with start_login, API-key-only connections are refused) and the alternative path when not yet authenticated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extend_requestBInspect
Extend the expiration time of a pending verification request.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Verification request ID to extend |
TDQS
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 already covered; the description usefully adds that authentication is required and how to obtain a session. It still omits behaviorally relevant details for a mutation: how much the expiration is extended, whether there are limits or one-shot restrictions, and what happens if the request is no longer pending.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action is front-loaded in the first sentence, and the auth instructions follow as a clearly separated paragraph. It is slightly verbose for a one-parameter tool, but every sentence carries operational information rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 should ideally hint at the result of the extension, and it does not. The auth prerequisite is fully covered, but the agent still lacks detail on extension magnitude and edge cases for this mutation, leaving it minimally adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the sole parameter 'id' is documented in the schema as 'Verification request ID to extend', so the description cannot add much. It contributes no format, source, or lookup guidance for obtaining the ID, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Extend the expiration time of a pending verification request'), which pinpoints the operation precisely. It doesn't name a sibling alternative, but the mutation semantics and the 'pending' qualifier make the target object unambiguous against the large sibling set.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The ACCESS paragraph gives concrete operational prerequisites (Proof account, authenticate via /mcp, or start_login) and even notes that start_login opens a session, which is genuine usage context. However, it never says when to extend versus when to cancel or recreate a request, e.g. how it relates to cancel_verification_request.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_2fa_statusARead-onlyInspect
Check the status of a 2FA session by session ID. Returns whether the challenge has been completed, is pending, or has expired.
Agent usage: Poll this after calling start_2fa. Check every few seconds. Terminal states: "verified" (proceed with protected operation), "expired" (restart with start_2fa). While "pending", the user has not yet entered their code.
Before calling this for a challenge you created, make sure your reply text already shows the user what to act on — the link itself, the SMS text and number, or a note to check their inbox; a link that appeared only in a tool result is one they never saw.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | 2FA session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only assert readOnlyHint=true, but the description adds substantial behavior beyond that: the meaning of each terminal state, polling cadence, the auth prerequisite (needs a Proof account; authenticate via /mcp or start_login), and the non-obvious requirement that the user-facing reply text must already surface the challenge link/SMS before this call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose and return states are front-loaded in the first sentence, and the polling/terminal-state guidance follows logically. Slightly long across three paragraphs with some overlap between the return-state list and the terminal-state explanation, but every section carries actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 and their meanings. Auth requirements and the pre-call reply-text obligation are also covered, so an agent has everything needed to call and interpret this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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, so the schema already carries the semantics. The description says 'by session ID' but adds no format, provenance, or sourcing 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.
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 a 2FA session by session ID') and enumerates the return states (completed/pending/expired), which lets an agent separate it from siblings like verify_2fa, wait_for_2fa, and start_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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives strong operational context: poll after start_2fa, cadence of 'every few seconds', and explicit terminal-state handling ('verified' proceed, 'expired' restart with start_2fa). It does not, however, mention the sibling wait_for_2fa, which is the obvious alternative to hand-rolled polling, so the alternative-space is not fully closed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_add_email_statusARead-onlyInspect
Check the status of an in-progress email addition by session ID.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | Add-email session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, and the description is consistent with a read-only status check. It adds real operational context beyond the annotations: the tool requires an authenticated Proof account and describes the auth flow (authenticate via /mcp or start_login). It stops short of describing lifecycle/polling behavior of the in-progress session.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded in one tight sentence, followed by a clearly separated access note. The access block is somewhat verbose but each clause carries actionable information for an agent hitting an auth failure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 ideally describe what status values are returned and whether polling is expected; it does neither. It also omits where session_id comes from. The auth guidance is helpful but leaves these functional gaps for a status-check tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the single parameter is already documented as 'Add-email session ID'. The description restates 'by session ID' but adds no origin or format information 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.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Check the status') and resource ('in-progress email addition') with the keying field ('by session ID'). The email resource implicitly separates it from the sibling get_add_phone_status, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives access/authentication guidance (needs a Proof account; authenticate or use start_login). However, it does not say where the session_id originates (presumably start_add_email) or when to prefer this over wait_for_verification or get_add_phone_status, so the when-to-use guidance is incomplete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_add_phone_statusARead-onlyInspect
Check the status of an in-progress phone addition by session ID. Poll until terminal state.
Before calling this for a challenge you created, make sure your reply text already shows the user what to act on — the link itself, the SMS text and number, or a note to check their inbox; a link that appeared only in a tool result is one they never saw.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | Add-phone session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true is consistent with a status-check tool, and the description adds behavior the annotation does not: this is a polling endpoint that should be called repeatedly until a terminal state, and it requires an authenticated Proof session (possibly created by start_login). It stops short of naming the terminal states or rejection behavior, so 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, followed by polling and auth guidance. The paragraph about making sure the link/SMS appears in reply text is a little verbose and tangential to tool selection, but it does carry task-relevant guidance rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 more about what a status response contains and which states count as terminal (e.g. complete, expired, failed). Authentication and polling behavior are covered, but the return-side picture is left entirely to inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single session_id parameter is already documented in the schema as the add-phone session ID. The description repeats 'by session ID' without adding format, provenance, or lifecycle detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 phone addition') plus the input key ('by session ID'). It is readily distinguishable from start_add_phone and from the sibling get_add_email_status, so an agent can pick 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operating guidance ('Poll until terminal state') and spells out the authentication path — authenticate the client, or sign in via start_login since that session opens this tool, then retry. It lacks an explicit 'do not use for X' exclusion, but the context is otherwise unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_api_key_usageARead-onlyInspect
Get per-API-key usage for a given key id: verification counts by type/channel/status, plus verification-request/confirmation/authorization totals, and attribution context (attribution_cutoff_at, attributed_fraction). The counts cover the key and every key it replaced (api_key.replaced_key_ids). Counts only — no recipient identifiers. Scoped to the authenticated account; an API-key caller may read only its own key.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The API key id to fetch usage for | |
| environment | No | Scope metrics to test or production data (default: production) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, it discloses that counts only are returned with no recipient identifiers, that counts aggregate the key plus every key it replaced (api_key.replaced_key_ids), and it spells out the authentication path (Proof account, /mcp auth or start_login). This is exactly the extra behavioral 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short paragraphs, front-loaded with what gets returned, followed by an access note. Nearly every sentence earns its place; the access paragraph is slightly verbose but justified for an auth-gated tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 carries the burden of describing return contents (count categories plus attribution_cutoff_at and attributed_fraction) and the auth requirement. 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.
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 real semantic meaning for id: the counts cover the key and every key it replaced, clarifying that id aggregates a key lineage. It does not add anything about the environment parameter beyond the schema's own default note.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource (per-API-key usage for a given key id) and enumerates the exact metric families returned: verification counts by type/channel/status plus request/confirmation/authorization totals. It is clearly distinguishable from siblings like get_usage, get_self_api_key, and list_api_keys, which cover different scopes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the operative constraint clearly: 'an API-key caller may read only its own key' and that usage is scoped to the authenticated account, which tells the agent when this tool is applicable. However, it never explicitly contrasts this with get_usage or get_self_api_key, leaving the agent to infer the choice among overlapping usage tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_assetARead-onlyInspect
Get a single verified asset by ID. Returns details including type, value, status, and verification timestamps.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Asset ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true; the description adds the account requirement ('needs a Proof account'), the exact authenticate flow, and the anti-pattern around start_login. That is meaningful behavioral context beyond the annotation, though return format/pagination behavior remains unstated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short blocks: what it returns first, then the access prerequisite. Front-loaded and mostly waste-free, though the parenthetical UI path is slightly verbose for an agent audience.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 usefully enumerates the returned fields, and it covers the auth prerequisite that would otherwise cause a failed call. Adequate for a single-parameter read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 the semantics. The description adds nothing about ID format or validity, making 3 the correct baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Get a single verified asset by ID') and enumerates the returned fields (type, value, status, timestamps). The word 'single' implicitly distinguishes it from list_assets, but no sibling is named 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear authentication precondition and, unusually, an explicit negative routing hint: 'start_login does NOT open this tool,' steering the agent away from a wrong recovery path. It does not, however, say when to prefer this over list_assets or get_profile_assets.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_authorizationARead-onlyInspect
Get an authorization by ID. Returns the current state of the authorization including status and usage statistics.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Authorization ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry readOnlyHint=true, but the description adds value beyond that: it discloses the authentication requirement and the 401-style retry flow, and warns that start_login does NOT unlock this tool — a genuinely non-obvious behavioral caveat. It stops short of describing response shape in depth.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then the return contents, then the access caveat. Two sentences plus a short ACCESS block; the anti-pattern warning about start_login earns its place, though the ACCESS paragraph is slightly verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 returned fields (status, usage statistics) and covering the auth prerequisite. Nothing critical to invoking a single-param read is missing; only edge cases (not-found/error behavior) are absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 Authorization ID. The description's 'by ID' adds no syntax or format detail beyond that, which is the correct baseline-3 outcome.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Get an authorization by ID') and adds what the response contains (status and usage statistics). It implicitly separates itself from list_authorizations and create_authorization/revoke_authorization by emphasizing single-ID lookup, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a concrete prerequisite (Proof account, authenticate the client, then retry) which is real usage guidance, but gives no when-to-use/when-not against alternatives like list_authorizations or get_verification_request. Usage is implied rather than framed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_circleARead-onlyInspect
Get a Circle by ID. Returns the Circle including its members and per-member channel presence booleans (an identifier is NEVER returned — SEC-PM-006).
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Circle ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond readOnlyHint=true: it discloses the authentication prerequisite, the shape of the returned payload, and a security constraint that an identifier is never returned (SEC-PM-006). That is meaningful behavioral disclosure for a read tool, 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose, return contents, and access protocol are front-loaded and ordered logically. The opaque SEC-PM-006 reference is the only bit of noise, but it does not bloat the description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 takes on the burden of describing what is returned, and it covers the auth prerequisite that an agent would otherwise trip over. Missing only failure/error semantics for a nonexistent ID.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 fully documented there (including the 24-hex pattern). The description restates 'by ID' but adds no format, constraint, or example 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.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get a Circle by ID') and even enumerates the returned payload (members, channel presence booleans). It implicitly separates itself from list_circles via 'by ID', but does not name any sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a real usage gate – requires a Proof account, must authenticate the client first, and start_login does not cover it – which is helpful. However it says nothing about when to prefer this over list_circles, list_circle_members, or get_circle siblings, so selection guidance is only implied by the 'by ID' framing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_confirmationARead-onlyInspect
Get a confirmation by ID. Returns the full confirmation including status, response, and proof token.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Confirmation ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint already declaring the safe-read profile, the description adds genuine non-obvious behavior: the auth requirement and the counterintuitive warning that start_login does not unlock this tool. It also previews the returned fields. It stops short of covering error cases or whether an unknown ID returns empty vs. raises.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short blocks, both front-loaded: purpose and return value first, then the access prerequisite. No filler sentences, though the auth note could be tightened slightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 return payload. Combined with the readOnly annotation and the auth prerequisite, an agent has everything needed to call this correctly: what it does, what comes back, and what access it requires.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 adds only the implicit notion that the ID refers to an existing confirmation and nothing about format or sourcing. Baseline 3 when the schema carries the parameter detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get a confirmation by ID') and even enumerates the return payload (status, response, proof token). This distinguishes it from list_confirmations and create_confirmation by the ID-based lookup, 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.
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', authenticate the client, and start_login does NOT open this tool), which is useful gating context. However, it offers no routing guidance among the many related siblings such as list_confirmations, wait_for_confirmation, or get_confirmation_approval_link, so when-to-use versus alternatives remains implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_confirmation_approval_linkAInspect
Generate a fresh approval link for a pending confirmation. The link expiry inherits the confirmation timeout. Only works for pending confirmations.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Confirmation ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false / destructiveHint=false. The description adds real behavioral context: the link expiry inherits the confirmation timeout, the pending-state precondition, and that a Proof account with an authenticated client is required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences up front, followed by a clearly separated ACCESS note. Every line carries information, though the auth block is slightly verbose for a one-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 precondition, expiry semantics and authentication, which is most of what an agent needs. It omits what the returned link looks like and whether regenerating invalidates prior links.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a single 'id' (24-hex Confirmation ID) already documented. The description refers to confirmations but adds no format or scoping 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.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Generate') and resource ('approval link for a pending confirmation'), and the qualifier 'fresh' distinguishes it from merely fetching a confirmation via get_confirmation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear precondition ('Only works for pending confirmations') and an explicit auth procedure, including the negative hint that start_login does NOT unlock this tool. It stops short of naming a sibling alternative for pulling an existing link.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_current_userARead-onlyInspect
Get the signed-in user's account details, plan and settings. Needs a login session: call start_login, then wait_for_login until it reports success. An API key alone cannot read this — for the key's own account use get_self_api_key or get_settings.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only readOnlyHint available from annotations, the description carries the auth burden and does it well: it discloses that a login session is required, that an API key is insufficient, and that a Proof account/authentication step is needed. It stops short of describing rate limits or response shape, hence 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then prerequisites, then alternatives. The ACCESS paragraph largely repeats the login instructions already given in the first paragraph, which is the only real redundancy, but the content still earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 gives only a coarse sense of the return ('account details, plan and settings'). Given the zero-parameter, read-only nature and the thorough auth guidance, this is close to complete, with the return shape being the remaining soft spot.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 avoids inventing parameter semantics and instead spends its words on auth context, which is the only caller-relevant input here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get the signed-in user's account details, plan and settings') and explicitly distinguishes itself from lookalike siblings (get_self_api_key, get_settings) by scoping to the signed-in user rather than the API key's own account.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the prerequisite flow (start_login, then wait_for_login until success), states the negative condition (an API key alone cannot read this), and routes to the correct alternatives for the API-key case. Nothing about 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_default_templatesARead-onlyInspect
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. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already establishes this as a safe read. The description adds real behavioral context beyond annotations: the account requirement and the concrete authentication step ('/mcp → Authenticate, then call this tool again'), plus the warning that start_login won't unblock it. It stops short of describing return shape or pagination.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose in the first sentence, then adds a clearly separated access note. Both sentences earn their place, though the access paragraph is slightly verbose for a zero-parameter read tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-param, read-only list tool with no output schema, the description covers purpose and the authentication prerequisite well. Return format is not described, but with no output schema the burden is light and the definition is largely complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 on the input side, and schema coverage is 100%.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 clarifies what 'default' means: built-in templates sent when no custom template exists. This implicitly distinguishes it from custom-template siblings like get_template/list_templates, but does not name an alternative 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides useful access context ('needs a Proof account') and a routing note that start_login does NOT open this tool, but gives no explicit when-to-use-vs-alternatives guidance relative to list_templates or get_template. 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_delegationARead-onlyInspect
Get one of your delegations by Mongo id or ph_dlg_* handle. Returns the stored publishable token plus the DERIVED effective_status/is_valid — the delegation is only as live as the control proof it stands on (a revoked, suspended or expired domain proof invalidates it) and never outlives its own expires_at, whichever comes first.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Delegation ID (24-hex Mongo id or ph_dlg_<32 hex> handle) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint; the description goes well beyond by disclosing the return payload (stored publishable token plus DERIVED effective_status/is_valid) and the derivation rule — validity is bounded by the underlying control proof (revoked/suspended/expired domain proof invalidates it) and by its own expires_at, whichever comes first. That is real behavioral context an agent cannot get 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads what the tool does and what it returns, then a clearly separated ACCESS block. Information-dense but every sentence carries weight; the validity explanation is slightly verbose but justified given no output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 semantics of the derived status fields, and it supplies auth prerequisites. An agent has everything needed to call it correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 fully documented, so the schema does the heavy lifting. The description restates both accepted formats (Mongo id, ph_dlg_* handle) but adds no syntax detail beyond the schema pattern, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Get) and resource (one delegation) plus the accepted identifier formats (Mongo id or ph_dlg_* handle). The singular 'one of your delegations' separates it from list_delegations and verify_delegations without needing their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit access prerequisites: needs a Proof account, how to authenticate (Claude Code /mcp → Authenticate), and an explicit warning that start_login does not unlock this tool. It does not state when to prefer this over list_delegations or verify_delegation, so it falls short of the 5 bar.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_dns_providersARead-onlyInspect
Get metadata for all supported DNS providers, including required credential fields and documentation links.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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 authentication prerequisite: a Proof account is needed, and the first call may open a session that requires start_login followed by a retry. That is meaningful behavioral context an agent cannot get 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short blocks: the capability statement first, then the access prerequisite. Both earn their place, though the auth note is slightly verbose and could be tighter without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no input parameters, no output schema, and readOnlyHint already covering safety, the description supplies everything remaining: what is returned (provider metadata, credential fields, doc links) and the auth flow required to call it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 and there is nothing for the description to clarify further. No parameter-level claims are made or needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Get) and resource (metadata for all supported DNS providers) and enumerates the payload (required credential fields, documentation links). This clearly separates it from siblings like connect_dns_provider, create_dns_credential, and list_dns_credentials, which act on credentials rather than provider metadata.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The ACCESS paragraph gives real procedural guidance (Proof account required, authenticate via /mcp or start_login, then retry), but it never states when to choose this tool over alternatives such as list_dns_credentials or connect_dns_provider. Usage is only implied via the 'required credential fields' payload.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_domainARead-onlyInspect
Get details of a specific domain by ID, including verification status, DNS records, and provider connections.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Domain ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, and the description goes beyond that by disclosing the authentication requirement and the recovery path (session opens this tool, then call again). It stops short of covering rate limits or response shape detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose sentence first, then a separate, clearly labeled ACCESS block. Both parts earn their place, though the auth block is slightly chatty with the parenthetical CLI hint.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only single-ID getter with no output schema, the description tells the agent what data comes back and how to satisfy the auth gate. Remaining gaps (pagination/error behavior) are minor for a lookup of this shape.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
One required parameter with 100% schema description coverage, so the schema already defines 'id' as the Domain ID. The description's 'by ID' only restates this, adding no format or sourcing detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 specific domain by ID') and enumerates the returned content (verification status, DNS records, provider connections). It does not explicitly contrast itself with near siblings like check_domain_verification or check_domain_credentials, so it falls short of the top band.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear access prerequisites (Proof account, authenticate or start_login) but no guidance on when to prefer this over list_domains or the various check_domain_* tools. Usage is only implied by 'by ID'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_hitlARead-onlyInspect
Get a HITL config by ID. Returns the config including channels, timeout, and status.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | HITL config ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds real context beyond readOnlyHint=true: it discloses the return payload shape (channels, timeout, status) and, importantly, the authentication precondition that the client must be authenticated for this specific tool. That prerequisite detail is not captured by annotations and is operationally significant.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in one sentence, followed by a clearly separated ACCESS note. The parenthetical Claude Code hint is slightly verbose but serves a practical recovery path, and no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 contents, and the authentication prerequisite. An agent has what it needs to invoke it correctly, with only the sibling-routing detail left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a single parameter clearly described as the 'HITL config ID' in the schema. The description's 'by ID' adds nothing beyond what the schema already 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.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get a HITL config by ID') and even names the returned fields (channels, timeout, status). It distinguishes itself from create_hitl/update_hitl/delete_hitl via the 'by ID' read framing, though it doesn't explicitly contrast with list_hitls.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The ACCESS block gives strong prerequisite guidance (needs a Proof account, authenticate first, start_login won't unlock this tool), which is genuinely useful. However, it offers no guidance on when to prefer this over list_hitls for retrieval, so usage is only implied by the 'by ID' phrasing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_hitl_keysARead-onlyInspect
Get the encryption keypair for a HITL config. With hitl:read it returns the public key, encrypted private key, KDF salt, and key ID (kid). A key holding confirmations:create without hitl:read receives only public_key and kid — what a confirmation message is sealed to, never the private-key material.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| hitl_id | Yes | HITL config ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnlyHint annotation by disclosing that the returned fields depend on the caller's permission scope — full material with hitl:read, only public_key/kid otherwise — and that private-key material is never exposed to confirmation-only keys. It also documents the Proof-account auth requirement, which annotations do not cover.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and return behavior, with access requirements in a clearly separated block. The access paragraph has minor redundancy ('Authenticate this client... then call this tool again'), but every sentence carries necessary information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 thoroughly, enumerating the fields returned under each permission tier and stating the auth prerequisite. 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and there is a single required hitl_id param, so the schema already documents it. The description refers to 'a HITL config' but adds no format, sourcing, or lookup guidance for the ID beyond what the schema provides, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Get the encryption keypair for a HITL config'), clearly distinct from siblings like get_hitl, list_hitls, upload_hitl_keys, and delete_hitl_keys. An agent can identify the resource and 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives strong context: it explains the permission-conditional behavior (hitl:read vs confirmations:create) and states an explicit exclusion ('start_login does NOT open this tool') plus the auth prerequisite. It does not name sibling alternatives such as get_hitl or upload_hitl_keys, so routing guidance is good but not fully explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_identity_challengeARead-onlyInspect
Get a Proof-Me identity challenge by ID. Returns its status (pending, confirmed, denied, cancelled, failed, expired, revoked or suspended), the channel the CONFIRM ran on, and — once the person being checked decided — the proof token and its proof_id. Poll this for resolution.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Identity challenge ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=true already covering the safety profile, the description adds real value beyond annotations: the full status enumeration, the channel returned, the proof token/proof_id arriving only after the subject decides, the account/auth requirement, and the polling-for-resolution behavior. It stops short of detailing pagination or error cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and return shape, then a clearly separated ACCESS block. Every sentence carries information; only minor verbosity in listing all nine status values keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 justifiably carries the return-value burden and does so by enumerating statuses and the proof payload. Combined with the auth prerequisite and polling guidance, 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is only one parameter and schema description coverage is 100%; the schema already documents 'id' as the Identity challenge ID with a hex pattern. The description adds nothing beyond 'by ID,' so the baseline 3 for schema-driven parameter documentation applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 a Proof-Me identity challenge by ID,' which cleanly separates it from create_identity_challenge and the sibling get_* tools. However, it never explicitly names or routes against an alternative tool (e.g. get_verification, get_multi_channel_verification_status), so it stops short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Poll this for resolution' gives a clear operational directive for when to call it, and the ACCESS block lays out the prerequisite (authenticated Proof account) plus the note that 'start_login does NOT open this tool.' No explicit when-not or named alternative is provided, so it is 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_multi_channel_verification_statusARead-onlyInspect
Get the status of a multi-channel verification group by its group_id. Returns the aggregate status (pending/verified/expired), the winning_channel once one completes, per-channel statuses, and the proof token (with expires_at) when the group is verified.
Before calling this for a challenge you created, make sure your reply text already shows the user what to act on — the link itself, the SMS text and number, or a note to check their inbox; a link that appeared only in a tool result is one they never saw.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| group_id | Yes | Multi-channel verification group ID (format vg_<hex>) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses the return shape (aggregate status enum, winning_channel, per-channel statuses, proof token with expires_at) and a non-obvious auth constraint ('needs a Proof account... start_login does NOT open this tool'). That auth caveat is exactly the kind of behavioral detail 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and return values are front-loaded in the first sentence, with the caveat and access notes following. The middle paragraph is somewhat digressive relative to the core operation but earns its place by preventing an invisible-link UX failure; overall it is tight with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 explains the return values, covers the auth model, documents the sole parameter via schema, and clarifies the read-only nature. 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single group_id parameter is fully documented in the schema (including the vg_<hex> format). The description only restates 'by its group_id' and adds no syntax or semantic 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.
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 multi-channel verification group by its group_id') and enumerates what it returns, which clearly separates it from per-channel or single-verification readers. It does not name or contrast any sibling tool (e.g. get_verification, get_proof_status), so sibling differentiation is implicit 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The second paragraph gives a workflow caveat ('before calling this for a challenge you created, make sure your reply text already shows the user what to act on'), which is useful ordering guidance but not a when-to-use/when-not-use rule. It never says how to choose between this and wait_for_verification or the other status readers, so 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.
get_my_profileARead-onlyInspect
Get the current user's primary profile. Returns profile details, theme, custom links, and public proof display settings.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true, and the description adds genuinely useful context: it documents the required Proof account and the exact auth flow plus the explicit exclusion of start_login. It does not disclose failure behavior when unauthenticated, but the auth requirement is a real addition 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two clearly separated blocks – purpose and access – with the primary function front-loaded. Efficient, though the all-caps 'ACCESS' header is slightly heavy for the amount of content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete for a zero-param read tool: it states what is returned, that it is read-only, and the auth precondition that would otherwise cause silent failures. Without an output schema it could be more explicit about the response shape, but the field list covers the essentials.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so baseline is 4. The description adds value by naming the returned fields a caller can expect, which compensates for the absent output schema, though with no params there is nothing more to specify.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (get) and resource (current user's primary profile) and enumerates the returned fields (details, theme, custom links, public proof display settings). Siblings get_profile and get_current_user exist, and the phrase 'current user's primary profile' distinguishes this from retrieving an arbitrary profile by ID.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit conditional guidance for the authentication prerequisite ('Authenticate this client, then call this tool again') and explicitly rules out start_login as the path to this tool. It does not contrast against get_profile / get_current_user, but the when-to-use context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_platform_summaryARead-onlyInspect
Get a one-call account snapshot: quota with end-of-month projection, request health (pending/completed/expired counts + success rate), per-channel completion rates, HITL counts, and active API key count. The same data the dashboard home renders. The hitl_channels sub-object requires the hitl:read scope.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| environment | No | Scope request/channel/HITL metrics to test or production data (default: production) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=true already declaring the safety profile, the description still adds real operational context: the hitl_channels sub-object requires the hitl:read scope, and the tool needs a Proof account with client authentication before it can be called. That scope caveat is exactly the kind of partial-failure information annotations cannot carry. It does not cover pagination or freshness semantics, but for a snapshot read those are minor.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the payload enumeration, then the scope caveat, then access prerequisites as a separate block. Every sentence carries distinct information — no restatement of the tool name, no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 enumerating the returned fields, so an agent knows what it will get. Auth and scope prerequisites are covered. A missing note on refresh/currency of the snapshot or on error behavior when the account lacks the hitl:read scope keeps it just under complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one optional parameter (environment), and schema description coverage is 100% with a full enum, so the schema already documents it. The description adds no extra semantics for the parameter — it also speaks about output contents rather than inputs. Baseline 3 is the correct score when the schema carries the full burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb + resource ('get a one-call account snapshot') followed by an enumeration of exactly what the snapshot contains (quota projection, request health, per-channel completion rates, HITL counts, API key count). The phrase 'the same data the dashboard home renders' anchors it against the many per-resource getters in the sibling list. An agent can distinguish it from get_usage, get_settings, or get_api_key_usage 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for when this tool applies (account-level snapshot rather than per-resource detail) and an explicit routing exclusion: 'start_login does NOT open this tool,' which prevents a common misfire. It also states the account prerequisite. It stops short of naming which sibling to use instead when only one metric is needed, 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_profileARead-onlyInspect
Get a specific profile by ID. Returns full profile details including theme, custom links, and verification display settings.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| profile_id | Yes | Profile ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true is consistent with a 'Get' tool, and the description goes beyond the annotation by disclosing the authentication prerequisite and the fact that a failed call should be retried after authenticating. It omits any error/not-found behavior or rate-limit context, so it is good but not complete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences followed by a clearly delimited ACCESS note; the purpose is front-loaded before the operational caveat. The ACCESS block is slightly verbose relative to the rest but every line is load-bearing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only single-parameter tool with no output schema, the description covers what it returns, what it requires, and how to recover from an auth failure. Nothing critical is missing, though sibling routing could be tighter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter and schema coverage is 100%, so the schema fully documents profile_id. The description adds no format, source, or lookup hint beyond what the schema already states, which is the baseline 3 case.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Get a specific profile by ID') and previews the payload (theme, custom links, verification display settings). The phrase 'specific profile by ID' implicitly contrasts with the sibling get_my_profile, but it does not name that alternative, so differentiation is only partial.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The ACCESS block gives a real precondition (a Proof account plus client authentication) and warns that start_login does not open this tool, which is genuinely actionable. It says nothing about when to prefer this over get_my_profile, list_profiles, or get_profile_assets, so the use-vs-alternative question 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_profile_assetsARead-onlyInspect
Get available verified assets that can be displayed on the user's profile. Returns assets eligible for public proof display.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=true already covering the safe-read profile, the description adds genuinely useful behavioral context: the account requirement and the explicit warning that start_login does NOT open this tool, which prevents a plausible failure mode. It omits return shape, but the auth caveat 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two clear sentences covering purpose and return scope, followed by a compact uppercase ACCESS block that front-loads the blocker. No filler, though the second sentence ('Returns assets eligible for public proof display') largely restates the first.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-param, read-only tool with no output schema, the description supplies the essential missing pieces: authentication path and the start_login non-equivalence. The only gap is a fuller sense of what an asset record contains, which is minor here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so there is nothing to disambiguate and the baseline of 4 applies. The description correctly implies the tool takes no filtering arguments (eligible assets are scoped server-side).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (get ... assets) and scopes it to verified assets displayable on the user's profile, which differentiates it from list_assets/get_asset by the 'public proof display' qualifier. However, it never names the sibling tools it sits between, so the discrimination requires inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an access prerequisite (needs a Proof account, authenticate first) but no explicit when-to-use versus list_assets, get_asset, or get_my_profile. Usage context is implied by 'displayed on the user's profile' rather than stated as a routing rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_proof_statusARead-onlyInspect
Get the status of a proof by its public handle (ph_ctl_* / ph_dlg_*) or a verification ID. Returns whether the proof is active, suspended, expired, or revoked — a live proof reads "active".
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Public proof handle (ph_ctl_* / ph_dlg_*) or verification ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true; the description goes further by disclosing the enumerated lifecycle states, clarifying that a live proof reads "active", and flagging the authentication prerequisite and the start_login dead end. That is meaningful behavioral context beyond the annotation, though it says nothing about rate limits or failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and return states, then the access note. Two short blocks with no filler, though the authentication paragraph could be tightened slightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 enumerating the possible statuses. Auth requirements are also covered. Complete enough for a single-parameter read tool, with only minor gaps around error cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and there is one parameter whose description already explains the handle/verification-ID formats. The description repeats the same handle syntax, adding no format or validation 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.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Get) and resource (proof status), specifies the identifier forms accepted, and enumerates the possible outcome states (active/suspended/expired/revoked). This is enough to distinguish it from siblings like validate_proof or list_revoked_proofs 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Tells the agent what input selects this tool (a proof handle or verification ID) and adds an explicit access precondition: a Proof account is required, the client must be authenticated via /mcp, and start_login does NOT unlock this tool. No direct when-to-use-vs-validate_proof comparison, 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_request_by_referenceARead-onlyInspect
Get a verification request by its reference ID (your unique identifier).
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| reference_id | Yes | Your unique reference ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true; the description adds real behavioral context the annotations lack: an authentication prerequisite, the exact remediation path for Claude Code, and the non-obvious warning that start_login does NOT open this tool. That prevents a plausible but wrong recovery attempt.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in one sentence, with the access caveat clearly separated in its own block. Slightly verbose in the remediation instructions, but every line is actionable rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 no output schema, the auth story is well covered, but the description says nothing about what a returned request contains or what happens on an unknown reference ID — a gap the absent output schema would otherwise have filled.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage on a single parameter, the schema already documents reference_id. The description's parenthetical '(your unique identifier)' reinforces ownership but adds no format, source, or retrieval semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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') and pins the lookup key as the caller's own reference ID, which implicitly distinguishes it from id-based siblings like get_verification_request. However, it never names the sibling it is not, so an agent must infer the distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The ACCESS block gives a clear operating condition (requires a Proof account, authenticate first), which is genuinely useful context. But it says nothing about when to choose this tool over get_verification_request or list_verification_requests, leaving the retrieval-by-reference vs by-id 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_request_proofsARead-onlyInspect
Get proof tokens for verified assets in a verification request. Returns proof tokens that can be used for offline verification.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Verification request ID |
TDQS
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 context beyond that: the tokens support offline verification, and there is an authentication prerequisite with a specific failure/remediation path. It does not describe pagination or token lifetimes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, with return semantics second and access mechanics last. Slightly verbose in the ACCESS block but every line carries actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 annotations and no output schema, the description covers purpose, the nature of the return, and auth requirements. It is complete enough to call correctly, with only minor gaps (no pagination or result-shape detail).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 fully. The description adds no format or constraint detail about the ID beyond what the schema states, which matches the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get proof tokens for verified assets in a verification request') and clarifies the return value (offline-verification tokens). It is clearly distinguishable from generic readers like get_verification_request, though it does not name which sibling to prefer.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Useful access guidance is given (needs a Proof account, authenticate then retry, and a notable 'start_login does NOT open this tool' exclusion). However it never states when to choose this over closely related siblings like get_proof_status, get_verification_request, or list_revoked_proofs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_self_api_keyARead-onlyInspect
Get the calling API key's own redacted metadata (id, name, key_prefix, environment, scopes, last_used_at, revoked_at, created_at) for agent self-inspection. Never returns the key hash or full secret. Requires API-key auth — a JWT session has no single-key context (returns 400 api_key_required).
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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 that the key hash and full secret are never returned, and that a JWT-authenticated call fails with a specific 400 code. That is meaningful behavioral context beyond the annotation, though response shape/pagination detail is absent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short paragraphs, front-loaded with the purpose and return fields, followed by the access/auth caveat. The ACCESS note is slightly verbose but every sentence conveys actionable routing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 returned fields, and it covers the auth model, a specific error condition, and the setup path for Claude Code. Nothing needed to call this zero-parameter tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 usefully lists the fields present in the returned object (id, name, key_prefix, environment, scopes, last_used_at, revoked_at, created_at) in the absence of an output schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Get the calling API key's own redacted metadata') and enumerates the exact returned fields, making it clearly distinguishable from siblings like list_api_keys and get_api_key_usage. The scope is narrowed to self-inspection of the authenticated key.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the selection context ('for agent self-inspection') and, unusually, the auth precondition plus the failure mode ('a JWT session has no single-key context (returns 400 api_key_required)'), and warns that 'start_login does NOT open this tool'. It doesn't explicitly name list_api_keys as the alternative for enumerating other keys, 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_sessionARead-onlyInspect
Get a session by ID. Returns the session status, verification details, and proof token if verified.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true, so the description usefully adds authentication requirements and describes what is returned, including the conditional proof token. It does not cover failure/error behavior or polling considerations, 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose, then adds access requirements in a short, structured block. Two sentences and a directive — efficient, though the ACCESS paragraph is slightly verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 annotations covering safety and no output schema, the description covers purpose, return content, and the authentication prerequisite. Minor gaps around error/polling behavior keep it from full marks.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 ('id', documented in the schema). The description adds no syntax or format details beyond the schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get a session by ID') and enumerates the returned content (status, verification details, proof token). This distinguishes it from siblings like get_proof_status or list_auth_sessions, which return different or bulk data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent what the ACCESS prerequisite is and how to satisfy it, and warns that start_login does NOT qualify for this tool. It lacks an explicit 'when not to use' relative to siblings (e.g., wait_for_session), 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_settingsARead-onlyInspect
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. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnlyHint annotation to disclose a non-obvious behavioral rule: the webhook signing secret is never returned to an API key, the response reports webhook.secret_set instead, and the raw value is only visible in the dashboard or in the update_settings response that created or rotated it. It also states the auth requirement, which annotations do not cover at all.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the primary payload description before the subtlety about the signing secret, and the update_settings cross-reference is placed exactly where it matters. The second ACCESS paragraph is somewhat operator-specific (Claude Code /mcp flow) 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.
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 carries the full burden of describing the return shape, and it does: webhook endpoint, event subscriptions, proof lifetime, and the secret_set substitute field. An agent knows what it will receive and what it will not.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 explain and the baseline is 4. The description correctly adds no parameter narrative where none is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (get) and resource (account settings) and enumerates exactly what is returned: the outbound webhook endpoint with its event subscriptions and the default proof lifetime. It also explicitly carves out branding as belonging to the sub-account and points to the sibling get_profile, so an agent can separate this tool from the many other 'get_*' tools in the list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear routing guidance (branding → get_profile) and a concrete precondition for calling it at all: a Proof account plus client authentication, with the explicit warning that start_login does NOT open this tool. It lacks an explicit 'use this when you need X' framing for the settings themselves, but the access prerequisites and the sibling exclusion are strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_subscriptionARead-onlyInspect
Get the current subscription details including plan, status, billing period, and usage limits.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true; the description adds the non-obvious behavioral fact that this tool is gated behind an account-level authentication step and cannot be reached through start_login. That is meaningful context the annotation does not carry. It still says nothing about behavior when unauthenticated or about caching, 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short blocks, each earning its place: the first states what is returned, the second states the access constraint before the agent wastes a call. Front-loaded and waste-free.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 must carry the whole load, and it does list the returned fields plus the auth gate. The only soft spot is the absence of any note about what happens on an unauthenticated call, which an agent would need to recover correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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. The description cannot and need not document parameter semantics; the enumerated return fields belong to purpose/scope rather than parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 payload (plan, status, billing period, usage limits), so an agent knows exactly what comes back. It does not differentiate itself from adjacent siblings like get_usage, get_platform_summary, or get_settings, which is the only thing keeping it from a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The ACCESS block gives a real prerequisite (needs a Proof account, client must authenticate via /mcp) and explicitly rules out the obvious alternative by stating 'start_login does NOT open this tool.' That is genuine when-to-use and when-not-to-use guidance, though it stops short of telling the agent what to do if authentication fails.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_templateARead-onlyInspect
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. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| channel | Yes | Message channel | |
| profile_id | No | The sub-account (project) to act on; omitted → your key's project, or the primary project for an account-wide key | |
| message_type | Yes | Message type (e.g. verification_request, login_request) |
TDQS
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 still adds real context beyond it — the fallback chain (custom → default) that determines what actually comes back, the fact that the response identifies the project via profile_id, and an explicit access prerequisite (Proof account, client authentication, and the note that start_login does NOT unlock this tool). It stops short of noting rate limits or the full response shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core capability and its fallback rule are front-loaded in one dense sentence, followed by the return-value note and the access caveat. The ACCESS block is somewhat boilerplate, but it is short and operationally necessary given the authentication prerequisite.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only lookup with no output schema, the description supplies what an agent needs: what gets resolved, what the response identifies, and the auth precondition that must be satisfied first. Only the precise response payload beyond profile_id is left unspecified, which is acceptable with no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so channel, profile_id, and message_type are already documented in-schema; baseline 3 applies. The description adds only marginal meaning by restating the channel/message_type pairing and clarifying that profile_id identifies the project in the response — useful framing but not new per-parameter syntax or constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (get the template) and goes further by defining the resolution rule: custom template at scope "project" if set, otherwise the channel/message-type default at scope "default". This meaningfully separates it from get_default_templates and list_templates, though those siblings are never named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description establishes the retrieval context (per sub-account, per channel, per message type) but never says when to prefer this over list_templates, get_default_templates, preview_template, or render_template. Usage is inferable from the resolution semantics rather than stated, and no exclusions or alternatives are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_usageARead-onlyInspect
Get usage metrics for the authenticated account. Shows verification counts, API calls, and quota usage.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| months | No | Number of months of history | |
| period | No | Month to query in YYYY-MM format (e.g. 2026-01) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description adds non-obvious behavioral context the annotations cannot: the account-level access requirement and the fact that authentication must happen through the client rather than start_login. It stops short of 5 because nothing is said about scope of the returned metrics (per-key vs account) or history limits beyond 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The functional sentence is front-loaded and the auth prerequisite is separated into its own block. The ACCESS block is slightly verbose for the value it carries, but every sentence is actionable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 two well-documented optional params and no output schema, the description covers what the tool returns and the access gate. Remaining gaps (return shape, default period behavior) are minor and partly covered by annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters (months, period) are already fully documented in the schema. The description adds no format, precedence, or interaction guidance between months and period, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('Get usage metrics for the authenticated account') followed by the concrete content returned (verification counts, API calls, quota usage). It doesn't differentiate itself from similar siblings like get_api_key_usage or get_platform_summary, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The ACCESS block gives a real prerequisite (a Proof account plus client authentication) and usefully warns that start_login does NOT unlock this tool. However, it never states when to prefer this tool over the closely related usage/subscription siblings, leaving the primary selection question unanswered.
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_statusARead-onlyInspect
Get the current status of a domain verification session, including challenge details.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | Domain verification session ID |
TDQS
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-schema behavior: the authentication prerequisite and the start_login relationship, plus a hint that the response carries challenge details. It stops short of describing pagination, freshness, or what happens on an expired session.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in one sentence and the access caveat follows in a clearly delimited block. Both sentences carry information; the parenthetical navigation hint is slightly verbose but earns its place for an agent needing to bootstrap auth.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only status getter with no output schema, the description covers auth prerequisites and mentions challenge details in the return, which is reasonable. It is still incomplete given the dense sibling namespace: no differentiation from check_domain_verification/check_user_domain_verification, and no statement of the returned status values an agent would need to act on.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with a single, self-explanatory session_id parameter, so the baseline of 3 applies. The description adds no syntax, format, or acquisition guidance for the ID beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (get status of a domain verification session) plus a scope hint (challenge details). However, the sibling list contains several near-identical tools (check_user_domain_verification, check_domain_verification, get_verification, get_multi_channel_verification_status) and the description never disambiguates which one this is, so an agent cannot confidently route between them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The ACCESS block gives valuable prerequisite context (Proof account, authenticate via /mcp or start_login, note that a session 'opens this tool'). But it says nothing about when to prefer this over the many sibling status-check tools, nor any exclusion conditions, so usage is only partially guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_verificationARead-onlyInspect
Get a verification by ID. Returns the full verification object including status, channel, and proof token if verified.
Before calling this for a challenge you created, make sure your reply text already shows the user what to act on — the link itself, the SMS text and number, or a note to check their inbox; a link that appeared only in a tool result is one they never saw.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Verification ID |
TDQS
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 context beyond that — the return payload shape, the account/auth requirement, and the non-obvious constraint that a link shown only in a tool result is one the user never saw. It omits polling semantics or whether repeated calls mutate the verification state.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose and return contents, then the user-visibility caveat, then access. The middle paragraph is longer than strictly needed, and the closing 'start_login does NOT open this tool' is slightly tangential, but every section carries useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 describing the returned fields, and it covers the auth prerequisite and the user-visible-output constraint. For a single-ID read tool this is nearly complete; only pagination/retry or freshness behavior is unaddressed, which is minor here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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, 'Verification ID') is fully documented in the schema. The description adds only the phrase 'by ID', which adds no syntax or format detail beyond what the schema provides, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 enumerates what the returned object contains (status, channel, proof token if verified). It does not, however, differentiate itself from near-siblings like get_verification_request, get_multi_channel_verification_status, or get_proof_status, so an agent still has to infer which of these retrieves which resource.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete precondition for calling it: before invoking on a challenge you created, your reply text must already surface the link/SMS/inbox instruction to the user. It also flags the authentication prerequisite. It never names an alternative tool or states when-not to use it, 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.
get_verification_requestARead-onlyInspect
Get a verification request by ID. Returns the request with all its asset verification statuses.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Verification request ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, but the description adds non-obvious context: an authentication precondition, a pointed warning that start_login does NOT enable this tool, and the shape of the returned data. This goes beyond the annotation without contradicting it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with the core purpose first and the return behavior second, followed by a compact auth note. Every sentence carries information; slight redundancy in the auth sentence keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description helpfully states what is returned, and it flags the auth precondition an agent must satisfy before calling. For a single-ID 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter, and the schema fully documents it ('Verification request ID') at 100% coverage. The description restates the ID-based lookup but adds no format, sourcing, or identifier 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.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Get a verification request by ID') and adds what it returns ('the request with all its asset verification statuses'). It does not differentiate from near-siblings like list_verification_requests or get_verification, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Useful prerequisite guidance is given: a Proof account is required and the client must be authenticated before retrying. However, there is no guidance on when to choose this over list_verification_requests or get_verification, so 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.
get_verified_userARead-onlyInspect
Get a single verified user and their verifications by external user ID.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| external_user_id | Yes | The external user ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=true already covering the safety profile, the description adds meaningful context: the authentication prerequisite and, notably, the explicit statement that start_login will not unlock this tool, which prevents a plausible wrong-path attempt. It stops short of describing the return shape or any rate/scope limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact blocks: purpose first, then a clearly labeled ACCESS note. No filler, and the actionable access constraint is easy to find.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only single-entity getter with one parameter and no output schema, the description covers what the tool returns (the user plus their verifications) and the auth gate. The only real omission is return-format/pagination nuance, which is minor here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single required parameter, so the schema already documents external_user_id. The description only restates that the lookup is 'by external user ID' without adding format, source, or validation detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Get) plus resource (single verified user and their verifications) and the lookup key (external user ID). It clearly contrasts with the plural list_verified_users sibling by being the singular fetch, though it never names that sibling to make the distinction explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides real precondition guidance: a Proof account is needed and the client must be authenticated first, and it explicitly warns that start_login does NOT open this tool. However it never tells the agent when to reach for get_verified_user versus list_verified_users or list_verifications, so the routing guidance is only partial.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_webhook_deliveryARead-onlyInspect
Get details of a single webhook delivery attempt including request/response payloads and retry history.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Webhook delivery ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe read, but the description adds meaningful context beyond annotations: the authentication requirement, the explicit note that start_login does not grant access, and the fact that retry history is included in the response. The auth caveat is valuable behavioral context the annotations do not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose sentence is front-loaded and dense with useful detail, and the access note is a separate, clearly delineated block. The authentication wording is slightly awkward and repetitive but every sentence carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 returned fields (request/response payloads, retry history) and by disclosing the auth prerequisite. For a simple one-parameter read tool this is close to complete; only the relationship to the listing/retry siblings is unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 'Webhook delivery ID'. The description's phrase 'single webhook delivery attempt' reinforces that the id identifies one delivery, but adds no syntax or format 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.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Get) and resource (a single webhook delivery attempt) plus the returned content: request/response payloads and retry history. This clearly separates it from list_webhook_deliveries (plural listing) and get_webhook_stats (aggregates) among its siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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, authenticate via /mcp before calling) and warns that start_login does not unlock this tool. However, it never says when to prefer this over list_webhook_deliveries or retry_webhook_delivery, 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_webhook_statsARead-onlyInspect
Get webhook delivery statistics including total deliveries, success/failure counts, and recent activity.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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: it requires an authenticated Proof account and a re-authentication step, which an agent must know before invoking. It stops short of describing return format or pagination, but for a no-param read tool this is solid 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, with the auth prerequisite cleanly separated in a second paragraph. Slightly verbose in the parenthetical routing hint ('Claude Code: /mcp → Authenticate'), but no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only tool with no output schema, the description covers purpose, scope of returned statistics, and the authentication gate. The only gap is not describing the shape of the statistics response, which is minor given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 per the rubric. There is nothing to document, and the empty schema is consistent with the description's summary-only framing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get webhook delivery statistics') and enumerates the contents (total deliveries, success/failure counts, recent activity). It is clearly a read-only summary tool, though it does not explicitly differentiate itself from sibling tools like list_webhook_deliveries or get_webhook_delivery.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The ACCESS paragraph gives a concrete precondition (Proof account + authenticate) and even notes that start_login does not unlock this tool, which is useful routing guidance. However, it never says when to choose this stats tool over the sibling list_webhook_deliveries or get_webhook_delivery, so usage relative to alternatives is only implied.
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. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Circle ID | |
| member_id | Yes | Member ID to invite |
TDQS
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 behavioral load: it discloses the auth requirement, that the invite is single-use, and what the member does with the delivered links. It does not say whether an existing member can be re-invited, whether the invite expires, or whether prior invites are invalidated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and return payload, then separates access/auth requirements into a clearly marked block. Every sentence carries distinct information with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and minimal annotations, the description compensates by describing the returned deep links and QR code and by spelling out the authentication flow needed before calling. An agent has enough to call it correctly on the first attempt.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% (both id and member_id are documented with format patterns), so the baseline is 3. The description adds no syntax, format, or semantic 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.
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') plus the resulting artifacts (Telegram/WhatsApp deep links, QR code) and the member-side action. This is clearly distinguishable from the sibling add_circle_member and add_circle_member_channel, which mutate membership/channels rather than producing an invitation artifact.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit prerequisite ('needs a Proof account', authenticate first) and a pointed exclusion ('start_login does NOT open this tool'), which prevents a common misuse path. It stops short of naming add_circle_member as the alternative when the member should be added directly rather than invited.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_api_keysARead-onlyInspect
List all API keys for the authenticated account. Returns key metadata (not the secret key values).
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true, but the description adds valuable non-obvious behavior: it returns key metadata and explicitly does NOT return secret key values, plus the authentication requirement. That is meaningful context beyond the annotation, though return shape and pagination are unaddressed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose followed by the high-value caveat about secrets, then the access block. Every sentence earns its place, though the auth instructions are slightly verbose and could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read tool with no output schema, the description covers the essentials: what is listed, what data comes back and what does not, and the auth prerequisite. Nothing critical to a correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing to document and the baseline is 4. The description correctly implies an account-scoped, unfiltered listing with no argument surface.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 scopes it to the authenticated account. It is distinguishable from create_api_key, revoke_api_key, and regenerate_api_key, though it does not explicitly address its overlap with the sibling 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The ACCESS paragraph gives a concrete prerequisite and an actionable flow (authenticate, then re-call), which is real usage guidance. However, it never states when to prefer this tool over siblings such as get_api_key_usage or get_self_api_key, 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_assetsBRead-onlyInspect
List all verified assets for the authenticated user. Assets are verified identities (phones, emails, domains).
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number | |
| type | No | Filter by asset type | |
| limit | No | Items per page | |
| status | No | Filter by status |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safe-read profile is covered. The description adds real value by disclosing the auth prerequisite (needs a Proof account, authenticate then retry). It does not, however, mention pagination behavior or the shape/ordering of results, which would matter for a list tool with page/limit params.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core action and definition, then the access caveat. No padding. Slightly fragmented by the ALL-CAPS ACCESS block but still efficient and readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 carries more burden, and it stops short of describing return contents, pagination, or result ordering. It does cover the essential auth prerequisite and the meaning of 'asset', which keeps it minimally viable rather than inadequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with two enums, so the schema fully documents page, type, limit, and status. The description clarifies the general concept of an 'asset' but adds no syntax, filtering semantics, or default info beyond 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.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('List all verified assets') and even defines what an asset is ('verified identities (phones, emails, domains)'), which helps distinguish it from generic list tools. However, it does not differentiate from close siblings like list_phones, list_emails, list_domains, or get_profile_assets, and its asset list omits the 'social' and 'wallet' types present in the schema enum.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a genuine when-not clue about authentication ('start_login does NOT open this tool'), which is useful routing info. But it offers no guidance on when to use this aggregate list versus the type-specific siblings (list_phones, list_emails, list_domains), leaving the core selection decision to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_authorizationsARead-onlyInspect
List authorizations with optional filters. Returns paginated results.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number | |
| limit | No | Items per page | |
| phone | No | Filter by phone number | |
| status | No | Filter by authorization status | |
| channel | No | Filter by channel |
TDQS
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 useful behavioral context beyond annotations: it requires a Proof account, explains the authentication step, clarifies that start_login is insufficient, and notes paginated results. It does not mention rate limits or default page size, but it is substantially more informative than the 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action in the first sentence, then adds access requirements compactly. Every sentence earns its place, and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a five-parameter, no-output-schema list tool with readOnlyHint=true, the description covers the key missing context: authentication requirements and pagination. It omits nothing critical for invocation, though it could clarify default sorting or whether the filters combine with AND logic.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all five parameters are documented in the input schema. The description only says 'optional filters' and 'paginated results,' which adds almost no parameter-level detail beyond the schema baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb+resource ('List authorizations') and adds scope ('optional filters', paginated results). However, it does not explicitly distinguish this from sibling tools like get_authorization or export_authorizations, which also deal with authorizations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an important access prerequisite (needs a Proof account, authenticate, start_login does not open this tool), but does not say when to use this list operation rather than get_authorization, export_authorizations, or other sibling retrieval tools. Usage is implied rather than explicitly guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_auth_sessionsARead-onlyInspect
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. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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 adds the non-obvious behavioral detail that API-key calls leave is_current unset and states the authentication prerequisite, though it says nothing about ordering, limits, or revoked/inactive session handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core behavior, and the return fields are stated before the access caveat. The ACCESS paragraph is somewhat verbose for a read-only list call but each sentence (auth requirement, retry instruction, start_login disclaimer) carries actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 returned fields, and the authentication prerequisite is spelled out. For a zero-parameter read tool this is essentially complete, missing only edge-case behavior (empty results, pagination).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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; the baseline of 4 applies. The description does not introduce confusion about inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List all active authentication sessions for the current user') and enumerates what is returned (channel, user agent, expiry). It is clearly distinct from the only closely related sibling, revoke_auth_session, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives real usage context: it requires a Proof account, tells the agent to authenticate and retry, and explicitly warns that start_login does NOT grant access to this tool. That negative routing hint is valuable, but there is no direct comparison against other list_* or get_session alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_circle_member_channelsARead-onlyInspect
List a Circle member's channels. Returns channel metadata only (channel, status, verified_at) — an identifier is NEVER returned (SEC-PM-006).
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Circle ID | |
| member_id | Yes | Member ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true; the description goes further by stating the exact return shape (channel, status, verified_at) and the SEC-PM-006 constraint that no identifier is ever returned. That security/return-scoping detail is exactly the kind of context annotations cannot carry. Minor gap: no pagination or volume behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and return contract are front-loaded in the first sentence, and the auth note is clearly separated. The ACCESS paragraph is slightly verbose with the parenthetical UI path and the start_login caveat, but every sentence carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description enumerates the returned fields and flags the identifier omission, and it covers the authentication prerequisite. For a two-param read tool this is close to complete; only pagination/ordering details are absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with both required params documented, so the schema carries the burden. The description adds nothing about the id/member_id format (24-char hex) or relationships beyond what the schema already states, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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') and even previews the returned fields, which lets an agent distinguish it from the broader member-listing siblings. It does not, however, explicitly contrast itself with near-neighbors like list_circle_members or add/remove_circle_member_channel.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The ACCESS block gives a real precondition (must be authenticated with a Proof account, and start_login will not unlock it), which is useful. But it offers no guidance on when to prefer this tool over list_circle_members or get_circle, 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_circle_membersARead-onlyInspect
List a Circle's members. Each member carries channel-presence booleans (has_telegram / has_whatsapp) and the masked phone they enrolled from (enrolled_phone_hint, e.g. +9••••••4171) — a full identifier is NEVER returned (SEC-PM-006).
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Circle ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true; the description goes well beyond by disclosing exact output fields, the masking rule ('a full identifier is NEVER returned'), the cited policy SEC-PM-006, and the auth prerequisite. That is precisely the behavioral 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short paragraphs, output shape front-loaded ahead of the access requirement. Every sentence earns its place, though the parenthetical example phone could be trimmed slightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 returned fields (has_telegram/has_whatsapp, enrolled_phone_hint) and the masking constraint, plus the auth requirement. 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (id) and schema coverage is 100%, so the schema already documents the Circle ID pattern. The description adds nothing about the id beyond what the schema states, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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') and immediately enumerates what each returned member contains. It is easy to distinguish from list_circles or list_circle_member_channels, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete prerequisite (Proof account required, re-authenticate via /mcp in Claude Code) and explicitly rules out a tempting alternative path ('start_login does NOT open this tool'). It does not, however, say when to prefer it over a filtered member lookup, 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.
list_circlesARead-onlyInspect
List Circles with optional filters. Archived Circles are excluded by default; pass status="archived" to surface them. Returns paginated results.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (default 1) | |
| limit | No | Items per page (default 20, max 100) | |
| status | No | Filter by status (archived excluded unless requested) | |
| profile_id | No | Filter by bound public profile (sub-account) | |
| environment | No | Filter by environment (production or test) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=true already declaring a safe read, the description still adds useful traits: default exclusion of archived items, paginated return, and the account/auth requirement that would otherwise cause a silent failure. That is meaningful 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The functional description is front-loaded and tight, and the auth note is placed after it. The ACCESS block is slightly verbose (repeats the authenticate-then-retry instruction) but still 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.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, but the description covers pagination, the archived default, and the auth prerequisite, which are the main unknowns for a 5-param list tool. The agent has enough to invoke it correctly on the first try given the fully documented schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 page, limit, status, profile_id, and environment. The description reinforces the status semantics but adds no syntax or format detail beyond what the schema provides; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List Circles') plus scope ('with optional filters'), and distinguishes itself from get_circle/create_circle by being the enumeration tool. It does not explicitly name a sibling to contrast with, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operative context: archived Circles are hidden unless status="archived" is passed, and it spells out the authentication prerequisite with a concrete recovery step. It stops short of naming alternative tools (e.g., get_circle for a single Circle), so no explicit when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_confirmationsARead-onlyInspect
List confirmations with optional filters. Returns paginated results with status and HITL config filtering.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number | |
| limit | No | Items per page | |
| status | No | Filter by confirmation status | |
| hitl_id | No | Filter by HITL config ID |
TDQS
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 behavioral context beyond that: results are paginated, filters combine status and HITL config, and it pre-empts a common failure mode by stating start_login does not authenticate 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, with filters and pagination following immediately. The ACCESS paragraph is longer but every sentence earns its place by preventing an auth dead-end; only the repeated 'needs a Proof account' framing is slightly redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 notes paginated results and the filterable dimensions. Auth prerequisites are explicit, parameters are fully covered by the schema, and the tool is a simple read-only list, so 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and every parameter (page, limit, status, hitl_id) is documented in the schema with type, enum, and pattern constraints. The description only reiterates that status and HITL config are filterable, adding no syntax beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('List confirmations') and adds scope detail: optional filters, paginated results, and status/HITL filtering. This distinguishes it from the singular get_confirmation and from list_hitls, though it never names a sibling directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The ACCESS block gives concrete operational guidance: a Proof account is required, the client must be authenticated via /mcp, and notably that start_login does NOT grant access to this tool. However, there is no guidance on when to choose this over get_confirmation or wait_for_confirmation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_delegationsARead-onlyInspect
List your own delegations with optional filters. Each item carries the DERIVED effective_status/is_valid beside its stored status — read effective_status, since status records only whether the owner revoked the delegation themselves, so a delegation still reads active there after its domain control proof was revoked, suspended or expired, and after its OWN lifetime ran out. effective_status accounts for all of those: it reports expired once either lifetime has passed, whichever is earlier. Tokens are not included in the list — use get_delegation for the stored token. There is no public enumeration of third-party delegations.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number | |
| limit | No | Items per page | |
| status | No | Filter 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
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true; the description adds substantial non-obvious behavior: derived vs stored status semantics, why status can still read active after control-proof revocation/suspension/expiry, token exclusion, and a concrete auth prerequisite with the exact remediation step. Far beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and the critical effective_status warning, with the access requirement last. Slightly repetitive in explaining effective_status (the expired/earlier-lifetime point is made twice), but no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers auth prerequisites, the derived-vs-stored distinction, and what the listing omits (tokens), which is the key completeness burden given no output schema. Pagination behavior and the exact item shape beyond effective_status/is_valid are left implicit, but the description is adequate for a filtered list tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the status parameter's schema text already states it filters stored status and not effective_status, so the description largely restates rather than extends parameter meaning. The surrounding effective_status explanation adds interpretive context but no new parameter syntax or format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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') plus scope ('your own') and optional filters. It is readily distinguishable from get_delegation (single item, includes token) and from the unrelated list_* siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: use this for the list, use get_delegation for the stored token, and states there is no public enumeration of third-party delegations. It also tells the agent to read effective_status rather than status, with the reason why.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_dns_credentialsARead-onlyInspect
List all stored DNS provider credentials for the authenticated account. Returns credential metadata (not secret values).
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already declares the safe-read profile, and the description adds useful context beyond that: it returns metadata only, never secret values, which matters for a credentials endpoint. The authentication/session requirement is also disclosed. It stops short of describing pagination or result shape, 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and result boundary in the first sentence, then the access requirement. The ACCESS paragraph is slightly long for a zero-argument list tool, but every sentence carries operational value (auth path and the session dependency).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, but the description covers the return nature (credential metadata, not secrets) and the full auth/session prerequisite, which is the main thing an agent could get wrong on this tool. Nothing needed to invoke it correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 and there is no schema semantics for the description to expand on. Nothing is required or missing here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List all stored DNS provider credentials') with scope ('for the authenticated account') and explicitly bounds the result ('not secret values'). This cleanly separates it from create_dns_credential, delete_dns_credential, and get_dns_providers 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The ACCESS block gives clear preconditions (needs a Proof account, authenticate first, or use start_login) and states that a session opens this tool. However, it never states when to prefer this over the similarly named get_dns_providers sibling, 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_domainsARead-onlyInspect
List all domains for the authenticated account. Returns domain metadata including verification status.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already establishes the safety profile, so the bar is lower; the description adds real value by disclosing the authentication requirement, the session-opening behavior of start_login, and the fact that the call must be retried after an interactive flow. Minor gaps (no pagination or result-size guidance) keep 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the operation and its result, then the access caveat. Every sentence earns its place, though the Claude-Code-specific parenthetical is slightly more verbose than the generic instruction that follows it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 carries the burden of saying what comes back ('domain metadata including verification status') and what is needed to call it at all (a Proof account). For a zero-parameter read tool this is close to complete, with only pagination/volume behavior left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the baseline this scores 4. There is nothing for the description to clarify beyond noting that the listing is implicitly scoped to the authenticated account, which it does.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with scope: 'List all domains for the authenticated account.' It also summarizes the returned payload ('domain metadata including verification status'), which lets an agent distinguish it from the singular get_domain and from the many unrelated list_* siblings 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The ACCESS block gives explicit preconditions and an alternative path ('Authenticate this client... or sign in with start_login... then call this tool again'), which is genuinely actionable. It does not, however, say when to prefer this over get_domain (single-domain lookup) or check_domain_verification, so the sibling routing 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.
list_emailsARead-onlyInspect
List all email addresses associated with the authenticated account.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only readOnlyHint available in annotations, the description carries the rest of the burden and delivers the key behavioral fact an agent needs: authentication is mandatory before this call and a login session triggers it. No return format or pagination detail, but the auth gate is well disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, followed by a compact ACCESS block giving the exact remediation steps. Two functional sentences, no filler; only minor overlap between the authentication instruction and the sign-in alternative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 only real complexity is the auth requirement, which is fully addressed including the fallback path via start_login. Nothing essential to correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 does not invent parameter details and instead spends its text on the auth prerequisite.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'List all email addresses associated with the authenticated account.' This is clear and distinguishable from adjacent list tools like list_phones, though it does not explicitly name siblings to distinguish itself from.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides concrete prerequisite context: a Proof account is required, the client must be authenticated, and the alternative path (start_login, then re-call this tool) is spelled out. It stops short of explicit when-not-to-use guidance relative to sibling list/email tools, but the invocation context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_hitlsARead-onlyInspect
List HITL configs with optional filters. Returns paginated results.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number | |
| limit | No | Items per page | |
| status | No | Filter by status (active or archived) | |
| environment | No | Filter by environment (production or test) |
TDQS
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 genuinely useful non-obvious context: it returns paginated results and requires a Proof account with an authenticated client, plus the counterintuitive caveat that start_login does not authenticate this tool. That caveat is real behavioral value beyond 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose in one sentence, then the pagination note, then the access requirement. No filler, though the auth block is verbose relative to the short core description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, zero-required-param list tool with full schema coverage and no output schema, this is nearly complete: purpose, pagination, and a critical auth caveat are all present. Missing only routing against sibling list/get tools and any indication of what a HITL config contains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and each parameter (page, limit, status, environment) is documented with enums and bounds, so the schema carries the burden. The description only says 'optional filters' generically and adds no syntax, defaults, or interaction detail beyond that.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (HITL configs) with scope qualifiers (optional filters, paginated results). The plural/list framing implicitly distinguishes it from get_hitl, but no sibling is named 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for use: optional filters, paginated, and a concrete access prerequisite with an explicit exclusion ('start_login does NOT open this tool'). It does not, however, describe when to prefer this over related tools like get_hitl or how the filters interact.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_incoming_requestsARead-onlyInspect
List incoming verification requests where the authenticated user is the subject.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already establishes the safe-read profile, so the description is not burdened with that. It adds genuinely new behavioral context: the auth requirement and the two-step flow (authenticate, then call again), which an agent could not infer from annotations or an empty schema. Pagination/result-size behavior for this list tool is still undisclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then the access prerequisite, in two tight sentences with no filler; the parenthetical client hint earns its place. Slightly dense but appropriately sized for a zero-param read tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list tool with no parameters and no output schema, the description covers purpose, scope, and the auth gate that could otherwise cause a failed call. It leaves out return shape and pagination, a minor gap 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters and the schema is empty, so the baseline is 4 per the rubric. There is nothing for the description to clarify about parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List incoming verification requests') and adds a meaningful scope qualifier ('where the authenticated user is the subject'), which separates it from the many sibling list tools. It does not, however, explicitly contrast itself with near-neighbors like list_my_requests or list_verification_requests.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a real prerequisite and remediation path ('needs a Proof account... Authenticate this client... or sign in with start_login'), which is actionable usage guidance. It stops short of saying when to prefer this tool over list_my_requests or list_verification_requests, so routing among siblings 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_my_requestsARead-onlyInspect
List verification requests created by the authenticated user.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, covering the safety profile. The description exceeds that by disclosing an authentication prerequisite and the exact recovery flow (/mcp → Authenticate, or start_login as an alternative). This is genuinely useful beyond annotations. It doesn't describe return format or pagination, but the auth-gating disclosure is a meaningful addition.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two-part structure: purpose sentence first, then a clearly labeled ACCESS note. Front-loaded and earned. The auth instructions are somewhat verbose (parenthetical UX detail) but not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is a simple zero-param list with readOnlyHint annotation and no output schema. The description covers purpose and the auth gate, which is the main non-obvious friction. Return shape is unspecified, but no output schema exists so this is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so per the rubric the baseline is 4. No parameter semantics are needed and none are implied incorrectly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (List) + resource (verification requests) + scope modifier (created by the authenticated user). The 'created by the authenticated user' scoping distinguishes it from siblings like list_incoming_requests, list_verification_requests, and get_verification_request.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies usage via the 'created by the authenticated user' scope, but does not explicitly state when to use this versus list_incoming_requests or list_verification_requests. No when-not guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_phonesARead-onlyInspect
List all phone numbers associated with the authenticated account.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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 non-obvious behavioral context by disclosing the authentication prerequisite and the session-opens-this-tool nuance. No return format or pagination detail is given, but the auth behavior is the important gap it fills.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose in one sentence, then a compact ACCESS block. Every sentence carries useful information; the auth recovery instructions are slightly verbose but justified for a tool that requires setup.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters, a read-only annotation, and no output schema, the definition covers the essentials: what is listed, the scope, and how to satisfy the auth requirement. It stops short of describing the returned phone-number shape, which is a minor gap absent an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 clarify and the baseline is 4. No parameter claims are made or needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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') plus the scope ('associated with the authenticated account'). It is clearly distinguishable from list_emails and list_domains by resource, though it does not explicitly name those siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a concrete precondition (needs a Proof account) and a recovery path (authenticate the client, or call start_login and retry), naming a specific sibling tool. It does not discuss when this tool is preferred over adjacent listing tools, so it stops short of full when/when-not coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_profilesARead-onlyInspect
List all profiles for the authenticated account. Returns all profiles including primary and secondary.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already marks this as a safe read operation, and the description adds valuable behavioral context beyond that: it returns all profiles including primary and secondary, and it requires account authentication before use. It does not describe pagination or response shape, but for a zero-parameter read tool with an explicit auth prerequisite, 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, followed by a useful return-scope note and a clearly separated ACCESS block. Every sentence earns its place, and there is no redundant or vague padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple zero-parameter, read-only listing tool with no output schema, the description is complete enough: it states the resource, scope of returned profiles, and the required authentication context. An agent has what it needs to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, so the baseline is 4. The description does not need to explain parameter semantics, and the empty input schema leaves nothing further to document.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 all profiles for the authenticated account.' It also clarifies scope by saying it returns 'all profiles including primary and secondary,' which distinguishes it implicitly from sibling tools like get_profile and get_my_profile. However, it does not explicitly name those alternatives, so the distinction is not fully spelled out.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The ACCESS section gives clear prerequisite context: the tool requires a Proof account and the client must be authenticated first. It also provides a useful exclusion—'start_login does NOT open this tool'—but does not compare this tool to any sibling list/get alternatives, so the when-to-use-vs-alternatives guidance is incomplete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_revoked_proofsARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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_templatesARead-onlyInspect
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. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| profile_id | No | The sub-account (project) to act on; omitted → your key's project, or the primary project for an account-wide key |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true; the description adds real behavioral context beyond that — an authentication prerequisite with a specific flow ('Authenticate this client ... then call this tool again') and the notable warning that 'start_login does NOT open this tool'. It also discloses key-type-dependent scoping. It omits result-size or pagination behavior, which is the main remaining gap for a list operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose in the first sentence and follows with the access caveat and key-type resolution. It is appropriately sized, though the profile_id resolution sentence duplicates the schema description, and the tool-specific authentication parenthetical is slightly verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, read-only list tool with no output schema, the description covers purpose, grouping ('organized by channel and message type'), scoping, and the auth prerequisite — enough to call it correctly. It does not address result volume or pagination, which leaves a minor completeness gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single parameter is fully documented in the schema, including the same omitted-fallback semantics. The description's project-scoping sentence largely restates the schema rather than adding format, validation, or edge-case detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb plus resource ('List the custom message templates of one sub-account (project)') and adds a scoping qualifier that separates it from siblings like get_template (single) and get_default_templates ('custom'). An agent can distinguish it from every sibling template tool 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operating context: the list is project-scoped, profile_id selects the project, and omitted behavior differs by key type (project-bound vs account-wide). It does not explicitly name alternatives such as get_template or get_default_templates, nor state when not to use this tool, so it stops short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_verification_requestsARead-onlyInspect
List verification requests with optional filters. Returns paginated results.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number | |
| limit | No | Items per page | |
| status | No | Filter by status. 'active' = live (not-yet-expired) pending or partial requests; persisted statuses are time-aware. | |
| reference_id | No | Filter by reference ID |
TDQS
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 the non-obvious auth gating, the retry-after-authenticate flow, and that results are paginated. That is real behavioral value beyond the annotations, though response shape and default page size remain unstated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences front-load what the tool does and what it returns, followed by a compact, actionable access note. Nothing is padded, though the second sentence about pagination could merge with the first.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 noting paginated results, and the auth prerequisite is the single most important missing piece from structured data — it is present. Filter semantics live in the schema, so nothing critical is absent; default limit/ordering remain unspecified but are minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 the non-obvious 'active' semantics. The description only says 'optional filters', adding nothing the schema does not already carry, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 verification requests') plus the filtering and pagination behavior, which is enough to distinguish it from mutation siblings like cancel_verification_request or create_verification_request. It does not, however, distinguish itself from the closely named read siblings get_verification_request and list_verifications.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The ACCESS block tells the agent the prerequisite (a Proof account) and the exact recovery step (authenticate, then retry), and it explicitly warns that 'start_login does NOT open this tool' even though start_login exists as a sibling — a genuine when-not instruction. It stops short of stating when to prefer this over get_verification_request or list_verifications.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_verificationsARead-onlyInspect
List verifications with optional filters. Returns paginated results.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number | |
| limit | No | Items per page | |
| status | No | Filter by status | |
| channel | No | Filter by channel | |
| external_user_id | No | Filter by external user ID |
TDQS
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 that results are paginated and that the call is gated behind an authenticated Proof account session. It still does not describe ordering, default page size, or empty-result behavior, but the added auth and pagination context goes meaningfully 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences of core description followed by a clearly delimited ACCESS block; the functional statement is front-loaded. The auth block is slightly verbose but every line carries actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only paginated list tool with no output schema and fully documented parameters, the description covers purpose, pagination, and the authentication requirement. A canonical output example or sort order would be the only additions worth making.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and every parameter (page, limit, status, channel, external_user_id) is documented with its own description and enums. The description adds only 'optional filters', which duplicates the schema rather than extending it, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List verifications') plus scope ('with optional filters') and a return trait ('paginated results'). It does not distinguish itself from the close sibling list_verification_requests, which an agent must disambiguate on its own.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an important operational prerequisite (needs a Proof account, authenticate the client, start_login does not unlock this tool), which is useful. However it never states when to use this versus similar listing tools such as list_verification_requests or get_verification.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_verified_usersARead-onlyInspect
List verified users grouped by external_user_id. Shows all verifications per user.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number | |
| limit | No | Items per page |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already establishes safety, and the description adds meaningful behavioral context by requiring a Proof account and client authentication. It also discloses the grouping behavior. It does not describe pagination behavior, rate limits, or return shape, so it falls 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the purpose and grouping behavior, then uses a clear ACCESS block for prerequisites. It is appropriately sized, though the second sentence overlaps somewhat with the first and the authentication notes are longer than strictly necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, read-only list tool with a fully documented two-parameter schema and no output schema, the description covers purpose, grouping, and authentication prerequisites. It does not explain pagination behavior or returned fields, but it is sufficiently complete for correct invocation in this context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both page and limit are already documented in the schema. The description adds no parameter syntax, defaults, or semantics beyond what the schema provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (List) and resource (verified users), and adds the key grouping rule (grouped by external_user_id) and scope (all verifications per user). This clearly distinguishes it from siblings such as get_verified_user and list_verifications, which operate on single users or raw verification records.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear access context: a Proof account is required and the client must be authenticated before calling. It also explicitly excludes one authentication path by stating that start_login does NOT open this tool. However, it does not compare the tool to sibling list/get tools or state when to choose it over them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_webhook_deliveriesARead-onlyInspect
List webhook delivery attempts with pagination and filtering. Shows delivery status, response codes, and timestamps.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number | |
| limit | No | Items per page | |
| status | No | Filter by delivery status | |
| event_type | No | Filter by event type (e.g. verification.completed) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint=true), so the extra burden is low, and the description does add real context: pagination and filtering behavior, the fields surfaced, the Proof-account requirement, and the explicit warning that start_login does NOT grant access to this tool. It stops short of stating default page size or what an empty result means.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short blocks, purpose first, access second, with zero filler. The access block is slightly long but directly actionable for the agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 what each delivery record contains and explains the auth barrier. For a read-only, four-param list tool the coverage is nearly sufficient; only pagination defaults and ordering are unspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with four documented params including an enum for status and a max of 100 on limit, so the schema already carries the semantics. The description says only 'with pagination and filtering' and adds no format or interaction detail (e.g. whether filters combine), so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List webhook delivery attempts') and names the facets it exposes (status, response codes, timestamps). It reads clearly against the singular get_webhook_delivery sibling, but never explicitly distinguishes itself from it or from get_webhook_stats.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No statement of when to reach for this list versus get_webhook_delivery (single attempt), get_webhook_stats (aggregates), or retry_webhook_delivery. The ACCESS note tells the agent how to become authorized, but that is a prerequisite, not usage 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_discoveryARead-onlyInspect
Poll a chat ID discovery token. Returns the discovered Telegram chat ID, user ID, and username once the user interacts with the bot.
Before calling this for a challenge you created, make sure your reply text already shows the user what to act on — the link itself, the SMS text and number, or a note to check their inbox; a link that appeared only in a tool result is one they never saw.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes | Discovery token from create_chat_id_discovery |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true is consistent with a polling read, and the description adds real behavioral context beyond the annotation: it requires an authenticated Proof account, gives the Claude Code /mcp auth path, and explicitly warns that start_login does NOT grant access. It omits blocking/timeout and polling-interval behavior, which would matter for an agent deciding how to loop.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and return values are front-loaded in the first sentence, and the two follow-on sentences each carry distinct, non-redundant information (correct ordering of the user-facing link, authentication requirement). No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description does the right thing by enumerating what is returned, and it covers the auth prerequisite most agents would otherwise trip on. It stops short of explaining polling cadence or what happens if the token is unclaimed/expired, which would complete the picture for a poll-style tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter, and the schema already fully documents it at 100% coverage ('Discovery token from create_chat_id_discovery'). The description adds no format, lifetime, or expiry detail about the token, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 explicitly names the return payload: discovered Telegram chat ID, user ID, and username. It does not distinguish itself from the sibling wait_for_chat_id_discovery, which is the most likely confusion point for an agent choosing between two near-identical tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a genuine usage precondition (ensure the reply text already shows the user the link/SMS text before calling) that an agent could not infer from the schema. However, it offers no guidance on when to prefer this over wait_for_chat_id_discovery or how often to poll, so the choice between the two siblings 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.
preview_templateARead-onlyInspect
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. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Template body text | |
| channel | Yes | Message channel | |
| subject | No | Email subject line | |
| profile_id | No | The sub-account (project) to act on; omitted → your key's project, or the primary project for an account-wide key | |
| button_text | No | Button text | |
| message_type | Yes | Message type | |
| button_url_template | No | Button URL template |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the non-mutating nature is covered. The description adds genuinely useful context beyond that: it requires a Proof account, requires authenticating this client first, and explicitly clarifies that start_login does NOT unlock this tool, preventing a plausible misfire.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action in the first sentence, followed by the observed effect on output. The second paragraph is slightly verbose but earns its place by covering the auth prerequisite and the start_login caveat, so no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 carries the return burden and does so conceptually ('shows how the message will look with placeholder variables filled in'), plus it covers the auth prerequisite. For a read-only 7-param preview tool this is close to sufficient, with only the sibling distinction left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage across all 7 parameters, the schema already documents channel, message_type, body, profile_id and the button fields. The description only adds the general notion of placeholder variables being filled in, conveying no per-parameter syntax or constraints beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: preview a template with sample data before saving, rendering it as a sub-account would send it. It is clearly distinct from get/list/update/delete_template, though it never names its closest sibling (render_template) to disambiguate the two rendering tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'before saving' implies the pre-persist use case, and the second paragraph gives a concrete workflow (authenticate, then call again). However, there is no explicit when-not guidance and no routing to render_template, which appears to do a similar rendering job, leaving the agent to infer the boundary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
regenerate_api_keyADestructiveInspect
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. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | API key ID to regenerate |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the destructiveHint=true annotation: it states the old key stops working immediately, that the new key carries replaced_key_ids for continuity, that the secret is returned ONLY in this response, and warns the secret will be visible in AI conversation context. These are non-obvious, high-impact behaviors an agent must know before calling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and irreversible effect are front-loaded, and the 2FA workflow and auth prerequisites are separated into clearly labeled blocks so an agent can scan them. It is longer than average but nearly every clause carries required pre-call information; the secret-visibility warning and replaced_key_ids note are not filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description explains the return payload (new id, new secret, replaced_key_ids) and the one-time nature of the secret, plus auth and 2FA prerequisites. Nothing an agent needs to invoke this destructive, credential-issuing tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a single self-describing 'id' parameter, so the schema already carries the load. The description still adds operational meaning by noting the caller should use the newly returned id from now on, which clarifies the id's lifecycle rather than just its type.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Regenerate an API key') and immediately defines what that means (new id and secret, same name/environment/scopes/project), which distinguishes it from create_api_key and revoke_api_key in the sibling list. An agent can tell what it 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the precondition that this operation requires 2FA and lays out a numbered flow (start_2fa → user verifies → poll get_2fa_status → then call this tool), naming the exact sibling tools to use. It also states the ACCESS prerequisite and how to satisfy it, leaving no routing ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_circle_memberADestructiveInspect
Remove a member from a Circle. Deletes the member's channels and revokes any live authorizations that routed through them.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Circle ID | |
| member_id | Yes | Member ID to remove |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare destructiveHint=true; the description goes well beyond that by naming exactly what gets destroyed (the member's channels) and what is revoked (live authorizations that routed through them), plus the auth gating. This is the kind of cascade disclosure an agent needs before invoking 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight paragraphs, with the destructive behavior front-loaded before the ACCESS note. Slightly redundant phrasing ('Authenticate this client ... then call this tool again') but nothing that wastes meaningfully.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive 2-parameter tool with no output schema, the description covers purpose, cascade effects, and auth prerequisites. It stops short of stating reversibility, partial-failure behavior, or what a successful removal returns, but the essentials for correct invocation are present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% (both id and member_id documented with ID patterns), so the schema already carries the parameter burden. The description adds no syntax, format, or defaulting detail beyond what the schema provides, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Remove a member from a Circle') and immediately discloses the cascading effects (channels deleted, live authorizations revoked). It is distinguishable from add_circle_member and invite_circle_member, though it does not explicitly contrast with remove_circle_member_channel.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit authentication precondition (needs a Proof account; authenticate, then retry; start_login does not open this tool), which is actionable operational guidance. However, it never says when to prefer this over siblings such as remove_circle_member_channel or revoke_authorization, nor any when-not conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_circle_member_channelADestructiveInspect
Remove a channel from a Circle member. Removing the last channel is allowed (the member simply becomes unreachable).
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Circle ID | |
| member_id | Yes | Member ID | |
| channel_id | Yes | Channel ID to remove |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (destructiveHint=true), the description discloses the consequence of the last-channel case and the account/auth prerequisite, including a pointed warning that start_login does NOT unlock this tool. That is exactly the kind of behavioral 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action is front-loaded in one sentence, with the edge case and access note following. Nothing is redundant, though the ACCESS block is phrased somewhat awkwardly and consumes a large share of a very short description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation with annotation coverage and a fully described schema, the description covers the crucial extras: the last-channel consequence and authentication requirement. No output schema exists to explain, so nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with all three IDs documented (Circle ID, Member ID, Channel ID), so the schema does the heavy lifting. The description adds no format or syntax detail beyond what the schema already provides, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Remove a channel from a Circle member'), which an agent can distinguish from add_circle_member_channel and remove_circle_member. It does not explicitly name those siblings, so differentiation is left to the reader.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description supplies a usage-relevant caveat (removing the last channel is allowed and leaves the member unreachable), which informs when the call is safe. However, it never names an alternative tool or states when to prefer it over add_circle_member_channel or remove_circle_member, so guidance remains implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_emailADestructiveInspect
Remove an email address from the account. Always requires one code: start_2fa_for_action with action_type email_remove and targets [this email id]. Revokes every proof of the address and your own consents naming it, declines pending confirmations waiting on it, moves Lookalike Watch alerts to your remaining primary email (or stops the watch when none is left), deletes the record, signs out your other devices, and names the new primary email. Refused for the address you signed in with and for your only way to sign in. Cannot be undone.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Email record ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnlyHint=false, destructiveHint=true) are consistent and the description goes far beyond them: revoking proofs and consents, declining pending confirmations, relocating Lookalike Watch alerts, signing out other devices, naming the new primary email, and explicit irreversibility ('Cannot be undone'). This is exactly the behavioral context an agent needs before an irreversible mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads what the tool does, then the prerequisite, then the consequence chain, then access — a logical order with no filler. The side-effect sentence is dense and long, but every clause describes a distinct irreversible effect on the account, so it earns its length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, no-output-schema, single-param tool, the definition covers purpose, precondition flow, refusal cases, full outcome set, and auth requirements. Nothing an agent needs to invoke it safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a single 'id' parameter, so baseline is 3. The description adds meaning by tying the id to the 2FA target list ('targets [this email id]'), clarifying how the parameter is consumed across the required pre-step rather than just what it is.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource ('Remove an email address from the account') and immediately scopes it against the rest of the toolset. The detailed side-effect list makes it unmistakable versus siblings like remove_phone, revoke_proof, or delete_profile.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the prerequisite tool and its arguments ('start_2fa_for_action with action_type email_remove and targets [this email id]') and states the exact refusal conditions (the signed-in address, the only sign-in method). It also documents authentication requirements and the Claude Code auth path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_phoneADestructiveInspect
Remove a phone number from the account. Always requires one code: start_2fa_for_action with action_type phone_remove and targets [this phone id]. Revokes every proof of the number and your own consents naming it, declines pending confirmations waiting on it, flags approval setups left with no approver, deletes the record and its messenger links, signs out your other devices, and names the new primary phone — your Proof of Me circles then reach you there. Refused for the number you signed in with, for your only way to sign in, and for your last phone while circles are active (circles_need_phone: add another phone first, or archive the circles). Cannot be undone.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Phone record ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare destructiveHint=true/readOnlyHint=false, but the description enumerates the full blast radius: revoked proofs and consents, declined pending confirmations, flagged approver-less setups, deleted record and messenger links, other devices signed out, new primary phone named. It also states irreversibility and auth requirements, well 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Long but dense and front-loaded: purpose first, then prerequisite, consequences, refusals, and auth. Every clause carries operational information, though the multi-clause consequence sentence is heavy and could be split for readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive single-param tool with no output schema and minimal annotations, the description supplies prerequisite flow, full side-effect list, refusal conditions, and authentication instructions. An agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and already documents the single 'id' parameter, so the baseline is 3. The description adds context by tying the id to the 2FA 'targets [this phone id]' flow, clarifying how the parameter participates in the prerequisite step.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 immediately distinguishes it from siblings like remove_email, set_primary_phone, and list_phones. 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the explicit prerequisite (start_2fa_for_action with action_type phone_remove and targets [this phone id]) and three explicit refusal conditions (number signed in with, only sign-in method, last phone while circles are active) with the circles_need_phone remedy. Nothing about when this is callable 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.
render_auth_linkARead-onlyInspect
Render an authorization or verification URL as a clickable link followed by a scannable QR code inside a fenced code block. This is a local computation tool — no HTTP request is made. Its output comes back to you, not to the user: copy the link, and the QR block inside its fence, into your reply.
Agent usage: pass a LINK field from an earlier response — deep_link (create_session, create_chat_id_discovery always; start_login, create_account, start_2fa, start_2fa_for_action, start_add_phone on telegram/whatsapp ONLY, where on sms and email that field is empty or absent altogether and this tool rejects it either way), challenge.deep_link (create_verification, messenger channels only), or telegram_deep_link / whatsapp_deep_link.
Do NOT pass qr_text to this tool: that field is a QR code already rendered as text, and this tool takes a link. When a response gives you qr_text and no link, print it verbatim inside a fenced code block instead — its rows only scan while they stay adjacent, so a blank line or wrapped row destroys the code.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The link to render — e.g. a deep_link response field. Never a qr_text value: that is the link already rendered as QR art. | |
| label | No | Optional label to display above the link (e.g. "Verify your phone number") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true; the description adds a lot beyond that — it is a local computation with no HTTP request, output returns to the agent rather than the user, most clients fold tool results away, and the agent must relay the actionable content into its own reply text. That is genuinely useful behavioral context absent from the 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and output form are front-loaded and every paragraph carries real instruction, but the middle 'Agent usage' paragraph is a single dense sentence with deeply nested parentheses that is hard to parse on first read. Slightly tighter phrasing would improve scannability without losing content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a stateless local render tool with readOnlyHint, no output schema, and only two parameters, the description covers purpose, valid inputs, invalid inputs, output shape, and how the agent must relay results. Nothing an agent needs to call and act on this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented in the schema, including the warning that url must never be a qr_text value. The description's added value is the enumeration of concrete source fields for url, but it largely restates the schema's own guidance, keeping it at the baseline for high coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and output form: render an authorization/verification URL as a clickable link plus a scannable QR code inside a fenced code block. It immediately clarifies the resource (LINK/deep_link fields) and separates itself from the sibling behavior of printing qr_text, so an agent can tell what it 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names which earlier-response fields to pass (deep_link, challenge.deep_link, telegram_deep_link, whatsapp_deep_link) and the exact tools/channels each comes from, plus when the field is empty or absent. It also states the when-not case: do not pass qr_text, and print it verbatim in a fenced block instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
render_templateARead-onlyInspect
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. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| channel | Yes | Message channel | |
| variables | No | Variables to substitute into the template | |
| profile_id | No | The sub-account (project) to act on; omitted → your key's project, or the primary project for an account-wide key | |
| message_type | Yes | Message type |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true is consistent with a rendering operation, and the description adds context the annotations don't carry: the custom-vs-default template fallback, the fact that output is fully rendered message content, and a non-obvious auth prerequisite. It stops short of noting side effects or rate limits, but the key behavioral traits 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose in the first sentence, then the access caveat in a short second paragraph. Both earn their place, though the parenthetical UI instruction is slightly more detail than strictly needed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter tool with a nested object and no output schema, the description covers what is rendered, where the template comes from, and the auth gate. Parameter-level detail is delegated to a fully covered schema, leaving little an agent would still need.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so channel, message_type, profile_id, and the nested variables object are already documented in the schema. The description only gestures at 'provided variables' and adds no syntax, defaults, or format meaning beyond the schema — baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (render) and resource (the template a sub-account sends), plus the resolution rule — custom template if present, otherwise the default — and the return value. It clearly separates rendering from adjacent operations like preview/get, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The ACCESS paragraph gives a real precondition (a Proof account must exist and this client must be authenticated; start_login does not unlock this tool). However, there is no guidance on when to use render_template versus preview_template or get_template, which are the obvious alternatives 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. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | HITL config ID to request authorization for |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnly=false and destructive=false. The description goes far beyond that: it discloses delivery semantics (the response carries no link to show), the returned `authorizations` shape with per-field meanings, the distinction between `status: 'pending'` and `status: 'active'`, the trap that an empty array means no recipient resolved (not everyone authorized), and a warning not to relay `message` on that branch.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Long, but nearly every sentence earns its place and the critical point (read the array, don't trust `message`) is front-loaded within the agent-usage block. Slightly verbose but well-structured rather than padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 carries the burden by describing the return payload (`authorizations` entries with `channel`, `recipient`, `authorization_id`, `status`, plus `message`) and its edge cases. It also flags the auth prerequisite. 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.
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 'HITL config ID to request authorization for'. The description adds no additional syntax or format meaning for the parameter, so the baseline of 3 applies even though the schema does all the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: 'Request authorization for a HITL config.' The scope is clear enough to separate it from siblings like create_authorization, create_confirmation, and create_hitl, whose names alone would otherwise be ambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the ordering dependency: it 'must be completed before create_confirmation will work for this HITL config', and tells the agent it may proceed 'once the user confirms they have approved'. This is exactly the when-to-use context needed.
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. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Domain ID | |
| email_prefix | No | Email prefix to resend verification to |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false and destructiveHint=false; the description adds the rate limit (3 requests per minute) and the authentication/session requirement, which are exactly the extra behavioral facts an agent needs. It does not describe return behavior, but for a resend it adds solid 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in one sentence, followed by the rate limit and access instructions — no filler. The ACCESS block is slightly verbose but every clause (account requirement, two auth paths) carries actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter resend tool with no output schema, the description covers purpose, rate limits, and the authentication flow needed before invocation. The only meaningful gap is routing guidance relative to sibling verification-resend tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for both parameters, including the enum of permitted email_prefix values, so the schema carries the parameter burden. The description adds nothing about the id or email_prefix semantics, warranting the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb+resource ('Resend the domain verification email'), which is clear and actionable. However, it does not distinguish this from close siblings such as resend_verification, resend_email_otp, or start_domain_email_verification, leaving the agent to 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The ACCESS paragraph usefully describes prerequisites (Proof account, authenticate via /mcp or start_login, then call again), which is genuine when/how guidance. But it never states when to choose this tool over the many sibling resend/verification tools, 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.
resend_email_otpAInspect
Resend the OTP code for an in-progress email addition.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | Add-email session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=false, so safety is partly covered. The description adds genuinely useful non-annotation context: a Proof account is required, the client must be authenticated, and a session from start_login is a prerequisite.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action is front-loaded in one sentence, with access prerequisites in a second short block. No filler, though the auth instructions are somewhat platform-specific for a reusable definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 essentials (purpose, session prerequisite, auth requirement) are present. It omits resend limits/rate behavior and what the caller should do after resending, leaving a modest gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and there is only one parameter, so the schema already documents session_id. The description only marginally extends this by clarifying the session must belong to an in-progress email addition, which is the right baseline-3 level.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Resend') plus resource ('OTP code') scoped precisely to 'an in-progress email addition', which cleanly separates it from verify_email_otp, submit_verification_code, and start_add_email.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The in-progress-add-email precondition implies when the tool applies, and authentication guidance (authenticate the client or use start_login) is given. However, it does not explicitly state when NOT to use it, nor route to sibling alternatives such as verify_email_otp when the code arrives.
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. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Verification ID |
TDQS
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 but is non-destructive. The description adds genuine context beyond that: the email-only channel restriction, the fact that a NEW code is generated and sent (invalidating the previous one by implication), and the auth prerequisite. It does not mention rate limits or whether prior codes 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences front-load the action and the channel constraint, followed by a clearly separated ACCESS note. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 mutation tool, the definition covers the essentials and adds the non-obvious auth prerequisite. Remaining gaps (whether existing codes are invalidated, throttling behavior) are minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with a single 'id' parameter documented as 'Verification ID'. The description adds nothing about the parameter, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Resend a verification message') plus a channel-scoping constraint ('email channel only') and the side effect ('Generates and sends a new code'). It stops short of naming the closest siblings (resend_email_otp, resend_domain_email, trigger_verification), so differentiation still requires inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The ACCESS block gives real operational guidance about prerequisite authentication and explicitly warns that start_login does NOT unlock this tool, which is useful. However, it offers no guidance on when to choose this tool over resend_email_otp, resend_domain_email, or trigger_verification for the same verification.
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. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Webhook delivery ID to retry |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false and destructiveHint=false; the description adds meaningful context beyond that, namely that the payload is reused and a NEW attempt is created rather than mutating the original record. It also discloses the concrete auth requirement and the exact recovery flow (authenticate via /mcp, then re-call), plus the notable nuance that start_login does not satisfy it. It omits idempotency/rate-limit behavior, 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded in the first sentence and the second sentence adds genuinely useful mechanism detail. The auth paragraph is slightly bulky but operational and earns its space for an unauthenticated agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter mutation with no output schema, the description covers what it does, what it produces (a new attempt with the same payload), and how to satisfy auth. Nothing critical is missing, though stating whether the retry can be repeated or what response to expect would fully close the loop.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and there is a single required 'id' param already documented in the schema as 'Webhook delivery ID to retry'. The description adds no syntax, format, or lookup guidance beyond that, so the schema does the heavy lifting and the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Retry) plus resource (webhook delivery) and clarifies the mechanism: a new delivery attempt with the same payload to the configured endpoint. This clearly distinguishes it from siblings like get_webhook_delivery, list_webhook_deliveries, and get_webhook_stats.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Retry a failed webhook delivery' implies the precondition (the delivery must have failed), which is useful. However, no alternative is named (e.g., re-sending via a different tool) and no exclusions are given, such as what to do if the delivery already succeeded or is still in flight.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
revoke_api_keyADestructiveInspect
Revoke an API key by ID. The key will immediately stop working. This action cannot be undone.
Agent usage: This operation requires 2FA. Before calling, complete the 2FA flow: (1) call start_2fa with action_type "api_key_revoke", (2) wait for user to verify the code, (3) poll get_2fa_status until "verified", (4) then call revoke_api_key.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | API key ID to revoke |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, and the description goes beyond them by stating the effect is immediate, irreversible ('cannot be undone'), and gated behind 2FA and an authenticated Proof account. These are exactly the operational traits an agent needs before committing to an irreversible mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well front-loaded: effect and irreversibility come first, then the procedural 2FA steps, then access. The numbered steps and ACCESS paragraph are slightly verbose but each earns its place given the prerequisite complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an irreversible mutation with a mandatory multi-step 2FA dance, the description covers effect, reversibility, ordering, and authentication. No output schema exists, and none is needed for a revoke operation, so nothing material is left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single required 'id' parameter, so the schema already documents it. The description adds no format or sourcing guidance beyond what the schema states, which is the expected baseline 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.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Revoke an API key by ID') and the immediate consequence ('The key will immediately stop working'). It is easily distinguished from siblings like create_api_key, regenerate_api_key, and list_api_keys.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit, ordered precondition flow (start_2fa → user verify → poll get_2fa_status → revoke) plus the account/authentication requirement. What is missing is sibling-level routing: it never contrasts this with regenerate_api_key, which is the natural near-neighbor an agent might otherwise choose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
revoke_assetADestructiveInspect
Revoke the proofs of one of your assets (a phone, email or domain) — the asset stays on the account. Owner only: sign in with start_login (a connection with only an API key is refused user_session_required — a key revokes a proof with revoke_proof instead), then one code: start_2fa_for_action with action_type revocation_bulk and targets [this asset id], wait_for_2fa, and call again. A phone or email: every proof of that number or address is revoked; signing in with it again issues a fresh proof. A domain you own: every proof of the domain and every delegation issued from it are revoked for good, and the domain needs re-verification — re-verifying does NOT bring the delegations back. Need a temporary stop for a domain proof? Use suspend_proof instead. Status-checking verifiers see the revocation within about a minute; signature-only verifiers accept a token until it expires. Cannot be undone.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Asset ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations flag it as destructive, but the description goes well beyond them: it discloses the auth requirement (user_session_required vs API-key path), the 2FA action_type/targets flow, the irreversible nature ('Cannot be undone'), the domain re-verification consequence (delegations not restored), and the propagation timing (~1 minute for status-checking verifiers).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the sibling routing are front-loaded, and the dense procedural sentences (2FA flow, domain consequences, propagation) each carry information an agent needs. It is long, but nearly every clause is load-bearing for a destructive, multi-step operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive one-param tool with no output schema, the description supplies the full picture: auth path, 2FA sequence, blast radius per asset type, reversibility, and verifier timing. Nothing material is left for the agent to infer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single 'id' parameter ('Asset ID'), so the baseline is 3. The description reinforces that the id is the asset being revoked ('targets [this asset id]') but adds no format or syntax detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource and an explicit scope distinction: 'Revoke the proofs of one of your assets... the asset stays on the account,' which separates it from asset-deletion tools. It further names the neighboring tools revoke_proof and suspend_proof, so an agent can place it precisely among siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use routing: use revoke_proof if you only hold an API key, use suspend_proof for a temporary stop on a domain proof, and use revoke_asset for permanent revocation. It also states the preconditions (owner sign-in via start_login, then 2FA via start_2fa_for_action/wait_for_2fa).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
revoke_authorizationADestructiveInspect
Revoke an active or pending authorization. Only authorizations with status "active" or "pending" can be revoked.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Authorization ID to revoke | |
| reason | No | Reason for revocation |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true / readOnlyHint=false, so the safety profile is covered, and the description contributes beyond it: the state precondition for revocation and the authentication requirement with a concrete remediation path (/mcp → Authenticate). It does not say whether revocation is reversible or what side effects cascade, but the added 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and eligibility constraint are front-loaded in the first two sentences; the access block that follows is useful but slightly repetitive in phrasing. No filler sentences overall.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter destructive tool with no output schema, the description covers the action, the state precondition, and the authentication prerequisite including the note that start_login does not unlock this tool. 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with 'id' and 'reason' both documented in the schema, so the baseline is 3. The description mentions no parameter details (e.g., that reason is optional or capped at 500 chars), adding nothing here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (revoke) and resource (authorization) and adds a scope qualifier: only 'active' or 'pending' items. The resource is distinguishable from revoke_api_key, revoke_asset, revoke_delegation, revoke_proof, but the description never explicitly names which sibling to prefer when the agent is unsure.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear eligibility precondition ('Only authorizations with status "active" or "pending" can be revoked'), which is genuine use guidance, but there is no when-to-use-vs-alternative routing against the many other revoke_* tools 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.
revoke_auth_sessionADestructiveInspect
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. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | Session ID to revoke |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare destructiveHint=true and readOnlyHint=false, so the destructive nature is known. The description adds valuable context beyond annotations: authentication requirements and the restriction that a JWT caller cannot revoke the current session, while an API key caller can revoke any session.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action, then moves to constraints and access requirements. It is appropriately sized for a one-parameter mutation tool, though the final ACCESS paragraph is slightly more verbose than necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter destructive mutation with rich annotations, the description covers the important missing behavioral context: authentication requirement and JWT/API-key scoping. It does not describe post-revocation effects or immediate invalidation, but the annotations and simple schema carry most of the remaining burden.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is only one parameter, session_id, and schema description coverage is 100%, so the schema already defines it as 'Session ID to revoke'. The description adds no syntax, format, or selection 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.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource: revoke a specific authentication session by ID. It clearly identifies the object as an authentication session, distinguishing it from related revocation tools like revoke_authorization and revoke_api_key, though it does not explicitly name sibling alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear usage context by explaining the Proof account requirement, the need to authenticate, and the key behavioral distinction between JWT and API key callers. It also gives an explicit when-not condition, but does not compare against alternative sibling tools such as list_auth_sessions or get_session.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
revoke_delegationADestructiveInspect
Revoke ONE delegation. The domain control proof and sibling delegations stay valid; the revocation is mirrored into the proof registry so the CRL, status list and public status lookup all see it. Idempotent: a repeat revoke answers success with the same body, both here and through revoke_proof with the ph_dlg_ handle — unlike a PROOF, where a repeat answers already_revoked. The result carries the DERIVED effective_status/is_valid beside the stored status.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Delegation ID (24-hex Mongo id or ph_dlg_<32 hex> handle) | |
| reason | No | Reason for revocation |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the destructiveHint/readOnlyHint annotations: it scopes the blast radius (domain control proof and sibling delegations remain valid), discloses the mirroring side-effect into the proof registry affecting CRL/status list/public lookup, and specifies the exact idempotent response semantics versus a PROOF's already_revoked. This is exactly the kind of context 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and scope in the first sentence, then layers behavior and access. It is dense but nearly every clause carries non-redundant information; the ACCESS paragraph is a bit promotional but operationally useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 explains the derived return fields (effective_status/is_valid alongside stored status), the side-effects, the idempotency contract, and the auth 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with only two params, so the schema already documents the id format and the reason enum. The description adds essentially no parameter-level detail (e.g., reason defaults), so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 scope with 'ONE', distinguishing it from bulk or sibling revocation paths. It names revoke_proof and the ph_dlg_ handle explicitly, so an agent can separate this from revoke_proof 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear usage context: idempotency expectation, the relationship to revoke_proof via the ph_dlg_ handle, and explicit access prerequisites including the /mcp Authenticate flow and the fact that start_login does not grant access. It stops short of an explicit 'use this instead of X when Y' routing rule for the two revoke tools, 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.
revoke_proofADestructiveInspect
Revoke a proof by its public handle (ph_ctl_* / ph_dlg_*) or a verification ID — the same addresses get_proof_status takes. The proof token will no longer validate anywhere: the status endpoint, the public validator, the revocation list and the Token Status List all report it revoked. A domain CONTROL proof (a ph_ctl_* of a domain) also revokes, for good, every delegation issued from it; for a domain you own, every proof of the domain is revoked and the domain needs re-verification. The API key needs proofs:write, plus delegations:write while the revocation reaches live delegations — for a domain you own, any live delegation of the domain, whichever of its handles you name (the refusal names the scope and the count). A handle revoked before the domain was verified again does not reach the new proof: revoke that one by its own handle. Otherwise it revokes the PROOF only — the asset or consent it is about stays. Need a temporary stop? Use suspend_proof instead. Cannot be undone.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Public proof handle (ph_ctl_* / ph_dlg_*) or verification ID | |
| reason | No | Reason for revocation |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say destructiveHint=true / readOnlyHint=false; the description goes far beyond that with cascade semantics (a ph_ctl_* of a domain permanently revokes every delegation issued from it; owning the domain revokes every proof and forces re-verification), permission escalation behavior, what the refusal message reports (scope and count), what is NOT destroyed (the underlying asset/consent stays), and irreversibility.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but every clause carries operative information — no filler. The purpose and the identifier format are front-loaded, though the long unbroken run of cascade/permission/edge-case prose would be easier to scan as separate lines rather than mid-paragraph dashes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, cascading mutation with no output schema, the description supplies exactly the missing pieces: blast radius, auth/permission requirements, refusal behavior, scope limits (asset/consent preserved), irreversibility, and the alternative tool. Nothing an agent needs to call it safely is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 earns an increment by tying the 'id' parameter to an existing mental model ('the same addresses get_proof_status takes') and spelling out both handle families. The 'reason' parameter is left entirely to the schema, so it is not a full 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 scopes the identifier domain ('by its public handle (ph_ctl_* / ph_dlg_*) or a verification ID'). It also names the sibling whose parameter space it shares (get_proof_status) and the alternative for a different intent (suspend_proof), so an agent can distinguish it from revoke_delegation, revoke_asset, and list_revoked_proofs 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: temporary stop → suspend_proof; permanent removal → this tool. It also states the preconditions (Proof account, client authentication, proofs:write plus delegations:write) and the edge case of a handle revoked before re-verification, telling the agent to revoke 'that one by its own handle'. Both when-to-use and when-to-use-something-else are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
searchARead-onlyInspect
Prefix-anchored global account search across six resource buckets (verification_requests, verifications, hitl, confirmations, authorizations, api_keys). Case-sensitive prefix match over indexed plaintext fields only; recipient identifiers are masked. Results are scoped to the authenticated account.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| q | Yes | Prefix-anchored search query (minimum 3 characters) | |
| type | No | Narrow the search to a single result bucket | |
| limit | No | Max results per bucket (default 10, max 25) | |
| environment | No | Scope results to test or production data (default: production) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true. The description adds substantive behavior: case-sensitive prefix matching, that only indexed plaintext fields are searched, that recipient identifiers are masked, and that results are scoped to the authenticated account and require authentication first. This is real disclosure 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences front-load the scope and matching semantics, with the auth requirement broken out into a clearly labeled ACCESS block. No filler, though the second sentence packs several distinct constraints together.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only search tool with no output schema, the description covers access, scope, matching rules, and masking, and the per-bucket limit is in the schema. Return shape is only implied via 'six resource buckets', which is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 q, type, limit, and environment with enums and bounds. The description only echoes 'six resource buckets' and 'prefix-anchored', adding little syntax or edge-case 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.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (prefix-anchored search) and resource (global account across six named buckets), plus the exact match semantics (case-sensitive prefix over indexed plaintext fields, masked recipient identifiers). This is clearly distinguished from the many list_*/get_* siblings without naming them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the access prerequisite (needs a Proof account, authenticate the client, then retry) and even warns that start_login does NOT open this tool — valuable routing guidance. It stops short of saying when to prefer search over the sibling list_verifications/list_api_keys tools for retrieval tasks.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Account session id from create_account |
TDQS
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.
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.
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.
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.
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.
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_emailADestructiveInspect
Set an email address as the primary email for the account.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Email record ID to set as primary |
TDQS
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 covered. The description adds genuinely useful context about the authentication gate and session bootstrap via start_login. It omits side effects such as what happens to the previously primary email and whether the change affects verification routing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short, front-loaded blocks: the action first, then the access requirement. The auth sentence is slightly long but every element (account type, two auth routes, re-invocation) is actionable rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter mutation with no output schema, the definition covers the essential blocking concern (authentication and how to obtain a session). The remaining gap is behavioral: it does not say what becomes of the prior primary email or whether the target must be verified first.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single parameter, and the schema description ('Email record ID to set as primary') is precise. The description adds no parameter-level 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.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Set an email address as the primary email') with a clear scope, and the name plus this phrasing separates it from siblings like set_primary_phone and set_primary_profile. However, it never explicitly names an alternative or contrasts its scope, so it falls short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete prerequisites and a recovery path: needs a Proof account, authenticate the client, or use start_login and re-call. That is real 'how/when to proceed' guidance. It does not, however, mention where to obtain the email record id (e.g., list_emails) or when to prefer this tool over other email operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_primary_phoneADestructiveInspect
Set a phone number as the primary phone for the account.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Phone record ID to set as primary |
TDQS
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 flagged structurally. The description adds real value beyond that by spelling out the authentication requirement and the exact remediation path (start_login, then retry). It does not explain the destructive side effect — that setting a new primary presumably demotes the previous primary number.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, purpose front-loaded ahead of the access requirement, with no filler. The second sentence is somewhat dense but every clause (auth requirement, two remediation routes, retry instruction) carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 is nearly complete — it covers purpose and the auth gate. The one meaningful omission is the side effect on the existing primary phone, which matters for a destructive-flagged tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 'Phone record ID to set as primary'. The description adds no syntax, format, or sourcing 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.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Set a phone number as the primary phone for the account.' This clearly distinguishes it from siblings like set_primary_email and set_primary_profile by the resource acted upon. It does not, however, explicitly name a sibling or contrast itself with them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a genuine prerequisite ('needs a Proof account') and points at the start_login alternative for obtaining one, which is useful routing. But it offers no guidance on when to prefer this tool over other phone-related tools (start_add_phone, list_phones, remove_phone) or 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.
set_primary_profileADestructiveInspect
Set a profile as the primary profile. The previous primary profile becomes secondary.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| profile_id | Yes | Profile ID to set as primary |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true and readOnlyHint=false, and the description explains exactly what is destructive: the previous primary profile is demoted to secondary. It also discloses the authentication prerequisite. That is meaningful context beyond the annotations, though it doesn't cover failure modes or reversibility.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core effect is front-loaded in the first sentence and the access requirement follows in a compact block. The CLAUDE-Code-specific parenthetical is slightly verbose but earns its place as actionable remediation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter mutation with annotations covering the safety profile and no output schema, the description covers the state transition and auth prerequisite adequately. Only minor gaps remain, such as behavior when the target profile is already primary or the ID is invalid.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single profile_id parameter is already documented in the schema. The description adds no format, sourcing, or resolution guidance for that ID, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (set) and resource (profile as primary) and even describes the resulting state change. It doesn't contrast itself with siblings like set_primary_email or set_primary_phone, but the resource is unambiguous enough that an agent can select it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an important precondition (needs a Proof account; authenticate first; start_login does not cover this) which is genuine usage guidance. However, it never says when to prefer this over alternatives such as update_profile or update_my_profile, 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.
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. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Domain ID | |
| from_email | No | Custom from email address for the domain |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations only declaring readOnlyHint=false and destructiveHint=false, the description carries real extra load: it names the return payload (resend.dkim_records and their status) despite there being no output schema, states the from_email constraint, and candidly discloses that Proof does not yet send from customer domains so the stored address is unused. It also spells out the account/authentication requirement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, followed by output details, the from_email caveat, and a clearly labeled ACCESS block. Every sentence contributes; the only mild cost is the somewhat long authentication sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation with no output schema, the description covers the key unknowns: what is returned (DKIM/SPF records and status), the from_email limitation, and authentication. It could be stronger by stating whether the domain must be verified first or referencing the prerequisite tools, but otherwise an agent has enough to call it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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: from_email must belong to this domain, is stored as the preferred sender, and is currently not used for sending. That is semantic value beyond the schema's 'Custom from email address' text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (register a verified domain with Proof's email provider, Resend) which is clearly more specific than the generic 'add_domain' or 'start_domain_verification' siblings. It does not explicitly name any sibling to differentiate itself, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Register a verified domain' implies the domain must already be added/verified, and the ACCESS block gives an authentication path plus an alternative (start_login). However, it never states when to call this versus siblings like add_domain, verify_domain, or start_domain_email_verification, leaving the workflow ordering to inference.
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. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
| channel | Yes | Channel to receive the verification code | |
| targets | No | 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. | |
| email_id | No | Specific email ID for email channel (optional) | |
| action_type | Yes | The sensitive action requiring 2FA |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnlyHint=false and destructiveHint=false; the description goes far beyond by disclosing that email is the ONLY channel the server dispatches on, that telegram/whatsapp/sms require the user to send the message themselves, the requires_email_selection no-session case, the target binding/`target_mismatch` refusal, session expiry, and the Proof account/start_login auth prerequisite. That is exactly the behavioral 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is long but front-loaded: the first sentence is a self-contained purpose statement, followed by the flow, the channel caveats, and the auth prerequisite. Nearly every sentence carries actionable instruction with no filler, though the volume is heavier than most agents need in a single description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 cover return values, and it does: session_id, deep_link, qr_code, qr_text, instructions, requires_email_selection, available_emails, sms_message/sms_dids. Combined with the polling guidance and auth requirement, an agent has everything needed to call and follow through.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema descriptions for channel, action_type, targets and email_id are themselves detailed, so the baseline is 3. The description adds real meaning on top: which channels are typical, when email_id matters (after requires_email_selection), and how deep_link/sms_message map to render_auth_link, which the schema does not explain.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening states a specific verb and resource: it starts a 2FA challenge for a sensitive operation, sends a code over the chosen channel, and returns a session ID. It further pins down its position in the flow (start -> poll get_2fa_status -> proceed) which separates it from verify_2fa, get_2fa_status and wait_for_2fa. It never addresses the very similarly named sibling start_2fa_for_action, so sibling differentiation is incomplete.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit numbered when-to-use sequence, names the follow-up tools (get_2fa_status, render_auth_link, create_api_key) and the branch conditions (verified vs expired, requires_email_selection). It also states typical channels and warns against misusing qr_text with a link renderer. Nothing about when to choose this tool over alternatives 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.
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. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| channel | Yes | Channel for the 2FA challenge — must differ from the user's last login channel | |
| targets | No | 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. | |
| email_id | No | Optional: specific UserEmail id for email-channel 2FA | |
| phone_id | No | Optional: specific UserPhone id for phone-channel 2FA | |
| single_use | No | Whether the grant is consumed on first use. Server forces true for destructive action types. Defaults to true. | |
| action_type | Yes | 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. | |
| ttl_seconds | No | Requested grant lifetime in seconds. Server caps to 300s for destructive action types, 86400s for configuration scopes. Defaults to 300 if omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses far more than the annotations, which only state it is not read-only and not itself destructive. It reveals the channel-differs-from-login enforcement, TTL caps (300s destructive / 86400s config), forced single-use for destructive scopes, targets-binding with `reason: target_mismatch`, the no-session-started email-selection edge case, and that clients fold tool results away so the user must be told in the agent's own reply. Also flags the account/auth prerequisite.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose before the policy detail, then organized into a numbered workflow and a closing user-visibility caveat. It is long and somewhat dense for a single tool, but nearly every sentence carries operational load, so the length is largely justified rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description names the relevant response fields (deep_link, sms_message, qr_text, requires_email_selection, available_emails) and explains how to act on each. Combined with the auth prerequisite and the end-to-end flow, an agent has everything needed to call it and handle the result correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3, but the description enriches semantics beyond the schema: it explains that step-up grants are bound to the exact `targets` ids the protected call will carry, that destructive scopes key on those ids, and that a channel differing from login is required. It adds a backend policy pointer (config/twoFAPolicy.ts) useful for resolving cap questions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+scope: starting a 2FA challenge that grants permission for a named sensitive action, and explains the grant mechanism (keyed by user id and action_type, read by endpoint middleware). It is clearly distinguishable from siblings like verify_2fa, wait_for_2fa, and get_2fa_status 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit five-step agent workflow: attempt the call, observe `403 2fa_required`, call this tool with that action_type and a different channel, present the challenge, wait via wait_for_2fa, retry. It also enumerates per-channel handling (deep_link vs sms_message vs email selection) and warns what not to do with qr_text, leaving almost nothing to inference.
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. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | Email address to add |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnly=false and destructive=false. The description adds real behavioral context beyond that: it triggers an outbound OTP email, returns a session ID rather than finalizing the add, and requires an authenticated Proof account. It does not state rate limits or OTP expiry, so 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences front-load the action and its effects, and the access note is separated into its own paragraph. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-param, no-output-schema step in an email-adding flow, the description covers action, side effect, return artifact, and auth prerequisite. Only the downstream verification tool name is missing, which is minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single required email parameter, so the schema already carries the semantics. The description's mention of 'the email' adds 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.
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 the immediate side effect (sends OTP) plus return value (session ID). It is clearly distinguishable from list_emails/remove_email, though it does not name the obvious sibling start_add_phone it mirrors.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly gives the prerequisite (a Proof account, authentication via /mcp or start_login after which the tool can be called) and implies the follow-up verification step via 'session ID to verify with.' It stops short of naming verify_email_otp as the continuation, but the when-to-use context 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. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
| channel | Yes | Channel for phone verification |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false/destructiveHint=false, so the description carries real weight here and delivers: nothing is sent before the user acts, a session ID is issued, the per-channel shape of the response differs, and auth is required ('needs a Proof account', how to authenticate). It also discloses that clients fold tool results away, a behavioral detail not derivable from any structured field.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded core flow, then an 'Agent usage' block and a client-rendering caveat — all substantive. It is long for a one-parameter tool and slightly over-explains channel output variants, but every sentence carries actionable instruction, so little is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 compensates by enumerating return fields per channel, and it also covers prerequisites, the next tool to call, and the rendering constraint ('never hand a qr_text to a link renderer'). Nothing an agent needs to call and follow up correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the enum self-documents, so the baseline is 3; the description earns extra credit by explaining what each channel value actually implies at runtime (deep_link/qr_code for telegram+whatsapp, sms_message/sms_dids for sms). That is genuine semantics beyond the enum labels, though it focuses on outputs rather than the argument itself.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 phone number') plus the distinctive mechanism ('by reverse OTP'), which clearly separates it from siblings like start_add_email, create_verification, or start_2fa. An agent can identify the tool's job 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly describes the flow ('the user starts the exchange themselves and nothing is sent before they do'), names the downstream step ('then poll get_add_phone_status'), and routes per-channel usage (pass deep_link to render_auth_link on telegram/whatsapp; show sms_message/sms_dids on sms). Alternatives and exclusions are stated rather than implied.
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. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Domain ID | |
| email_prefix | No | Email prefix to send verification to (default: admin) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=false, establishing a non-destructive write. The description adds the concrete side effect (a verification code is emailed to an admin address) and the auth requirement, which the annotations do not cover. It omits rate limits or how to continue the flow, 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, followed by a clearly separated ACCESS note. Both parts earn their place, though the parenthetical Claude Code instruction is slightly verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a flow-starting mutation with no output schema, the description covers the trigger and auth prerequisites but never points to the follow-up tools (confirm_domain_email_code, check_domain_email_status, resend_domain_email). A short next-step hint would make the flow complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with the email_prefix enum fully documented in the schema (default: admin). The description only echoes the 'standard admin email address' concept, adding no new meaning about the id or the enum choices, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (start domain verification) and the mechanism (via corporate email, sending a code to an admin address). This distinguishes it loosely from credential-based verification, but it does not differentiate from the very similarly named sibling start_domain_verification or setup_domain_email, so the agent still has to guess which domain-verification entry point applies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The ACCESS block gives a genuine prerequisite (Proof account, authenticate or start_login first) which tells the agent when the tool becomes callable. It says nothing about when to prefer this over start_domain_verification, start_user_domain_verification, or verify_domain_with_credentials, so the sibling-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. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Domain to verify (e.g. example.com) | |
| customer_id | No | Customer identifier for B2B tracking | |
| verification_method | No | Verification method (default: manual_dns) |
TDQS
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 the rest: it discloses that the call creates a persistent verification record (a write) and that the response contains DNS/HTTP instructions for the customer. The authentication requirement is stated, which annotations do not cover. It does not address repeat calls, idempotency, or expiry of the created record.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two brief paragraphs, purpose front-loaded, with the access caveat clearly separated. Every sentence carries information; nothing is padded. The ACCESS block is slightly jarring stylistically but earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter, no-output-schema tool, the description covers what it does, the auth prerequisite, and what the caller receives (instructions). The main gap is the absence of any guidance on the follow-up tool to poll or complete verification, which matters given the dense verification-sibling cluster.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and all three parameters are documented in the schema, so the baseline is 3. The description's mention of 'DNS/HTTP instructions' loosely maps to the verification_method enum but adds no format or default detail beyond what the schema already says.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Start') and resource ('B2B domain verification') and adds the concrete outcome: creates a verification record and returns DNS/HTTP instructions. The 'B2B' qualifier helps separate it from start_domain_email_verification and start_user_domain_verification, but it never explicitly names check_domain_verification or verify_domain, so the routing among near-identical siblings is left partly to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit prerequisite (needs a Proof account) and an actionable remediation path (authenticate via /mcp, then call again), plus a useful exclusion: 'start_login does NOT open this tool.' What it lacks is any statement of when to prefer this over verify_domain, check_domain_verification, or the reinitiation vs. checking flow.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| No | Email address (required for email channel) | ||
| channel | Yes | Authentication channel | |
| phone_number | No | Phone number in E.164 format (required for SMS channel) |
TDQS
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.
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.
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.
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.
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.
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_verificationBInspect
Start a self-service domain verification session. The user proves ownership of a domain via DNS or HTTP challenge.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Domain name to verify (e.g. example.com) | |
| channel | No | Verification channel (default: dns) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=false, so safety is partly covered. The description adds meaningful context beyond annotations: it creates a session, requires an authenticated Proof account, and implies a follow-up challenge step. It does not disclose what the session returns or how long it remains valid, so it is 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose in one tight sentence, with the auth prerequisite clearly separated in its own ACCESS block. Slightly longer than strictly necessary, but every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a session-starting tool with no output schema, the description covers what happens and who can call it, but omits the natural next steps (the resulting DNS/HTTP challenge and checking via check_user_domain_verification). An agent can call it correctly but cannot plan the full flow from this definition alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with a documented enum for channel, so the schema already carries the parameter burden. The description's mention of DNS or HTTP challenge maps to the channel enum but adds no syntax or format 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.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Start a ... domain verification session') and clarifies the mechanism (DNS or HTTP challenge). However, it does not differentiate from close siblings like start_domain_verification or start_domain_email_verification, which an agent would need help choosing between.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The ACCESS block gives real prerequisites (needs a Proof account, authenticate this client or sign in via start_login first), which is genuine when-to-use context. But it offers no guidance on when to pick this self-service flow over start_domain_verification or start_domain_email_verification, so tool selection among siblings 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.
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. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Verification ID | |
| code | Yes | The OTP or challenge code to submit |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnly=false and destructive=false, so the description carries the real burden and delivers: the out-of-band delivery precondition, the specific error code on unsupported pairs, and the account/auth requirement. This is well beyond what the annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then constraints, then alternative routing, then access. Dense but purposeful; the ACCESS paragraph is slightly verbose though it conveys distinct, needed information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-param mutation tool with no output schema, the description covers the accepted inputs, the failure mode, the authentication prerequisites, and where the same goal is achieved otherwise. 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters (id, code) are already documented and the description adds no syntax or format detail for them. The type/channel discussion clarifies surrounding semantics but those are not parameters of this tool, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 for a pending verification), then precisely narrows the accepted cases. It distinguishes itself from siblings by naming the exact situations it handles versus where completion happens elsewhere.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly lists when it applies (type email, type domain with channel email) and when it does not, including the exact failure (400 unsupported_for_type), and routes the agent to trigger_verification plus the phone/social/telegram completion paths. 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.
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. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Verification ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnlyHint=false and destructiveHint=false; the description adds meaningful extras beyond that — the pk_test_* key requirement, that it auto-completes without real OTP delivery, and an explicit authentication prerequisite with the note that start_login does NOT grant access. It stops short of saying what state change results on the verification object, but the added auth and mode constraints are substantial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and scope are front-loaded in the first sentence, and the ACCESS block is separated as its own labeled paragraph so it can be scanned independently. The auth instructions are slightly verbose but each line carries an actionable requirement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter test-only tool with no output schema, the description covers purpose, key-type restriction, and the authentication prerequisite an agent needs before calling. Nothing critical is missing, though a note on the resulting verification state would fully close the loop.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one parameter (id) with 100% schema description coverage, so the schema already documents it. The description adds no syntax, format, or source hints for the id 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.
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') and scopes it precisely with the test-mode and pk_test_* key constraint. That test-mode qualifier is what separates it from the many real verification siblings (trigger_verification, submit_verification_code), though no 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for when to reach for it: testing flows without real OTP delivery, and it explains the access prerequisite for opening the tool at all. It does not name alternatives or an explicit 'do not use in production' exclusion, but the test-mode scope makes that largely inferable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
trigger_verificationAInspect
Trigger a DNS/HTTP verification check for a pending domain verification.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Verification ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false (a non-read, non-destructive action), so the safety profile is covered. The description adds real value beyond that: the Proof-account requirement, the /mcp authentication flow, and the specific quirk that start_login will not unblock 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences that are front-loaded with the action and then the access caveat; every sentence earns its place. Slightly verbose in the parenthetical auth instructions but no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 could reasonably say more about what the check returns or whether repeated triggering is idempotent. It covers purpose, precondition, and auth, but leaves an agent guessing how this differs from the cluster of sibling verification tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 (id, 'Verification ID'), so the schema carries the semantics. The description adds nothing about the id (e.g., where it comes from or accepted format), making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (trigger) and resource (DNS/HTTP verification check) plus the precondition that the verification is pending. It does not differentiate from the many near-identical siblings such as check_domain_verification, verify_domain, start_domain_verification, or verify_domain_with_credentials, so an agent cannot tell which of these to pick from the text alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'for a pending domain verification' implies the precondition for use, and the ACCESS block explains the account/authentication prerequisite plus the notable exclusion that start_login does NOT open this tool. However, no alternative sibling is named and no explicit when-not guidance is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_circleADestructiveInspect
Update a Circle's name and/or owner name. Omitted fields are left unchanged; the profile/identity binding is create-only.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Circle ID | |
| name | No | New name for the Circle | |
| owner_name | No | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond the readOnlyHint=false/destructiveHint=true annotations by disclosing partial-update semantics (omitted fields unchanged), a create-only constraint on the profile/identity binding, and a concrete authentication requirement with remediation steps. It does not explain why the operation carries a destructive hint, but the added behavioral context is substantial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence front-loads the action and mutable fields, followed by concise behavioral notes and a clearly separated ACCESS block. Minor verbosity in the auth remediation, but every sentence carries usable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter mutation tool with no output schema, the description covers purpose, partial-update behavior, constraints, and authentication. Return-value information is the only notable omission, which is acceptable for a simple update.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the owner_name schema entry is richly documented (trimming, null-clearing, member-facing naming). The description references the same fields but adds little 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.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Update) and resource (a Circle's name and/or owner name), and explicitly scopes which fields are mutable. It distinguishes itself from siblings like update_profile or update_hitl by naming 'Circle', though it does not call out an alternative tool directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Omitted fields are left unchanged; the profile/identity binding is create-only' gives useful partial-update and constraint context, and the ACCESS block tells the agent when the tool is callable. However, there is no explicit when-to-use vs. when-not guidance against alternatives such as create_circle or update_profile.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_hitlADestructiveInspect
Update a HITL config. Can change name, channels, or timeout.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | HITL config ID | |
| name | No | New name (null to clear) | |
| channels | No | Updated channels | |
| timeout_seconds | No | Updated timeout in seconds (60–86400) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare destructiveHint=true, so the description does not need to repeat the safety profile. It adds useful authentication context, including the need for a Proof account and that start_login does not unlock this tool. It does not explain mutation semantics such as whether channels replace or merge, or what happens to omitted fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loads the primary purpose before the access requirement. Every sentence is relevant, though the field list is mildly redundant with the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a four-parameter update tool with full schema coverage, destructive annotations, and no output schema, the description covers purpose and authentication adequately. It leaves some mutation-specific behavior to the schema, but the 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.
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 id, name, channels, and timeout_seconds. The description only restates the mutable fields in prose and adds no syntax, format, or constraint details beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb and resource: update a HITL config, and names the mutable fields. It does not explicitly differentiate itself from siblings such as create_hitl, delete_hitl, get_hitl, or list_hitls, but the update verb is specific enough to distinguish it in practice.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies the tool is used to change an existing HITL config, and it gives an important authentication prerequisite. However, it does not state when to use this instead of create_hitl, delete_hitl, or get_hitl, nor does it describe any exclusions or partial-update conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_my_profileADestructiveInspect
Update the current user's primary profile. Supports display name, bio, avatar, theme, custom links, and verification display settings.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| bio | No | Profile bio | |
| theme | No | Profile theme settings | |
| is_public | No | Whether the profile is publicly visible | |
| avatar_url | No | Avatar (HTTPS URL or base64 data URI, null to remove) | |
| custom_links | No | Custom links (max 20) | |
| display_name | No | Display name | |
| show_proof_channels | No | Show proof channels | |
| show_verification_dates | No | Show verification dates |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=true, so the safety profile is already conveyed. The description adds the auth requirement but does not disclose what 'destructive' means here (e.g. replacing the theme object, removing custom links, null to drop avatar) or that the update is partial vs. full-replace. With annotations carrying the safety signal, this is a moderate addition.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and an enumerated field list, then a clearly separated access block. Slightly redundant that the field list duplicates schema properties, but each sentence earns its place and nothing is buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the mutation scope and the auth gate, which are the two things an agent most needs here. However, with destructiveHint=true and 8 optional params, it should clarify partial-update semantics and what gets overwritten/removed. No output schema, so return values need not be explained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already documents all 8 params, including nested theme fields and the null-to-remove avatar semantics. The description only re-lists field names that the schema already covers, adding no format or default-value detail beyond it. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: 'Update the current user's primary profile', and enumerates the supported fields (display name, bio, avatar, theme, custom links, verification display settings). This clearly distinguishes it from siblings like update_profile (likely arbitrary profile by ID/username) and update_profile_proofs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the access precondition and the authenticate flow, which is actionable context. But it never differentiates from update_profile or update_profile_proofs, so an agent has no explicit statement of when to use this self-scoped variant over the more general sibling. Clear context, no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_profileBDestructiveInspect
Update a profile by ID. Supports changing display info, email branding (theme, support email), theme, custom links, and verification display settings.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| bio | No | Profile bio | |
| theme | No | Profile theme settings | |
| is_public | No | Whether the profile is publicly visible | |
| avatar_url | No | Avatar (base64 or URL, null to remove) | |
| is_primary | No | Set as primary profile | |
| profile_id | Yes | Profile ID | |
| email_theme | No | Theme of this project's emails | |
| is_business | No | Whether this is a business profile | |
| custom_links | No | Custom links (max 20) | |
| display_name | No | Display name | |
| business_name | No | Business name | |
| support_email | No | Support email this project's messages show (null to remove) | |
| show_proof_channels | No | Show proof channels on public profile | |
| show_verification_dates | No | Show verification dates on public profile |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the mutation safety profile is covered. The description adds useful auth context ('start_login does NOT open this tool'), but does not explain partial-update semantics, whether omitted fields are preserved, or what 'destructive' means in practice.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core operation and field summary, then a separate access note. It is appropriately sized and avoids repeating schema details, though the field list sentence is slightly list-like.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 nested objects and no output schema, the description covers access and field groupings but omits partial-update behavior, null-removal semantics, and the meaning of omitted parameters. The 100% schema coverage fills param-level gaps, so the description is adequate but not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all 14 parameters are documented in the schema. The description only groups the updatable areas (display info, email branding, theme, custom links, verification display settings) without adding syntax, format, or default behavior beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Update) and resource (a profile) with scoping 'by ID', which implicitly distinguishes it from update_my_profile. It does not explicitly name the sibling alternative, but the purpose is clear from the first sentence.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an authentication prerequisite ('needs a Proof account... Authenticate... then call this tool again'), but it never says when to use this tool versus alternatives like update_my_profile or set_primary_profile. No when/when-not guidance or alternative routing is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_profile_proofsADestructiveInspect
Update which verified assets (proofs) are displayed on a specific profile. Controls visibility, privacy masking, ordering, and labels.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| proofs | Yes | Proofs to display on profile | |
| profile_id | Yes | Profile ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true, and the description hints at replacement semantics ('Update which verified assets are displayed') while adding genuinely useful auth context beyond the annotations. However, it never states what the destructive behavior actually is, e.g. whether proofs omitted from the list are removed or hidden, which is the single most important thing to know before calling 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose sentence, then a clearly separated ACCESS block. Efficient overall, though the access paragraph is slightly wordy for what amounts to one prerequisite plus one warning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation tool with no output schema, the description covers auth but omits the key operational detail: what happens to existing proofs not present in the supplied list, and what the result of the update looks like. Adequate but with a meaningful gap given the destructive hint.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both top-level parameters and every nested item field are already documented. The description's mention of visibility, masking, ordering, and labels loosely maps to the nested fields but adds no format, defaults, or semantics 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.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Update') and resource ('which verified assets (proofs) are displayed on a specific profile') and enumerates the controlled facets (visibility, privacy masking, ordering, labels). It does not explicitly distinguish itself from the very close sibling update_public_proofs or update_profile, so an agent could still 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear precondition for use: 'needs a Proof account. Authenticate this client... then call this tool again,' and explicitly warns that start_login does NOT open this tool. It stops short of saying when to prefer this over update_public_proofs or update_profile, so no alternative-routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_public_proofsBDestructiveInspect
Update which verified proofs are visible on the user's public profile, including visibility, masking, and display order.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
| proofs | Yes | Array of proof display configurations (max 50) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true, so the description should explain what is destroyed or replaced; it never says whether supplying the array overwrites prior proof configuration or merges with it. It does add useful auth context (needs a Proof account, start_login opens a session), which is genuine 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose sentence is front-loaded and dense, and the ACCESS block is separated out so it does not bury the purpose. Slightly verbose on the auth workflow but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A destructive mutation with no output schema needs more than purpose plus auth: the overwrite semantics and the fate of proofs omitted from the array are left unstated. The rich item schema compensates for parameter detail, but the mutation contract itself is incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the nested item schema already documents label, asset_id, is_visible, mask_level, and display_order. The description's field list mirrors the schema rather than adding semantics such as the max-50 cap or replace-vs-merge behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (update), resource (verified proofs on the user's public profile), and the fields affected (visibility, masking, display order). It just misses differentiation from the very similar sibling update_profile_proofs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use or when-not guidance, and a closely related sibling (update_profile_proofs) is never mentioned. The ACCESS block gives a conditional authentication procedure, which is actionable context but not tool-choice routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_settingsADestructiveInspect
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. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| webhook | No | Outbound webhook configuration. Deliveries carry an HMAC-SHA256 X-Proof-Signature over "<X-Proof-Timestamp>.<body>". | |
| proof_expiry_days | No | Default proof-token lifetime in days for newly issued proofs |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations flag a destructive write, and the description adds behavior beyond that: the signing secret is created on the first webhook set and is returned only when this call created or rotated it, so it must be recorded immediately. It also documents the auth precondition and warns that start_login won't unlock it, all of which the annotations do not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core verb and scope, then alternatives, then behavior, then access. Dense but essentially every sentence carries information; the ACCESS paragraph is slightly long but contains a genuinely non-inferable warning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 notes what the call returns (the signing secret, only on create/rotate). Combined with the access/auth prerequisites and sibling routing, an agent has everything needed to invoke this mutation correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with nested objects, so the schema already documents url, events, rotate_secret and proof_expiry_days in detail. The description only gestures at them at a high level ('the outbound webhook endpoint with its event subscriptions'), adding no syntax or constraint 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.
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 the exact scope: the outbound webhook endpoint with event subscriptions, plus the default proof lifetime. It explicitly distinguishes itself from the similarly-named update_profile sibling by noting branding belongs to each sub-account.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names a concrete alternative and the condition that selects it (branding → update_profile), and gives a clear prerequisite ('needs a Proof account… authenticate this client, then call this tool again'), including the non-obvious exclusion that start_login does NOT open this tool. It stops short of explicitly contrasting with get_settings for reading settings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_templateADestructiveInspect
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. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Template body text with variable placeholders | |
| channel | Yes | Message channel | |
| subject | No | Email subject line (email channel only) | |
| profile_id | No | The sub-account (project) to act on; omitted → your key's project, or the primary project for an account-wide key | |
| button_text | No | Button text (email channel only) | |
| message_type | Yes | Message type (e.g. verification_request, login_request) | |
| button_url_template | No | Button URL template with placeholders |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=true, so the write nature is covered. The description adds real context beyond that: it is an upsert that overwrites the project's default template for that channel/message type, and it discloses a specific failure mode (template_hardcoded_name) with its trigger. It does not say whether the change is reversible or how it interacts with a previously set custom template.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The operational sentence is front-loaded and the auth prerequisite follows, so the agent reads the important scoping first. The ACCESS block is slightly verbose, but every clause (authenticate first, start_login does not apply) carries actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a template-upsert tool with no output schema, the description covers scope, auth prerequisite, and a key validation rule. It leaves minor gaps around return values and whether the new template is effective immediately or needs preview/render to verify, 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.
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 adds meaning beyond the schema by tying channel and message_type to the template's targeting scope and by specifying that the brand placeholder must be {{business_name}} inside the body. It does not clarify subject/button field interactions beyond the schema's own 'email channel only' notes.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb set (create or update) plus resource (custom template) and narrows the scope to a single sub-account, channel, and message type. The phrase 'replacing the default for that project only' distinguishes it from account-wide default templates (get_default_templates) and from read-only siblings like get_template/list_templates. An agent can identify the upsert semantics even though the tool name says only 'update'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit prerequisite (needs a Proof account; authenticate first) and warns that start_login does not unlock this tool, which prevents a common wrong path. It also states a hard usage constraint (brand name must be written as {{business_name}}). It stops short of naming alternatives such as preview_template or get_default_templates for checking output before committing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_hitl_keysADestructiveInspect
Upload an encryption keypair for a HITL config. The server validates the RSA-4096 public key and computes the key ID. Note: the encrypted_private_key is already encrypted client-side with the user's password — the server never sees the password.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| hitl_id | Yes | HITL config ID | |
| kdf_salt | Yes | Base64url-encoded PBKDF2 salt | |
| public_key | Yes | PEM-encoded RSA-4096 SPKI public key | |
| encrypted_private_key | Yes | JSON-serialized encrypted private key envelope (PBKDF2-SHA256+AES-256-GCM) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=true; the description adds meaningful behavior beyond that — server-side RSA-4096 public key validation, key ID computation, and the crucial security fact that the private key is already client-side encrypted so the server never sees the password. It does not, however, explain what the destructiveHint actually destroys (e.g., whether it replaces previously uploaded keys).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then credentials/security notes, then an access paragraph. There's minor redundancy around the encryption point, but every sentence carries actionable content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-param, 4-required mutation tool with no output schema, the description covers purpose, auth prerequisites, and the security model. Its gaps are that it doesn't say what the computed key ID is returned as, or what happens to any pre-existing keys on re-upload.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 semantic value: it explains that encrypted_private_key is a client-side encrypted envelope for the user's password, which tells the agent the value must be produced before calling rather than raw key material.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 clarifies the scope of what the server does versus the client (validates the RSA-4096 public key, computes the key ID). It's easily distinguished from siblings like get_hitl_keys, delete_hitl_keys, create_hitl, and update_hitl.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete routing guidance: it requires a Proof account, tells the agent to authenticate then retry, and explicitly warns that start_login does NOT unlock this tool — a genuinely useful negative exclusion. It stops short of describing the prerequisite HITL config lifecycle (e.g., that a hitl_id from create_hitl must already exist) or the relationship to add/update key flows.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_proofARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| identifier | No | Optional: 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_token | Yes | The JWT proof token to validate |
TDQS
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.
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.
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.
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.
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.
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. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | Verification code | |
| session_id | Yes | 2FA session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false and destructiveHint=false; the description adds two substantive traits they don't cover: a rate limit of 10 attempts per minute and the authentication prerequisite. It omits failure behavior (invalid/expired code, lockout after the rate limit), which would be the natural next detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, followed by the rate limit and then the access block. Every element earns its place, though the capitalized ACCESS block is comparatively verbose for the amount of new information it carries.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter completion tool with no output schema, the description covers the auth path and the rate limit, which are the main operational unknowns. It leaves out code expiry and success/failure outcomes, a minor gap given the lack of a return schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters (code, session_id) are documented in the schema, so baseline is 3. The description adds nothing about code format or where session_id originates beyond the generic flow hint.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: submit a code to complete a 2FA challenge. This distinguishes it from start_2fa (which begins the flow) by using 'complete'. However, it never contrasts itself with the close siblings verify_2fa_magic_link or submit_verification_code, so an agent must infer the routing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear preconditions (a Proof account, an authenticated client or a start_login session) and the ordering constraint 'then call this tool again'. It does not mention alternatives such as wait_for_2fa or when not to use this tool, so it stops short of explicit routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_2fa_magic_linkAInspect
Complete a 2FA challenge using a magic link token (received via email). No code submission needed — the token itself is the proof.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes | Magic link token from the verification email |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false and destructiveHint=false; the description adds meaningful context beyond that — the token arrives via email, it is the sole proof (no separate code), and a session must exist first. It does not disclose token single-use/expiry semantics, 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short, front-loaded paragraphs with no filler; the core action leads and the access requirement follows. The redundant re-statement of the token's email origin is the only slight cost.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter verification tool with no output schema, the description covers the action, the credential source, and the prerequisite session/auth flow. It doesn't state what success yields (session established vs. challenge cleared), a minor gap for a tool whose whole point is a state change.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 fully documented ('Magic link token from the verification email'). The description's 'received via email' phrasing largely restates the schema, adding no format or source detail beyond it — baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb + resource ('Complete a 2FA challenge using a magic link token'), plus a clause that separates it from sibling code-submission tools: 'No code submission needed — the token itself is the proof.' An agent can route between this, verify_2fa, and submit_verification_code 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The ACCESS paragraph gives concrete when/how-to-use guidance (needs a Proof account; authenticate via /mcp or start_login, then call again), which is real operational routing. It stops short of explicitly naming an alternative for the code-based path (verify_2fa), leaving that contrast 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.
verify_delegationARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| card | No | The MCP server card or A2A agent card to read the delegation from | |
| token | No | A raw delegation token, when you already have it instead of a card | |
| delegate | Yes | The artifact identity you resolved independently. Required: this comparison is what defeats a copied token. | |
| check_status | No | Default 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_scopes | No | Capability scopes the delegation must grant | |
| expected_principal | Yes | Required. 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
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.
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.
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.
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.
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.
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_delegationsARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| items | Yes | 1-50 artifacts to verify in this call, each shaped like a verify_delegation call |
TDQS
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.
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.
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.
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.
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.
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. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Domain ID to verify |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnlyHint=false and destructiveHint=false, so the description adds real value by disclosing the authentication prerequisite and the fact that this is an action that kicks off a verification process. It does not disclose idempotency, rate limits, or whether the operation is asynchronous and needs polling, which would be the next useful layer.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first sentence and the access prerequisite follows in a compact, clearly separated block. Slightly more verbose than strictly needed, but every sentence carries information and nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 purpose and auth adequately, but it omits the obvious follow-up context in a crowded verification toolset: whether calling this is synchronous, and whether the agent should subsequently call check_domain_verification/check_domain_email_status to observe the result. That gap matters given the sibling list.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single required parameter (id: Domain ID to verify) with 100% schema description coverage, so the schema fully documents it. The description adds no format, syntax, or sourcing detail (e.g., where to obtain the domain ID) beyond what the schema already says, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 (DNS records or other method) plus the goal (confirm ownership). However, it does not distinguish itself from close siblings like start_domain_verification, check_domain_verification, or verify_domain_with_credentials, so an agent cannot tell the trigger apart from the check or the credential path 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The ACCESS block is genuine operational guidance: it names the required Proof account and gives two concrete ways to satisfy authentication (/mcp authenticate or start_login). But there is no when-to-use guidance relative to the many sibling verification tools (start_* vs check_* vs verify_domain_with_credentials), 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.
verify_domain_with_credentialsAInspect
Verify a pending domain using previously stored DNS credentials. Use when credentials are already connected.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Domain ID to verify |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare it as non-read-only and non-destructive. The description adds genuinely useful context: a Proof account is required, the client may need authentication, start_login opens a session for this tool, and the call must be repeated afterward. It still omits what happens on success/failure (state transition of the domain, error when no credentials are stored).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose in the first sentence, then a clearly labeled ACCESS block. Every sentence carries information; the only minor wrinkle is the slightly convoluted phrasing about the session opening the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter mutation with no output schema, the description covers purpose, precondition, and auth flow well. It leaves a gap on return/error behavior and the fallback when credentials are absent, which an agent would benefit from given the dense set of domain-verification siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 fully documented as 'Domain ID to verify'. The description adds no format, source, or lookup guidance for that ID beyond what the schema already says, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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) and qualifies the mechanism with 'using previously stored DNS credentials', which separates it from the credential-less sibling verify_domain. It stops short of naming that sibling explicitly, so the differentiation is implicit 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.
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 triggering precondition, and the ACCESS paragraph spells out the authentication prerequisite and the follow-up call pattern. It does not name the alternative path (e.g. verify_domain) or state when this tool should NOT be used.
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. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | OTP code received via email | |
| session_id | Yes | Add-email session ID |
TDQS
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 genuinely useful context beyond that: it will 'complete the add-email flow' on correct input and requires an authenticated Proof session. It omits failure behavior (wrong/expired code) and rate limits, but for a low-risk mutation it covers the important traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sections: the action sentence is front-loaded and the ACCESS block follows logically. Every sentence is functional, though the authentication aside is somewhat dense and could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-parameter mutation with no output schema, the description covers purpose, flow completion, and authentication prerequisites. It does not state what the tool returns or what happens to the email on success/failure, leaving a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are documented in the schema ('OTP code received via email', 'Add-email session ID'). The description adds no syntax or format 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.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ('Submit the OTP code to verify an email addition') and anchors it to a named flow ('add-email flow'), so an agent knows it completes a two-step email-add sequence. It does not explicitly distinguish itself from adjacent siblings like submit_verification_code or verify_2fa, which is the only reason 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear operational context: the code comes from email, the session is an add-email session, and the tool finalizes the flow when correct. The ACCESS block explicitly explains prerequisites (Proof account, authentication via /mcp or start_login) and the re-call requirement. It stops short of explicitly naming when to choose it over submit_verification_code, so not a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wait_for_2faARead-onlyInspect
Poll a 2FA session until the user completes the challenge. Uses exponential backoff (2s initial, 1.5x, 30s max) with jitter.
Agent usage: Call this after start_2fa with the returned session_id. Terminal states: "verified" (challenge completed — proceed with the protected operation), "expired" (offer to restart with start_2fa). Before polling, present start_2fa's challenge: pass its deep_link to render_auth_link on telegram/whatsapp, or show its sms_message on sms.
The user does not see tool results — most clients fold them away, render_auth_link's output included. Before you wait or poll, put what the user must act on into your own reply text: the link itself (not a sentence announcing it), the SMS text and number, or a note to check their inbox.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | 2FA session ID from start_2fa | |
| timeout_seconds | No | Maximum 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
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Far beyond the single readOnlyHint annotation, the description discloses the polling strategy (exponential backoff, 2s initial, 1.5x, 30s max, jitter), the terminal states and their meaning, the timeout behavior ('status "pending"', re-call with same id), and the auth requirement. This is exactly the operational context an agent needs before committing to a long-poll.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action and backoff are front-loaded in the first two sentences, followed by clearly separated 'Agent usage' and rendering guidance. It is long (four paragraphs) and the 'user does not see tool results' point is restated, but nearly every sentence carries actionable instruction rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and only a readOnlyHint annotation, the description carries the full burden and does so: it covers sequencing, terminal states, timeout/resume behavior, authentication, and the cross-tool rendering step with render_auth_link. An agent can drive the whole 2FA flow from this text.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both session_id and timeout_seconds (default, max, client-timeout interaction, re-call semantics) are already documented in the schema. The description adds no parameter-level detail beyond what the schema 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.
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 ('Poll a 2FA session until the user completes the challenge'), which cleanly separates it from status-readers like get_2fa_status and verifiers like verify_2fa. 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly names the prerequisite ('Call this after start_2fa with the returned session_id'), the terminal states and the follow-up action for each ('expired' → restart with start_2fa), plus an access caveat ('start_login does NOT open this tool'). What's missing is any routing against the non-blocking alternative get_2fa_status for an agent that doesn't want to wait.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wait_for_account_creationARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Account session id from create_account | |
| timeout_seconds | No | Maximum 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
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.
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.
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.
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.
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.
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_discoveryARead-onlyInspect
Poll a chat ID discovery token until the user interacts with the Telegram bot. Uses exponential backoff (2s initial, 1.5x, 30s max) with jitter.
Agent usage: Call this after create_chat_id_discovery. Present the discovery response's deep_link with render_auth_link first, then poll with the returned token. Terminal states: "completed" (chat_id discovered — use it when creating a HITL config with a Telegram channel), "expired". While "pending", the user has not yet opened the Telegram link.
The user does not see tool results — most clients fold them away, render_auth_link's output included. Before you wait or poll, put what the user must act on into your own reply text: the link itself (not a sentence announcing it), the SMS text and number, or a note to check their inbox.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes | Discovery token from create_chat_id_discovery | |
| timeout_seconds | No | Maximum 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
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only readOnlyHint=true in annotations, the description carries real behavioral weight: exponential backoff parameters (2s, 1.5x, 30s max, jitter), the pending/completed/expired state machine, timeout semantics, and the non-obvious caveat that users cannot see tool results so the agent must surface the link itself. This is exactly the context 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and polling mechanics, then usage sequence, then the client-rendering caveat. It is somewhat long, and the SMS/number/inbox examples drift beyond this tool's Telegram scope, but every paragraph is purposeful and the ordering is sound.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 documents terminal states, the pending case, retry-on-timeout behavior, and the auth prerequisite (Proof account, /mcp authentication, and that start_login does not open this tool). 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already explains both token and timeout_seconds thoroughly, including the 60s client-timeout warning. The description only restates 'poll with the returned token', 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.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Poll a chat ID discovery token until the user interacts with the Telegram bot'), which is far better than a tautology. However, it never distinguishes itself from the sibling poll_chat_id_discovery, which appears to do something very similar, so an agent cannot tell them apart from the text alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear call sequence: use after create_chat_id_discovery, present deep_link via render_auth_link first, then poll with the returned token. It also enumerates terminal states ('completed', 'expired') and what 'pending' means. It stops short of saying when to prefer this over poll_chat_id_discovery, which is the one ambiguity left.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wait_for_confirmationARead-onlyInspect
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. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Confirmation ID from create_confirmation | |
| timeout_seconds | No | Maximum 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
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint, so the description carries the burden and delivers: backoff schedule (2s initial, 1.5x, 30s max, jitter), terminal vs pending state meanings, the fact that no link is returned, and the auth prerequisite (Proof account; start_login does not open this tool). The only gap is that it never restates the timeout behaviour of the poll loop returning 'pending' plus re-call semantics are covered in the schema rather than here.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose and backoff, then usage, then auth. Efficient overall, but the get_confirmation_approval_link digression is long and syntactically tangled ('it needs the confirmation to be still pending — the state this tool waits in — and also refuses once timeout_at has passed'), costing clarity for content that serves a sibling tool more than this one.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 must describe returns, and it does: terminal states 'approved' (with proof_token check) and 'denied', plus 'pending'. Combined with auth requirements and re-call guidance, 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (id, timeout_seconds) are already fully documented in the schema, including the default/max and client-timeout caveat. The description adds no parameter detail beyond what the schema provides, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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'), which cleanly separates it from sibling one-shot readers like get_confirmation and list_confirmations. The name plus first sentence tell an agent exactly what operation this is.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to call it ('Call this after create_confirmation with the returned confirmation ID') and names the alternative get_confirmation_approval_link with the condition that selects it (approver needs a link, confirmation still pending, timeout_at not passed). This is genuine 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.
wait_for_loginARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Auth session ID from start_login | |
| timeout_seconds | No | Maximum 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
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.
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.
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.
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.
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.
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_requestARead-onlyInspect
Poll a verification request until it reaches a terminal state (completed, expired, or cancelled). Uses exponential backoff (2s initial, 1.5x, 30s max) with jitter.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Verification request ID to poll | |
| timeout_seconds | No | Maximum 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
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnlyHint annotation by disclosing the polling algorithm (exponential backoff, 2s initial, 1.5x, 30s max, jitter), the auth prerequisite, and the timeout return behavior (status 'pending', retry with same id). These are exactly the operational traits an agent needs before invoking a long-poll tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and terminal states, followed by concise backoff and access notes. The access paragraph is slightly verbose but justified since it warns against confusing this with start_login.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read tool with no output schema, the description covers behavior, auth, and timeout recovery adequately. It could be marginally stronger by stating what a terminal-state response contains, but the polling contract is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already documents the id and timeout_seconds semantics in richer detail than the description. The description restates terminal states but adds no parameter-level meaning beyond what is structured, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (poll) plus resource (verification request) and the exact terminal conditions it waits for (completed, expired, cancelled). This clearly separates it from sibling read tools like get_verification_request or list_verification_requests.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear context for use (waiting for a request to finish) and explicitly tells the agent what to do on timeout (re-call with the same identifier). It does not name alternate siblings such as wait_for_verification or get_verification_request, so the 'vs alternatives' clause is absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wait_for_sessionARead-onlyInspect
Poll a session until it reaches a terminal state (verified, failed, or expired). Uses exponential backoff (2s initial, 1.5x, 30s max) with jitter.
Before calling this for a challenge you created, make sure your reply text already shows the user what to act on — the link itself, the SMS text and number, or a note to check their inbox; a link that appeared only in a tool result is one they never saw.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Session ID to poll | |
| timeout_seconds | No | Maximum 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
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true; the description adds real behavioral detail beyond that: exponential backoff with jitter (2s/1.5x/30s cap), the fact that a timeout returns status "pending" rather than erroring, and that a Proof account is required with explicit auth steps. It does not describe the shape of the terminal-state payload, which is the one remaining gap given there is no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short paragraphs, front-loaded with purpose then the operational caveat then access. Every sentence is load-bearing, though the pre-call reply-text instruction is verbose enough that it could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, polling mechanics, timeout/retry behavior, auth gating, and the user-visibility ordering constraint — enough to call it correctly without an output schema. Only the terminal payload contents are left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the timeout_seconds description already carries the default/max and the client-timeout warning, so the description adds little parameter-level meaning beyond what the schema provides. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (poll) and resource (a session) plus the exact terminal states it resolves on (verified, failed, expired), which separates it from the non-blocking get_session and from the many other wait_for_* siblings that target logins, verifications, or requests.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear preconditions for calling it (must already be authenticated; must have surfaced the link/SMS/inbox note in the reply text before waiting) and sequencing on timeout. It never names the non-blocking alternative (get_session) or says when not to block, 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.
wait_for_verificationARead-onlyInspect
Poll a verification until it reaches a terminal state (verified, failed, expired, revoked, or cancelled). Uses exponential backoff (2s initial, 1.5x, 30s max) with jitter.
A multi-channel verification that lost the race is "cancelled" and one whose proof was withdrawn is "revoked"; both are final, so the wait returns rather than polling on.
Before calling this for a challenge you created, make sure your reply text already shows the user what to act on — the link itself, the SMS text and number, or a note to check their inbox; a link that appeared only in a tool result is one they never saw.
ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Verification ID to poll | |
| timeout_seconds | No | Maximum 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
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only assert readOnlyHint=true, and the description stays consistent with that while adding substantial behavior: exponential backoff parameters (2s, 1.5x, 30s max) with jitter, the pending response on timeout with an instruction to re-call with the same id, and the finality of cancelled/revoked. The access/authentication requirement is also spelled out, which annotations do not cover.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the poll-until-terminal behavior before the semantics and access notes. Each paragraph earns its place, but the middle paragraph's shrug-style aside on cancelled/revoked is a little verbose relative to the rest.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 defining the terminal states and the timeout return value (status 'pending'), plus auth prerequisites. An agent has everything needed to call it correctly and to interpret what comes back.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the timeout_seconds schema text already carries the default, max, and client-timeout caveat, so the description adds no parameter meaning 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.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (poll) and resource (a verification) and enumerates the exact terminal states it waits for, so an agent can distinguish it from non-blocking siblings like get_verification or get_multi_channel_verification_status. The cancelled/revoked clarification further sharpens what 'terminal' means here.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for when to block on a verification and warns that a lost-race verification becomes cancelled, so the wait returns. It also carries a prerequisite about surfacing the link/SMS text to the user before calling, and notes start_login does NOT open this tool. It never explicitly contrasts with the non-blocking get_verification / get_proof_status alternatives, 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.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
13 tool updates
- Changed
create_profile2 fields changed- added
Input schema / properties / email_themeAdded value: +{ + "description": "Theme of this project's emails", + "enum": [ + "dark", + "light" + ], + "type": "string" +} - added
Input schema / properties / support_emailAdded value: +{ + "description": "Support email this project's messages show", + "format": "email", + "maxLength": 254, + "type": "string" +}
- Removed
delete_profile_template - Changed
delete_template1 field changed- added
Input schema / properties / profile_idAdded 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" +}
- Changed
get_template1 field changed- added
Input schema / properties / profile_idAdded 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" +}
- Removed
list_profile_templates - Changed
list_templates2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / profile_idAdded 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" +}
- Removed
preview_profile_template - Changed
preview_template1 field changed- added
Input schema / properties / profile_idAdded 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" +}
- Changed
render_template1 field changed- added
Input schema / properties / profile_idAdded 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" +}
- Changed
update_profile2 fields changed- added
Input schema / properties / email_themeAdded value: +{ + "description": "Theme of this project's emails", + "enum": [ + "dark", + "light" + ], + "type": "string" +} - added
Input schema / properties / support_emailAdded 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)" +}
- Removed
update_profile_template - Changed
update_settings1 field changed- removed
Input schema / properties / brandingRemoved 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" -}
- Changed
update_template1 field changed- added
Input schema / properties / profile_idAdded 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" +}
1 tool update
- Removed
claim_request_assets
4 tool updates
- Added
delete_domain_verification - Changed
export_data2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / export_idAdded value: +{ + "description": "Read this export's status instead of the latest one", + "pattern": "^[a-f0-9]{24}$", + "type": "string" +}
- Changed
start_2fa2 fields changed- changed
Input schema / properties / action_type / enumPrevious 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" +] - added
Input schema / properties / targetsAdded 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" +}
- Changed
start_2fa_for_action3 fields changed- changed
Input schema / properties / action_type / descriptionPrevious 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." - changed
Input schema / properties / action_type / enumPrevious 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" +] - added
Input schema / properties / targetsAdded 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" +}
2 tool updates
- Changed
create_user_request23 fields changed- added
Input schema / properties / action_context / additionalPropertiesAdded value: +false - changed
Input schema / properties / action_context / descriptionPrevious 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\" }" - added
Input schema / properties / action_context / propertiesAdded 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" + } +} - changed
Input schema / properties / action_context / typePrevious value: -"string"New value: +"object" - changed
Input schema / properties / action_type / descriptionPrevious value: -"Purpose of the request (default: verification)"New value: +"Purpose of the request (default: verification); custom and confirmation also need an action_context title" - changed
Input schema / properties / action_type / enumPrevious value: -[ - "verification", - "onboarding", - "compliance" -]New value: +[ + "verification", + "2fa", + "login", + "custom", + "confirmation", + "authorization" +] - changed
Input schema / properties / assets / descriptionPrevious value: -"Asset type identifiers to request (e.g. email, phone, identity)"New value: +"Assets to request, e.g. [{ \"type\": \"email\" }, { \"type\": \"phone\", \"required\": false }]" - added
Input schema / properties / assets / items / additionalPropertiesAdded value: +false - added
Input schema / properties / assets / items / propertiesAdded 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" + } +} - added
Input schema / properties / assets / items / requiredAdded value: +[ + "type" +] - changed
Input schema / properties / assets / items / typePrevious value: -"string"New value: +"object" - changed
Input schema / properties / callback_url / descriptionPrevious value: -"Webhook URL for request status updates"New value: +"HTTPS webhook URL for request status updates" - added
Input schema / properties / callback_url / maxLengthAdded value: +2000 - added
Input schema / properties / callback_url / patternAdded value: +"^https:\\/\\/" - changed
Input schema / properties / expires_in_hours / descriptionPrevious value: -"Hours until request expires (default: 24)"New value: +"Hours until request expires (default: 168, i.e. 7 days)" - added
Input schema / properties / public_profile_id / patternAdded value: +"^[0-9a-fA-F]{24}$" - changed
Input schema / properties / redirect_url / descriptionPrevious value: -"URL to redirect the subject after completing the request"New value: +"HTTPS URL to redirect the subject after completing the request" - added
Input schema / properties / redirect_url / maxLengthAdded value: +2000 - added
Input schema / properties / redirect_url / patternAdded value: +"^https:\\/\\/" - added
Input schema / properties / reference_id / maxLengthAdded value: +255 - added
Input schema / properties / reference_id / minLengthAdded value: +1 - changed
Input schema / properties / validity_requirement / descriptionPrevious 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\"" - added
Input schema / properties / validity_requirement / patternAdded value: +"^\\d+[hdwm]$"
- Changed
create_verification_request1 field changed- changed
Input schema / properties / expires_in / descriptionPrevious 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)"
2 tool updates
- Changed
create_circle1 field changed- added
Input schema / properties / owner_nameAdded 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." +}
- Changed
update_circle1 field changed- added
Input schema / properties / owner_nameAdded 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." +}
6 tool updates
- Removed
add_challenger - Changed
create_identity_challenge6 fields changed- removed
Input schema / properties / challenger_idRemoved value: -{ - "description": "Enrolled challenger initiating the check", - "pattern": "^[0-9a-fA-F]{24}$", - "type": "string" -} - added
Input schema / properties / circle_idAdded value: +{ + "description": "Circle that holds the member", + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" +} - removed
Input schema / properties / hitl_idRemoved value: -{ - "description": "HITL config that holds the challenger", - "pattern": "^[0-9a-fA-F]{24}$", - "type": "string" -} - added
Input schema / properties / member_idAdded value: +{ + "description": "Enrolled Circle member initiating the check", + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" +} - changed
Input schema / properties / suspicious_channel / descriptionPrevious 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" - changed
Input schema / requiredPrevious value: -[ - "hitl_id", - "challenger_id" -]New value: +[ + "circle_id", + "member_id" +]
- Removed
invite_challenger - Removed
list_challengers - Removed
remove_challenger - Removed
trigger_drill
1 tool update
- Changed
create_confirmation2 fields changed- changed
Input schema / properties / message / descriptionPrevious 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." - changed
Input schema / properties / message / maxLengthPrevious value: -2000New value: +10000
176 tool updates
- First observed
add_challenger - First observed
add_circle_member - First observed
add_circle_member_channel - First observed
add_domain - First observed
add_verification_provider - First observed
cancel_user_request - First observed
cancel_verification_request - First observed
check_domain_credentials - First observed
check_domain_email_status - First observed
check_domain_verification - First observed
check_user_domain_verification - First observed
claim_request_assets - First observed
claim_username - First observed
confirm_domain_email_code - First observed
connect_cloudflare - First observed
connect_dns_provider - First observed
connect_godaddy - First observed
create_account - First observed
create_api_key - First observed
create_authorization - First observed
create_chat_id_discovery - First observed
create_circle - First observed
create_circle_member_drill - First observed
create_confirmation - First observed
create_delegation - First observed
create_dns_credential - First observed
create_hitl - First observed
create_identity_challenge - First observed
create_multi_channel_verification - First observed
create_profile - First observed
create_session - First observed
create_user_request - First observed
create_verification - First observed
create_verification_request - First observed
delete_circle - First observed
delete_dns_credential - First observed
delete_domain - First observed
delete_hitl - First observed
delete_hitl_keys - First observed
delete_profile - First observed
delete_profile_template - First observed
delete_template - First observed
export_authorizations - First observed
export_data - First observed
extend_request - First observed
get_2fa_status - First observed
get_add_email_status - First observed
get_add_phone_status - First observed
get_api_key_usage - First observed
get_asset - First observed
get_authorization - First observed
get_circle - First observed
get_confirmation - First observed
get_confirmation_approval_link - First observed
get_current_user - First observed
get_default_templates - First observed
get_delegation - First observed
get_dns_providers - First observed
get_domain - First observed
get_hitl - First observed
get_hitl_keys - First observed
get_identity_challenge - First observed
get_multi_channel_verification_status - First observed
get_my_profile - First observed
get_platform_summary - First observed
get_profile - First observed
get_profile_assets - First observed
get_proof_status - First observed
get_request_by_reference - First observed
get_request_proofs - First observed
get_self_api_key - First observed
get_session - First observed
get_settings - First observed
get_subscription - First observed
get_template - First observed
get_usage - First observed
get_user_domain_verification_status - First observed
get_verification - First observed
get_verification_request - First observed
get_verified_user - First observed
get_webhook_delivery - First observed
get_webhook_stats - First observed
invite_challenger - First observed
invite_circle_member - First observed
list_api_keys - First observed
list_assets - First observed
list_auth_sessions - First observed
list_authorizations - First observed
list_challengers - First observed
list_circle_member_channels - First observed
list_circle_members - First observed
list_circles - First observed
list_confirmations - First observed
list_delegations - First observed
list_dns_credentials - First observed
list_domains - First observed
list_emails - First observed
list_hitls - First observed
list_incoming_requests - First observed
list_my_requests - First observed
list_phones - First observed
list_profile_templates - First observed
list_profiles - First observed
list_revoked_proofs - First observed
list_templates - First observed
list_verification_requests - First observed
list_verifications - First observed
list_verified_users - First observed
list_webhook_deliveries - First observed
poll_chat_id_discovery - First observed
preview_profile_template - First observed
preview_template - First observed
regenerate_api_key - First observed
remove_challenger - First observed
remove_circle_member - First observed
remove_circle_member_channel - First observed
remove_email - First observed
remove_phone - First observed
render_auth_link - First observed
render_template - First observed
request_hitl_authorization - First observed
resend_domain_email - First observed
resend_email_otp - First observed
resend_verification - First observed
retry_webhook_delivery - First observed
revoke_api_key - First observed
revoke_asset - First observed
revoke_auth_session - First observed
revoke_authorization - First observed
revoke_delegation - First observed
revoke_proof - First observed
search - First observed
send_account_email - First observed
set_primary_email - First observed
set_primary_phone - First observed
set_primary_profile - First observed
setup_domain_email - First observed
share_request_email - First observed
start_2fa - First observed
start_2fa_for_action - First observed
start_add_email - First observed
start_add_phone - First observed
start_domain_email_verification - First observed
start_domain_verification - First observed
start_login - First observed
start_user_domain_verification - First observed
submit_verification_code - First observed
test_verify - First observed
trigger_drill - First observed
trigger_verification - First observed
update_circle - First observed
update_hitl - First observed
update_my_profile - First observed
update_profile - First observed
update_profile_proofs - First observed
update_profile_template - First observed
update_public_proofs - First observed
update_settings - First observed
update_template - First observed
upload_hitl_keys - First observed
validate_proof - First observed
verify_2fa - First observed
verify_2fa_magic_link - First observed
verify_delegation - First observed
verify_delegations - First observed
verify_domain - First observed
verify_domain_with_credentials - First observed
verify_email_otp - First observed
wait_for_2fa - First observed
wait_for_account_creation - First observed
wait_for_chat_id_discovery - First observed
wait_for_confirmation - First observed
wait_for_login - First observed
wait_for_request - First observed
wait_for_session - First observed
wait_for_verification
Publisher details
- Operator
- UAB "LT telekomunikacijos" · Publisher source
- Operator website
- https://proof.holdings
- Vendor relationship
- First-party
- Documentation
- https://proof.holdings/docs/mcp
- Trust center
- https://proof.holdings/compliance
- Restrictions
- No paid plan or admin approval required. Keyless tools (account bootstrap, login, proof and delegation verification) work without an account; the others ask you to sign in with a Proof account (OAuth in the browser) on first use.
Related MCP Connectors
Verified, pay-per-use API tools for AI agents through one authenticated connection.
Command your AI agents: verifiable passports, credential injection, full audit, revoke in 60s.
Context and control for any AI. Agent identity, scoped access, and proof across tools.
Your AI and another company's AI on one signed line. People approve; nobody shares logins.
Related MCP Servers
AlicenseNot gradedqualityBmaintenanceEnables AI agents to send, receive, verify, approve, and delegate signed, proof-carrying requests across organisations using delegation chains, replay protection, quorum approvals, and tamper-evident receipts.Apache 2.0- AlicenseAqualityAmaintenanceIdentity infrastructure for the agent economy. Mint an agent ~handle in two free calls with no human account, then verify anyone and read inferred traits under the consent the person set in advance.1652 npmApache 2.0
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to perform pay-per-call security verification of wallets, tokens, contracts, dApps, agents, and more via a remote endpoint with no installation.2MIT
- AlicenseBqualityBmaintenanceEnables agents and apps to verify end-user identity through company API keys, human login links with multi-channel notifications, OIDC client registration, and budget-aware billing.131MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.