Skip to main content
Glama
@proof-holdings/mcp-server

@proof-holdings/mcp-server

Official

create_verification_request

Create a single verification request for up to 10 assets—phone, email, domain, social, wallet, account, or Telegram bot—so multiple checks run in one flow.

Instructions

Create a multi-asset verification request. Allows verifying multiple assets (phone, email, domain, social, wallet, account, telegram_bot) in a single flow.

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

Input Schema

NameRequiredDescriptionDefault
assetsYesArray of assets to verify (1-10)
expires_inNoRequest expiry in seconds (default: 604800, i.e. 7 days; max: 2592000, i.e. 30 days)
partial_okNoAllow partial completion (default: false)
action_typeNoPurpose of the verification (default: verification)
callback_urlNoWebhook URL for status updates (HTTPS only)
redirect_urlNoURL to redirect user after verification completes (HTTPS only)
reference_idNoYour unique reference ID for this request
action_contextNoContext displayed to user during verification
proof_expiry_daysNoPer-request proof expiry override in days (7, 30, 90, or 365)
public_profile_idNoPublic profile ID for branding
validity_requirementNoHow fresh an existing proof must be to count, as <n>h, <n>d, <n>w or <n>m (e.g. "7d")

Output Schema

NameRequiredDescriptionDefault
idNoMongoDB ObjectId
assetsNo
statusNoStatus of a verification request
progressNo
created_atNo
expires_atNo
partial_okNo
updated_atNo
action_typeNoType of action for verification request or authorization
callback_urlNoThe webhook URL set on the request, if any
completed_atNo
redirect_urlNo
reference_idNo
action_contextNoThe action the person is asked to authorize; null when the request carries none
computed_stateNoAdditive machine-readable effective state: re-derives expiry from expires_at (never trusts the stored status). BOTH `is_expiring_soon` and `next_action` are role-aware — `next_action.role` says which side this envelope was computed for, and the two fields are consistent within it. Present only on authenticated owner/requester and recipient responses; absent on public/third-party surfaces.
verification_urlNoURL for the verification flow
validity_requirementNoRequired proof freshness as set on the request (e.g. "7d"); null when none was set

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed11 schema fields changedv1.7.2
    • removedInput schema / additionalProperties
      Removed value: -false
    • removedInput schema / properties / action_context / additionalProperties
      Removed value: -false
    • removedInput schema / properties / assets / items / additionalProperties
      Removed value: -false
    • removedInput schema / properties / assets / items / properties / allowed_channels / items / $ref
      Removed value: -"#/properties/assets/items/properties/channel"
    • addedInput schema / properties / assets / items / properties / allowed_channels / items / enum
      Added value: +[
      +  "whatsapp",
      +  "telegram",
      +  "sms",
      +  "email",
      +  "dns",
      +  "http",
      +  "auto",
      +  "github",
      +  "google",
      +  "facebook",
      +  "x",
      +  "linkedin",
      +  "instagram",
      +  "youtube",
      +  "tiktok",
      +  "ethereum",
      +  "solana",
      +  "bitcoin",
      +  "coinbase",
      +  "kraken",
      +  "telegram_bot_token"
      +]
    • addedInput schema / properties / assets / items / properties / allowed_channels / items / type
      Added value: +"string"
    • addedInput schema / properties / expires_in / maximum
      Added value: +9007199254740991
    • addedInput schema / properties / proof_expiry_days / maximum
      Added value: +9007199254740991
    • addedInput schema / properties / proof_expiry_days / minimum
      Added value: +-9007199254740991
    • addedInput schema / properties / validity_requirement
      Added value: +{
      +  "description": "How fresh an existing proof must be to count, as <n>h, <n>d, <n>w or <n>m (e.g. \"7d\")",
      +  "pattern": "^\\d+[hdwm]$",
      +  "type": "string"
      +}
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "http://json-schema.org/draft-07/schema#",
      +  "additionalProperties": {},
      +  "properties": {
      +    "action_context": {
      +      "description": "The action the person is asked to authorize; null when the request carries none"
      +    },
      +    "action_type": {
      +      "description": "Type of action for verification request or authorization"
      +    },
      +    "assets": {},
      +    "callback_url": {
      +      "description": "The webhook URL set on the request, if any"
      +    },
      +    "completed_at": {},
      +    "computed_state": {
      +      "description": "Additive machine-readable effective state: re-derives expiry from expires_at (never trusts the stored status). BOTH `is_expiring_soon` and `next_action` are role-aware — `next_action.role` says which side this envelope was computed for, and the two fields are consistent within it. Present only on authenticated owner/requester and recipient responses; absent on public/third-party surfaces."
      +    },
      +    "created_at": {},
      +    "expires_at": {},
      +    "id": {
      +      "description": "MongoDB ObjectId"
      +    },
      +    "partial_ok": {},
      +    "progress": {},
      +    "redirect_url": {},
      +    "reference_id": {},
      +    "status": {
      +      "description": "Status of a verification request"
      +    },
      +    "updated_at": {},
      +    "validity_requirement": {
      +      "description": "Required proof freshness as set on the request (e.g. \"7d\"); null when none was set"
      +    },
      +    "verification_url": {
      +      "description": "URL for the verification flow"
      +    }
      +  },
      +  "type": "object"
      +}
  2. Changed1 schema field changedv1.6.0
    • changedInput schema / properties / expires_in / description
      Previous value: -"Request expiry in seconds (default: 86400, max: 604800)"New value: +"Request expiry in seconds (default: 604800, i.e. 7 days; max: 2592000, i.e. 30 days)"
  3. First observedv1.1.0

TDQS

A3.8/5.0
Behavior4/5

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

Annotations only declare readOnlyHint=false and destructiveHint=false, so the description's disclosure of an authentication/setup precondition that blocks invocation is valuable context beyond the schema. It stops short of explaining request lifecycle behavior (expiry, proof issuance, webhook firing), but the output schema covers the return shape.

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

Conciseness4/5

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

Two compact paragraphs with the capability statement front-loaded and the access precondition isolated for easy scanning. No redundant filler, though the ACCESS block is slightly verbose for a single setup instruction.

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

Completeness3/5

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

For an 11-parameter nested tool the description is thin, but the schema is fully documented and an output schema exists, so the description's remaining duty is routing. It never distinguishes this tool from the many sibling creation/cancellation/status tools, which leaves ambiguity for a large toolset.

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

Parameters3/5

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

Schema description coverage is 100%, so every one of the 11 parameters including the nested asset object is already documented in the schema. The description adds no syntax, defaults, or constraints beyond restating the asset-type list that is already the enum, so baseline 3 applies.

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

Purpose4/5

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

The description names a specific verb and resource ('Create a multi-asset verification request') and enumerates the seven asset types it covers, so an agent knows exactly what the tool produces. It is not explicitly differentiated from close siblings like create_verification or create_multi_channel_verification, which is the main clarity gap.

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

Usage Guidelines4/5

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

It supplies a real prerequisite ('needs a Proof account. Set PROOF_API_KEY and restart this server') and explicitly rules out a tempting but wrong path ('start_login does NOT open this tool'), which is genuine when-not guidance. It still doesn't say when to prefer this over the other request-creation siblings.

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

Deploy Server

Other Tools