Skip to main content
Glama

verify_wallet_transfer

Submit a transaction hash for the dust/test transfer verification method — the other way to prove ownership of a crypto wallet so its balance counts toward a crypto Proof of Funds letter. The test transfer is a tiny amount the user sends from their own wallet purely to prove ownership; it is not a payment toward a property, and this tool does not move funds. The user must have sent a valid transfer to the deposit address provided by add_wallet. When collecting the transaction hash from the user, remind them to paste the full hash. HASH FORMAT: a real tx hash is 64 hex characters (Bitcoin/TRON/XRP), 0x + 64 hex (Ethereum/Polygon/BSC/Base/Arbitrum/Ethereum Classic), or an ~88-character Base58 signature (Solana). Block-explorer URLs are also accepted — the hash is extracted automatically. Users very often paste an exchange reference ID by mistake (e.g. Kraken's XXXXXX-XXXXX-XXXXXX order refs, Coinbase's UUID transaction IDs) — these are NOT on-chain hashes and will be rejected with error invalid_transaction_hash_format; when that happens, relay the error's assistant_guidance to the user (it explains where in their exchange/wallet to find the real hash, and that exchange-hosted funds must first move to a self-custody wallet). ASSET DETECTION: you do NOT need to know which asset the user sent. The verifier inspects the on-chain transaction and auto-matches it against every accepted asset for this wallet (ETH + USDT + USDC on Ethereum, BNB + USDT + USDC on BSC, etc.). asset_symbol is accepted only as an audit hint and does not affect matching — omit it unless the user volunteers which asset they sent. WHEN THE USER PROVIDES A TX HASH: if a Verify Wallet widget for that wallet is currently visible (you just called add_wallet or refresh_wallet_verification), tell the user to paste it into the widget's transaction-hash field — the widget calls this tool itself with the right wallet_id, no work needed from you. If no Verify Wallet widget is on screen (e.g. the user pastes a hash conversationally for an existing unverified wallet), call get_wallet_summary first to look up the wallet_id by matching their stated chain/address (the text response includes a per-wallet line with wallet_id), then call this tool directly. Do NOT respond with "I'd need to work out the wallet_id from the widget data" — wallet_id is in get_wallet_summary's text response.

Input Schema

NameRequiredDescriptionDefault
wallet_idYesInternal wallet UUID from a prior add_wallet or get_wallet_summary response. Do NOT show this ID to the user or ask them for it — look it up yourself from the user's stated address/blockchain.
asset_symbolNoOptional audit hint — the symbol the user says they sent (e.g. "USDT"). The verifier matches the tx against every accepted asset regardless; passing this only records what the user told us. You can safely omit this.
transaction_hashYesThe transaction hash of the dust transfer

Output Schema

NameRequiredDescriptionDefault
statusYesverified | pending | failed | already_verified
messageNo
wallet_idNo
asset_symbolNoAsset the verifier auto-matched the transaction against
ownership_statusNoUnderlying wallet state — VERIFIED_TRANSACTION | PENDING_TRANSACTION | NOT_VERIFIED | FAILED

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • removedInput schema / additionalProperties
      Removed value: -false
  2. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "http://json-schema.org/draft-07/schema#",
      +  "additionalProperties": false,
      +  "properties": {
      +    "asset_symbol": {
      +      "description": "Asset the verifier auto-matched the transaction against",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "message": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "ownership_status": {
      +      "description": "Underlying wallet state — VERIFIED_TRANSACTION | PENDING_TRANSACTION | NOT_VERIFIED | FAILED",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "status": {
      +      "description": "verified | pending | failed | already_verified",
      +      "type": "string"
      +    },
      +    "wallet_id": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    }
      +  },
      +  "required": [
      +    "status"
      +  ],
      +  "type": "object"
      +}
  3. Changed1 schema field changed
    • changedInput schema / properties / asset_symbol / description
      Previous value: -"Symbol of the asset the user sent — must match one of the entries in the assets array returned by add_wallet / refresh_wallet_verification (e.g. \"ETH\", \"USDT\", \"USDC\", \"BNB\", \"BTC\", \"TRX\"). Required when the wallet offers multiple verification assets. Omit on chains with a single asset (Bitcoin, XRP, Solana). The server resolves the symbol to the correct token contract + decimals for the verification check."New value: +"Optional audit hint — the symbol the user says they sent (e.g. \"USDT\"). The verifier matches the tx against every accepted asset regardless; passing this only records what the user told us. You can safely omit this."
  4. Changed1 schema field changed
    • addedInput schema / properties / asset_symbol
      Added value: +{
      +  "description": "Symbol of the asset the user sent — must match one of the entries in the assets array returned by add_wallet / refresh_wallet_verification (e.g. \"ETH\", \"USDT\", \"USDC\", \"BNB\", \"BTC\", \"TRX\"). Required when the wallet offers multiple verification assets. Omit on chains with a single asset (Bitcoin, XRP, Solana). The server resolves the symbol to the correct token contract + decimals for the verification check.",
      +  "type": "string"
      +}
  5. Changed1 schema field changed
    • changedInput schema / properties / wallet_id / description
      Previous value: -"Wallet UUID from the add_wallet response"New value: +"Internal wallet UUID from a prior add_wallet or get_wallet_summary response. Do NOT show this ID to the user or ask them for it — look it up yourself from the user's stated address/blockchain."
  6. First observed

TDQS

A4.6/5.0
Behavior4/5

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

Adds a lot beyond the annotations: it clarifies the tool does not move funds (reconciling the non-destructive intent), discloses that it performs an on-chain lookup (consistent with openWorldHint), explains auto-matching across all accepted assets, and documents the specific failure mode invalid_transaction_hash_format plus the instruction to relay assistant_guidance. Minor gap: it doesn't say whether a failed verification is retryable or whether a successful verification is final/one-shot despite idempotentHint=false.

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

Conciseness4/5

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

Front-loaded with purpose and organized with clear uppercase section headers (HASH FORMAT, ASSET DETECTION, WHEN THE USER PROVIDES A TX HASH), so an agent can scan to the relevant block. It is long and carries some redundancy — the 'not a payment / does not move funds' point is restated, and the closing 'Do NOT respond with...' sentence is a defensive aside rather than tool semantics.

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

Completeness5/5

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

For a 3-parameter verification tool with full schema coverage, annotations, and an output schema, the description covers everything an agent needs: prerequisites, wallet_id acquisition path, hash formats, error handling, and asset-matching behavior. Return-value details are correctly left to the output schema.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description genuinely adds meaning: asset_symbol is an audit hint that does not affect matching and should usually be omitted, and transaction_hash accepts block-explorer URLs as well as raw hashes. The concrete hash format rules (64 hex, 0x-prefixed, ~88-char Base58) and the exchange-reference-ID failure mode are substantive additions the schema does not carry.

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

Purpose5/5

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

States a specific verb and resource (submit a tx hash for the dust/test transfer verification) and immediately distinguishes it from the sibling verify_wallet_signature by framing it as 'the other way to prove ownership of a crypto wallet.' It also names the downstream purpose (balance counting toward a Proof of Funds letter) so the agent understands why it exists.

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

Usage Guidelines5/5

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

Gives explicit routing logic: if a Verify Wallet widget is visible, hand the hash to the widget rather than calling the tool; if not, call get_wallet_summary first to resolve wallet_id, then call this tool. It also states the prerequisite (user must have already sent a transfer to the deposit address from add_wallet) and names the alternative verification path.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.