Skip to main content
Glama

assetfare_v2_quote_selected_candidate

Read-only

Reuse the chosen exact request-time quote while valid; after expiry refresh only that candidate at the same amount and never reselect. Example: pass candidate_id and the selection receipt hash. An AssetFare result requires a caller-local proof check and fresh wallet simulation before verified_for_signing; remote verification is not signing authority. An external result is only its provider handoff and has no AssetFare transaction-verification claim. Never prepares, signs, submits, or grants transaction authority.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
profileNoTime policy: fast (30s), balanced (60s default), or explicit economy (60s). Every recommendation profile has an absolute 60-second ceiling.
to_chainYesDestination chain for the v2 route: Solana, Base, Arbitrum, or Robinhood Chain. Source-only chains are not destinations.
to_tokenYesOutput token symbol on to_chain. The chain-token pair must appear in current v2 capabilities.
amount_usdYesRequested input value in USD, minimum 1. USD 1 is reachability/schema smoke only. A USD 50 competitive bucket was observed only for dated 2026-09-23 Solana USDC to Base USDC evidence and must not be generalized to another corridor. USD 1,000 is the primary representative amount. SOL input includes a swap. Always quote the actual intended amount.
from_chainYesSource chain for the v2 route. Polygon, Optimism, Ethereum, HyperEVM, X Layer, Sei, Sonic, Monad, Avalanche, Cronos, Injective, Linea, Aptos, Unichain, and Ink are source-only and cannot be used as to_chain.
from_tokenYesInput token symbol on from_chain. The chain-token pair must appear in current v2 capabilities.
candidate_idYesExact candidate_id returned by assetfare_v2_route_selection; it is never chosen automatically.
max_eta_secondsNoOptional stricter maximum ETA in seconds; it cannot exceed 60 or the selected profile limit.
selection_receipt_sha256YesExact selection_receipt.sha256 returned with the fresh shortlist.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
statusYes
versionYes
choice_bindingYes
server_signingYes
execution_handoffYes
server_submissionYes
selected_candidateYes
selection_quote_sourceYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed11 schema fields changed
    • changedInput schema / properties / max_eta_seconds / description
      Previous value: -"Optional stricter maximum ETA in seconds; it cannot exceed the selected profile limit."New value: +"Optional stricter maximum ETA in seconds; it cannot exceed 60 or the selected profile limit."
    • changedInput schema / properties / max_eta_seconds / maximum
      Previous value: -1800New value: +60
    • changedInput schema / properties / profile / description
      Previous value: -"Time policy: fast (30s), balanced (60s default), or explicit economy (up to 1,800s)."New value: +"Time policy: fast (30s), balanced (60s default), or explicit economy (60s). Every recommendation profile has an absolute 60-second ceiling."
    • changedOutput schema / properties / choice_binding / properties / version / const
      Previous value: -"assetfare-agent-route-choice-2.1.0"New value: +"assetfare-agent-route-choice-2.2.0"
    • addedOutput schema / properties / execution_handoff
      Added value: +{
      +  "additionalProperties": true,
      +  "properties": {
      +    "assetfare_builds_unsigned_actions": {
      +      "type": "boolean"
      +    },
      +    "assetfare_server_signing": {
      +      "const": false,
      +      "type": "boolean"
      +    },
      +    "assetfare_server_submission": {
      +      "const": false,
      +      "type": "boolean"
      +    },
      +    "execution_class": {
      +      "enum": [
      +        "assetfare_verified_unsigned",
      +        "external_provider_handoff"
      +      ],
      +      "type": "string"
      +    },
      +    "next_action": {
      +      "additionalProperties": {},
      +      "type": "object"
      +    },
      +    "proof_carrying_action_required": {
      +      "type": "boolean"
      +    },
      +    "route": {
      +      "enum": [
      +        "solana:SOL->solana:USDC",
      +        "solana:SOL->solana:USDG",
      +        "solana:SOL->base:ETH",
      +        "solana:SOL->base:USDC",
      +        "solana:SOL->arbitrum:ETH",
      +        "solana:SOL->arbitrum:USDC",
      +        "solana:SOL->robinhood:ETH",
      +        "solana:SOL->robinhood:USDG",
      +        "solana:USDC->solana:SOL",
      +        "solana:USDC->solana:USDG",
      +        "solana:USDC->base:ETH",
      +        "solana:USDC->base:USDC",
      +        "solana:USDC->arbitrum:ETH",
      +        "solana:USDC->arbitrum:USDC",
      +        "solana:USDC->robinhood:ETH",
      +        "solana:USDC->robinhood:USDG",
      +        "solana:USDG->solana:SOL",
      +        "solana:USDG->solana:USDC",
      +        "solana:USDG->base:ETH",
      +        "solana:USDG->base:USDC",
      +        "solana:USDG->arbitrum:ETH",
      +        "solana:USDG->arbitrum:USDC",
      +        "solana:USDG->robinhood:ETH",
      +        "solana:USDG->robinhood:USDG",
      +        "base:ETH->solana:SOL",
      +        "base:ETH->solana:USDC",
      +        "base:ETH->solana:USDG",
      +        "base:ETH->base:USDC",
      +        "base:ETH->arbitrum:ETH",
      +        "base:ETH->arbitrum:USDC",
      +        "base:ETH->robinhood:ETH",
      +        "base:ETH->robinhood:USDG",
      +        "base:USDC->solana:SOL",
      +        "base:USDC->solana:USDC",
      +        "base:USDC->solana:USDG",
      +        "base:USDC->base:ETH",
      +        "base:USDC->arbitrum:ETH",
      +        "base:USDC->arbitrum:USDC",
      +        "base:USDC->robinhood:ETH",
      +        "base:USDC->robinhood:USDG",
      +        "arbitrum:ETH->solana:SOL",
      +        "arbitrum:ETH->solana:USDC",
      +        "arbitrum:ETH->solana:USDG",
      +        "arbitrum:ETH->base:ETH",
      +        "arbitrum:ETH->base:USDC",
      +        "arbitrum:ETH->arbitrum:USDC",
      +        "arbitrum:ETH->robinhood:ETH",
      +        "arbitrum:ETH->robinhood:USDG",
      +        "arbitrum:USDC->solana:SOL",
      +        "arbitrum:USDC->solana:USDC",
      +        "arbitrum:USDC->solana:USDG",
      +        "arbitrum:USDC->base:ETH",
      +        "arbitrum:USDC->base:USDC",
      +        "arbitrum:USDC->arbitrum:ETH",
      +        "arbitrum:USDC->robinhood:ETH",
      +        "arbitrum:USDC->robinhood:USDG",
      +        "robinhood:ETH->solana:SOL",
      +        "robinhood:ETH->solana:USDC",
      +        "robinhood:ETH->solana:USDG",
      +        "robinhood:ETH->base:ETH",
      +        "robinhood:ETH->base:USDC",
      +        "robinhood:ETH->arbitrum:ETH",
      +        "robinhood:ETH->arbitrum:USDC",
      +        "robinhood:ETH->robinhood:USDG",
      +        "robinhood:USDG->solana:SOL",
      +        "robinhood:USDG->solana:USDC",
      +        "robinhood:USDG->solana:USDG",
      +        "robinhood:USDG->base:ETH",
      +        "robinhood:USDG->base:USDC",
      +        "robinhood:USDG->arbitrum:ETH",
      +        "robinhood:USDG->arbitrum:USDC",
      +        "robinhood:USDG->robinhood:ETH",
      +        "polygon:USDC->base:USDC",
      +        "polygon:USDC->arbitrum:USDC",
      +        "optimism:USDC->base:USDC",
      +        "optimism:USDC->arbitrum:USDC",
      +        "ethereum:USDC->solana:USDC",
      +        "ethereum:USDC->base:USDC",
      +        "hyperevm:USDC->solana:USDC",
      +        "hyperevm:USDC->base:USDC",
      +        "xlayer:USDC->solana:USDC",
      +        "xlayer:USDC->base:USDC",
      +        "sei:USDC->solana:USDC",
      +        "sei:USDC->base:USDC",
      +        "sonic:USDC->solana:USDC",
      +        "sonic:USDC->base:USDC",
      +        "monad:USDC->solana:USDC",
      +        "monad:USDC->base:USDC",
      +        "avalanche:USDC->solana:USDC",
      +        "avalanche:USDC->base:USDC",
      +        "cronos:USDC->solana:USDC",
      +        "cronos:USDC->base:USDC",
      +        "injective:USDC->solana:USDC",
      +        "injective:USDC->base:USDC",
      +        "linea:USDC->solana:USDC",
      +        "linea:USDC->base:USDC",
      +        "aptos:USDC->solana:USDC",
      +        "aptos:USDC->base:USDC",
      +        "unichain:USDC->solana:USDC",
      +        "ink:USDC->solana:USDC"
      +      ],
      +      "type": "string"
      +    },
      +    "version": {
      +      "const": "assetfare-agent-execution-handoff-1.0.0",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "version",
      +    "execution_class",
      +    "route",
      +    "assetfare_builds_unsigned_actions",
      +    "proof_carrying_action_required",
      +    "next_action",
      +    "assetfare_server_signing",
      +    "assetfare_server_submission"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / selected_candidate / properties / assetfare_executes_candidate
      Added value: +{
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / selected_candidate / properties / assetfare_local_verification_required
      Added value: +{
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / selected_candidate / properties / execution_class
      Added value: +{
      +  "enum": [
      +    "assetfare_verified_unsigned",
      +    "external_provider_handoff"
      +  ],
      +  "type": "string"
      +}
    • changedOutput schema / properties / selected_candidate / required
      Previous value: -[
      -  "candidate_id",
      -  "provider",
      -  "provider_role",
      -  "expected_receive_base",
      -  "minimum_receive_base",
      -  "all_in_cost_usd",
      -  "eta_seconds",
      -  "eta_upper_bound_seconds",
      -  "eta_basis",
      -  "verification_tier",
      -  "prepare_mode",
      -  "prepare_available",
      -  "assetfare_direct",
      -  "fee_included"
      -]New value: +[
      +  "candidate_id",
      +  "provider",
      +  "provider_role",
      +  "expected_receive_base",
      +  "minimum_receive_base",
      +  "all_in_cost_usd",
      +  "eta_seconds",
      +  "eta_upper_bound_seconds",
      +  "eta_basis",
      +  "verification_tier",
      +  "prepare_mode",
      +  "prepare_available",
      +  "assetfare_direct",
      +  "execution_class",
      +  "assetfare_local_verification_required",
      +  "assetfare_executes_candidate",
      +  "fee_included"
      +]
    • changedOutput schema / properties / version / const
      Previous value: -"assetfare-agent-route-choice-2.1.0"New value: +"assetfare-agent-route-choice-2.2.0"
    • changedOutput schema / required
      Previous value: -[
      -  "version",
      -  "status",
      -  "choice_binding",
      -  "selected_candidate",
      -  "selection_quote_source",
      -  "server_signing",
      -  "server_submission"
      -]New value: +[
      +  "version",
      +  "status",
      +  "choice_binding",
      +  "selected_candidate",
      +  "execution_handoff",
      +  "selection_quote_source",
      +  "server_signing",
      +  "server_submission"
      +]
  2. Changed2 schema fields changed
    • changedOutput schema / properties / choice_binding / properties / version / const
      Previous value: -"assetfare-agent-route-choice-2.0.0"New value: +"assetfare-agent-route-choice-2.1.0"
    • changedOutput schema / properties / version / const
      Previous value: -"assetfare-agent-route-choice-2.0.0"New value: +"assetfare-agent-route-choice-2.1.0"
  3. Added

TDQS

A3.9/5.0
Behavior4/5

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

Adds meaningful context beyond the annotations: caller-local proof check and fresh wallet simulation are required before verified_for_signing, remote verification is not signing authority, and external results carry no AssetFare verification claim. The 'never prepares, signs, submits, or grants transaction authority' line reinforces the readOnly profile. With annotations already covering the safety surface, this is solid added value.

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

Conciseness4/5

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

Leads with the core reuse/refresh behavior before the verification caveats, so the actionable part is front-loaded. The last two sentences overlap somewhat ('remote verification is not signing authority' vs 'never prepares, signs, submits'), a minor redundancy.

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?

An output schema exists, so return values need not be explained. For a 7-required-parameter tool the description covers the reuse/refresh semantics and the verification boundary an agent must respect. Gaps are minor and largely covered by the rich schema.

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 the schema already documents all 9 parameters thoroughly. The description only restates two required inputs (candidate_id and the receipt hash), adding no format or constraint detail beyond the schema. Baseline 3 applies when the schema does the heavy lifting.

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

Purpose4/5

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

States a specific verb+resource: 'Reuse the chosen exact request-time quote while valid' and 'refresh only that candidate at the same amount and never reselect.' This clearly distinguishes it from a fresh-quote sibling like assetfare_v2_quote. It stops short of naming that sibling explicitly, so an agent must infer the alternative.

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?

Gives concrete when-to-use context: reuse while valid, refresh only the chosen candidate after expiry, never reselect. The example ('pass candidate_id and the selection receipt hash') clarifies the call site. No explicit exclusion naming an alternative tool, which keeps it from a 5.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.