Skip to main content
Glama

add_wallet

Idempotent

Submit a public crypto wallet address (Bitcoin, Ethereum, Solana, stablecoin wallets, and other supported chains) so RealOpen can verify ownership and count its holdings toward a crypto Proof of Funds letter for a real estate purchase. Detects the blockchain, scans on-chain balances, and returns verification options (message signing or dust transfer). Also serves as the retry path: if a previously-added wallet is in a FAILED or unverified state, call this tool again with the same address to get a fresh verification challenge. If the wallet is already verified, the response will indicate that. The response renders an inline Verify Wallet widget showing the verification message (with copy button), the dust-transfer deposit address, and the multi-asset menu; the user clicks through the widget rather than you reading the values aloud. CANCELLED-CALL HANDLING: if a prior invocation of this tool returned no result because the user dismissed or did not approve the client-side consent prompt, simply retry when the user asks again. Do NOT tell the user that the platform or safety checks blocked the action, and do NOT invent a server-side reason — there is no such block on the RealOpen side; it was just a missed consent tap. POST-VERIFY RE-CHECK: the widget runs verify_wallet_signature / verify_wallet_transfer internally via callTool when the user submits from inside it. That silent call does not always produce a visible follow-up in chat — the client can drop the sendFollowUpMessage trigger. If the user says they completed verification, or says the widget shows "verified", or asks to proceed, ALWAYS call get_wallet_summary first to read the fresh ownership_status before answering. Do not tell the user "still not verified" based on your prior tool output — that output is stale the moment the widget is used. PRESENTATION: identify the wallet to the user by its address, never by wallet_id (the UUID is internal — use it only as a parameter to other tools). EVM CHAIN NOTE: 0x... addresses are verified across Ethereum, Base, Arbitrum, BNB Smart Chain, and Ethereum Classic. Signature verification is chain-agnostic and works for any EVM wallet — both regular (EOA) and smart-contract wallets (the verifier checks ERC-1271 on-chain). Dust-transfer verification works on Ethereum, Base, Arbitrum, BNB Smart Chain, and Ethereum Classic too: each dust-transfer option is tagged with its chain (e.g. "USDC on Base", "BNB on BNB Chain", "ETC on Ethereum Classic"), so the user must send on the chain shown for that option. (Polygon is also supported for signature verification.) BNB itself is accepted natively on BNB Smart Chain or as the original ERC-20 on Ethereum — the same 0x deposit address serves both; legacy Beacon Chain (bnb1...) addresses are not supported. ZERO-BALANCE NOTE: If total_usd is 0, do NOT assume the wallet is empty. Many wallets use stealth addresses, HD-derived receive addresses, or UTXO shuffling that hide true balance behind the public address. If the response includes a zero_balance_hint, surface that guidance to the user and strongly suggest the test-transfer verification path. EXCHANGE CUSTODY: if the user's crypto is held on an exchange account (Coinbase, Binance, etc.) — where they cannot sign messages and do not control the sending address — do not force this flow; search get_faq for "exchange" and explain that exchange-held assets are supported via account statements and manual review. ZCASH (ZEC): accepted on TRANSPARENT addresses only (t1…/t3…). Shielded or unified addresses (zs1…/u1…) are rejected with error code shielded_zcash — balances there are private by design and can never be verified. BEFORE a Zcash user starts verification, ask whether their ZEC is on a transparent address; if it is shielded, tell them to move the amount they want to prove to a t-address in the same wallet first (Trezor Suite and Ledger Live show transparent Zcash accounts). Relay transparent_only_hint when present. DOGECOIN (DOGE): D… addresses can verify by signed message ("Dogecoin Signed Message" in Dogecoin Core, Ledger Live, Trezor Suite, Exodus) or by test transfer; 9…/A… multisig addresses use the test transfer. Like Bitcoin, only the verified address is counted until an extended public key is linked (link_wallet_xpub — xpub or dgub). ETHEREUM CLASSIC (ETC): the same 0x address is scanned on Ethereum Classic automatically — no separate add. Verified ETC counts toward Proof of Funds and the RealScore Report, but ETC is NOT a settlement asset: RealOpen does not quote or accept ETC to fund a purchase. Never tell a user they can pay for a home with ETC today — say it counts toward proof of funds and that the closing is funded from an accepted settlement asset.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
addressYesThe public wallet address to add

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
assetsNoPer-asset on-chain balances detected for this wallet
statusNoSet to "already_verified" when re-adding an already-verified wallet
addressNo
messageNo
total_usdNo
wallet_idNo
blockchainNo
linked_addressesNo
ownership_statusNoNOT_VERIFIED | PENDING_SIGNATURE | PENDING_TRANSACTION | VERIFIED_SIGNATURE | VERIFIED_TRANSACTION | FAILED
zero_balance_hintNo
verification_optionsNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "http://json-schema.org/draft-07/schema#",
      +  "additionalProperties": false,
      +  "properties": {
      +    "address": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "assets": {
      +      "description": "Per-asset on-chain balances detected for this wallet",
      +      "items": {
      +        "additionalProperties": true,
      +        "properties": {},
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "blockchain": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "linked_addresses": {
      +      "items": {
      +        "additionalProperties": true,
      +        "properties": {},
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "message": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "ownership_status": {
      +      "description": "NOT_VERIFIED | PENDING_SIGNATURE | PENDING_TRANSACTION | VERIFIED_SIGNATURE | VERIFIED_TRANSACTION | FAILED",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "status": {
      +      "description": "Set to \"already_verified\" when re-adding an already-verified wallet",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "total_usd": {
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "verification_options": {
      +      "additionalProperties": true,
      +      "properties": {
      +        "dust_transfer": {
      +          "additionalProperties": true,
      +          "description": "available + deposit_address + accepted assets[] for the transfer verification path",
      +          "properties": {},
      +          "type": "object"
      +        },
      +        "message_signing": {
      +          "additionalProperties": true,
      +          "description": "available + message to sign for the signature verification path",
      +          "properties": {},
      +          "type": "object"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "wallet_id": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "zero_balance_hint": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    }
      +  },
      +  "type": "object"
      +}
  2. Added
  3. Removed
  4. First observed

TDQS

A4.7/5.0
Behavior5/5

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

Annotations only declare idempotent/non-destructive/open-world; the description adds substantial behavior the annotations cannot convey — the inline Verify Wallet widget, cancelled-call/consent-dismissal handling, stale-output warnings, zero-balance stealth-address caveats, and chain-specific verification mechanics (ERC-1271, dust-transfer chains). This is far beyond what structured fields provide.

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

Conciseness3/5

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

Front-loaded correctly with a clear opening sentence and labeled sections (CANCELLED-CALL HANDLING, POST-VERIFY RE-CHECK, PRESENTATION, EVM CHAIN NOTE, etc.) aid scanning. However it is heavily oversized, with per-chain guidance (Zcash, Dogecoin, ETC, BNB) that could live in reference material rather than the selection-time description.

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?

An output schema exists, so return values need not be described, and the description still covers the edge cases an agent must handle: retries, verification state staleness, custody limitations, unsupported address types, and chain-specific constraints. Nothing needed to invoke or interpret results correctly appears missing.

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

Parameters4/5

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

The single required address parameter is 100% schema-covered, so baseline is 3, but the description materially enriches its meaning: addresses must be public, 0x addresses span multiple EVM chains, Zcash must be transparent (t1…/t3…), and D… vs 9…/A… Dogecoin addresses change the flow. That is real semantic value over the schema's one-line 'public wallet address to add'.

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

Purpose5/5

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

Opens with a specific verb+resource+outcome: submit a public wallet address so RealOpen verifies ownership and counts holdings toward a Proof of Funds letter. It further distinguishes itself from siblings by name (verify_wallet_signature / verify_wallet_transfer run inside the widget) and by function (retry path for FAILED/unverified wallets). An agent can tell exactly what this does and how it differs from the surrounding tools.

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

Usage Guidelines5/5

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

Gives explicit when-to-use rules (first add, retry after FAILED/unverified, after widget verification always call get_wallet_summary first) and when-NOT-to-use routes (exchange-custodied assets → get_faq; shielded Zcash rejected; ETC counts for proof of funds but is not a settlement asset). Alternatives are named and conditions spelled out.

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.