Skip to main content
Glama

Server Details

Verify crypto wallets and generate proof of funds letters for buying real estate with crypto.

If you are the author of this connector, you can claim ownership with GitHub, an HTTP challenge, or a DNS record. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Last Tested
Transport
Streamable HTTP
URL
Repository
realopengroup/mcp-server
GitHub Stars
0
Server Listing
RealOpen MCP Server

Available Tools

21 tools
add_walletA
Idempotent
Inspect

Submit a public wallet address for verification. 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, and BNB Smart Chain. 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, and BNB Smart Chain too: each dust-transfer option is tagged with its chain (e.g. "USDC on Base", "BNB on BNB Chain"), 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
addressYesThe public wallet address to add

Output Schema

ParametersJSON Schema
NameRequiredDescription
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

TDQS

A4.7/5.0
Behavior5/5

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

Annotations only provide idempotentHint=true and destructiveHint=false. The description far exceeds that by disclosing client-side consent dismissal handling, no server-side blocking, chain-specific address behavior, zero-balance stealth-address caveats, exchange custody limitations, and Zcash shielded-address rejection. It also documents the widget rendering and instructs the agent not to read values aloud, which is critical behavioral guidance.

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

Conciseness4/5

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

The description is long, but the length is justified by the large number of edge cases and user-facing behaviors it must cover. It is well structured with capitalized section labels (CANCELLED-CALL HANDLING, EVM CHAIN NOTE, ZERO-BALANCE NOTE, EXCHANGE CUSTODY, ZCASH) and the core purpose is front-loaded. A few repetitions could be trimmed, but the organization earns the length.

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?

Given the tool's complexity, the description is exceptionally complete. It covers the success path, retry path, already-verified path, cancelled-call handling, chain support details, zero-balance nuance, exchange-custody alternatives, and Zcash restrictions. The output schema exists, so the description need not describe return values, and nothing essential to calling this tool correctly appears missing.

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

Parameters5/5

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

The schema has one well-described address parameter with 100% coverage, so the baseline is 3. The description adds extensive meaning beyond the schema: 0x addresses work across multiple EVM chains, bnb1 legacy addresses are unsupported, Zcash must be t-addresses, and the same 0x address serves BNB on BNB Smart Chain and Ethereum. This transforms the parameter from a generic string into a chain-aware input with concrete constraints.

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

Purpose5/5

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

The opening sentence states a specific verb and resource: 'Submit a public wallet address for verification' and immediately lists what the tool does (detects blockchain, scans balances, returns verification options). It is clearly distinguishable from siblings like verify_wallet_signature and verify_wallet_transfer because it initiates the verification flow rather than completing it.

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

Usage Guidelines4/5

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

The description gives strong usage context: retry path for failed/unverified wallets, exchange-custody fallback to get_faq, and Zcash transparent-address prerequisites. It does not explicitly name the sibling verify tools as the next step after the widget flow, but the flow is implied well enough that an agent would know when to call this tool.

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

generate_proof_of_fundsAInspect

Generate a Proof of Funds letter (PDF) for the authenticated user. Requires completed identity verification and at least one verified wallet. Returns a download link valid for 30 days. The response renders an inline widget with a thumbnail preview and download/share controls; you do not need to repeat the download URL in your text response — the widget handles presentation. CANCELLED-CALL HANDLING: if a prior invocation 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 the POF was generated unless this tool actually returned a download_url — if the response is empty or missing, the call did not land and should be retried, not reported as complete. CEILING: the requested amount must be ≤ pof_ceiling_usd from get_wallet_summary; never use total_verified_usd or the sum of wallets[].total_usd as a ceiling — total_verified_usd is pre-haircut (before a volatility/pricing buffer) and the generator will reject amounts above the true ceiling. If unsure of the current ceiling, call get_wallet_summary first.

ParametersJSON Schema
NameRequiredDescriptionDefault
amountYesRequested Proof of Funds amount
currencyNoCurrency for the letter (default: USD)USD

Output Schema

ParametersJSON Schema
NameRequiredDescription
amountYes
statusYesready when the letter generated successfully
currencyYes
file_nameNo
valid_untilNoISO date — letter expires after 30 days
download_urlYesPDF download URL — handed to the widget; the model should not echo it
thumbnail_urlYesTop-of-letter PDF preview image URL — used by the widget

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the sparse annotations, the description discloses prerequisites, a 30-day download link, inline widget rendering, cancellation handling, and the ceiling constraint. It warns against using incorrect ceiling sources, adding important behavioral context not present in annotations.

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

Conciseness4/5

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

The description is long but well-structured with clear sections for cancellation handling and ceiling. Every sentence serves a purpose, though some operational details could be condensed. It is appropriately sized for the tool's complexity.

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

Completeness5/5

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

The description covers prerequisites, return value (download link, widget), error/retry handling, and the critical ceiling calculation. With an output schema present, it fully equips the agent to invoke the tool correctly and interpret the result.

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 schema already documents both parameters (amount, currency) with descriptions, so baseline is 3. The description adds crucial constraint semantics for the amount parameter (must be ≤ pof_ceiling_usd from get_wallet_summary), which is not in the schema. This elevates the score to 4.

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

Purpose5/5

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

The description begins with a specific verb ('Generate') and resource ('Proof of Funds letter (PDF)'), clearly stating the action and output. It distinguishes itself from sibling tools like get_wallet_summary and verify_wallet_signature by focusing on document generation.

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

Usage Guidelines5/5

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

It specifies preconditions (completed identity verification, at least one verified wallet) and explicitly recommends calling get_wallet_summary to check the ceiling. It also provides guidance on cancellation handling and when not to report success, giving clear expected usage.

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

get_account_statusA
Read-onlyIdempotent
Inspect

Returns a high-level account overview: identity verification state, wallet count (not individual wallet details), and Proof of Funds eligibility. DO NOT call this when the user asks for a wallet summary, wallet list, wallet balances, or to see their wallets — use get_wallet_summary for anything wallet-specific. This tool is for answering "is my account ready?"-style questions and for resuming setup: the response includes activation.next_action — the single correct next step for this user's state. The response renders an inline progress widget (checklist + one next-step CTA); keep your text to a short summary and let the widget carry the presentation.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
pofNo
emailNo
user_idNo
walletsNoAggregate wallet counts. For per-wallet details, call get_wallet_summary.
last_nameNo
activationNoProgress + next-step routing resolved from the account state. Follow next_action rather than re-deriving the step order. Fully-activated users get a "generate another POF / wallet summary" action, never an onboarding CTA.
first_nameNo
account_hintNoPresent only for brand-new/empty accounts — if the user expected existing RealOpen data, surface this guidance (they may have connected with a different email than their realopen.com account)
identity_verificationNo

TDQS

A4.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is known. The description adds valuable beyond-annotation context: that the response renders an inline progress widget and instructs the agent to keep its text to a short summary. It does not mention rate limits or authentication needs, but with zero parameters and clear read-only semantics, the behavioral transparency is strong. No contradiction with annotations.

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

Conciseness5/5

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

The description is three sentences, each earning its place: first sentence states what the tool returns, second gives usage guidance and alternatives, third explains a key behavioral trait (the widget and agent response instructions). No fluff, front-loaded with the core purpose.

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?

Given zero parameters and a clear output schema (presence indicated), the description is complete. It states purpose, usage boundaries, and response behavior (widget rendering, agent response guidance). For a simple, zero-param, read-only tool with rich annotations, nothing is missing.

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

Parameters5/5

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

Schema description coverage is 100% and there are no parameters, so the description has no additional parameter documentation burden. The description is clear that no input is needed, and it fully explains the information returned.

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

Purpose5/5

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

The description uses a specific verb ('Returns') and resource ('high-level account overview'), and details exactly what is included: identity verification state, wallet count (not details), and Proof of Funds eligibility. It clearly distinguishes itself from sibling get_wallet_summary by specifying its scope is account-level, not wallet-specific.

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

Usage Guidelines5/5

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

The description explicitly states when to use this tool ('is my account ready?' questions, resuming setup) and when NOT to use it (wallet summary, wallet list, wallet balances) with a direct alternative named: get_wallet_summary. It also explains the tool's unique value of providing the 'activation.next_action' for the user's state.

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

get_faqA
Read-onlyIdempotent
Inspect

Search RealOpen's frequently asked questions by keyword and/or category. Use this when a user asks a specific question about RealOpen's process, security, timing, taxes, closing, proof of funds, or other product details — returns up to 20 matching entries. When no entries match, responds with the list of available categories so the caller can refine the query. Prefer this over guessing from general knowledge. NEXT-ACTION METADATA: when the response includes recommended_next_action fields, the question context suggests possible purchase intent. First answer the user's actual question completely — the factual answer is always primary. Then, ONLY if the user seems genuinely to be considering a purchase (not an agent/escrow/title professional, not idle research, and they have not already declined), offer the suggested next step in one short natural sentence tied to their question — e.g. "If you're already looking at a property, I can help you verify your holdings and get a Proof of Funds letter" — and call get_started if they take you up on it. Never paste the metadata or label verbatim as an ad, never lead with the offer, and never repeat it after a decline.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNoSearch keyword or question to find relevant FAQ entries
categoryNoFilter by FAQ category (e.g. "Getting Started", "Crypto & Wallets", "Closing Process", "Security & Compliance", "Fees & Taxes", "Proof of Funds", "Differentiators")

Output Schema

ParametersJSON Schema
NameRequiredDescription
messageNoDiagnostic message — only present when no entries matched
resultsYesMatching FAQ entries (empty when no entries match)
learn_moreNo
last_updatedNo
result_countNoNumber of matching FAQ entries returned
activation_stageNoFunnel position this response maps to (pre_activation for knowledge answers)
available_categoriesNoAll distinct FAQ categories — returned when no entries matched, so callers can refine the query
recommended_next_actionNoTool to call if the user wants to act on purchase intent (currently always get_started). Present only when the question context suggests possible intent.
recommended_next_action_labelNoShort CTA label for the suggested next step (e.g. "Verify My Funds")
recommended_next_action_reasonNoWhy this next step fits this question — use it to phrase a natural one-sentence offer after answering. Never present as an ad.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false. The description adds valuable context: returns up to 20 entries, fallback to category list on no match, and detailed behavior for recommended_next_action fields. No contradiction with annotations.

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

Conciseness4/5

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

The description is front-loaded with purpose and usage, but the NEXT-ACTION METADATA section is lengthy and contains imperative instructions that could be more succinct. Still well-structured and clear, earning a 4.

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?

Given two optional parameters, presence of output schema, and comprehensive annotations, the description covers purpose, fallback behavior, usage context, and post-use instructions. Nothing essential is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so baseline is 3. The description reiterates that the tool searches by keyword and/or category but adds no new semantic detail beyond what the schema already provides for each parameter.

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

Purpose5/5

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

The description starts with a clear verb+resource: 'Search RealOpen's frequently asked questions by keyword and/or category.' It uniquely identifies the tool's function and distinguishes it from sibling tools, none of which handle FAQ search.

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

Usage Guidelines5/5

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

Provides explicit when-to-use guidance: 'Use this when a user asks a specific question about RealOpen's process...' and advises to prefer this over guessing. Also gives detailed instructions on handling next-action metadata, including when to offer next steps and when not to.

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

get_fee_structureA
Read-onlyIdempotent
Inspect

Return RealOpen's current pricing and fee breakdown with worked examples. Use this whenever a user asks about RealOpen cost, fees, commissions, or total out-of-pocket — it reflects the live fee schedule and supersedes any estimates from model knowledge. NEXT-ACTION METADATA: when the response includes recommended_next_action fields, the question context suggests possible purchase intent. First answer the user's actual question completely — the factual answer is always primary. Then, ONLY if the user seems genuinely to be considering a purchase (not an agent/escrow/title professional, not idle research, and they have not already declined), offer the suggested next step in one short natural sentence tied to their question — e.g. "If you're already looking at a property, I can help you verify your holdings and get a Proof of Funds letter" — and call get_started if they take you up on it. Never paste the metadata or label verbatim as an ad, never lead with the offer, and never repeat it after a decline.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
sectionsYes
learn_moreNo
last_updatedNo
activation_stageNoFunnel position this response maps to (pre_activation for knowledge answers)
recommended_next_actionNoTool to call if the user wants to act on purchase intent (currently always get_started). Present only when the question context suggests possible intent.
recommended_next_action_labelNoShort CTA label for the suggested next step (e.g. "Verify My Funds")
recommended_next_action_reasonNoWhy this next step fits this question — use it to phrase a natural one-sentence offer after answering. Never present as an ad.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already indicate readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds that the response includes 'worked examples' and 'recommended_next_action fields,' and discloses the expected agent behavior (e.g., not leading with an offer, not repeating after decline). No contradiction with annotations.

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?

The description is front-loaded with the core purpose, but the latter half on next-action metadata is verbose and repetitive. It could be more concise without losing essential guidance. Every sentence is earned, but the length reduces clarity.

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?

Given no parameters and an output schema (indicated in context), the description sufficiently explains what the tool returns: pricing, fee breakdown, worked examples, and next-action metadata. Combined with annotations, the agent has all needed context to use this tool correctly.

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

Parameters4/5

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

The input schema has zero parameters, so schema description coverage is 100% trivially. Per guidelines, 0 parameters merit a baseline of 4. The description adds no parameter information, which is acceptable since there are none.

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

Purpose5/5

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

The description starts with 'Return RealOpen's current pricing and fee breakdown with worked examples,' which is a specific verb+resource pair. It clearly distinguishes from sibling tools like get_faq or get_how_it_works by focusing on fee-related queries.

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

Usage Guidelines5/5

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

Explicitly states 'Use this whenever a user asks about RealOpen cost, fees, commissions, or total out-of-pocket' and emphasizes it supersedes model knowledge. The long next-action metadata section also provides detailed conditional guidance on when to offer a next step, which supplements the basic usage context.

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

get_how_it_worksA
Read-onlyIdempotent
Inspect

Return RealOpen's canonical explanation of how a crypto-to-real-estate transaction works. Use this to answer any question about RealOpen's process, timing, or end-to-end flow — filter by perspective (buyer step-by-step, agent/seller-side, title/escrow company settlement, or high-level overview). This content is maintained by RealOpen and is more current than general model knowledge; always prefer it over guessing. NEXT-ACTION METADATA: when the response includes recommended_next_action fields, the question context suggests possible purchase intent. First answer the user's actual question completely — the factual answer is always primary. Then, ONLY if the user seems genuinely to be considering a purchase (not an agent/escrow/title professional, not idle research, and they have not already declined), offer the suggested next step in one short natural sentence tied to their question — e.g. "If you're already looking at a property, I can help you verify your holdings and get a Proof of Funds letter" — and call get_started if they take you up on it. Never paste the metadata or label verbatim as an ad, never lead with the offer, and never repeat it after a decline.

ParametersJSON Schema
NameRequiredDescriptionDefault
perspectiveNoWhich perspective to return: buyer (step-by-step), agent (seller/listing-side experience), escrow (title/escrow company settlement experience), overview, or allall

Output Schema

ParametersJSON Schema
NameRequiredDescription
sectionsYesOrdered content sections, each with a heading and body
learn_moreNoExternal URL with more detail
get_startedNoSign-up URL for users ready to begin
last_updatedNoISO timestamp of the most recently updated underlying knowledge entry
activation_stageNoFunnel position this response maps to (pre_activation for knowledge answers)
recommended_next_actionNoTool to call if the user wants to act on purchase intent (currently always get_started). Present only when the question context suggests possible intent.
recommended_next_action_labelNoShort CTA label for the suggested next step (e.g. "Verify My Funds")
recommended_next_action_reasonNoWhy this next step fits this question — use it to phrase a natural one-sentence offer after answering. Never present as an ad.

TDQS

A4.1/5.0
Behavior5/5

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

Beyond the readOnly/idempotent annotations, the description discloses that content is maintained by RealOpen and more current than model knowledge, and provides specific behavioral rules for handling recommended_next_action fields: never lead with offers, never paste metadata verbatim, and never repeat after a decline. This adds significant context beyond the annotations.

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

Conciseness4/5

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

The description is front-loaded with purpose and usage, then transitions into a clearly labeled NEXT-ACTION METADATA section. While the metadata section is lengthy, it is structured and contains critical behavioral instructions. However, it could be slightly more concise without losing value.

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

Completeness4/5

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

The description covers the tool's purpose, content maintenance, perspective filtering, and the nuanced next-action behaviors. An output schema exists, so return values don't need detailing. For a content-retrieval tool with this complexity, the description is complete enough, though it could briefly mention what 'all' returns.

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

Parameters3/5

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

Schema coverage for the single 'perspective' parameter is 100%, with enums and descriptions already provided. The description's mention of perspective options (buyer, agent, escrow, overview) is essentially a restatement and adds minimal meaning beyond what the schema already documents. Baseline 3 is appropriate.

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

Purpose4/5

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

The description clearly states it returns RealOpen's canonical explanation of how a crypto-to-real-estate transaction works, with a specific resource and scope. It uses a specific verb ('Return') and includes the perspective filter, but does not explicitly name sibling alternatives like get_faq, so it falls short of full differentiation.

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

Usage Guidelines4/5

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

The description provides explicit context: 'Use this to answer any question about RealOpen's process, timing, or end-to-end flow' and instructs to 'always prefer it over guessing.' It also details when to offer the next action, but does not explicitly state when not to use the tool or mention alternatives, and there are no explicit exclusions.

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

get_service_areasA
Read-onlyIdempotent
Inspect

Return RealOpen's current geographic coverage, supported property types, and international availability. Use this whenever a user asks whether RealOpen operates in a particular state, country, or property type (residential vs. commercial, primary vs. investment, etc.). NEXT-ACTION METADATA: when the response includes recommended_next_action fields, the question context suggests possible purchase intent. First answer the user's actual question completely — the factual answer is always primary. Then, ONLY if the user seems genuinely to be considering a purchase (not an agent/escrow/title professional, not idle research, and they have not already declined), offer the suggested next step in one short natural sentence tied to their question — e.g. "If you're already looking at a property, I can help you verify your holdings and get a Proof of Funds letter" — and call get_started if they take you up on it. Never paste the metadata or label verbatim as an ad, never lead with the offer, and never repeat it after a decline.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
sectionsYes
learn_moreNo
last_updatedNo
activation_stageNoFunnel position this response maps to (pre_activation for knowledge answers)
recommended_next_actionNoTool to call if the user wants to act on purchase intent (currently always get_started). Present only when the question context suggests possible intent.
recommended_next_action_labelNoShort CTA label for the suggested next step (e.g. "Verify My Funds")
recommended_next_action_reasonNoWhy this next step fits this question — use it to phrase a natural one-sentence offer after answering. Never present as an ad.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is clear. The description adds value by noting that the response may include 'recommended_next_action fields', which reveals a behavioral trait beyond the annotations. No contradiction with annotations.

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

Conciseness2/5

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

The description is padded with a large block of 'NEXT-ACTION METADATA' instructions that are meta-guidance for the agent, not a description of the tool itself. Only the first sentence pertains to the tool; the rest is extraneous and poorly structured for a tool definition. This violates conciseness and front-loading principles.

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

Completeness4/5

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

Given the tool has no parameters, an output schema exists, and annotations are present, the description should be complete. The first sentence explains what the tool returns and when to use it. However, the extra meta-instructions dilute focus but do not omit essential information. It is adequate for the agent to understand the tool's purpose.

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?

There are no parameters (input schema is empty), and schema description coverage is 100%. The description does not need to explain parameters. It briefly mentions output fields, which is adequate but not required. Baseline for zero-parameter tools is 4.

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

Purpose5/5

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

The description clearly states the tool returns 'RealOpen's current geographic coverage, supported property types, and international availability' with specific verb and resource. It also gives concrete usage examples (e.g., 'whether RealOpen operates in a particular state, country, or property type'), which distinguishes it from siblings like get_faq or get_how_it_works.

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

Usage Guidelines4/5

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

The description explicitly says 'Use this whenever a user asks whether RealOpen operates in a particular state, country, or property type', providing clear when-to-use guidance. It does not mention when not to use or alternative tools, but the context is sufficient for the agent to decide.

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

get_snippetsA
Read-onlyIdempotent
Inspect

Find pre-approved RealOpen social-media snippets — copy-ready posts written by RealOpen's marketing team for twitter, linkedin, instagram, email, or general use. Use this when a user asks for ready-to-post content or needs inspiration grounded in approved brand voice. Filter by platform, tone, tag, attached asset, or keyword. Each snippet includes body text, tags, share title (usable as email subject), and a preview of the associated visual asset when one is attached.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNoFilter by snippet tags (matches ANY)
toneNoFilter by snippet tone
keywordNoFree-text search on snippet text and title
asset_idNoGet snippets tied to a specific asset by ID
platformNoFilter by target platform

Output Schema

ParametersJSON Schema
NameRequiredDescription
snippetsYesUp to 20 matching snippets (random order to avoid stale top-matches)

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds valuable context about the return content ('body text, tags, share title, and a preview of the associated visual asset') and the source ('written by RealOpen's marketing team'). This goes beyond the annotations without contradicting them.

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

Conciseness5/5

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

Three sentences, each earning its place: the main purpose, the usage context, and the return/filter summary. The description is front-loaded with the most important information and contains no fluff.

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

Completeness5/5

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

For a read-only search tool with 5 optional parameters and an output schema, the description covers purpose, usage, filters, and return content. There are no significant gaps given the annotations and output schema already provide the rest.

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

Parameters3/5

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

Schema description coverage is 100%, so all 5 parameters are documented. The description restates the filter dimensions ('platform, tone, tag, attached asset, or keyword') but adds no new meaning beyond the schema. This matches the baseline of 3 for high schema coverage.

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

Purpose5/5

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

The description opens with a specific verb ('Find') and resource ('pre-approved RealOpen social-media snippets'), specifying the content type and platforms. It clearly distinguishes this from sibling tools like get_faq or get_how_it_works by focusing on marketing content.

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

Usage Guidelines4/5

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

Explicitly states when to use: 'when a user asks for ready-to-post content or needs inspiration grounded in approved brand voice.' However, it does not mention when not to use or explicitly name alternative tools, so it lacks the full exclusions/alternatives that would merit a 5.

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

get_startedA
Read-onlyIdempotent
Inspect

The front door to buying real estate with crypto through RealOpen. Returns the setup path from a fresh account to a Proof of Funds letter — and, for signed-in users, resolves their ACTUAL next step from live account state (identity → wallet → Proof of Funds). Call this when: the user is new, asks what they can do here, or connects without a specific request; the user is considering using crypto for a property purchase; the user asks how to become offer-ready or how to get/verify a proof of funds letter; or a knowledge answer (fees, supported assets, service areas, closing process) leads the user to express clear intent to actually transact. Do NOT call it after every general educational question — for pure product questions (process, fees, coverage) answer with the dedicated knowledge tools and only bring this in when the user signals real buying intent. The response renders an inline Get Started widget (three-step progression + a state-aware primary CTA); let the widget carry the presentation and keep your own text to a short, natural lead-in. The structured activation.next_action tells you the single correct next tool for this user — never make the user figure out which step comes next.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
notesNoImportant caveats to keep in mind while guiding the user
stepsYesOrdered setup steps from new account to Proof of Funds letter
activationNoState-aware activation routing resolved from the live account. Follow next_action rather than re-deriving the step order.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnly, idempotent, and non-destructive hints. The description adds significant behavioral context: it returns a widget, resolves next step from live account state, and should not be used for educational queries. No contradictions with annotations.

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

Conciseness4/5

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

The description is well-structured with a clear main purpose, bulleted usage guidelines, and behavioral notes. It is slightly long but every sentence adds value; front-loading the purpose helps agents quickly understand the tool.

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

Completeness5/5

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

Given the tool's complexity (state-aware, multiple user scenarios, widget output, structured next_action), the description covers when to use, what it returns, how to interpret the output, and how to proceed. The output schema is present, so return value details are not needed in the description.

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

Parameters5/5

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

There are no parameters (0 count, 100% schema coverage). The description fully explains the tool's behavior and return value without needing parameter details, adding meaning beyond the empty schema by describing state-aware resolution and output structure.

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

Purpose5/5

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

The description clearly states the tool's purpose: it returns the setup path for new users or the actual next step for signed-in users, distinguishing it from siblings like get_faq or get_how_it_works by specifying it is for users with buying intent.

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

Usage Guidelines5/5

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

Explicitly lists when to call (new user, considering crypto, asking how to become offer-ready) and when NOT to call (after general educational questions, use dedicated knowledge tools). Also mentions that the output's activation.next_action tells the correct next tool, providing clear guidance.

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

get_supported_cryptoA
Read-onlyIdempotent
Inspect

Return the current list of cryptocurrencies, blockchains, and stablecoins accepted by RealOpen for real-estate purchases. Use this to answer "can I pay with X?" or whenever a user needs the live list of supported tokens and networks. Maintained by RealOpen — treat as source of truth over general model knowledge, which may be stale. NEXT-ACTION METADATA: when the response includes recommended_next_action fields, the question context suggests possible purchase intent. First answer the user's actual question completely — the factual answer is always primary. Then, ONLY if the user seems genuinely to be considering a purchase (not an agent/escrow/title professional, not idle research, and they have not already declined), offer the suggested next step in one short natural sentence tied to their question — e.g. "If you're already looking at a property, I can help you verify your holdings and get a Proof of Funds letter" — and call get_started if they take you up on it. Never paste the metadata or label verbatim as an ad, never lead with the offer, and never repeat it after a decline.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
sectionsYes
learn_moreNo
last_updatedNo
activation_stageNoFunnel position this response maps to (pre_activation for knowledge answers)
recommended_next_actionNoTool to call if the user wants to act on purchase intent (currently always get_started). Present only when the question context suggests possible intent.
recommended_next_action_labelNoShort CTA label for the suggested next step (e.g. "Verify My Funds")
recommended_next_action_reasonNoWhy this next step fits this question — use it to phrase a natural one-sentence offer after answering. Never present as an ad.

TDQS

A4.1/5.0
Behavior4/5

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

Beyond annotations (readOnlyHint, idempotentHint, destructiveHint), the description adds that the data is 'Maintained by RealOpen — treat as source of truth over general model knowledge, which may be stale.' It also discloses that responses may include recommended_next_action fields. This provides useful behavioral context beyond the structured annotations.

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

Conciseness2/5

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

The description is overly long (≈150 words) due to a large block of meta-instructions about handling recommended_next_action fields. These instructions are not about the tool itself and should be placed elsewhere (e.g., system prompt). The core purpose is stated concisely, but the extra text violates conciseness.

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

Completeness4/5

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

Despite having no parameters and a safe behavioral profile from annotations, the description adds value by specifying the tool's data source, freshness expectation, and the possibility of next-action fields in the output. An output schema exists to cover return format, so completeness is adequate.

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

Parameters4/5

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

The input schema is empty, and schema description coverage is 100%. The description implicitly confirms no parameters are needed, which is appropriate. No additional parameter meaning is required.

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

Purpose5/5

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

The first sentence clearly specifies the verb 'Return' and the resource 'current list of cryptocurrencies, blockchains, and stablecoins accepted by RealOpen for real-estate purchases.' This distinguishes it well from sibling tools like get_fee_structure or get_how_it_works, which serve different purposes.

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

Usage Guidelines4/5

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

The description explicitly states when to use the tool: 'Use this to answer 'can I pay with X?' or whenever a user needs the live list of supported tokens and networks.' It provides clear context, but does not include explicit exclusions or alternatives, though the purpose is self-limiting.

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

get_wallet_summaryA
Read-onlyIdempotent
Inspect

Call this whenever the user asks for a wallet summary, wallet list, their wallets, wallet balances, verified holdings, or Proof of Funds ceiling. Returns all wallets for the authenticated user with their balances, verification status, and Proof of Funds ceiling. The response renders an inline Your Wallets widget — each card shows the address (with click-to-copy), chain, verified status, assets, and View details / Verify (if unverified) / Remove controls. Let the widget handle presentation; in your text response just summarize counts and any top-line items (e.g. "You have 3 wallets, 2 verified, POF ceiling $65k"). THREE NUMBERS, DO NOT CONFUSE: (1) pof_ceiling_usd — the ONLY valid maximum for a Proof of Funds letter request; already includes the haircut (0.98× stablecoins, 0.935× volatile) and excludes unverified wallets. (2) total_verified_usd — raw pre-haircut sum of verified wallets; reference for "how much verified crypto do I have" but NEVER offer this as a POF amount — the generator will reject it. (3) Σ wallets[].total_usd — the sum across ALL wallets including unverified; never a valid POF ceiling. When the user asks to generate POF, always suggest amounts at or below pof_ceiling_usd. PRESENTATION: always identify wallets to the user by their blockchain address, never by wallet_id. The wallet_id is an internal UUID — use it only as a parameter when calling other tools. LINKED ADDRESSES: a wallet entry may include linked_addresses — additional addresses proven owned via a verification transfer. ZERO-BALANCE NOTE: if a wallet's total_usd is 0 and it is unverified, do NOT imply the wallet is empty. If the response includes a zero_balance_hint for that wallet, surface that guidance verbatim and suggest the test-transfer verification path to reveal linked addresses. BITCOIN FULL-WALLET NOTE: a verified Bitcoin wallet entry may carry full_wallet_hint (no extended public key linked yet — only the verified address and transfer-proven addresses are counted) or xpub_linked: true with an xpub_scan summary (every derived address counted). If a user says their Bitcoin balance looks low, relay full_wallet_hint and offer link_wallet_xpub. ZCASH: a Zcash wallet entry carries transparent_only_hint — only transparent (t1…) balances are verified and counted; relay it before the user starts verification if their ZEC may be shielded.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
walletsYesAll wallets on the user's account
eligible_tokensNoAsset symbols that count toward POF eligibility
pof_ceiling_usdNoMaximum amount valid for a Proof of Funds letter. Already includes the haircut (0.98× stables, 0.935× volatile) and excludes unverified wallets.
total_verified_usdNoRaw pre-haircut sum of verified wallets. NEVER use as a POF ceiling — pof_ceiling_usd is the only correct max.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is known. The description goes far beyond annotations by explaining widget rendering, the precise meanings of the three returned USD numbers, rejection behavior of generate_proof_of_funds, and special hints for zero-balance, Bitcoin full-wallet, and Zcash transparent-only cases. This is substantial behavioral context that annotations alone could not provide.

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

Conciseness4/5

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

The description is long but well-organized with bolded labels and scannable sections. It front-loads the trigger and core purpose before diving into cautionary notes. A few warnings repeat the same point, especially around never using total_usd or total_verified_usd as the POF ceiling, but the redundancy is likely intentional for a high-stakes numerical distinction.

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 tool with no parameters and an output schema, the description still provides complete operational context: what counts as a valid POF ceiling, how to handle the widget, what to do with zero_balance_hint, full_wallet_hint, and transparent_only_hint, and how to route the next step to generate_proof_of_funds. An agent has everything needed to invoke this tool correctly and avoid common mistakes.

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

Parameters4/5

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

The tool has zero parameters, so the input schema carries no burden and the baseline is 4. The description adds useful meaning about the result fields and their distinctions (pof_ceiling_usd, total_verified_usd, total_usd), which is enough for correct use. Nothing more is needed for parameters.

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

Purpose5/5

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

The description names a specific verb and resource family: 'Call this whenever the user asks for a wallet summary, wallet list, their wallets, wallet balances, verified holdings, or Proof of Funds ceiling.' It states exactly what is returned: all wallets, balances, verification status, and POF ceiling. It is clearly differentiated from siblings like generate_proof_of_funds and refresh_wallet_balance by tying this tool to summary/list/balance 'asks'.

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?

Usage guidance is explicit and actionable: it lists trigger phrases, instructs the agent to let the widget handle presentation, and tells it to pass pof_ceiling_usd to generate_proof_of_funds when generating a POF. It also gives strong 'never' rules, such as never using total_usd or total_verified_usd as the POF ceiling, and never implying an unverified zero-balance wallet is empty. This gives clear when-to-use and when-not-to-use behavior.

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

logoutA
Idempotent
Inspect

Sign out of your RealOpen MCP session. Use this when the user wants to switch accounts or disconnect.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYessigned_out
messageNo

TDQS

A4.5/5.0
Behavior3/5

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

With annotations already declaring idempotentHint=true and destructiveHint=false, the description adds only minimal behavioral context by specifying the session scope ('RealOpen MCP session') and typical use cases. It does not go into further side effects or post-conditions, but the annotation coverage reduces the need for extensive disclosure.

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

Conciseness5/5

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

The description is two short sentences, front-loaded with the action, and contains no redundant information. Every phrase earns its place.

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

Completeness5/5

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

For a zero-parameter logout tool with an output schema and annotations, the description is complete. It states the action, the target session, and when to use it, leaving no critical gaps.

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

Parameters4/5

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

The tool has zero parameters, so the baseline is 4. The description appropriately does not discuss parameters since none exist, and the schema already fully covers this (100% coverage vacuously).

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

Purpose5/5

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

The description clearly states the tool's function: 'Sign out of your RealOpen MCP session.' It uses a specific verb ('Sign out') and identifies the resource (RealOpen MCP session), fully distinguishing it from all sibling 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?

Explicit usage guidance is provided: 'Use this when the user wants to switch accounts or disconnect.' This gives clear conditions for when to invoke the tool and implicitly when not to.

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

refresh_wallet_balanceA
Idempotent
Inspect

Re-fetch on-chain asset balances for an existing wallet and update the stored record. Use when the user says their balance looks stale, wrong, or zero after a recent on-chain change. Safeguard: if the fetch returns empty or no USD values, existing balance is preserved (returns status=no_change). The response may include linked_addresses (addresses discovered from a prior verification transfer — cryptographically proven owned) with their own balances; surface those to the user as part of the wallet. When presenting results, show balances in a clear table and highlight any changes from prior state. ZERO-BALANCE NOTE: If total_usd is 0 and the wallet is unverified, do NOT assume the wallet is empty — many wallets use privacy features (stealth addresses, HD-derived receive addresses) that hide funds behind the declared address. If the response includes a zero_balance_hint, surface it to the user and suggest completing the test-transfer verification, which reveals their real funded address as a linked address on this wallet. BITCOIN FULL-WALLET NOTE: for Bitcoin the response may include xpub_linked (true when the user has linked their wallet's extended public key — the balance then covers every derived address, and xpub_scan summarises the scan) or full_wallet_hint (a verified BTC wallet with no xpub yet). When full_wallet_hint is present and the user thinks the balance is low, relay the hint and offer link_wallet_xpub. ZCASH: transparent_only_hint means only transparent (t1…) balances count — shielded ZEC is invisible and must be moved to a t-address first.

ParametersJSON Schema
NameRequiredDescriptionDefault
wallet_idYesInternal wallet UUID from a prior get_wallet_summary or add_wallet response. Do NOT show this ID to the user or ask them for it — look it up from the address they mentioned.

Output Schema

ParametersJSON Schema
NameRequiredDescription
assetsNoPer-asset balances on the wallet
statusYesrefreshed | no_change
addressNo
messageNo
total_usdNo
wallet_idNo
xpub_scanNoBitcoin only: summary of the last extended-key scan (script_type, total_btc, total_usd, funded_address_count, scanned_at)
blockchainNo
xpub_linkedNoBitcoin only: true when an extended public key is linked and the balance covers every derived address
full_wallet_hintNoBitcoin/Zcash: present for verified wallets with no extended key linked — how to count the full wallet via link_wallet_xpub
linked_addressesNoAdditional addresses proven owned via a prior verification transfer
zero_balance_hintNoSurfaced when balance is 0 and the wallet is unverified — explains stealth/HD addressing
transparent_only_hintNoZcash only: only transparent (t1…) balances are verified and counted; shielded ZEC must be moved to a t-address first

TDQS

A4.5/5.0
Behavior5/5

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

The description goes far beyond the annotations: it discloses that empty or no-USD fetches preserve the existing balance and return status=no_change, explains linked_addresses as cryptographically proven owned, warns against assuming zero-balance wallets are empty, and explains consolidation_hint behavior. This is consistent with annotations; readOnlyHint=false aligns with 'update the stored record.'

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

Conciseness4/5

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

The core purpose and trigger are front-loaded, and the long caveats are clearly labeled as notes. However, the zero-balance warning is repeated across the ZERO-BALANCE, BITCOIN, and ZCASH notes, and the description appears to end mid-sentence at the Zcash note, so it is somewhat longer and less tidy than ideal.

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

Completeness4/5

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

The description covers the trigger, mutation semantics, preservation behavior, linked addresses, presentation requirements, and multiple zero-balance edge cases. The output schema handles return-shape details. The main gap is that the text appears truncated at the Zcash note, leaving that final instruction incomplete.

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

Parameters3/5

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

The input schema already fully documents wallet_id, including that it is an internal UUID from get_wallet_summary or add_wallet and should not be shown to the user. With 100% schema description coverage, the description adds no additional parameter-level semantics, so the baseline of 3 applies.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Re-fetch on-chain asset balances for an existing wallet and update the stored record.' It clearly distinguishes this tool from siblings like get_wallet_summary or refresh_wallet_verification by centering on balance refresh and update semantics.

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

Usage Guidelines5/5

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

It gives an explicit trigger: 'Use when the user says their balance looks stale, wrong, or zero after a recent on-chain change.' It also provides conditional guidance for empty results, zero-balance hints, BTC consolidation hints, and Zcash re-fetch/linking suggestions, which tells an agent how to behave in key edge cases.

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

refresh_wallet_verificationAInspect

Regenerate verification challenges for an existing unverified wallet. Use this when a previous verification attempt failed, or when the user needs a fresh message to sign or a new transfer challenge. Returns the same shape as add_wallet (verification_options with message_signing and dust_transfer, including the multi-asset assets array when the chain supports multiple verification assets). 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. 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.

ParametersJSON 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 from the address they mentioned.

Output Schema

ParametersJSON Schema
NameRequiredDescription
assetsNo
statusNo
addressNo
messageNo
total_usdNo
wallet_idNo
blockchainNo
linked_addressesNo
ownership_statusNo
zero_balance_hintNo
verification_optionsNo

TDQS

A4.7/5.0
Behavior5/5

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

Given annotations only provide readOnlyHint=false, openWorldHint=false, idempotentHint=false, and destructiveHint=false, the description adds substantial behavioral context. It explains the widget renders inline, user interacts via clicking rather than reading values aloud, that the widget internally calls verify_wallet_signature/verify_wallet_transfer, that those silent calls may not produce visible follow-up, and that prior output becomes stale after widget use. This goes far beyond the annotations and is essential for correct agent behavior.

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

Conciseness5/5

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

The description is long but every sentence carries necessary operational detail: purpose, return shape, widget behavior, post-verify re-check procedure, and rejection of stale output. It is front-loaded with the main purpose and progressively adds context, with no filler or redundancy.

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

Completeness5/5

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

Despite having an output schema, the description still explains the response shape and the widget's behavior, which is critical for interpreting results. It also covers edge cases like silent internal calls and stale output, making the description fully complete for the tool's complexity and the scenario of user interaction.

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

Parameters3/5

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

The tool description does not mention wallet_id at all; all parameter semantics (e.g., 'Internal wallet UUID', 'Do NOT show this ID') are provided in the input schema. Since schema description coverage is 100%, the baseline of 3 applies, but the description itself adds no incremental parameter meaning.

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

Purpose5/5

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

The description opens with a specific verb+resource: 'Regenerate verification challenges for an existing unverified wallet.' It clearly distinguishes this from related sibling tools like add_wallet, verify_wallet_signature, and get_wallet_summary by focusing on regeneration of challenges after failed attempts or fresh need.

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

Usage Guidelines5/5

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

Explicit when-to-use guidance is given: 'Use this when a previous verification attempt failed, or when the user needs a fresh message to sign or a new transfer challenge.' It also instructs when NOT to rely on prior output and directs to call get_wallet_summary after widget use, effectively naming an alternative for re-checking verification status.

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

remove_walletA
DestructiveIdempotent
Inspect

Permanently remove a wallet from the authenticated user's account. Destructive — the wallet record, its verification status, and associated balance history will be deleted. Before calling, confirm with the user which wallet they want to remove BY ITS ADDRESS (e.g. "remove the Bitcoin wallet at bc1q...abc?") and get explicit confirmation. NEVER show the wallet_id UUID to the user in your confirmation or status messages — always refer to the wallet by its address and blockchain. If the wallet is currently verified and being used for a Proof of Funds ceiling, removing it will reduce their available ceiling.

ParametersJSON Schema
NameRequiredDescriptionDefault
wallet_idYesInternal wallet UUID from get_wallet_summary. Do NOT show this ID to the user or ask them for it — look it up from the address they mentioned.

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYesremoved | not_found
messageNo
wallet_idNo

TDQS

A4.5/5.0
Behavior5/5

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

Goes far beyond the destructiveHint annotation by detailing exactly what gets deleted (wallet record, verification status, balance history) and the downstream effect on Proof of Funds ceiling. This is rich behavioral context that annotations alone do not provide.

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

Conciseness5/5

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

The description is compact yet dense with essential information. Each sentence conveys critical operational guidance—confirmation, address reference, UUID privacy, and ceiling impact—without filler or redundancy.

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

Completeness5/5

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

Given the destructive nature and complexity, the description covers all necessary operational details: what is deleted, how to confirm with the user, communication constraints, and side effects. Combined with the existing output schema and annotations, the context is fully specified.

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

Parameters3/5

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

The input schema already provides full coverage (100%) with a detailed description of wallet_id, including the instruction not to show it to the user. The tool description repeats this guidance but does not add new parameter semantics beyond reinforcing existing schema content, so baseline 3 is appropriate.

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

Purpose5/5

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

The description clearly states the tool's function: 'Permanently remove a wallet from the authenticated user's account.' It specifies the resource (wallet) and distinguishes it from siblings like add_wallet, making the purpose unmistakable.

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

Usage Guidelines4/5

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

Provides strong usage context: requires explicit user confirmation, instructs how to identify the wallet (by address, not UUID), and notes the ceiling impact for verified wallets. However, it does not explicitly mention when NOT to use the tool or alternative tools, 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.

search_assetsA
Read-onlyIdempotent
Inspect

Search RealOpen's library of approved affiliate marketing assets (flyers, social graphics, email banners, brand logos, presentations, listing media). Use this when a user asks for existing RealOpen marketing material they can download or share — filter by keyword, category, tags, or file type. Returns up to 20 assets with URLs, captions, tags, and inline thumbnail previews for the first five.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNoFilter by one or more tag slugs (assets matching ANY tag are returned)
keywordNoFree-text keyword search across label and description
categoryNoFilter by asset category
file_typeNoFilter by file type

Output Schema

ParametersJSON Schema
NameRequiredDescription
assetsYesUp to 20 matching assets (ordered most-recent first)

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint true and idempotentHint true, so the description doesn't need to restate safety. It adds valuable behavioral context: result cap of 20 assets, included fields (URLs, captions, tags), and inline thumbnail previews for the first five. This goes beyond the structured annotations.

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

Conciseness5/5

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

Two sentences, each earning its place: the first states the core function and resource, the second provides usage context and output details. No redundancy, no filler. Well front-loaded.

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

Completeness4/5

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

For a search tool with four optional parameters and an output schema, the description covers the essential points: asset library, filter dimensions, result limit, and preview behavior. It doesn't explain sorting or default behavior, but those are not necessary given the output schema exists.

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

Parameters3/5

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

Schema coverage is 100% for all four parameters, each with a clear description. The tool description merely summarizes that you can filter by keyword, category, tags, or file type, which adds no new 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.

Purpose5/5

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

The description opens with a specific verb and resource: 'Search RealOpen's library of approved affiliate marketing assets.' It enumerates asset types (flyers, social graphics, email banners, etc.), making the tool's scope unmistakable. This clearly differentiates it from sibling tools, which revolve around wallets, proofs, and FAQs.

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

Usage Guidelines4/5

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

The description gives an explicit use case: 'Use this when a user asks for existing RealOpen marketing material they can download or share.' It does not mention alternatives or when-not-to-use, but given the sibling toolset, no direct alternative exists, making this guidance sufficient.

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

start_identity_verificationAInspect

Start or restart identity verification (KYC). If a previous session exists that was incomplete, denied, or expired, this creates a new one. Returns a URL the user must open in their browser.

ParametersJSON Schema
NameRequiredDescriptionDefault
force_newNoForce a new verification session even if one is pending (use after denial or expiry)
id_number_requiredNoWhether to require an ID number on the document (default: true)

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYesOne of: already_verified, processing, redirect_required
messageNo
instructionsNo
verified_nameNoSet when status=already_verified
previous_statusNoThe prior session status if this call is restarting a stale session
verification_urlNoStripe Identity URL the user opens in their browser. Present when status=redirect_required.

TDQS

A4.3/5.0
Behavior4/5

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

The description adds valuable behavioral context beyond the annotations: it explains that a new session is created for incomplete/denied/expired previous sessions and that it returns a user-facing URL. This complements the annotation flags (e.g., readOnlyHint=false) without contradicting them.

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

Conciseness5/5

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

The description is two sentences, front-loaded with the purpose, and each sentence provides essential operational details (session handling and URL return). There is no unnecessary wording.

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 tool with only two optional parameters and an output schema, the description covers the core behavior, session-restart logic, and the return value (URL). It is sufficiently complete for an agent to understand when and how to invoke the tool.

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

Parameters3/5

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

The input schema already contains full descriptions for both parameters (force_new and id_number_required) with 100% coverage. The description does not add meaning beyond the schema, so a baseline score of 3 is appropriate.

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

Purpose5/5

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

The description clearly states the tool starts or restarts identity verification (KYC), using a specific verb and resource. It also distinguishes itself from sibling tools by focusing on identity verification sessions and the behavior regarding previous sessions.

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

Usage Guidelines4/5

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

The description provides clear context on when to use the tool: when starting or restarting identity verification, including after incomplete, denied, or expired sessions. However, it does not explicitly mention alternatives or exclusion scenarios, but the provided context is sufficient for an agent to select it appropriately.

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

verify_wallet_signatureAInspect

Submit a signed message to verify wallet ownership. The user must have signed the exact verification message provided by add_wallet. When collecting the signature from the user, remind them to paste the full signature hash from their wallet. WHEN THE USER PROVIDES A SIGNATURE: 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 signature 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 signature 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
signatureYesThe signature hash produced by signing the verification message with your wallet
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.

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYesverified | pending | failed | already_verified
messageNo
wallet_idNo
ownership_statusNoUnderlying wallet state — VERIFIED_SIGNATURE | PENDING_SIGNATURE | NOT_VERIFIED | FAILED

TDQS

A4.8/5.0
Behavior5/5

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

Annotations provide no safety hints (all false), so the description carries the full transparency burden. It discloses a non-obvious behavioral trait: the widget automatically invokes this tool with the correct wallet_id, meaning the agent should not call it when the widget is visible. It also warns against a specific failure response and directs the agent to get_wallet_summary for lookup, providing rich context beyond annotations.

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

Conciseness4/5

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

The description is long and includes a capitalized conditional section, but every sentence serves a purpose—there's no fluff. The structure is logical (purpose, user instruction, widget vs. direct-call decision tree, and a corrective warning). While longer than ideal, it remains well-organized and front-loaded with the core action.

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?

Given the tool's interactive complexity (widget visibility, wallet_id lookup, user signature collection), the description covers all necessary scenarios and even anticipates a common mistake. With an output schema present, return-value details need not be explained. The guidance is complete enough for an agent to select and invoke the tool correctly in any situation.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description adds meaningful extra context: it reminds the agent to ask the user for the 'full signature hash' and clarifies that wallet_id must never be shown or requested from the user, reinforcing the schema's caution with concrete workflow steps. This pushes it above baseline.

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

Purpose5/5

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

The description opens with 'Submit a signed message to verify wallet ownership,' which is a specific verb+resource combination that clearly distinguishes this tool from siblings like verify_wallet_transfer. The purpose is unambiguous and directly tied to wallet ownership verification.

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

Usage Guidelines5/5

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

The description gives explicit when-to-use guidance: use the widget if visible, otherwise call get_wallet_summary first to find the wallet_id. It also provides a clear exclusion ('the widget calls this tool itself, no work needed from you') and names the alternative lookup path, covering when/not and alternatives.

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

verify_wallet_transferAInspect

Submit a transaction hash for the dust/test transfer verification method. 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), 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.

ParametersJSON 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

ParametersJSON Schema
NameRequiredDescription
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

TDQS

A5/5.0
Behavior5/5

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

Annotations only indicate this is not read-only and not idempotent, so the description must disclose behavior itself. It explains the verifier's internal asset auto-matching, accepts block-explorer URLs and extracts the hash, rejects exchange reference IDs with a specific error name, and instructs relaying assistant_guidance. It also clarifies that wallet_id is not something to ask the user for, which is a crucial behavioral rule beyond 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.

Conciseness5/5

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

Although lengthy, the description is organized into clear blocks: hash format, asset detection, widget-related flow, and fallback path. Every sentence carries an operational constraint or user-facing behavior. The length is justified by the complexity of the verification workflow and the number of failure modes it preempts.

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?

The tool is complete for real use: it specifies prerequisites, widget-state handling, a fallback with get_wallet_summary, and the invalid-transaction-hash error path. Since an output schema exists, the description does not need to cover return values. Nothing needed to call the tool correctly is left unattended.

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

Parameters5/5

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

Schema coverage is 100% for the three parameters, which earns the baseline 3, but the description adds substantial semantic value. It documents per-chain hash formats, the handling of URLs, the rejection cases for exchange IDs, and the harmless/reflection-only nature of asset_symbol. This materially helps an agent decide what to put into transaction_hash and whether to omit asset_symbol.

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

Purpose5/5

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

The description opens with a specific verb and object: 'Submit a transaction hash for the dust/test transfer verification method.' This clearly targets the wallet-transfer verification workflow and ties it to a deposit address provided by add_wallet. The use of 'transaction hash' and 'transfer verification' plausibly differentiates it from the sibling verify_wallet_signature, even without an explicit comparison.

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

Usage Guidelines5/5

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

It gives concrete when-to-use rules: only after the user has sent a valid transfer to a deposit address, and while or when a Verify Wallet widget is, or isn't, visible. It also prescribes a concrete fallback: call get_wallet_summary first to resolve wallet_id, and it explicitly warns against a common wrong approach. This is far more actionable than most tool descriptions.

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. Dates show when Glama detected each change.

  1. 1 tool update
    • Changedlink_wallet_xpub2 fields changed
      • addedOutput schema / properties / binding
        Added value: +{
        +  "description": "active (bound to a proven address) | pending (activates when the wallet is verified)",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • changedOutput schema / properties / status / description
        Previous value: -"linked | unlinked"New value: +"linked | pending_verification | unlinked"
  2. 3 tool updates
    • Changedget_wallet_summary1 field changed
      • addedOutput schema / properties / wallets / items / properties / transparent_only_hint
        Added value: +{
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedlink_wallet_xpub1 field changed
      • changedInput schema / properties / wallet_id / description
        Previous value: -"Internal wallet UUID of the verified Bitcoin wallet, from get_wallet_summary. Do NOT show this ID to the user."New value: +"Internal wallet UUID of the verified Bitcoin or Zcash wallet, from get_wallet_summary. Do NOT show this ID to the user."
    • Changedrefresh_wallet_balance2 fields changed
      • changedOutput schema / properties / full_wallet_hint / description
        Previous value: -"Bitcoin only: present for verified wallets with no extended key linked — how to count the full wallet via link_wallet_xpub"New value: +"Bitcoin/Zcash: present for verified wallets with no extended key linked — how to count the full wallet via link_wallet_xpub"
      • addedOutput schema / properties / transparent_only_hint
        Added value: +{
        +  "description": "Zcash only: only transparent (t1…) balances are verified and counted; shielded ZEC must be moved to a t-address first",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
  3. 3 tool updates
    • Changedget_wallet_summary3 fields changed
      • addedOutput schema / properties / wallets / items / properties / full_wallet_hint
        Added value: +{
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / wallets / items / properties / xpub_linked
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / wallets / items / properties / xpub_scan
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "properties": {},
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
    • Addedlink_wallet_xpub
    • Changedrefresh_wallet_balance3 fields changed
      • addedOutput schema / properties / full_wallet_hint
        Added value: +{
        +  "description": "Bitcoin only: present for verified wallets with no extended key linked — how to count the full wallet via link_wallet_xpub",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / xpub_linked
        Added value: +{
        +  "description": "Bitcoin only: true when an extended public key is linked and the balance covers every derived address",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / xpub_scan
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "properties": {},
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Bitcoin only: summary of the last extended-key scan (script_type, total_btc, total_usd, funded_address_count, scanned_at)"
        +}
  4. 7 tool updates
    • Changedget_account_status1 field changed
      • addedOutput schema / properties / activation
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Progress + next-step routing resolved from the account state. Follow next_action rather than re-deriving the step order. Fully-activated users get a \"generate another POF / wallet summary\" action, never an onboarding CTA.",
        +  "properties": {
        +    "authenticated": {
        +      "type": "boolean"
        +    },
        +    "next_action": {
        +      "additionalProperties": true,
        +      "description": "The single correct next step for this user: tool, CTA label, suggested prompt, reason",
        +      "properties": {},
        +      "type": "object"
        +    },
        +    "stage": {
        +      "description": "identity | wallet_add | wallet_verify | pof_ready | activated",
        +      "type": "string"
        +    },
        +    "steps": {
        +      "items": {
        +        "additionalProperties": true,
        +        "properties": {},
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "authenticated",
        +    "stage",
        +    "steps",
        +    "next_action"
        +  ],
        +  "type": "object"
        +}
    • Changedget_faq4 fields changed
      • addedOutput schema / properties / activation_stage
        Added value: +{
        +  "description": "Funnel position this response maps to (pre_activation for knowledge answers)",
        +  "type": "string"
        +}
      • addedOutput schema / properties / recommended_next_action
        Added value: +{
        +  "description": "Tool to call if the user wants to act on purchase intent (currently always get_started). Present only when the question context suggests possible intent.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / recommended_next_action_label
        Added value: +{
        +  "description": "Short CTA label for the suggested next step (e.g. \"Verify My Funds\")",
        +  "type": "string"
        +}
      • addedOutput schema / properties / recommended_next_action_reason
        Added value: +{
        +  "description": "Why this next step fits this question — use it to phrase a natural one-sentence offer after answering. Never present as an ad.",
        +  "type": "string"
        +}
    • Changedget_fee_structure4 fields changed
      • addedOutput schema / properties / activation_stage
        Added value: +{
        +  "description": "Funnel position this response maps to (pre_activation for knowledge answers)",
        +  "type": "string"
        +}
      • addedOutput schema / properties / recommended_next_action
        Added value: +{
        +  "description": "Tool to call if the user wants to act on purchase intent (currently always get_started). Present only when the question context suggests possible intent.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / recommended_next_action_label
        Added value: +{
        +  "description": "Short CTA label for the suggested next step (e.g. \"Verify My Funds\")",
        +  "type": "string"
        +}
      • addedOutput schema / properties / recommended_next_action_reason
        Added value: +{
        +  "description": "Why this next step fits this question — use it to phrase a natural one-sentence offer after answering. Never present as an ad.",
        +  "type": "string"
        +}
    • Changedget_how_it_works4 fields changed
      • addedOutput schema / properties / activation_stage
        Added value: +{
        +  "description": "Funnel position this response maps to (pre_activation for knowledge answers)",
        +  "type": "string"
        +}
      • addedOutput schema / properties / recommended_next_action
        Added value: +{
        +  "description": "Tool to call if the user wants to act on purchase intent (currently always get_started). Present only when the question context suggests possible intent.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / recommended_next_action_label
        Added value: +{
        +  "description": "Short CTA label for the suggested next step (e.g. \"Verify My Funds\")",
        +  "type": "string"
        +}
      • addedOutput schema / properties / recommended_next_action_reason
        Added value: +{
        +  "description": "Why this next step fits this question — use it to phrase a natural one-sentence offer after answering. Never present as an ad.",
        +  "type": "string"
        +}
    • Changedget_service_areas4 fields changed
      • addedOutput schema / properties / activation_stage
        Added value: +{
        +  "description": "Funnel position this response maps to (pre_activation for knowledge answers)",
        +  "type": "string"
        +}
      • addedOutput schema / properties / recommended_next_action
        Added value: +{
        +  "description": "Tool to call if the user wants to act on purchase intent (currently always get_started). Present only when the question context suggests possible intent.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / recommended_next_action_label
        Added value: +{
        +  "description": "Short CTA label for the suggested next step (e.g. \"Verify My Funds\")",
        +  "type": "string"
        +}
      • addedOutput schema / properties / recommended_next_action_reason
        Added value: +{
        +  "description": "Why this next step fits this question — use it to phrase a natural one-sentence offer after answering. Never present as an ad.",
        +  "type": "string"
        +}
    • Changedget_started1 field changed
      • addedOutput schema / properties / activation
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "State-aware activation routing resolved from the live account. Follow next_action rather than re-deriving the step order.",
        +  "properties": {
        +    "authenticated": {
        +      "type": "boolean"
        +    },
        +    "next_action": {
        +      "additionalProperties": true,
        +      "description": "The single correct next step for THIS user: tool to call, CTA label, suggested user prompt, reason, and (when applicable) a fallback URL",
        +      "properties": {},
        +      "type": "object"
        +    },
        +    "stage": {
        +      "description": "connect | identity | wallet_add | wallet_verify | pof_ready | activated",
        +      "type": "string"
        +    },
        +    "steps": {
        +      "description": "The three user-facing steps with per-step state (complete | current | processing | pending)",
        +      "items": {
        +        "additionalProperties": true,
        +        "properties": {},
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "authenticated",
        +    "stage",
        +    "steps",
        +    "next_action"
        +  ],
        +  "type": "object"
        +}
    • Changedget_supported_crypto4 fields changed
      • addedOutput schema / properties / activation_stage
        Added value: +{
        +  "description": "Funnel position this response maps to (pre_activation for knowledge answers)",
        +  "type": "string"
        +}
      • addedOutput schema / properties / recommended_next_action
        Added value: +{
        +  "description": "Tool to call if the user wants to act on purchase intent (currently always get_started). Present only when the question context suggests possible intent.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / recommended_next_action_label
        Added value: +{
        +  "description": "Short CTA label for the suggested next step (e.g. \"Verify My Funds\")",
        +  "type": "string"
        +}
      • addedOutput schema / properties / recommended_next_action_reason
        Added value: +{
        +  "description": "Why this next step fits this question — use it to phrase a natural one-sentence offer after answering. Never present as an ad.",
        +  "type": "string"
        +}
  5. 2 tool updates
    • Changedget_account_status1 field changed
      • addedOutput schema / properties / account_hint
        Added value: +{
        +  "description": "Present only for brand-new/empty accounts — if the user expected existing RealOpen data, surface this guidance (they may have connected with a different email than their realopen.com account)",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Addedget_started
  6. 1 tool update
    • Changedget_how_it_works2 fields changed
      • changedInput schema / properties / perspective / description
        Previous value: -"Which perspective to return: buyer (step-by-step), agent (seller/listing-side experience), overview, or all"New value: +"Which perspective to return: buyer (step-by-step), agent (seller/listing-side experience), escrow (title/escrow company settlement experience), overview, or all"
      • changedInput schema / properties / perspective / enum
        Previous value: -[
        -  "buyer",
        -  "agent",
        -  "overview",
        -  "all"
        -]New value: +[
        +  "buyer",
        +  "agent",
        +  "escrow",
        +  "overview",
        +  "all"
        +]
  7. 19 tool updates
    • Changedadd_wallet1 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"
        +}
    • Changedgenerate_proof_of_funds1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "amount": {
        +      "type": "number"
        +    },
        +    "currency": {
        +      "type": "string"
        +    },
        +    "download_url": {
        +      "description": "PDF download URL — handed to the widget; the model should not echo it",
        +      "type": "string"
        +    },
        +    "file_name": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "status": {
        +      "description": "ready when the letter generated successfully",
        +      "type": "string"
        +    },
        +    "thumbnail_url": {
        +      "description": "Top-of-letter PDF preview image URL — used by the widget",
        +      "type": "string"
        +    },
        +    "valid_until": {
        +      "description": "ISO date — letter expires after 30 days",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "required": [
        +    "status",
        +    "amount",
        +    "currency",
        +    "download_url",
        +    "thumbnail_url"
        +  ],
        +  "type": "object"
        +}
    • Changedget_account_status1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "email": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "first_name": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "identity_verification": {
        +      "additionalProperties": true,
        +      "properties": {
        +        "next_step": {
        +          "description": "Human-readable instruction for the user given the current status",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "status": {
        +          "description": "One of: none, requires_input, processing, verified, has_error, canceled",
        +          "type": "string"
        +        },
        +        "verified_name": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        }
        +      },
        +      "required": [
        +        "status"
        +      ],
        +      "type": "object"
        +    },
        +    "last_name": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "pof": {
        +      "additionalProperties": true,
        +      "properties": {
        +        "ceiling_usd": {
        +          "description": "Maximum amount valid for a Proof of Funds letter (post-haircut, verified wallets only)",
        +          "type": "number"
        +        },
        +        "eligible": {
        +          "type": "boolean"
        +        }
        +      },
        +      "required": [
        +        "eligible",
        +        "ceiling_usd"
        +      ],
        +      "type": "object"
        +    },
        +    "user_id": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "wallets": {
        +      "additionalProperties": true,
        +      "description": "Aggregate wallet counts. For per-wallet details, call get_wallet_summary.",
        +      "properties": {
        +        "pending": {
        +          "type": "number"
        +        },
        +        "total": {
        +          "type": "number"
        +        },
        +        "verified": {
        +          "type": "number"
        +        }
        +      },
        +      "required": [
        +        "total",
        +        "verified",
        +        "pending"
        +      ],
        +      "type": "object"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedget_faq1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "available_categories": {
        +      "description": "All distinct FAQ categories — returned when no entries matched, so callers can refine the query",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "last_updated": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "learn_more": {
        +      "type": "string"
        +    },
        +    "message": {
        +      "description": "Diagnostic message — only present when no entries matched",
        +      "type": "string"
        +    },
        +    "result_count": {
        +      "description": "Number of matching FAQ entries returned",
        +      "type": "number"
        +    },
        +    "results": {
        +      "description": "Matching FAQ entries (empty when no entries match)",
        +      "items": {
        +        "additionalProperties": true,
        +        "properties": {
        +          "answer": {
        +            "type": "string"
        +          },
        +          "category": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "question": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "question",
        +          "answer"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "results"
        +  ],
        +  "type": "object"
        +}
    • Changedget_fee_structure1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "last_updated": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "learn_more": {
        +      "type": "string"
        +    },
        +    "sections": {
        +      "items": {
        +        "additionalProperties": true,
        +        "properties": {
        +          "content": {
        +            "type": "string"
        +          },
        +          "title": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "title",
        +          "content"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "sections"
        +  ],
        +  "type": "object"
        +}
    • Changedget_how_it_works1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "get_started": {
        +      "description": "Sign-up URL for users ready to begin",
        +      "type": "string"
        +    },
        +    "last_updated": {
        +      "description": "ISO timestamp of the most recently updated underlying knowledge entry",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "learn_more": {
        +      "description": "External URL with more detail",
        +      "type": "string"
        +    },
        +    "sections": {
        +      "description": "Ordered content sections, each with a heading and body",
        +      "items": {
        +        "additionalProperties": true,
        +        "properties": {
        +          "content": {
        +            "type": "string"
        +          },
        +          "title": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "title",
        +          "content"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "sections"
        +  ],
        +  "type": "object"
        +}
    • Changedget_referral_link1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "referral_url": {
        +      "description": "Fully-qualified realopen.com URL with ref_id query param appended",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "referral_url"
        +  ],
        +  "type": "object"
        +}
    • Changedget_service_areas1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "last_updated": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "learn_more": {
        +      "type": "string"
        +    },
        +    "sections": {
        +      "items": {
        +        "additionalProperties": true,
        +        "properties": {
        +          "content": {
        +            "type": "string"
        +          },
        +          "title": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "title",
        +          "content"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "sections"
        +  ],
        +  "type": "object"
        +}
    • Changedget_snippets1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "snippets": {
        +      "description": "Up to 20 matching snippets (random order to avoid stale top-matches)",
        +      "items": {
        +        "additionalProperties": true,
        +        "properties": {
        +          "asset_file_type": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "asset_id": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "asset_image_url": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "asset_label": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "id": {
        +            "type": "string"
        +          },
        +          "platform": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "referral_url": {
        +            "description": "Tracked referral URL — only present when the session has a resolved ref_id",
        +            "type": "string"
        +          },
        +          "tags": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "text": {
        +            "description": "The actual snippet body to share",
        +            "type": "string"
        +          },
        +          "title": {
        +            "description": "Share title — usable as an email subject line",
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "tone": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "text",
        +          "tags"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "snippets"
        +  ],
        +  "type": "object"
        +}
    • Changedget_supported_crypto1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "last_updated": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "learn_more": {
        +      "type": "string"
        +    },
        +    "sections": {
        +      "items": {
        +        "additionalProperties": true,
        +        "properties": {
        +          "content": {
        +            "type": "string"
        +          },
        +          "title": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "title",
        +          "content"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "sections"
        +  ],
        +  "type": "object"
        +}
    • Changedget_wallet_summary1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "eligible_tokens": {
        +      "description": "Asset symbols that count toward POF eligibility",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "pof_ceiling_usd": {
        +      "description": "Maximum amount valid for a Proof of Funds letter. Already includes the haircut (0.98× stables, 0.935× volatile) and excludes unverified wallets.",
        +      "type": [
        +        "number",
        +        "null"
        +      ]
        +    },
        +    "total_verified_usd": {
        +      "description": "Raw pre-haircut sum of verified wallets. NEVER use as a POF ceiling — pof_ceiling_usd is the only correct max.",
        +      "type": [
        +        "number",
        +        "null"
        +      ]
        +    },
        +    "wallets": {
        +      "description": "All wallets on the user's account",
        +      "items": {
        +        "additionalProperties": true,
        +        "properties": {
        +          "address": {
        +            "type": "string"
        +          },
        +          "assets": {
        +            "items": {
        +              "additionalProperties": true,
        +              "properties": {},
        +              "type": "object"
        +            },
        +            "type": "array"
        +          },
        +          "blockchain": {
        +            "type": "string"
        +          },
        +          "linked_addresses": {
        +            "items": {
        +              "additionalProperties": true,
        +              "properties": {},
        +              "type": "object"
        +            },
        +            "type": "array"
        +          },
        +          "ownership_status": {
        +            "type": "string"
        +          },
        +          "total_usd": {
        +            "type": [
        +              "number",
        +              "null"
        +            ]
        +          },
        +          "verified_at": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "wallet_id": {
        +            "type": "string"
        +          },
        +          "zero_balance_hint": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          }
        +        },
        +        "required": [
        +          "wallet_id",
        +          "address",
        +          "blockchain",
        +          "ownership_status"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "wallets"
        +  ],
        +  "type": "object"
        +}
    • Changedlogout1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "message": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "status": {
        +      "description": "signed_out",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "status"
        +  ],
        +  "type": "object"
        +}
    • Changedrefresh_wallet_balance1 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 balances on the wallet",
        +      "items": {
        +        "additionalProperties": true,
        +        "properties": {},
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "blockchain": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "linked_addresses": {
        +      "description": "Additional addresses proven owned via a prior verification transfer",
        +      "items": {
        +        "additionalProperties": true,
        +        "properties": {},
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "message": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "status": {
        +      "description": "refreshed | no_change",
        +      "type": "string"
        +    },
        +    "total_usd": {
        +      "type": [
        +        "number",
        +        "null"
        +      ]
        +    },
        +    "wallet_id": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "zero_balance_hint": {
        +      "description": "Surfaced when balance is 0 and the wallet is unverified — explains stealth/HD addressing",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "required": [
        +    "status"
        +  ],
        +  "type": "object"
        +}
    • Changedrefresh_wallet_verification1 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": {
        +      "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": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "status": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "total_usd": {
        +      "type": [
        +        "number",
        +        "null"
        +      ]
        +    },
        +    "verification_options": {
        +      "additionalProperties": true,
        +      "properties": {
        +        "dust_transfer": {
        +          "additionalProperties": true,
        +          "properties": {},
        +          "type": "object"
        +        },
        +        "message_signing": {
        +          "additionalProperties": true,
        +          "properties": {},
        +          "type": "object"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "wallet_id": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "zero_balance_hint": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedremove_wallet1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "message": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "status": {
        +      "description": "removed | not_found",
        +      "type": "string"
        +    },
        +    "wallet_id": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "required": [
        +    "status"
        +  ],
        +  "type": "object"
        +}
    • Changedsearch_assets1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "assets": {
        +      "description": "Up to 20 matching assets (ordered most-recent first)",
        +      "items": {
        +        "additionalProperties": true,
        +        "properties": {
        +          "category": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "created_at": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "description": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "file_type": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "id": {
        +            "type": "string"
        +          },
        +          "label": {
        +            "type": "string"
        +          },
        +          "tags": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "thumbnail_url": {
        +            "description": "CDN URL for a smaller preview image",
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "url": {
        +            "description": "CDN URL for the asset itself",
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "video_id": {
        +            "description": "Bunny Stream video id when the asset is a video",
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "label",
        +          "tags"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "assets"
        +  ],
        +  "type": "object"
        +}
    • Changedstart_identity_verification1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "instructions": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "message": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "previous_status": {
        +      "description": "The prior session status if this call is restarting a stale session",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "status": {
        +      "description": "One of: already_verified, processing, redirect_required",
        +      "type": "string"
        +    },
        +    "verification_url": {
        +      "description": "Stripe Identity URL the user opens in their browser. Present when status=redirect_required.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "verified_name": {
        +      "description": "Set when status=already_verified",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "required": [
        +    "status"
        +  ],
        +  "type": "object"
        +}
    • Changedverify_wallet_signature1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "message": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "ownership_status": {
        +      "description": "Underlying wallet state — VERIFIED_SIGNATURE | PENDING_SIGNATURE | NOT_VERIFIED | FAILED",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "status": {
        +      "description": "verified | pending | failed | already_verified",
        +      "type": "string"
        +    },
        +    "wallet_id": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "required": [
        +    "status"
        +  ],
        +  "type": "object"
        +}
    • Changedverify_wallet_transfer1 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"
        +}

Frequently Asked Questions

Discussions

No comments yet. Be the first to start the discussion!

Related MCP Connectors

Related MCP Servers

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

TDQS

A4.4/5.0
Disambiguation4/5

Most tools have clearly distinct purposes (wallet management, verification, knowledge lookup, marketing, account status), but there is minor overlap between add_wallet and refresh_wallet_verification (both generate verification challenges) and between get_started and get_account_status (both touch on next-step resolution). Descriptions clarify the differences, so confusion is unlikely.

Naming Consistency5/5

All tool names follow a consistent verb_noun snake_case pattern (e.g., add_wallet, get_wallet_summary, verify_wallet_transfer), with only 'logout' as a single verb, which is still consistent with the imperative style. No mixed conventions or cryptic names.

Tool Count4/5

The server exposes 20 tools, which is on the heavier side of the typical range but appropriate for the broad domain (wallet operations, verification, KYC, knowledge base, marketing assets, referral tracking). Each tool has a distinct role, so the count feels justified rather than bloated.

Completeness5/5

The surface covers the full lifecycle for crypto-to-real-estate transactions: wallet management (add, remove, refresh, verify), identity verification, proof-of-funds generation, knowledge tools (fees, coverage, supported crypto, how-it-works), marketing (snippets, assets, referral), and account navigation (get_started, logout). No obvious gaps that would leave an agent stuck.