Skip to main content
Glama

Server Details

Spend USDC in the real world: prepaid cards, gift cards, push-to-card, and bank payouts.

Ownership verified
Status
Healthy
Uptime
99.8% over 35 days
OAuth
Works in Glama
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL

TDQS

A3.8/5.0

Scored across 80 tools

Disambiguation3/5

The descriptions are unusually detailed, but the set contains several adjacent money-movement families that require careful reading to tell apart: fund_card_balance vs fund_card_from_account_balance, withdraw vs withdraw_card_balance vs agent_wallet_transfer vs move_agent_wallet_funds, and multiple recipient/deletion systems. The distinctions are usually explained, yet the sheer number of similar-sounding financial operations makes misselection plausible.

Naming Consistency4/5

Most tool names use consistent snake_case and are broadly verb_noun oriented. There are a few deviations such as agent_wallet_swap, buy_with_saved_card, push_to_card, pay_x402_endpoint, and the bare withdraw, but they remain readable and do not create a chaotic surface.

Tool Count1/5

Eighty tools is far beyond a well-scoped MCP surface and forces the server to span auth, wallets, swaps, banking, cards, gift cards, payments, webhooks, docs, and support. Even with good descriptions, this volume creates heavy selection and context overhead for an agent.

Completeness4/5

The surface is very broad and covers most lifecycles: account/auth, wallet funding and transfers, banking applications and recipients, card ordering/funding/withdrawal, gift cards, payments, webhooks, and docs. Some sub-resources lack full lifecycle operations such as closing banking accounts or managing reloadable cards beyond creation/funding/withdrawal, but these are minor relative to the overall coverage.

Available Tools

80 tools
add_banking_destinationAInspect

Attach bank details to a recipient

Attaches a bank account or crypto address to a recipient and returns the destination_id that /send-bank-payment pays out to.

Free.

NameRequiredDescriptionDefault
nicknameNoAn optional label. The only field editable later, via `updateBankingDestination`.
destinationYesThe destination. For a US bank account: `destination_type: "fiat_us"` plus `aba_routing_number`, `account_number`, `account_type`, `account_holder_name`, and `bank_name`. Also supports `fiat_iban` and `crypto`.
recipientIdYesThe recipient from `createBankingRecipient`.
recipientAddressNoSets the recipient's postal address before attaching the destination. Needed when the recipient was created name-only: bank destinations are rejected without one, so supplying it here avoids a dead end.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=false, destructiveHint=false, idempotentHint=false. The description adds useful behavioral context: it returns a `destination_id`, it supports multiple destination types (US bank, IBAN, crypto), and it warns that bank destinations are rejected without a postal address, so supplying `recipientAddress` avoids a dead end. This goes beyond the schema and 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 compact and front-loaded: the core action and return value appear in the first sentence, followed by a one-word 'Free.' and then a concise but informative parameter walkthrough. Every sentence earns its place; no fluff.

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 tool has an output schema, so return values are covered. The description covers prerequisites, the dead-end scenario, and the editable field. It could be slightly more explicit about the exact structure of the `destination` object, but the schema already provides that. Overall, an agent has enough context to call this 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?

Schema coverage is 100%, so the baseline is 3. The description adds meaning by explaining the relationship between `recipientId` and `createBankingRecipient`, clarifying that `nickname` is the only editable field later, and explaining why `recipientAddress` is needed (name-only recipients cause rejection). This adds value beyond the raw schema.

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 verb 'Attach' and the resource 'bank details to a recipient', and explicitly mentions the returned `destination_id` used by `/send-bank-payment`. This distinguishes it from sibling tools like `create_banking_recipient` (creates the recipient) and `update_banking_destination` (edits later).

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 explains when to use this tool: to attach bank/crypto details to a recipient, and notes the prerequisite that a recipient must exist from `createBankingRecipient`. It also mentions the alternative `updateBankingDestination` for editing the nickname later. It doesn't explicitly say when NOT to use it, but the context is clear enough.

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

agent_wallet_swapAInspect

Swap one asset in your managed agent wallet for any other token on Solana, into USDC by default. Use it to make spendable a token the wallet holds but cannot pay with, such as USDT or SOL someone sent it (get_agent_wallet lists them under tokens), or to buy a token you need. Find a token's mint with search_swap_tokens and check the price with agent_wallet_swap_quote first. No SOL is needed for fees; the rate includes a provider fee of up to 0.25% plus the pool fee. Waits up to 45 seconds and returns status succeeded with outputAmount and txHash, or pending if it is still settling. The money stays in your wallet, so swaps do not count against spend limits.

NameRequiredDescriptionDefault
amountYesDecimal amount of from_mint to sell, in its own units (e.g. 10).
to_mintNoThe asset to buy. Omit for USDC.
from_mintYesThe asset to sell: an SPL token mint address, or native for SOL.
slippage_bpsNoMaximum slippage from the quote in basis points (default 50, max 300). A worse fill fails and nothing is swapped.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotations, the description discloses that no SOL is needed for fees, that a provider fee up to 0.25% plus pool fee is included, the 45-second wait, and the succeeded/pending status outcomes with outputAmount and txHash. It also clarifies that funds remain in the wallet and swaps do not count against spend limits, which is valuable operational context.

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 front-loaded with the core action, then adds usage context, prerequisites, fee behavior, timing, return values, and spend-limit implications. Each sentence contributes useful information without repetition.

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 output schema, and the annotations, the description is complete enough for an agent to call it correctly. It covers purpose, workflow, fees, timing, return statuses, and the important wallet/spend-limit behavior.

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 schema already documents all four parameters at 100% coverage, including amount units, native SOL handling, USDC default, and slippage limits. The description reinforces the USDC default and the token-discovery workflow, but does not add parameter-level detail beyond the schema, so the 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: swap one asset in the managed agent wallet for any other Solana token, defaulting into USDC. It clearly distinguishes this from the quote and token-search siblings, so an agent can identify the tool without opening the schema.

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 explicit when-to-use cases: making a held token spendable or buying a needed token. It also names prerequisite and alternative tools: get_agent_wallet to see held tokens, search_swap_tokens to find mints, and agent_wallet_swap_quote to check price first.

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

agent_wallet_swap_quoteA
Read-only
Inspect

Price a swap inside your managed agent wallet without making it. Same arguments as agent_wallet_swap. Returns estimatedOutputAmount, minimumOutputAmount (the least the swap delivers at the slippage limit), the USD value of each side when priced (the gap is what the swap costs), and providerFeeBps. Refused if the wallet holds less of from_mint than amount.

NameRequiredDescriptionDefault
amountYesDecimal amount of from_mint to sell, in its own units.
to_mintNoThe asset to buy. Omit for USDC.
from_mintYesThe asset to sell: an SPL token mint address, or native for SOL.
slippage_bpsNoMaximum slippage from the quote in basis points (default 50, max 300).

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so the non-mutating nature is covered. The description goes beyond them by disclosing the balance precondition that causes refusal and by interpreting the output ("the gap is what the swap costs"), which is real behavioral context. It doesn't mention quote staleness/expiry, which matters for a live price.

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 short sentences, front-loaded with the price-don't-execute distinction, then output semantics, then the refusal condition. No filler, and the most decision-relevant fact comes first.

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?

With an output schema present the description needn't enumerate returns, yet it briefly frames their meaning, and it covers the one precondition an agent could trip over. For a read-only four-parameter quote tool with full annotations, nothing needed for correct invocation is missing.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3. The description still adds value: it ties slippage_bps to minimumOutputAmount ("the least the swap delivers at the slippage limit") and ties from_mint to a required wallet balance, which the schema does not state.

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

Purpose5/5

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

States a specific verb and resource ("Price a swap inside your managed agent wallet") and immediately delimits it with "without making it," which is exactly what separates it from the sibling agent_wallet_swap. An agent can pick between the two without opening either schema.

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?

"Same arguments as agent_wallet_swap" plus "without making it" gives clear implied routing: quote first, execute later with the sibling. The precondition "Refused if the wallet holds less of from_mint than amount" adds a concrete when-it-fails condition. It stops short of an explicit "call this before agent_wallet_swap" instruction, so not a 5.

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

agent_wallet_transferA
Destructive
Inspect

Transfer USDC out of your managed agent wallet to any Solana address, or to any Base address by setting destination_network to base (bridged over CCTP, minimum 1 USDC, maximum your spend limit; the recipient receives the amount less a 0.01% bridge fee, usually within a minute). It draws on the whole balance: if the Solana side is short, the difference is pulled back from Base first (usually about 15 seconds). Use this to pay someone or to move funds to another wallet you control. This is the only way to move the agent wallet's USDC; withdraw draws on the separate Laso account balance instead. To send another asset the wallet holds (USDT, SOL, any SPL token listed in get_agent_wallet's tokens), pass its mint (native for SOL); amount is then in that token's units, Solana destinations only, valued at market price for your spend limits.

NameRequiredDescriptionDefault
mintNoThe asset to send: an SPL token mint address, or native for SOL. Omit for USDC.
amountYesDecimal amount to send, as a string (e.g. 25.50), in USDC unless mint is set.
destination_addressYesAddress to send the USDC to: a Solana address, or a 0x address when destination_network is base.
destination_networkNoChain the destination address is on (default solana). base delivers native USDC on Base.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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

The description adds substantial behavior beyond the annotations: CCTP bridging, 0.01% fee, 1 USDC minimum, spend-limit ceiling, ~1 minute delivery, automatic Base-to-Solana pullback (~15s), and the fact that other tokens are valued at market price for spend limits. These are exactly the operational details an agent needs for a destructive, non-idempotent, open-world transfer.

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 text is dense but front-loaded: the primary transfer use case and cross-chain caveat come first, followed by funding-source mechanics and the alternative-token path. Every sentence carries operational information, though the final sentence about other assets is long and could be slightly tighter.

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?

With an output schema present and annotations declaring destructive/open-world/non-idempotent behavior, the description fills the remaining gaps: funding source, bridge mechanics, limits, timing, and how other tokens are handled. Nothing critical for correct invocation is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description adds real meaning: omitting 'mint' means USDC, 'amount' is in USDC unless mint is set, and 'destination_network=base' changes address format and enables bridging with specific limits. It does not repeat schema text verbatim; it explains the interaction between 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 states a specific verb (transfer) and resource (USDC out of the managed agent wallet) plus cross-chain behavior. It explicitly distinguishes itself from the sibling 'withdraw' by noting that withdraw draws on the separate Laso account balance, so an agent can route correctly without opening either schema.

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

Usage Guidelines4/5

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

It gives clear usage contexts ('pay someone or move funds to another wallet you control') and an explicit exclusion/routing rule versus 'withdraw'. It also explains the alternative path for non-USDC assets via the mint parameter. However, it does not mention 'move_agent_wallet_funds' or 'agent_wallet_swap', which are close siblings an agent might otherwise consider.

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

announce_connectionAInspect

Call this FIRST, before any other Laso tool. Your human is watching a screen that waits for you to connect; this is what resolves it, names you in their dashboard, and starts a session in their activity stream. Introduce yourself with agent_name and message. Also returns your wallet funding state, so it doubles as your setup check.

NameRequiredDescriptionDefault
messageNoA short greeting shown to your human, in your own words. Max 280 characters.
agent_nameNoWhat to call you in your human's dashboard, e.g. Claude Code. Max 60 characters.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=false and destructiveHint=false. The description adds context about the side effects (starting a session, returning wallet funding state) which is not in annotations. However, it does not describe what happens if called again or whether it can be called multiple times, but idempotentHint=false already signals that. Overall it adds useful behavioral context without contradiction.

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, front-loaded with the critical instruction 'Call this FIRST'. Every sentence serves a purpose: the first explains what it does and when, the second mentions the extra return value. No wasted words.

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 an output schema (not shown) and two well-documented parameters, the description fully covers the tool's role, timing, and return value. An agent can correctly invoke it as the first step without missing information.

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% and both parameters have descriptive text (message, agent_name with max lengths). The description mentions 'Introduce yourself with agent_name and message' but adds minimal new meaning beyond the schema. Baseline of 3 is appropriate since the schema already carries the parameter semantics.

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 states a specific purpose: resolving the connection screen, naming the agent in the dashboard, and starting a session. It clearly distinguishes itself from all sibling tools by positioning itself as the mandatory first call.

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 instructs 'Call this FIRST, before any other Laso tool' and explains the context (human watching a waiting screen). It also notes it doubles as a setup check, giving the agent clear when-to-use guidance.

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

buy_with_saved_cardAInspect

Shop and pay with the holder's saved card

Buys from online merchants (Amazon, Walmart, Target, Best Buy, DoorDash and more) and pays with the card the account holder saved themselves (see GET /get-saved-cards). One conversation per purchase:

  1. Send what to buy as ask, in plain language. Pass delivery_address on this first call when you know it.

  2. Relay reply to the holder and send their answers back as ask with the same conversation_id, until a cart comes back.

  3. Show the holder the cart. Once they agree, send its hash as confirm with the conversation_id. Nothing can be charged before this.

  4. The confirm answers awaiting_approval with an approval_url. Send it to your human; never open it yourself. They approve on their own device with their passkey. Then send the same confirm again to get order_placed.

A turn runs against a live merchant and can take up to two minutes. This call waits about 45 seconds: a turn that finishes in time comes back complete (state: done); a slower one comes back as state: running with a turn_id to poll with GET /get-purchase-turn.

This route is free. The holder's own card pays the merchant, and no identity verification is needed.

NameRequiredDescriptionDefault
askNoWhat the holder wants, in plain language. Required unless confirming.
confirmNoA cart's `hash` from an earlier turn, to place exactly that cart.
conversation_idNoThe conversation to continue. Required with `confirm`.
delivery_addressNoWhere to ship. Send it on the call that asks for the cart (a cart is bound to the address it was shown for) and on the confirm.

Output Schema

NameRequiredDescription
cartNoThe most recently shown cart.
noteNoThe next step.
cartsNoEvery open cart in the conversation, oldest first.
errorNoPresent when `state` is `failed`.
replyNoThe shopping assistant's turn as prose, ready to show the holder.
stateNo`running` means the turn is still talking to the merchant; the fields below appear once it is `done`. One of: running, done, failed.
statusNoWhat to do next. `needs_input`: a question or a cart waiting on a confirm. `awaiting_approval`: send `approval_url` to the holder, then repeat the same confirm. `in_progress`: the order is already being placed; read `GET /get-purchase-conversation` instead of confirming again. `order_placed`. `declined`: see `decline_code`. `conflict`: nothing ran, see `error_code` and confirm the fresh cart's hash. Never branch on `reply`. One of: needs_input, awaiting_approval, in_progress, order_placed, declined, conflict.
catalogNoThe last product search. Empty on a turn that did not search again, so keep the previous one.
turn_idNoThis turn's id. Poll `GET /get-purchase-turn` with it while `state` is `running`.
order_idNoSet when this turn placed an order.
unmatchedNoThings asked for that did not make it into a cart, with a reason. Show these rather than guessing from `reply`.
card_last4NoThe saved card that paid, for naming it to the holder.
created_atNoMilliseconds since the epoch.
error_codeNoOn `conflict`: `cart_changed`, `turn_in_progress`, `delivery_address_changed`, or `delivery_address_bound_after_cart`.
approval_urlNoSend to the holder when `status` is `awaiting_approval`. Never open it yourself.
decline_codeNoThe machine reason behind `declined`, e.g. `items_unavailable`.
charge_statusNoWhether money moved: `none`, `confirming`, `settled`, or `unknown` (do not retry; read the conversation). One of: none, confirming, settled, unknown, .
conversation_idNoSend it back on every follow-up and on the confirm.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only cover the safety profile (non-read-only, non-idempotent, non-destructive); the description supplies the behavior that actually matters: the human approval gate via approval_url that the agent must never open, the ~45s wait versus a potential two-minute live turn with state: done/running plus turn_id polling, and that the route is free with no identity verification. This is behavior beyond what structured fields convey.

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

Conciseness4/5

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

Front-loaded with the purpose, then a numbered flow, then timing behavior; nearly every sentence carries operational weight. It is longer than strictly minimal, but the density of actionable detail (approval routing, poll fallback, free/no-KYC note) justifies most of 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?

For a multi-turn live-merchant purchase flow with nested address input and an output schema, the description covers the conversation lifecycle, the approval gate, and the async return states, so an agent knows what to expect at each call and how to resume.

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 baseline is 3, but the description adds real semantics: which parameter to send on which turn, that delivery_address should go on both the cart-requesting call and the confirm, and that the cart is bound to the address it was shown for. It does not restate the hash pattern or field formats, which the schema already covers.

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

Purpose5/5

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

States a specific verb and resource ('Buys from online merchants ... and pays with the card the account holder saved'), names concrete merchants, and distinguishes itself from siblings like order_gift_card, order_intl_card, and send_payment by tying the payment to the holder's saved card. An agent can route to it without opening the schema.

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

Usage Guidelines5/5

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

Gives an explicit four-step when-and-how sequence, names the sibling route for prerequisites (GET /get-saved-cards) and the polling alternative (GET /get-purchase-turn), and states the precondition that nothing can be charged before confirm. Exclusions and conditions are all spelled out.

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

cancel_intl_orderA
Destructive
Inspect

Cancel a queued international card order

Cancel a previously queued international non-reloadable card order, as long as it has not yet been fulfilled by an admin (state=queued). The charged amount is credited back to the account balance.

NameRequiredDescriptionDefault
card_idYesThe card ID of the queued order to cancel (returned from `/order-intl-card`)

Output Schema

NameRequiredDescription
card_idNo
messageNo

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, readOnly=false, and idempotent=false. The description adds valuable behavioral context beyond annotations: the charged amount is credited back to the account balance, and the state precondition (`state=queued`) is disclosed. 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 concise and front-loaded: first line states the action and resource, then the paragraph adds the eligibility condition and financial effect. Every sentence earns its place without 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?

For a single-parameter mutation tool with a provided output schema and annotations covering destructiveness, the description covers the essential operational facts: what is cancelled, when it can be cancelled, and what happens to the charged amount. Nothing needed for correct invocation 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% and the only parameter, `card_id`, is already well documented by the schema with its source (`returned from /order-intl-card`). The description reinforces that it is a queued order ID but does not add significant meaning beyond the schema.

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 ('Cancel') and resource ('queued international card order'), and adds the key qualifier 'non-reloadable' with the state constraint `state=queued`. This clearly distinguishes it from sibling ordering tools like `order_intl_card`, `order_card`, and `order_gift_card`.

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 the tool applies: only for a previously queued order that has not yet been fulfilled by an admin. It gives a clear exclusion ('as long as it has not yet been fulfilled') but does not name an alternative tool or explain what to do if the condition is not met.

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

create_agent_api_keyAInspect

Issue an API key

Issues a durable lasoak_ API key for the account. The raw key is returned once — only its hash is stored, so it cannot be retrieved again. Normally the human does this from the dashboard.

Free.

NameRequiredDescriptionDefault
labelNoA label to recognize the key by.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior4/5

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

It discloses important side-effect and security behavior beyond annotations: the raw key is shown once, only a hash is stored, and the key cannot be retrieved again. This substantially helps an agent reason about consequences, and it does not contradict the readOnly/destructive/idempotent hints.

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 compact and front-loaded: the action appears first, followed by the critical one-time-raw-key caveat. The heading-like first sentence and 'Free.' are slightly redundant but not wasteful.

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 single optional parameter, the presence of an output schema, and annotations, the description covers the essential operational facts: what is created, the credential-handling caveat, and normal human/dashboard context. It does not explain key lifecycle follow-ups, but that is not required for correct invocation.

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 only parameter, label, is already fully described in the input schema ('A label to recognize the key by'), and the description adds no additional semantics about how the label behaves. With 100% schema coverage, 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 states a specific verb and resource: it issues a durable `lasoak_` API key for the account, and adds the distinguishing detail that the raw key is returned only once. It is not a tautology, though it does not explicitly name a sibling to differentiate from.

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

Usage Guidelines2/5

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

The only usage guidance is 'Normally the human does this from the dashboard,' which implies privileged/manual operation but gives no explicit when-to-use or when-not-to-use conditions. It does not mention alternatives like exchange_api_key or refresh_token.

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

create_agent_walletA
Idempotent
Inspect

Create your managed agent wallet, or return the existing one (idempotent). Returns the Solana side as walletId and address, and the Base side as baseWalletId and baseAddress. Rarely needed: the dashboard provisions the wallet, and get_agent_wallet creates a missing Base side. Fund either address with USDC to pay for the paid tools.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare idempotentHint=true and destructiveHint=false, so the description doesn't need to re-establish safety. It adds real context beyond the annotations: the two-sided wallet structure (Solana walletId/address, Base baseWalletId/baseAddress) and the operational note that either address must be funded with USDC to use paid tools. It stops short of auth/rate-limit detail, but the added behavioral context is substantial.

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?

Four short sentences, front-loaded with the core create-or-return behavior, then return shape, then usage guidance, then funding note. Each sentence carries distinct information with no repetition of the name or title.

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

Completeness5/5

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

An output schema exists, yet the description still concisely maps the return fields, and it covers the practical question of what the wallet is for and how to fund it. Nothing an agent needs to invoke this correctly is missing.

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

Parameters4/5

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

The tool takes zero parameters, so the baseline is 4. There are no parameter semantics to disambiguate, and the description correctly does not invent any.

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?

Specific verb+resource ('Create your managed agent wallet') with a precise scope qualifier: it returns the existing wallet rather than creating a duplicate. It clearly distinguishes itself from the sibling get_agent_wallet by naming it directly.

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 when NOT to use it ('Rarely needed: the dashboard provisions the wallet') and names the alternative ('get_agent_wallet creates a missing Base side'). This is exactly the when/when-not/alternatives guidance that makes selection unambiguous.

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

create_banking_accountAInspect

Open an on-ramp or off-ramp account

Opens a banking rail. An on-ramp issues a virtual US bank account: dollars sent to it arrive as USDC in the managed wallet. An off-ramp pays out to a bank account you have registered, and is opened automatically by /send-bank-payment, so most agents never call this for one directly.

Free.

NameRequiredDescriptionDefault
railNoThe payment rail for the account.
assetNoCrypto asset ticker, uppercase.
networkIdNoOn-ramp only. Defaults to Solana mainnet.
accountTypeYesWhich rail to open.
capabilitiesNoOn-ramp only. Bank rails to support. Defaults to ACH and wire.
cryptoAddressNoOn-ramp only. Where the converted USDC should land. Defaults to the managed agent wallet.
fiatDestinationIdNoOff-ramp only. The bank destination payouts go to, from `addBankingDestination`.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false, so the description doesn't need to restate those. The description adds meaningful behavioral context: on-ramp issues a virtual US bank account and converts dollars to USDC in the managed wallet, off-ramp pays out to a registered bank account, and off-ramp is opened automatically by another tool. It also discloses that the tool is free. This goes beyond the annotations and helps the agent understand side effects.

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 well-structured with a clear title, a short definition of each account type, and a note about when not to call it. Every sentence earns its place, and the most important distinction (on-ramp vs off-ramp) is front-loaded. The 'Free.' note is a minor extra but not wasteful.

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 core behavior, the two modes, and the automatic off-ramp path, which is enough for an agent to decide whether to call it. The output schema exists, so return values don't need to be explained. It could mention prerequisites like needing a banking profile or KYC, but the schema and sibling tools (get_kyc_status, submit_banking_application) partially cover that context.

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%, so the schema already documents all 7 parameters. The description adds context for the two account types and mentions defaults (Solana mainnet, ACH and wire, managed agent wallet), which aligns with the schema. However, it doesn't add much beyond what the schema already says, so a 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 opens a banking rail and distinguishes between on-ramp and off-ramp accounts, explaining what each does. It names the specific resource (banking account) and the verb (open), and the title reinforces this. It also differentiates from siblings by noting off-ramp accounts are opened automatically by send-bank-payment, so most agents won't need to call this for off-ramp.

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 explains when to use on-ramp vs off-ramp, and even tells agents they usually don't need to call this for off-ramp because send-bank-payment does it automatically. It also mentions the 'Free' pricing, which is a clear usage signal. This is strong guidance for an agent deciding whether to invoke this tool.

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

create_banking_profileAInspect

Create the banking profile

Opens the banking profile that all other banking calls hang off. Identity verification is required first; if the human has not verified, the reply carries kycRequired: true and a kycUrl to hand them. This is the only step an agent cannot complete itself. Retry once they finish.

Free.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only indicate it's not read-only, not idempotent, not destructive. The description adds crucial behavioral context: it's the only step an agent cannot complete itself, it returns kycRequired and kycUrl when verification is pending, and advises to retry after the human finishes. This goes well beyond annotations and is essential for the agent to handle correctly.

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 concise and front-loaded with the purpose and key prerequisite. The only blemish is the trailing 'Free.' sentence, which appears to be a stray or unrelated note and adds no value. This prevents a perfect score.

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 tool with an output schema, the description fully covers what an agent needs: the purpose, the prerequisite, the failure mode (kycRequired), and the required human interaction. Nothing essential is missing. The output schema handles return values, so no further detail is needed.

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?

With zero parameters, the description has no parameter details to add. Per the rubric, the baseline is 4 for zero-parameter tools. The description appropriately focuses on preconditions and behavior instead of parameter semantics.

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 creates the banking profile and explains its role as the foundation for all other banking calls. It distinguishes itself from siblings like create_banking_account (accounts vs. profile) and get_banking_profile_status (status vs. creation). The verb-resource pairing is specific and unambiguous.

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 implies when to use it: before other banking calls, and it explicitly states the prerequisite (identity verification) and the action to take if verification is missing (hand the kycUrl to the human). However, it doesn't explicitly name alternatives or say when not to use it, such as checking if the profile already exists via get_banking_profile_status. This is a minor gap given the clear prerequisite and positioning.

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

create_banking_recipientAInspect

Create a payout recipient

Creates a person or company money can be sent to. Bank details are attached separately with addBankingDestination.

Free.

NameRequiredDescriptionDefault
nameYesThe recipient's name.
addressNoThe recipient's postal address. Required before a bank destination can be attached, so supplying it here avoids a second call.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false (write operation) and idempotentHint=false. The description adds 'Free' (a cost signal) but otherwise does not disclose potential failures, side effects, or prerequisites beyond what the schema provides. Since annotations cover the basic safety profile, this is adequate but not exceptional.

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 concise and well-structured: a title, a one-sentence definition, a key usage note pointing to the next step, and a cost indicator. No redundant information, and all sentences earn their place.

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 simple create operation with two parameters and a rich schema (100% coverage) and an output schema present, the description is sufficiently complete. It covers the main purpose, the next step (addBankingDestination), and a key prerequisite (address). It doesn't explain return values but the output schema presumably does.

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 covers both parameters, and the description adds meaningful context: it explains that address is required before a bank destination can be attached, and supplying it here avoids a second call. This enhances understanding of the address parameter beyond the schema's basic description.

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 creates a payout recipient (a person or company) and differentiates it from attaching bank details by referencing addBankingDestination. This distinguishes it from sibling tools like add_banking_destination and delete_banking_recipient, making the purpose unambiguous.

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 that bank details are attached separately via addBankingDestination, implying the correct sequence of use. However, it does not explicitly mention when not to use this tool or alternatives like update_payment_recipient, so it is slightly incomplete but still helpful.

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

create_reloadable_cardAInspect

Create a reloadable card

Creates a reloadable card funded from the account holder's balance with the card issuer, and returns it. This is the same card the holder creates in the Laso dashboard, so an agent and a human end up with the same product.

The card is reusable by default (reusable: true): it stays open across charges until its limit is spent. Pass reusable: false for a single-use card that closes after its first approved charge.

This route is free — no x402 payment. The card draws on the account holder's own balance with the issuer, so Laso fronts nothing.

If the balance is short, this route answers 402. Fund it by sending USDC: GET /get-card-deposit-address returns the holder's own deposit address at the card issuer (USDC on Base only), and the balance credits within a couple of minutes. The holder can also top up with Apple or Google Pay in the dashboard.

Read the new card's number and CVV with /get-card-data?card_id=.... A card created here is Laso-issued, so its card_details come back directly — the approval step applies only to cards the holder created in a different app.

NameRequiredDescriptionDefault
reusableNoWhether the card stays open across charges. Defaults to `true`; `false` closes it after the first approved charge.
usd_amountYesAmount in US dollars to load onto the card, minimum $1. Sent as dollars, not cents.

Output Schema

NameRequiredDescription
cardNo

TDQS

A4.2/5.0
Behavior5/5

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

Discloses far beyond the sparse annotations (readOnlyHint=false, destructiveHint=false): the route is free with no x402 payment, the 402 response when the balance is short, the funding path (USDC-on-Base deposit address with ~minutes credit, Apple/Google Pay top-up), and the behavior that created cards are Laso-issued so no approval step applies. Rich operational detail an agent needs before invoking.

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?

Well-organized with front-loaded essentials and effective bold callouts (reusable, this route is free, if the balance is short), but verbose: roughly seven sentences for a two-parameter create. Asides like the Apple/Google Pay dashboard top-up and the 'so an agent and a human end up with the same product' framing could be trimmed without losing decision-relevant content. Structured, but not tight.

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?

Comprehensive for its complexity: an output schema exists (so return shape is covered), and the description handles error behavior (402 + funding remedy), payment cost, reusability, and follow-up reads via get-card-data. The only soft gap is that the 'approval step' for externally-created cards is referenced but never explained — minor in context.

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 both parameters (usd_amount as dollars-not-cents with $1 minimum; reusable defaulting true). The description adds narrative on the reusable semantics ('stays open across charges until its limit is spent', 'closes after its first approved charge') but this merely restates the schema meaning — no new syntax or format detail. Baseline 3 applies since the schema carries the load.

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

Purpose5/5

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

States a specific verb+resource ('Creates a reloadable card funded from the account holder's balance') and grounds it in a concrete scenario — 'the same card the holder creates in the Laso dashboard.' It marks this as the free, balance-funded creation route, which distinguishes it from card siblings like order_card, fund_card_balance, and push_to_card without needing their schemas opened.

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 context for when to use it: it's free (no x402), it mirrors the dashboard product, and it is the route for a Laso-issued card whose data comes back directly ('the approval step applies only to cards the holder created in a different app'). It names companion follow-ups (get-card-deposit-address, get-card-data) but never crisply names a sibling alternative and the trade-off for choosing it over order_card.

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

delete_address_book_entryA
DestructiveIdempotent
Inspect

Remove a saved recipient

The saved recipient names your human manages on their dashboard, so a request like "send $20 to the coffee vendor" can be resolved to an address instead of asking them for it.

Free.

It operates only on the authenticated account's own book — there is no user parameter to pass.

A name is a label, not an instruction. agentWalletTransfer takes an address and deliberately does not accept a name: a rename between your human asking and you sending would otherwise move money somewhere they did not intend. When you resolve a name to an address, say the address back to them before sending.

Removing an entry only forgets the name; it has no effect on past transfers to that address.

NameRequiredDescriptionDefault
addressNoThe address to remove.

Output Schema

NameRequiredDescription
addressNo

TDQS

A4.3/5.0
Behavior5/5

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

The description adds valuable behavior beyond the annotations: deletion only forgets the name mapping, has no effect on past transfers, and cannot target another account's book. The name-is-not-an-instruction warning also prevents misuse. This is consistent with destructiveHint=true and idempotentHint=true.

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 action and scope are front-loaded, but the description includes off-topic material — 'Free.' and the extended agentWalletTransfer name-vs-address warning — that is not needed to invoke a delete. A tighter version would keep the own-book scope and no-past-transfer effect.

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 one-parameter delete tool with an output schema and annotations covering destructiveness and idempotence, the description covers scope, effect on history, and account limitations. Nothing needed to call it correctly 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?

The schema already documents the single address parameter with 100% coverage, so the baseline is 3. The description adds context that no user parameter is needed, but it does not detail address format or requiredness.

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 gives a specific action and object ('Remove a saved recipient'), and the rest ties it clearly to the address book ('the authenticated account's own book') rather than banking or payment recipients. This clearly separates it from sibling delete tools.

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

Usage Guidelines4/5

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

It identifies the target context — the human-managed address book — and explicitly notes it operates only on the authenticated account's own book with no user parameter. It doesn't name alternative tools or exclusion cases, so it stops short of full routing guidance.

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

delete_banking_recipientA
DestructiveIdempotent
Inspect

Delete a recipient

Deletes a recipient, its destinations, and any off-ramp account that paid out to it. Irreversible.

Free.

NameRequiredDescriptionDefault
recipientIdYesThe recipient to delete.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

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

The description adds significant behavioral context beyond the annotations: it discloses cascade deletion (destinations and off-ramp accounts), irreversibility, and that the operation is free. Annotations already flag destructiveHint=true, but the description enriches this with specifics that matter for agent decision-making, and it does not contradict any annotation.

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 exceptionally concise—two sentences plus a short paragraph—yet it front-loads the core action ('Delete a recipient') and packs in essential behavioral details (cascade, irreversibility, cost) without any fluff. Every sentence earns its place.

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 low-complexity delete tool with one parameter and an output schema, the description covers the key behavioral aspects an agent needs: what gets deleted, reversibility, and cost. It does not mention prerequisites like authentication, but that is implicit for API tools and not a significant gap here.

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 schema provides 100% coverage for the single parameter (recipientId) with a clear description. The tool description adds no additional parameter-level meaning, so it stays at the baseline of 3 where the schema carries the semantic load.

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?

Clearly states the verb 'Delete' and the resource 'recipient', and goes further to specify the scope: it deletes the recipient, its destinations, and any off-ramp account that paid out to it. This distinguishes it from sibling delete tools like delete_payment_recipient and delete_address_book_entry, which target different resource types.

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

Usage Guidelines3/5

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

The description implies usage—use it to delete a banking recipient—but it does not explicitly mention alternatives or provide when-not guidance. While the sibling list includes similar delete tools, no exclusion criteria are given, so an agent must infer the correct choice based on the resource type.

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

delete_payment_recipientA
DestructiveIdempotent
Inspect

Remove a saved recipient (free)

Removes a saved Venmo or PayPal recipient. Payment history is kept; only the saved entry stops being offered.

This is not reversible through the API, so prefer archiving (POST /payment-recipients with archived: true) when the account owner may want the recipient back, and confirm before removing someone they did not ask you to remove.

platform and recipient_id may be sent in the JSON body or the query string.

NameRequiredDescriptionDefault
platformNoRequired unless sent in the body.
recipient_idNoRequired unless sent in the body. The entry's `recipient_id` from `GET /payment-recipients` (an opaque id, not the phone number or email).

Output Schema

NameRequiredDescription
deletedNo
user_idNo
recipient_idNo

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the destructiveHint annotation, the description adds meaningful behavior: the action is not reversible through the API, payment history is kept, only the saved entry stops being offered, and parameters may go in body or query string. 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 well organized and efficient: it states the action, the irreversible consequence, the preferred alternative, and the transport option. Slight redundancy between the opening title and first sentence, but every sentence 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 two-parameter deletion tool with an output schema, the description covers all essential operational facts: irreversibility, history preservation, alternative archiving behavior, consent caution, and body/query flexibility. Nothing critical is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description adds genuinely useful transport semantics by stating that `platform` and `recipient_id` may be sent in the JSON body or query string, and clarifies that `recipient_id` is the opaque id from `GET /payment-recipients`, not the phone number or email.

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 and resource: 'Removes a saved Venmo or PayPal recipient.' It clearly distinguishes this from sibling tools like delete_banking_recipient by naming the payment recipient scope and noting that payment history is preserved.

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 tells the agent when to prefer an alternative: archive via `POST /payment-recipients` with `archived: true` when the owner may want the recipient back. It also instructs to confirm before removing someone the owner did not ask to remove, providing clear selection guidance.

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

delete_webhookA
DestructiveIdempotent
Inspect

Delete the notification webhook (free)

Removes the calling wallet's webhook registration. Notifications keep flowing to the user's other channels (push, SMS, Telegram, in-app); only the webhook deliveries stop. The account owner is notified of the removal.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
deletedNoFalse when there was no registration to delete.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already indicate destructiveHint=true and idempotentHint=true, so the description correctly aligns. It adds valuable context: that other notification channels continue, and the account owner is notified. No contradiction.

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 concise and well-structured: a clear title line, then a brief explanation of scope and side effects. Every sentence adds value, and the key point (only webhook stops) is 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?

The tool is simple with no parameters and an output schema exists (not shown but indicated). The description covers the main behavioral implications: removal scope and notification to owner. It could mention the return value or idempotency implications, but overall it's complete for an agent.

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 zero parameters, so schema coverage is trivially 100%. The description doesn't need to explain params; it correctly focuses on behavior. This is a baseline of 4 for parameter-free tools.

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 verb 'delete' and resource 'webhook', and specifies it removes the calling wallet's webhook registration. It distinguishes itself from sibling tools like register_webhook and get_webhook by focusing on removal.

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 it: to remove the webhook for the calling wallet. However, it does not explicitly state when NOT to use it or mention alternatives, but the distinction from get/register webhook is implicit.

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

disconnect_card_issuerAInspect

Unlink the card issuer

Removes the link between this Laso account and the card issuer, the same as the disconnect button in the dashboard. The card and its balance stay with the card issuer untouched; only Laso's link is removed.

What stops working. Every reloadable card route and saved card purchases (POST /buy-with-saved-card) need the link, so they fail until the account holder links again with POST /start-card-issuer-link and a fresh code that only they can receive. Confirm with the account holder before calling this.

Safe to repeat: an account with no link answers the same way. Afterwards GET /get-card-issuer-status reads not_started.

This route is free.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
noteNoHow to link again.
statusNoThe link state after unlinking, as `GET /get-card-issuer-status` reports it. One of: not_started.

TDQS

A4.8/5.0
Behavior5/5

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

Adds substantial context beyond the annotations: what is preserved (card and balance stay with the issuer), what breaks (reloadable card routes and POST /buy-with-saved-card), that the operation is repeat-safe with a stable response, and the resulting status (not_started via get-card-issuer-status). This also explains why destructiveHint=false is accurate — only the Laso link is removed.

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

Conciseness4/5

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

Front-loaded with the core action and its effect, then structured into named blocks for consequences and repeat behavior. Slightly long with the bolded headers and the 'This route is free' coda, but nearly every sentence carries actionable information.

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?

With an output schema present and zero parameters, the remaining burden is behavioral and recovery context, all of which is covered: side effects, failure modes, recovery route, and post-call status.

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 takes zero parameters, so there is nothing for the description to disambiguate; the schema is trivially complete. Baseline 4 applies for a no-argument tool.

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

Purpose5/5

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

States a specific verb+resource ('Unlink the card issuer', 'Removes the link between this Laso account and the card issuer') and immediately clarifies it is the dashboard disconnect action. This clearly distinguishes it from siblings like start_card_issuer_link, verify_card_issuer_link, and get_card_issuer_status.

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 names when to use it ('the same as the disconnect button in the dashboard'), adds a caution ('Confirm with the account holder before calling this'), and names the alternative recovery path (POST /start-card-issuer-link with a fresh code only the holder can receive). An agent needs no inference to route correctly.

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

exchange_api_keyAInspect

Exchange an API key for a session

Exchanges a durable lasoak_ API key for a short-lived id_token (one hour) plus a refresh_token, and returns an auth_url to hand your human so they can watch what you do. This is the first call an agent makes. The reply's id_token authenticates every other endpoint here.

If you have no key, your human creates one at https://laso.finance/agent/dashboard — there is no other way to obtain one.

Free.

NameRequiredDescriptionDefault
api_keyYesYour `lasoak_` API key.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

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

Annotations declare `readOnlyHint: false` and `destructiveHint: false`, but the description adds important context: it is a session-exchange that produces short-lived credentials (one hour), returns an `auth_url` so a human can monitor activity, and is a prerequisite for authenticating other endpoints. This is more informative than the bare annotations. A minor gap is that it does not explicitly state side effects like invalidating an older session, but this is not a strong deduction given the annotations are already present.

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, front-loads the core exchange mechanism, states the token duration, the auth_url purpose, prerequisites, and fallback path, all in three short paragraphs. No unnecessary detail; the format 'Free.' is an oddity but does not hurt clarity. The wording is direct and every sentence adds 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 essential context: what is exchanged, what the tokens do, how long they last, the human-facing `auth_url`, and the fallback if no key exists. The output schema is present, so return values don't need to be elaborated. A slight deduction: the description does not clarify behavior on invalid or expired keys, but given the presence of a clear prerequisite and output schema, this is not a major shortfall.

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?

With 100% schema description coverage and a single required `api_key` parameter, the schema fully explains the parameter. The description enriches it by clarifying the expected format (`lasoak_`) and that the key is durable and must be created by a human if absent. That is valuable additional semantics beyond the bare schema, though the schema already uses the same `lasoak_` example.

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 exchanges a durable `lasoak_` API key for a short-lived `id_token` and `refresh_token`, and names the returned `auth_url` for human oversight. It also positions this as the first call an agent makes and that the `id_token` authenticates every other endpoint, which sharply distinguishes its purpose from other endpoints like `refresh_token` or `create_agent_api_key`.

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 says this is the first call an agent makes, that the resulting `id_token` authenticates all other endpoints, and that the only alternative to having a key is having the human create one at the dashboard URL. This tells an agent when to use this tool, that it must precede other calls, and what to do if no key is available.

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

fund_card_balanceA
Destructive
Inspect

Load a reloadable card balance

Pay USDC to load the account holder's reloadable card balance at the card issuer.

Why this exists: the card issuer only accepts USDC on Base, and a Laso managed agent wallet holds USDC on Solana. Pay this route from either chain and Laso bridges the payment to your own deposit address at the issuer over Circle's CCTP, which burns on the source chain and mints native USDC on Base.

Price: exactly the amount you are loading, and exactly that amount is credited to the balance. Loading $50 costs $50 and puts $50 on the card. Laso covers Circle's bridging fee by burning slightly more than requested.

A linked card issuer account is required. The account holder sets it up at https://laso.finance/agent/dashboard/verified/card.

Delivery starts once your payment settles. The response confirms the payment and returns a top_up_id; the transfer to your card balance follows and usually lands in under a minute. A payment made on Base is already on the issuer's chain, so it is forwarded without a bridge. Watch the top-up under top_ups in GET /list-card-transactions, where status moves paid → bridging → delivered → credited and the transaction hash behind each leg appears as it lands, or poll GET /get-card-deposit-address until balance reflects it.

Follow with POST /create-reloadable-card to create a card against the balance once it has arrived.

If the top-up's status becomes failed, nothing is stranded: the USDC you paid has credited your Laso account balance. Retry, or recover it with POST /withdraw.

PAID ROUTE (5-10000 USD): the x402 USDC price is paid automatically from your managed agent wallet. Make sure the wallet exists and is funded first (get_agent_wallet).

NameRequiredDescriptionDefault
amountYesUSD of USDC to load onto the card balance (min $5, max $10,000). The x402 price equals this amount; Laso absorbs the bridge cost.

Output Schema

NameRequiredDescription
noteNo
assetNo
statusNoAlways `paid` here: the payment settled and delivery to the card balance has started. Follow the later states in `GET /list-card-transactions`.
networkNo
top_up_idNoIdentifies this top-up under `top_ups` in `GET /list-card-transactions`.
funded_usdNoUSD loaded onto the card balance.
deposit_addressNoThe account holder's own deposit address at the card issuer, on Base.
payment_networkNoThe chain the payment settled on: `solana` (bridged to Base over CCTP) or `base` (forwarded directly).

TDQS

A4.6/5.0
Behavior5/5

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

Annotations flag a destructive, non-idempotent, open-world write, and the description adds genuinely useful traits beyond them: exact pricing with no markup, CCTP bridging from Solana/Base, the paid→bridging→delivered→credited status lifecycle, delivery timing under a minute, and explicit failure semantics ('nothing is stranded', funds credit the Laso balance). This is well beyond annotation coverage.

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

Conciseness4/5

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

Front-loads the one-line purpose and uses bold section headers (Why/Price/requirement/Delivery/Follow/Recovery) so an agent can skim. It is on the long side and could trim some narrative detail, but nearly every section carries actionable information.

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 money-moving tool with an output schema already present, the description covers the remaining agent-facing gaps: prerequisites, payment routing across two chains, timing, status tracking endpoints, and failure recovery. Nothing an agent needs to invoke it correctly is missing.

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

Parameters4/5

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

Schema coverage is 100% and already documents the amount bounds, so the baseline is 3; the description adds meaningful semantics the schema does not — the x402 price equals the amount, the exact amount is credited, and Laso absorbs the bridge cost. That additional pricing meaning justifies a 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?

States a precise verb+resource — loading the account holder's reloadable card balance at the card issuer — and immediately scopes it against siblings by naming create_reloadable_card as the follow-up and push/create-card tools as distinct steps. An agent can tell this apart from other funding tools without opening a schema.

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 strong context: a linked card issuer account is required, the agent wallet must exist and be funded first (get_agent_wallet), this should be followed by create_reloadable_card, and failures can be retried or recovered with withdraw. It lacks an explicit 'when-not to use this vs. a sibling' exclusion, which keeps it just 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.

fund_card_from_account_balanceAInspect

Top up a reloadable card from the account balance

Load the account holder's reloadable card balance from their Laso account balance, the USDC already credited to the account (read it with GET /get-account-balance). GET /fund-card-balance takes a new payment; this spends money the account already holds, such as a paid request that could not be fulfilled.

Free. The account balance is debited exactly amount, and that amount lands on the card balance. Laso delivers it to the holder's deposit address at the card issuer, usually within a minute.

Tracking. The response carries a top_up_id. Poll GET /list-card-transactions until that top-up's status under top_ups is credited, or GET /get-card-deposit-address until balance reflects it, then call POST /create-reloadable-card. If the delivery fails, the amount is returned to the account balance.

Amount: $5 to $10,000, and no more than the account balance.

A linked card issuer account is required (see POST /start-card-issuer-link).

NameRequiredDescriptionDefault
amountYesUSD to move from the account balance onto the card balance (min $5, max $10,000).

Output Schema

NameRequiredDescription
noteNoWhat happens next and how to track it.
statusNoAlways `paid`: the account balance has been debited. Follow the top-up through `bridging`, `delivered`, and `credited` in `GET /list-card-transactions`.
top_up_idNoIdentifies this top-up under `top_ups` in `GET /list-card-transactions`.
funded_usdNoUSD debited from the account balance and loaded onto the card balance.

TDQS

A4.8/5.0
Behavior5/5

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

Goes well beyond the annotations: free, exact `amount` debited, delivery to the deposit address usually within a minute, automatic return of funds if delivery fails, and the polling path (`top_up_id` plus list-card-transactions / get-card-deposit-address) to confirm crediting. This is rich operational context for a non-idempotent mutation that annotations alone would not convey.

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?

Bold section headers (Free, Tracking, Amount) and the funding-source caveat is front-loaded, so it is easy to scan. It does slightly restate the min/max already present in the schema, a small redundancy, but the remaining sentences each carry new information.

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?

With an output schema present, the description does not need to enumerate return fields, yet it still explains the key `top_up_id` and the follow-up sequence needed to finish the flow. Prerequisite, cost, failure behavior, and amount constraint are all covered for a one-parameter money-movement tool.

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% and already documents the $5–$10,000 bounds, so the baseline would be 3. The description adds a constraint not expressible in the schema — the amount cannot exceed the account balance — which genuinely improves the agent's ability to pick a valid value.

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

Purpose5/5

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

States a specific verb (top up), a specific resource (reloadable card), and a specific funding source (the account balance), which cleanly separates it from the sibling fund_card_balance/push_to_card tools. The added note that GET /fund-card-balance takes a new payment while this spends already-held money makes the distinction explicit.

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 names the alternative (fund_card_balance takes a new payment) and the condition that selects this tool instead (money the account already holds, e.g. an unfulfillable paid request). It also states the prerequisite (a linked card issuer account via POST /start-card-issuer-link).

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

get_account_balanceA
Read-onlyIdempotent
Inspect

Get account balance

Returns the Laso account balance and total deposits for the authenticated user, plus the managed agent wallet's balance under agent_wallet so both are visible in one call.

These are two separate balances. The account balance is a ledger held by Laso. The agent wallet is an on-chain wallet that holds USDC. A paid request moves USDC from the wallet to Laso, so it is recorded on the account balance as a deposit and then debited by the purchase. total_deposits therefore includes purchases paid from the agent wallet, and a balance of 0 after a purchase is expected. Funds still held are agent_wallet.balance_usdc plus balance.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
noteNoPlain-language explanation of how the account balance and the agent wallet relate.
balanceNoLaso account balance in USD. This is a ledger held by Laso and is what `/withdraw` draws on. It is not the agent wallet's on-chain balance; see `agent_wallet`.
user_idNoThe user's ID (lowercase wallet address)
agent_walletNoThe caller's managed agent wallet: separate on-chain USDC on Solana and Base, with `balance_usdc` the total. Not part of the account balance. Spend it through `agentX402Pay` and move it with `agentWalletTransfer`.
balance_typeNoNames what `balance` measures: the Laso account balance, not the agent wallet. One of: account_balance.
total_depositsNoTotal lifetime USD credited to the account balance. Includes every paid request settled from the agent wallet, because each one arrives as a deposit before the purchase debits it. It is not a measure of money received from outside.
created_timestampNo
created_timestamp_readableNo

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already cover safety (readOnlyHint, idempotentHint, destructiveHint=false), yet the description adds substantial business-logic context beyond them: the ledger-vs-on-chain distinction, the USDC flow that makes a paid request appear as a deposit then a debit, and the expectation that `balance` can legitimately be 0 after a purchase. This is exactly the kind of non-obvious behavior an agent needs to interpret results correctly.

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

Conciseness4/5

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

Front-loaded summary line followed by two paragraphs of interpretation; the opening line restates the title verbatim, which is mild waste. The remaining prose is dense but every sentence carries real semantics, so length is largely justified by the two-balance model.

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

Completeness5/5

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

An output schema already documents the return structure, and the description goes further by explaining what the returned numbers mean and how they move. For a zero-parameter read tool with full annotation coverage, nothing an agent needs to call or interpret it is missing.

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

Parameters4/5

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

The tool takes zero parameters, so there is nothing for the description to disambiguate. Baseline 4 applies for a no-argument tool.

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

Purpose5/5

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

States a specific verb and resource ('Get account balance') and immediately specifies exactly what is returned: the Laso account balance, total deposits, and the managed agent wallet balance under `agent_wallet`. It also distinguishes this tool's dual-balance scope from the single-wallet view implied by the sibling `get_agent_wallet`, so an agent can differentiate without opening a schema.

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

Usage Guidelines3/5

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

Usage is only implied: the phrase 'so both are visible in one call' and the note that 'a `balance` of 0 after a purchase is expected' tell the agent when the returned values matter, but there is no explicit when-to-use, when-not-to-use, or named alternative. Adequate but leaves selection logic to inference.

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

get_agent_spend_limitA
Read-onlyIdempotent
Inspect

Read the spend limits

Returns the account owner's two limits and where the rolling 24-hour window stands: maxPerPaymentUsdc with the min, max, and default bounds it can be set within, maxPerDayUsdc, what has been spent and is left of the 24 hours, and maxPaymentNowUsdc, the most one payment may cost right now. The limit defaults to $1,000 and ranges from $1 to $50,000. It applies to every payment agentX402Pay makes, Laso routes and external url endpoints alike.

Check an amount against maxPaymentNowUsdc before attempting a payment rather than waiting to be refused. Compare the fee-inclusive total, since fees are added on top of the amount you request. Read-only to an agent: only the account owner can change the limit, from the dashboard. If a payment would exceed it, do not split it into smaller payments. Stop and tell your human.

Free.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
maxNoThe highest value the owner can set.
minNoThe lowest value the owner can set.
defaultNoThe limit that applies when the owner has never set one.
maxPerDayUsdcNoThe most everything the agent moves out may total across any rolling 24 hours: payments, wallet sends, and withdrawals together.
nextReleaseAtNoWhen the oldest outflow in the window stops counting, in ms since epoch. Null when nothing is counting.
nextReleaseUsdcNoHow much allowance comes back at `nextReleaseAt`. Null when nothing is counting.
spentLast24hUsdcNoWhat has counted toward the 24-hour limit in the trailing 24 hours.
maxPaymentNowUsdcNoThe most one payment may cost right now: the smaller of `maxPerPaymentUsdc` and `remainingTodayUsdc`. Check an amount against this, not against `maxPerPaymentUsdc` alone.
maxPerPaymentUsdcNoThe most a single payment may total, fees included.
remainingTodayUsdcNoWhat is left of the 24-hour limit right now.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, and the description adds substantive context beyond them: the limit defaults to $1,000 and ranges $1–$50,000, only the account owner can change it (via dashboard, not this tool), and the call is free. This goes well beyond the structured safety hints.

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

Conciseness4/5

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

Front-loaded with the return fields and the actionable rule, and every sentence carries unique information. It is longer than strictly necessary and leans on prose where a compact list would read faster, keeping it just short of a 5.

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?

Even though an output schema exists, the description supplies the decision logic an agent needs (compare fee-inclusive totals, don't split payments, escalate to human) plus limit bounds and ownership rules. Nothing required to call and act on this tool is missing.

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

Parameters4/5

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

The tool takes zero parameters, so the baseline is 4. The description compensates by thoroughly documenting the returned values and their semantics (bounds, remaining 24h budget, current per-payment ceiling), which is the relevant 'input' an agent needs to reason about.

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

Purpose5/5

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

States a specific verb+resource ('Read the spend limits') and immediately enumerates the exact fields returned (maxPerPaymentUsdc, maxPerDayUsdc, maxPaymentNowUsdc), so an agent knows precisely what this tool yields and how it differs from balance/payment-status siblings.

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 instructs to check an amount against maxPaymentNowUsdc BEFORE attempting a payment, to compare the fee-inclusive total, and what to do on exceed (stop and tell the human, do not split payments). It also names the affected operations (agentX402Pay / url endpoints), routing the agent correctly.

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

get_agent_walletA
Read-onlyIdempotent
Inspect

Get your managed agent wallet: whether one exists, its funding addresses on Solana and Base, its USDC balance, and whether it needs funding. Paid tools draw from this wallet, so check it before your first paid call. Fund it by sending USDC on Solana to wallet_address, or USDC on Base to base_wallet_address; both land in the same balance. balance_usdc is the total across the wallet's Solana and Base sides, which every payment and transfer can draw on, split as solana_balance_usdc and base_balance_usdc; base_balance_usdc is null when its live chain read fails. These on-chain balances are separate from the Laso account balance that get_account_balance reports: a paid call shows up there as a deposit followed by a debit, so an account balance of 0 after a purchase is expected. tokens lists every asset the Solana side holds, USDC included (mint, symbol, amount, usd_value; mint is native for SOL); send any of them with agent_wallet_transfer by passing mint, or convert them to USDC with agent_wallet_swap.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare readOnly/idempotent/openWorld=false; the description adds substantial behavioral context the annotations cannot: a documented failure mode ('base_balance_usdc is null when its live chain read fails'), how balances aggregate across chains, and the deposit-then-debit accounting quirk that makes an account balance of 0 after purchase expected.

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

Conciseness4/5

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

Front-loaded with purpose and the pre-call check, then moves to funding, balance semantics, and token list. The long semicolon-chained sentence about balances is dense and could be split, but nearly every clause carries information an agent would otherwise get wrong.

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

Completeness5/5

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

An output schema exists, yet the description still supplies the cross-tool accounting model (wallet balance vs. Laso account balance) and the null-on-chain-read-failure caveat that the schema alone would not make actionable. Nothing needed to call and correctly interpret this tool is missing.

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

Parameters4/5

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

Zero parameters, so the baseline is 4. The description instead spends its budget explaining output fields (balance_usdc, solana_balance_usdc, base_balance_usdc, tokens) with enough semantics that an agent can interpret results without guessing.

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

Purpose5/5

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

Opens with a specific verb+resource ('Get your managed agent wallet') and immediately enumerates what it returns: existence, Solana/Base funding addresses, USDC balance, funding status. It also differentiates itself from siblings by name (get_account_balance, agent_wallet_transfer, agent_wallet_swap).

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?

States explicit when-to-use ('check it before your first paid call' since 'paid tools draw from this wallet') and gives the follow-up routing: send assets via agent_wallet_transfer or convert via agent_wallet_swap. It also preempts a likely confusion by explaining when get_account_balance is the wrong place to look.

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

get_banking_applicationA
Read-onlyIdempotent
Inspect

Read the banking application

Reads what the application still needs. Returns ready (whether it can be submitted), applicationStatus, and the outstanding questions. The identity answers carry over from verification; what remains are non-identity questions such as employment status and source of funds, which an agent can answer itself.

Free.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the description does not need to repeat those. It adds value by explaining the output fields (ready, applicationStatus, outstanding questions) and the nuance that identity answers carry over from verification, which is behavioral context beyond the annotations. No contradiction exists.

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 structured with a clear first line that summarizes the purpose, followed by a concise explanation of return values and context. It is slightly verbose with the trailing 'Free.' which adds little value, but the core message is front-loaded and efficient.

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, zero-parameter tool with an output schema, the description is highly complete. It explains what the tool returns, clarifies that identity answers are inherited, and describes the nature of remaining questions. No critical information for an agent to invoke the tool correctly is missing.

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

Parameters4/5

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

The tool has zero parameters, so there is nothing to explain. Per the calibration rule, 0 parameters earns a baseline score of 4. The description does not need to add parameter details since there are none.

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 that the tool reads the banking application and returns readiness, status, and outstanding questions. It distinguishes itself from update/submit siblings by being a read operation, but it does not explicitly name any alternative tools. The verb 'Read' and the resource 'banking application' are specific and unambiguous.

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

Usage Guidelines3/5

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

The description implies usage after verification to discover non-identity questions, but it does not explicitly state when to use this tool versus others like submit_banking_application or update_banking_application_details. It provides context about what remains to be answered, but lacks direct guidance on alternatives or exclusions.

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

get_banking_profile_statusA
Read-onlyIdempotent
Inspect

Check the banking profile status

Reads the current state of the banking profile: whether it exists, and where its application stands.

Free.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/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 covered. The description adds useful context by specifying that the tool reports existence and application stage, and it also adds the note 'Free.' There is 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 appropriately short and front-loaded. The opening line repeats the title almost verbatim, and 'Free.' is a minor extra, but the overall length is well controlled and the core behavior is stated in one sentence.

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, read-only status tool with an output schema, the description provides sufficient context: it states what resource is being read and what aspect of its state is returned. Nothing essential for correct invocation appears to be missing.

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

Parameters4/5

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

The input schema has zero propertiesanding 100% schema description coverage, so there are no parameter semantics to explain. The description instead indicates the kind of information returned, which helps the agent interpret the output for a parameterless call.

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 identifies a specific verb ('Reads') and resource ('banking profile') and clarifies what is returned: whether the profile exists and where its application stands. It is clear and easy to distinguish from creation/submission siblings, though it does not explicitly contrast with get_banking_application or other related status tools.

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 clearly establishes the use case: call this when you need to know the current state of the banking profile. It does not explicitly name alternatives or provide exclusion guidance, but the context is unambiguous and not misleading.

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

get_banking_transactionA
Read-onlyIdempotent
Inspect

Read one transaction

Reads a single banking transaction — an on-ramp arriving or an off-ramp paying out — with its normalized status.

Free.

NameRequiredDescriptionDefault
transactionIdYesThe transaction to read.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already carry readOnlyHint, idempotentHint, and destructiveHint, so the description does not need to restate safety behavior. It adds useful context beyond those annotations: the transaction can be an on-ramp arriving or off-ramp paying out, it returns a normalized status, and it is free. 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 short sentences with no filler. The key action and scope are front-loaded, and the extra details (on-ramp/off-ramp, normalized status, free) each add value without bloating the text.

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 low-complexity single-parameter read tool with an output schema and strong safety annotations, the description is complete. It communicates what the transaction represents, the status normalization, and the cost, so an agent has enough context to invoke it correctly.

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 fully documents transactionId (100% coverage) with 'The transaction to read.' The description does not add additional parameter details such as expected format or how to obtain the ID, but the schema carries the necessary semantic weight. 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 states a specific verb ('Reads a single banking transaction') and a clear resource, explicitly narrowing the scope to one transaction as opposed to a list. The on-ramp/off-ramp clarification also disambiguates the transaction types covered, and the singular framing distinguishes it from sibling list_banking_transactions.

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

Usage Guidelines3/5

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

The context is clear: use this to fetch one banking transaction. However, it never explicitly names alternatives such as list_banking_transactions for multiple transactions, nor does it state when not to use this tool. Usage is implied rather than spelled out.

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

get_card_dataA
Read-onlyIdempotent
Inspect

Get card details

Returns the current status and details of card orders. If card_id is provided, returns a single card, looked up across U.S. non-reloadable, international non-reloadable, and reloadable cards. If omitted, returns all cards of the given card_type for the authenticated user; card_type defaults to Non-Reloadable U.S. when omitted, so existing callers see unchanged behavior. Pass card_type=Non-Reloadable International to list international cards, or card_type=Reloadable to list reloadable cards.

For U.S. non-reloadable cards, details take ~7-10 seconds to become available after ordering; poll every 2-3 seconds until status is "ready", then read card_details. For international non-reloadable cards, the order is queued until an admin fulfills it (typically within 24 hours), after which card_details is populated.

For international cards, the card_id returned by /order-intl-card is a queue id. After admin fulfillment, the issuer's transaction id becomes the new card_id and the original queue id is preserved on the card as queued_order_card_id. You can keep polling /get-card-data?card_id=<original-queue-id> and it will resolve to the fulfilled card.

Reloadable cards are a separate product, set up by the account holder in the Laso dashboard rather than ordered through this API. They are reusable (a multi_use card stays open across charges until its limit is spent) and can be topped up, unlike the single-load non-reloadable cards. Listing them returns balance, spend_limit, last4, expiry, and reusable. If the wallet has no card issuer account linked, the list is empty and a note explains how the holder sets one up.

Reading a reloadable card's number and CVV is gated by the card issuer, and which gate applies depends on who issued it. Request the card by card_id; the response carries exactly one of three fields. card_details is the normal result for a card created through /create-reloadable-card, which Laso issues on the holder's behalf and can read for them directly — no approval step is involved. details_approval with status: "pending" and an approval_id appears only for a card the holder created in a DIFFERENT app: the issuer has emailed them an approve/deny link, and once they approve you retry as GET /get-card-data?card_id=<CARD_ID>&approval_id=<APPROVAL_ID> to receive card_details. details_error means the issuer could not return the number; retry shortly, and if it persists the holder can read the card in the dashboard. Spend the card by entering its number, expiry, and CVV at the merchant's checkout. billing_address is null on these cards and always will be — the issuer holds no billing address for a card. If a merchant requires one, use the address the account holder gave at identity verification (ask them; do not guess), since these cards are AVS-checked against it and a mismatch is the most common decline on a card that has funds. A card with reusable: true stays open after an approved charge and can be spent again up to its remaining balance; a charge larger than the balance is declined in full, as there are no partial approvals.

NameRequiredDescriptionDefault
card_idNoThe card ID returned from `/get-card` or `/order-intl-card`, or a reloadable card's id from `card_type=Reloadable`. Looked up across all three card types. If omitted, returns all cards of `card_type`.
card_typeNoWhen listing all cards (no `card_id`), filters by card type. Defaults to `Non-Reloadable U.S.` if omitted (preserves existing client behavior). Pass `Non-Reloadable International` to list international cards, or `Reloadable` to list reloadable cards.Non-Reloadable U.S.
approval_idNoReloadable cards only, and only for a card the account holder created in a DIFFERENT app: pass the approval_id from a prior details_approval response once they have approved it. Cards created through /create-reloadable-card are Laso-issued and never require this.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

The description adds rich behavioral context beyond the annotations. . The readOnlyHint=true and idempotentHint=true annotations are consistent with the description's read-only nature, and the description elaborates on the behavior of polling, approval gates, and data availability windows, which are not inferable from the annotations alone.

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 section is purposeful and necessary for correct operation. It is structured with clear paragraphs for each card type and edge cases. The most critical usage information (how to poll) is placed early, and the response format is not over-explained since an output schema exists. No redundant sentences.

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 (three card types, approval gates, polling behavior, and a complex output schema), the description is thorough. It covers all necessary conditions for successful invocation, including edge cases like missing billing_address and approval flows. The output schema exists, so the description doesn't need to enumerate return values. It is complete for an agent to use correctly.

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 schema description coverage is 100%, so parameters are well documented in the schema. The description adds value by providing additional context on how parameters interact (e.g., card_id lookup across all types, approval_id only for certain cards), but the schema already defines their basic semantics. The baseline 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's purpose: to get card details and status. It specifies the resource (cards), the action (get), and differentiates between single card lookup and listing by card type. It also distinguishes from siblings like order_card and order_intl_card by describing the retrieval of card data, not creation.

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 provides explicit guidance on when to use this tool versus alternatives, such as mentioning that reloadable cards are set up in the dashboard rather than ordered through the API. It explains the conditions for using card_id versus card_type, and how to handle different card types. It also clarifies when to use approval_id and how to poll for updates, which is critical for correct usage.

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

get_card_deposit_addressA
Read-onlyIdempotent
Inspect

Get the reloadable card deposit address

Returns the account holder's own USDC deposit address at the card issuer, and the balance currently on it. This is how an agent funds a reloadable card balance with crypto.

Funding is user-funded: the address belongs to the account holder, so USDC sent to it credits their balance and funds their cards. The issuer provisions the address on first read, so simply calling this creates it.

Base only. The address takes USDC on Base. USDC sent on another chain is unrecoverable. A Laso managed agent wallet holds USDC on Solana, so fund from a wallet that holds USDC on Base rather than transferring straight from a managed wallet.

Deposits usually confirm within a couple of minutes. Poll this endpoint until balance reflects the deposit, then call POST /create-reloadable-card.

The address is stable per holder, but read it through this endpoint rather than caching it: the issuer is the only authority on it.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
noteNoChain warning and the next step.
assetNoThe asset the address accepts. Always `USDC`.
addressNoThe holder's own USDC receiving address at the card issuer.
balanceNoDollars currently on the card balance, or `null` when the issuer cannot read it (which is not the same as zero).
networkNoThe chain the address accepts. Always `base`.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already mark the tool as read-only, idempotent, and non-destructive, and the description adds significant behavioral context beyond that: the issuer provisions the address on first read so calling creates it, deposits typically confirm within minutes, the address is stable per holder, and it should be read fresh rather than cached. These are valuable operational details not present in 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.

Conciseness5/5

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

Although the description is longer than typical, every paragraph earns its place: purpose, funding semantics, chain constraint, polling workflow, and caching guidance. The content is front-loaded with the main purpose and organized with bolded key points, with no filler.

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 the complete invocation context: why to call it, what it returns, the one-time provisioning side effect, the critical chain restriction, expected timing, confirmation polling, and the next step. With an output schema also present to define the return shape, nothing an agent needs to call and use this tool correctly is missing.

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

Parameters4/5

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

The tool has zero parameters and schema description coverage is trivially 100%, so there is nothing for the description to clarify about inputs. This matches the baseline for a parameterless tool; no additional parameter-level semantics are needed.

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 states a specific operation: retrieve the account holder's USDC deposit address and current balance for a reloadable card. It also articulates the tool's unique role clearly ('This is how an agent funds a reloadable card balance with crypto'), which distinguishes it from the many card and payment siblings.

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 explicitly says when to use this tool: to fund a reloadable card balance with crypto. It gives a concrete workflow—poll until balance confirms, then call POST /create-reloadable-card—and provides an explicit exclusion: fund from a wallet holding USDC on Base rather than transferring from a Solana-managed wallet, with a warning that other chains are unrecoverable.

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

get_card_issuer_statusA
Read-onlyIdempotent
Inspect

Check the card issuer link

Reports whether this account has linked the card issuer, the one-time setup every reloadable card route needs first. Until it is linked, those routes answer 400 with No card issuer account is linked to this wallet.

status is one of not_started, code_sent, linked, or kyc_required. Linking is held to Laso identity verification, so an account that has not linked and is not verified reads kyc_required, with a kyc_url to hand the account holder.

The account holder, never the agent, receives and enters the code. Send your human to their own inbox (or phone) and have them type the code into your interface. Never try to read the account holder's email or messages yourself, and never ask for their email password or access.

This route is free.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
noteNoWhat to do next.
statusNo`not_started`: no link in progress. `code_sent`: a code is waiting for the account holder. `linked`: done. `kyc_required`: the account must complete Laso identity verification first. One of: not_started, code_sent, linked, kyc_required.
channelNo`code_sent` only. Where the code went. One of: email, phone.
kyc_urlNo`kyc_required` only. A one-time identity-verification link to hand the account holder.
sent_toNo`code_sent` only. The destination, masked (e.g. `j***@e***.com`). The full address is never returned.
linked_atNo`linked` only. When the link was made, in milliseconds since the epoch.
expires_atNo`code_sent` only. When the code stops working, in milliseconds since the epoch. Codes last 10 minutes.
attempts_leftNo`code_sent` only. Incorrect entries still allowed before this code is discarded.

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the readOnly/idempotent annotations by disclosing the `400` error text emitted by dependent routes, the meaning of each status value, the kyc_required fallback condition with its kyc_url, and the unusual constraint that only the account holder may receive and enter the code. It also flags that the route is free.

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

Conciseness4/5

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

Front-loads the one-line purpose and the status enum before the caveats, and nearly every sentence carries operational weight. The bolded account-holder code-handling rule is more relevant to the start/verify steps than to this read-only check, which is a small amount of off-target bulk.

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

Completeness5/5

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

An output schema exists, so return values need not be detailed; the description nonetheless explains the status enum and the kyc_url handoff. Combined with the annotation safety profile, an agent has everything needed to call this zero-argument check correctly and act on its 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 tool takes zero parameters, so the baseline is 4. There is nothing parameter-level for the description to clarify, and it correctly spends no space on parameter syntax.

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

Purpose5/5

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

States a specific verb and resource: it reports whether the account has linked the card issuer, and enumerates the exact `status` values returned. This is clearly distinguishable from the mutating siblings start_card_issuer_link and verify_card_issuer_link, which advance the same flow.

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?

Explains the context in which the check matters — it is the one-time setup prerequisite for reloadable card routes, which otherwise answer `400`. It stops short of explicitly naming when to call this versus start_card_issuer_link or verify_card_issuer_link, so the routing is inferred rather than stated.

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

get_kyc_statusA
Read-onlyIdempotent
Inspect

Get KYC verification status (optional)

KYC is optional. Most endpoints (cards, gift cards, push-to-card, account balance, withdrawals) do not require verification. It is only needed for certain features such as Venmo/PayPal payouts via /send-payment, and may be used for additional controls in the future. If you are not using those features, you can ignore the verification endpoints entirely.

Returns the calling wallet's cached KYC verification status. Use this as a free pre-flight check before paying for /send-payment: if kyc_verified is true the payout will go through. If it is false, don't call /send-payment yet — that call would not send the payout (it returns kyc_required and a kyc_url), and the USDC you paid would just land in your account balance, recoverable with POST /withdraw. To start verification when not verified, call /get-kyc-link.

This reads the cached status kept up to date by the verification webhook; it does not start verification or return a verification link.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
user_idNo
kyc_verifiedNoWhether the wallet has completed identity verification. When true, /send-payment dispatches the payout. When false, /send-payment does not send: it returns kyc_required and the USDC paid lands in account balance (recoverable via POST /withdraw). Verify before calling /send-payment.
kyc_review_answerNoLatest review answer (e.g. GREEN for approved, RED for rejected), or null if never reviewed.
kyc_review_statusNoLatest review status from the verification provider, or null if never reviewed.
kyc_last_reviewed_atNoEpoch milliseconds of the last review, or null if never reviewed.

TDQS

A4.8/5.0
Behavior5/5

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

The description transparently states that the endpoint reads cached status maintained by a webhook, does not start verification, and does not return a verification link. It also communicates the important behavioral nuance that a false status would not cause /send-payment to fail destructively—the USDC would land in the account balance and be recoverable. This goes well beyond the annotations, which only declare readOnly/idempotent/destructive hints.

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 somewhat long but every sentence earns its place: it explains optionality, the pre-flight use case, the failure mode, and the alternative endpoint. The opening bolded 'KYC is optional' is an effective front-loaded summary, though the paragraph could be trimmed slightly without losing key guidance.

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 read-only tool with an output schema available, the description fully covers what an agent needs: what the tool returns, how to act on the result, what it does not do, and how it relates to other endpoints. No important operational context is missing.

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

Parameters4/5

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

The tool has zero parameters and 100% schema coverage, so the baseline is 4. The description adds relevant context about the returned field `kyc_verified` and its semantics, which is useful for interpreting the output, though it doesn't need to document any parameters since none exist.

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 the calling wallet's cached KYC verification status, uses a specific verb and resource, and distinguishes this read-only status check from the related /get-kyc-link endpoint. It is not confused with any sibling tool despite many similar-looking KYC-related operations.

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 says when to use the tool (as a free pre-flight check before calling /send-payment), what to do if kyc_verified is false (do not call /send-payment; call /get-kyc-link instead), and even provides nuanced fallback context about recoverable USDC. This is exemplary usage guidance with clear alternatives and conditions.

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

get_payment_statusA
Read-onlyIdempotent
Inspect

Check Venmo and PayPal payout status (free)

Reports the state of the Venmo and PayPal payouts this account has sent with GET /send-payment. Free: only the payout itself is a paid action.

Three ways to call it: with payment_id to fetch one payout, with recipient_id (from GET /payment-recipients) to list every payout to that saved recipient, or with neither to list every payout this account has sent, newest first.

state is queued (waiting on account balance), awaiting-funding (debited and accepted, but delayed on our side before it reaches the platform, usually until the next business day), in-process (dispatched to the platform), complete, failed, or cancelled. queued, awaiting-funding and in-process are the states still in flight; poll every few minutes, or register a webhook with POST /register-webhook to be told when a payout completes instead. A payout that has been in-process for more than an hour is worth raising with the account owner. state is absent on payouts sent before state tracking existed.

Bank payouts are not listed here: follow those with listBankingTransactions. Push-to-card transfers are completed by the recipient in the browser and have no server-side state.

NameRequiredDescriptionDefault
payment_idNoFetch one payout by its `id`. Takes precedence over `recipient_id`.
recipient_idNoList every payout to one saved recipient. This is the `recipient_id` returned by `GET /payment-recipients`, not the phone number or email.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already establish the safe read-only, idempotent, closed-world profile, and the description adds substantially more: the cost model, the full state machine with plain-English meanings, polling cadence, the one-hour stale-in-process heuristic, and the caveat that state is absent on pre-state-tracking payouts. That is real behavioral 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.

Conciseness5/5

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

Front-loads purpose and cost, then the call modes, then the state reference. It is dense but every sentence carries operational information (states, polling, webhook escape hatch, exclusions) 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?

With an output schema present, the description rightly avoids restating return shapes and instead covers everything else an agent needs: invocation modes, state vocabulary, freshness handling, cost, and explicit sibling boundaries. Nothing material is missing.

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

Parameters4/5

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

Schema coverage is 100% and both params are documented, setting the baseline at 3, but the description adds the interplay the schema can only partially express: the 'call with neither' mode that lists all sent payouts, plus the newest-first ordering and the recipient_id provenance. Marginal but genuine added 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?

States a specific verb+resource (check payout status) scoped to Venmo and PayPal payouts sent via GET /send-payment. It explicitly disambiguates from siblings by excluding bank payouts (use listBankingTransactions) and push-to-card transfers, so an agent can distinguish it from get_withdrawal_status and the banking 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?

Enumerates the three invocation modes (payment_id, recipient_id, or neither) with the exact outcome of each, names the alternative (register a webhook via POST /register-webhook to avoid polling), and states what is out of scope. This is about as explicit as when/when-not/alternatives gets.

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

get_pricingA
Read-onlyIdempotent
Inspect

Get the fee schedule

Returns the fee and limits of every paid product: the route, the amount range it accepts, the fee rate, and the minimum fee. Free, no auth or payment header, so you can budget before you have an account.

Fees are added on top of amount. The total is amount + max(amount × fee_rate, min_fee), rounded up to the cent. The international card's fee_rate is the rate in effect now, including any running fee promotion. For the exact total of one specific request, read the amount in that route's 402 challenge: requesting a paid route without a payment header returns the quote and charges nothing.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
noteNoHow fees are applied.
productsNo

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already cover the read-only/idempotent profile, but the description adds substantive behavior: no auth or payment header required, no charge incurred, and the exact fee computation formula including rounding and min-fee interaction. It also explains that the fee_rate reflects any live promotion, which the agent cannot infer elsewhere.

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

Conciseness4/5

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

Front-loaded with the core purpose, then progressively adds formula and quote-retrieval detail. Every sentence carries information, though the third paragraph is fairly dense and could be tightened slightly.

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?

Even though an output schema exists (so return fields needn't be spelled out), the description goes further by explaining the fee formula and the authoritative per-route quote path. An agent has everything needed to call this correctly and interpret its output.

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 takes zero parameters, so the baseline is 4 and there is nothing for the description to clarify. It correctly implies a parameterless global read.

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

Purpose5/5

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

States a specific verb and resource ('Get the fee schedule') and immediately enumerates the returned fields: route, amount range, fee rate, minimum fee. This is clearly distinguishable from billing-related siblings like get_account_balance or get_payment_status, which report state rather than pricing.

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 explicit context for use ('so you can budget before you have an account') and routes the agent to the 402-challenge path when an exact per-request total is needed. It does not explicitly name or exclude any sibling tools, so it falls short of a full 5.

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

get_purchase_conversationA
Read-onlyIdempotent
Inspect

Read a purchase conversation's orders

The record of a purchase conversation: whether a turn is still running, the last checkout attempt, and every order it placed with its charge status. Use it to track an order, and to settle what happened before repeating a confirm whose outcome is unclear (in_progress, charge_status: unknown, or a failed turn).

NameRequiredDescriptionDefault
conversation_idYesThe `conversation_id` from a purchase turn.

Output Schema

NameRequiredDescription
openNo
cartsNoCarts still open in the conversation.
ordersNoEvery order this conversation placed, oldest first.
last_checkoutNo
conversation_idNo
turn_in_progressNoTrue while a turn is still running. Wait for it to clear before reading `orders`.

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint/idempotentHint/non-destructive, so the safety bar is pre-met; the description adds real value by stating what the record exposes (turn state, last checkout attempt, per-order charge status) and its reconciliation role. No auth, rate-limit, or pagination notes, but those are minor for a read-only call.

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

Conciseness4/5

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

Two sentences, front-loaded with the verb and resource and then the use case; little waste. The long parenthetical of failure states is dense but each element is load-bearing, so it earns its space.

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, and the description covers inputs, purpose, and the operational trigger well. The one real gap is the absence of any differentiation from get_purchase_turn, which an agent choosing between the two would want.

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?

Only one parameter with 100% schema description coverage, so the schema already documents `conversation_id` as the id from a purchase turn. The description adds no format, sourcing, or edge-case detail beyond that, making the baseline 3 correct.

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 (read a purchase conversation's orders) and enumerates the payload: turn running state, last checkout attempt, and each order's charge status. It is clear what the tool returns, but it never names or distinguishes itself from the sibling get_purchase_turn, which an agent must disambiguate against.

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 guidance: to track an order, and to settle an unclear outcome before repeating a confirm, with the exact triggers (`in_progress`, `charge_status: unknown`, `failed` turn). It lacks any when-not or explicit alternative routing, so it stops 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.

get_purchase_turnA
Read-onlyIdempotent
Inspect

Read a purchase turn that was still running

Reads back a turn from POST /buy-with-saved-card that came back state: running. Poll every few seconds until state is done or failed; the response has the same shape as the POST.

A failed confirm may still have placed the order. Read GET /get-purchase-conversation before sending it again.

NameRequiredDescriptionDefault
turn_idYesThe `turn_id` from `POST /buy-with-saved-card`.

Output Schema

NameRequiredDescription
cartNoThe most recently shown cart.
noteNoThe next step.
cartsNoEvery open cart in the conversation, oldest first.
errorNoPresent when `state` is `failed`.
replyNoThe shopping assistant's turn as prose, ready to show the holder.
stateNo`running` means the turn is still talking to the merchant; the fields below appear once it is `done`. One of: running, done, failed.
statusNoWhat to do next. `needs_input`: a question or a cart waiting on a confirm. `awaiting_approval`: send `approval_url` to the holder, then repeat the same confirm. `in_progress`: the order is already being placed; read `GET /get-purchase-conversation` instead of confirming again. `order_placed`. `declined`: see `decline_code`. `conflict`: nothing ran, see `error_code` and confirm the fresh cart's hash. Never branch on `reply`. One of: needs_input, awaiting_approval, in_progress, order_placed, declined, conflict.
catalogNoThe last product search. Empty on a turn that did not search again, so keep the previous one.
turn_idNoThis turn's id. Poll `GET /get-purchase-turn` with it while `state` is `running`.
order_idNoSet when this turn placed an order.
unmatchedNoThings asked for that did not make it into a cart, with a reason. Show these rather than guessing from `reply`.
card_last4NoThe saved card that paid, for naming it to the holder.
created_atNoMilliseconds since the epoch.
error_codeNoOn `conflict`: `cart_changed`, `turn_in_progress`, `delivery_address_changed`, or `delivery_address_bound_after_cart`.
approval_urlNoSend to the holder when `status` is `awaiting_approval`. Never open it yourself.
decline_codeNoThe machine reason behind `declined`, e.g. `items_unavailable`.
charge_statusNoWhether money moved: `none`, `confirming`, `settled`, or `unknown` (do not retry; read the conversation). One of: none, confirming, settled, unknown, .
conversation_idNoSend it back on every follow-up and on the confirm.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already carry the safety profile (readOnly, idempotent, non-destructive, not open-world), yet the description still adds real behavior: the response matches the POST shape, the polling cadence, and the important caveat that a failed confirm may still have placed the order. It does not cover rate limits or what states other than running/done/failed look like, so it stops just short of exhaustive.

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 tight paragraphs, front-loaded with the core read, then the polling rule, then the failure warning. No sentence is redundant and each advances correct usage.

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

Completeness5/5

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

An output schema exists, so return values need not be enumerated — and the description's note that the response mirrors the POST is a useful pointer rather than padding. For a one-parameter polling read with full annotation coverage, nothing an agent needs to call it correctly 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 coverage is 100% and the single parameter already documents its provenance in the schema description. The prose adds no syntax, format, or constraint beyond what the schema provides, which is the expected baseline 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.

Purpose5/5

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

States a specific verb ('Read') and resource ('a purchase turn') scoped precisely to turns from POST /buy-with-saved-card that returned state: running. It also implicitly distinguishes itself from buy_with_saved_card (the creator) and names get_purchase_conversation as a related read, so an agent can place it among siblings without opening schemas.

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

Usage Guidelines5/5

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

Gives an explicit operational loop: poll every few seconds until state is done or failed. It also names the alternative action and its precondition — read GET /get-purchase-conversation before resending a failed confirm. When-to-use, when-to-stop, and the alternative are all spelled out.

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

get_saved_cardsA
Read-onlyIdempotent
Inspect

List the holder's saved cards

Lists the cards the account holder saved themselves: a card they already own, typed once on the card issuer's page and locked behind their passkey. Nothing is issued or prefunded, and no identity verification is needed. Every purchase paid with a saved card is approved by the holder on their own device.

The response carries display fields only, never a card number. An empty cards list means nothing is saved yet: call POST /create-saved-card-link and send the returned url to your human.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
noteNoThe next step.
cardsNo
blockerNoPresent only when the holder finished saving a card but it is not readable yet. `needs_code`: they saved it on a card account they already had, and confirm it once with a one-time code in the dashboard. `linked_elsewhere`: the card account they unlocked is linked to another Laso account. Relay `note`; sending another link does not help with `needs_code`. One of: needs_code, linked_elsewhere.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already cover read-only, idempotent, non-destructive, closed-world, but the description adds meaningfully beyond them: no card is issued or prefunded, no identity verification is required, purchases are approved by the holder on their device, and the payload never contains a card number. That last point is critical safety context for an agent handling payment data.

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

Conciseness4/5

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

Front-loaded with the core action, then semantics, then response shape and next step — a logical order with no filler sentences. It runs three short paragraphs where two would do, and the bolded 'Nothing is issued or prefunded' clause is slightly promotional, but every line carries information.

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, annotated, output-schema-bearing read tool, the description covers the remaining unknowns: what a saved card actually is, that no verification or issuance occurs, that numbers are absent from the response, how to read an empty list, and what to do next. Nothing an agent needs to call and interpret it is missing.

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

Parameters4/5

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

The tool takes zero parameters, so there is no parameter surface for the description to clarify; baseline 4 applies. Nothing in the text misrepresents or invents inputs.

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?

Specific verb+resource ('List the holder's saved cards') and immediately disambiguates the resource from sibling concepts: these are cards the holder already owns, typed once at the issuer and passkey-locked, not newly issued cards. This separates it cleanly from order_card, create_reloadable_card, and get_card_data.

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 explicit downstream routing for the empty-result case ('call POST /create-saved-card-link and send the returned url to your human'), which is genuine when-to-act guidance. It does not, however, state when to prefer this over other read tools such as get_card_data or list_card_transactions, so the routing is one-directional rather than a full use/avoid statement.

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

get_signup_statusA
Read-onlyIdempotent
Inspect

Wait for your human to finish the signup

Long-polls until the human opens the claim link and finishes creating the account. Holds the connection open for about 60 seconds and returns 204 No Content if they have not finished yet.

Retry on 204 and nothing else. The call already blocks for you, so add no sleep between attempts. Every other status is final and retrying will not change the answer: 401 means the token is wrong, 410 means the link expired. Both carry "terminal": true in the body. A loop written as "retry until 200" spins at network speed against those, because they answer instantly rather than holding the connection.

On completion it returns your api_key — delivered exactly once. Store it before doing anything else; a later poll returns the account without it. By that point the human is on their dashboard, their agent wallet is provisioned, and you are already recorded as their connected agent, so announceAgentConnection is not needed on this path.

NameRequiredDescriptionDefault
claim_codeYesThe claim_code from the same POST /signup response.
claim_tokenYesThe claim_token from POST /signup.

Output Schema

NameRequiredDescription
authNoAn id_token / refresh_token bundle you can use immediately.
statusNo
api_keyNoYour lasoak_ key. Delivered EXACTLY ONCE — null on any later poll.
user_idNoThe Laso user id of the new account.
next_stepsNo
api_key_noteNoPresent only when api_key is null, explaining that it was already delivered.
callable_base_urlNo

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already mark this as read-only, idempotent, and non-destructive, but the description adds substantial behavioral detail: it blocks for ~60 seconds, returns 204 on incomplete signup, treats 401/410 as terminal with 'terminal': true, and delivers api_key exactly once. This goes far beyond the annotations and gives the agent a precise mental model.

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 earns its place: it front-loads the core purpose, then covers retry behavior, terminal statuses, and the one-time api_key delivery in a structured, bolded format. No filler or repetition beyond the title echo.

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 long-polling tool with an output schema, the description covers all essential context: blocking behavior, status code semantics, retry policy, terminality, api_key delivery, and downstream implications like not needing announceAgentConnection. Nothing critical 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 coverage is 100%, with both claim_token and claim_code described as coming from POST /signup. The description does not add extra parameter-level meaning beyond that, 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: 'Wait for your human to finish the signup' and then explains the long-polling behavior. It clearly distinguishes itself from siblings like start_signup and announce_connection by describing exactly what this tool does and what it does not do.

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 and when-not-to-use guidance: 'Retry on 204 and nothing else', 'Every other status is final', and 'announceAgentConnection is not needed on this path'. It also warns against a naive 'retry until 200' loop, which is actionable and prevents misuse.

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

get_supported_countriesA
Read-onlyIdempotent
Inspect

Get supported countries

Returns where each product can be used or sent, as ISO 3166-1 alpha-2 country codes. Free, no auth or payment header.

The USA prepaid card, Venmo payments, and bank payments are U.S. only. PayPal pays recipients in every country Laso serves; countries_by_platform separates it from Venmo. Push to card pays out to debit cards in the U.S. (USD), the euro area (EUR), and the U.K. (GBP); countries_by_currency maps each currency to its countries. The gift card list is the live catalog's: pass one of its codes as country to GET /order-gift-card. The international prepaid card has no fixed list (countries: null); check a merchant with GET /search-merchants?card_type=Non-Reloadable International.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
productsNo

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint/idempotentHint/no-destructive, so the safety profile is covered. The description adds real behavioral context beyond that: 'Free, no auth or payment header,' plus which products are U.S.-only vs global and where `countries: null` occurs, which an agent needs to interpret results.

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

Conciseness4/5

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

Front-loads the purpose and return format, then appends dense product-specific caveats. It is on the long side for a zero-param tool and some sentences verge on tangential endpoint routing, but every sentence carries distinct, decision-relevant information.

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?

With no parameters, an output schema present, and full annotations, the definition needs little more; the description still supplies the domain semantics (per-product scope, U.S.-only vs global, null list) that make the returned codes interpretable. Nothing an agent needs to call it correctly is missing.

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

Parameters4/5

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

This tool takes zero parameters, so the baseline is 4. The `country` reference in the description pertains to a different endpoint rather than this tool's inputs, but there are no parameters to clarify.

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

Purpose5/5

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

States a specific verb+resource ('Get supported countries') and then immediately clarifies what that means concretely: 'Returns where each product can be used or sent, as ISO 3166-1 alpha-2 country codes.' No sibling does the same thing, so the agent can distinguish it without opening the schema.

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 clear context for the various product-specific country lists and routes the agent to the right alternative endpoints (e.g. `GET /order-gift-card` with a listed code, `GET /search-merchants` for the international card). It doesn't phrase explicit 'use this vs X' when/when-not rules, but the routing guidance covers the relevant cases.

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

get_versionA
Read-onlyIdempotent
Inspect

Get the current docs version

Returns the current API contract version (api_version), the versioning and deprecation policy, and the content-hash version of the Laso Finance agent docs (SKILL.md, openapi.json, llms.txt, llms-full.txt, ai-plugin.json). Free, no auth or payment header.

Agents aggressively cache these docs, so use this to detect a stale cache: if the docs_version you last saw differs from the value returned here, refetch the docs. Every API response also carries this value in the X-Laso-Docs-Version response header, alongside X-Laso-Docs-Manifest, which points at the authoritative freshness beacon at https://laso.finance/.well-known/docs-version.json.

This route is also the status target of the API catalog at https://laso.finance/.well-known/api-catalog (RFC 9727), which every response advertises via a Link header with rel="api-catalog".

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
docsNoPer-file entries, each with a `url` and a stable `sha256` content identifier. Compare against the values you last saw to tell which file changed.
noteNo
versioningNoThe versioning and deprecation policy in machine-readable form: which header carries the version, what counts as an additive versus a breaking change, and how a retirement is signalled.
api_versionNoVersion of the API contract itself (this description's `info.version`). Moves only on a breaking change, unlike `docs_version`. Also sent on every response as `X-Laso-Api-Version`.
docs_versionNo12-character content hash of the agent docs. Changes only when the docs change.
api_catalog_urlNoURL of the RFC 9727 API catalog (`application/linkset+json`) indexing the OpenAPI description, the agent docs, and this status route.
docs_manifest_urlNoURL of the authoritative freshness beacon, served with no-cache.

TDQS

A4.3/5.0
Behavior5/5

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

Annotations already cover read-only, idempotent, non-destructive behavior, but the description goes further: it declares the endpoint is free, needs no auth or payment header, explains aggressive client-side caching, and documents the response header and freshness beacon. This is rich context beyond structured fields.

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: purpose first, then return contents, usage, and supporting headers. It is longer than strictly necessary for a zero-param tool, and the final paragraph about RFC 9727 API catalog and Link header is tangential, but no sentence is confusing or out of order.

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?

With an output schema present, the description need not enumerate return values, yet it still explains api_version, versioning policy, and docs_version clearly. Combined with explicit auth and cache-detection guidance, an agent has everything needed to call 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 tool takes zero parameters, so the schema is empty and schema coverage is 100%. Per the rubric, zero parameters sets a baseline of 4; there is nothing to clarify or compensate for.

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 opens with a specific verb+resource ('Get the current docs version') and details exactly what version data is returned. It never names a sibling or differentiates itself from tools like search_docs, so it stops short of the top score.

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

Usage Guidelines4/5

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

It explicitly states when to call it ('use this to detect a stale cache') and gives the triggering condition (docs_version differs from last seen). It also points to the X-Laso-Docs-Version header as an equivalent mechanism, though it never states when not to call it or how it relates to the sibling search_docs.

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

get_webhookA
Read-onlyIdempotent
Inspect

Get webhook registration & delivery health (free)

Returns the calling wallet's webhook registration and its delivery health. The signing secret is never returned here — it is shown once by POST /register-webhook; re-register to rotate it.

A registration is auto-disabled after 50 consecutive failed deliveries (disabled becomes true); re-register to re-enable it.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
urlNo
disabledNoTrue when auto-disabled after repeated delivery failures. Re-register to re-enable.
registeredNo
disabled_reasonNo
consecutive_failuresNo
last_delivery_detailNo`HTTP <status>` of the last attempt, or the error message.
last_delivery_statusNo`delivered` or `failed`, or null before the first delivery.
last_delivery_timestampNoEpoch milliseconds of the last delivery attempt.
last_delivery_message_idNoThe `webhook-id` header of the last delivery.

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the readOnly/idempotent/destructive annotations, the description adds meaningful behavior: the signing secret is never returned, it is only shown once at registration, and registrations auto-disable after 50 consecutive delivery failures. This gives the agent useful operational 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 and front-loaded with the tool's purpose. The follow-up sentences each add necessary operational details, and there is no filler or redundant schema repetition.

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?

With no parameters, an output schema available, and annotations covering safety, the description provides everything needed to call the tool correctly. It also covers the important edge case of auto-disablement and the path to recovery.

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 there are no parameter semantics to document. The description still adds relevant context by clarifying that the operation applies to the calling wallet's webhook, which is the only implicit input.

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 gives a specific verb and resource: 'Get webhook registration & delivery health.' It also scopes the operation to 'the calling wallet's' webhook, making the read-only intent unambiguous and clearly distinguishing it from sibling tools like register_webhook and delete_webhook.

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 routes the agent away from this tool when the signing secret is needed or when rotation is desired, pointing to POST /register-webhook instead. It also explains that a disabled registration must be re-registered to re-enable, giving concrete when-not-to-use guidance.

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

get_withdrawal_statusA
Read-onlyIdempotent
Inspect

Get withdrawal statuses

Returns the status of withdrawals for the authenticated user. If withdrawal_id is provided, returns a single withdrawal. If omitted, returns all withdrawals.

NameRequiredDescriptionDefault
withdrawal_idNoGet a specific withdrawal by ID. If omitted, returns all withdrawals.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/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 established. The description adds useful contextual behavior: results are scoped to the authenticated user and the single-vs-all behavior depends on the withdrawal_id parameter. 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.

Conciseness5/5

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

The description is compact and front-loaded, stating the core purpose in the first line and then explaining the conditional behavior in two short sentences. Every sentence earns its place without unnecessary elaboration.

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 simple read-only status lookup with one optional parameter and an output schema, the description covers all essential behavior: scope, conditional branching, and result type. An agent has enough information to select and invoke the tool correctly.

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%, and the description's parameter guidance mirrors the schema: omitting withdrawal_id returns all withdrawals, providing it returns a single withdrawal. This adds no new semantic detail beyond the schema, 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 identifies the operation: getting withdrawal statuses for the authenticated user. It also contrasts the two behavioral modes (single withdrawal when an ID is provided, all withdrawals when omitted), which makes the tool's purpose unambiguous among the many status-related siblings.

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 how to use the optional withdrawal_id parameter and what happens when it is omitted. It does not explicitly name alternative tools, but the resource (withdrawals) and scope (authenticated user) make the intended use clear enough.

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

list_address_bookA
Read-onlyIdempotent
Inspect

List saved recipients

The saved recipient names your human manages on their dashboard, so a request like "send $20 to the coffee vendor" can be resolved to an address instead of asking them for it.

Free.

It operates only on the authenticated account's own book — there is no user parameter to pass.

A name is a label, not an instruction. agentWalletTransfer takes an address and deliberately does not accept a name: a rename between your human asking and you sending would otherwise move money somewhere they did not intend. When you resolve a name to an address, say the address back to them before sending.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
entriesNo

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, and the description does not contradict them. It adds useful behavioral context: the operation is free, scoped to the authenticated account's own book, has no user parameter, and names are labels rather than instructions for sending money. 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.

Conciseness4/5

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

The description is somewhat longer than needed and repeats the title phrase 'List saved recipients,' but each paragraph earns its place by adding use-case, cost, scope, and a safety warning. The core function is stated up front and the important warning about name resolution is clearly emphasized.

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, read-only list operation with rich annotations and an output schema, the description provides everything an agent needs to invoke it correctly: purpose, usage scenario, account scope, cost, and a safety caveat. Nothing essential is missing.

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

Parameters4/5

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

The input schema has zero properties, so there is no parameter to document. The description explicitly confirms this by saying there is no user parameter to pass, which is helpful for ruling out a common mistake. This meets the baseline for a zero-parameter tool.

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 opens with 'List saved recipients' and explains that these are recipient names a human manages on their dashboard and can be resolved to an address. This clearly identifies a specific verb and resource. It does not explicitly contrast itself with sibling recipient-list tools like list_banking_recipients or list_payment_recipients, so it stops short of a 5.

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 a concrete use case: when a request names a saved recipient such as 'the coffee vendor', this tool resolves the name to an address rather than asking the human. It also states a scope constraint—it operates only on the authenticated account's own book. It does not name exclusions or alternatives, but the context is clear.

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

list_agent_api_keysA
Read-onlyIdempotent
Inspect

List API keys

Lists the account's live lasoak_ API keys, newest first: each key's keyId, label, createdAt and lastUsedAt (milliseconds). Revoked keys are left out. The raw keys are never returned, since only their hashes are stored. Connections approved through the MCP server's OAuth flow appear here too, labelled with the client's name.

Free.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the bar is lower. The description nonetheless adds real behavioral context: revoked keys are omitted, raw keys are never returned because only hashes are stored, and OAuth-approved connections surface here labelled with the client name. These are traits not derivable from 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?

Front-loaded with the purpose and then the field list; every clause carries information. The opening "List API keys" lightly duplicates the annotation title, a minor redundancy that costs a point.

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

Completeness5/5

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

An output schema exists, so return values need not be explained, yet the description still previews the returned fields and the ordering. For a no-argument list tool this is fully complete.

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 takes zero parameters, so the baseline is 4. The description correctly adds no parameter detail because there is nothing to parameterize.

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 ("List ... API keys") and pins down scope with concrete detail: live `lasoak_` keys, newest first, revoked keys excluded. An agent can immediately tell this apart from create_agent_api_key, revoke_agent_api_key, and exchange_api_key without opening any schema.

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

Usage Guidelines3/5

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

Usage is implied by the operation itself (a read-only listing), and the trailing "Free." note signals there is no cost to calling it. However, there is no explicit when-to-use vs. when-not guidance and no reference to the sibling keys tools (create/revoke/exchange).

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

list_banking_accountsA
Read-onlyIdempotent
Inspect

List banking accounts

Lists the account's banking rails and their details — for an on-ramp, the routing and account numbers to give whoever is paying in. The off-ramp deposit address is deliberately withheld: it is internal payout plumbing, not account detail.

Free.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/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=falseking, so the safety profile is covered. The description adds useful behavioral context by disclosing the deliberate omission of the off-ramp deposit address and explaining why, which helps set expectations about the returned data.

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 short and front-loaded with the core purpose, followed by the valuable off-ramp caveat. Minor redundancy: the opening phrase 'List banking accounts' repeats the tool name, and the trailing 'Free.' is ambiguous and adds little value.

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?

This is a simple zero-parameter read-only tool with an output schema available. The description captures the essential semantic nuance (on-ramp vs off-ramp), explicitly flags the one notable limitation, and leaves nothing an agent needs to invoke it 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 tool has zero parameters and schema description coverage is 100%, so there are no parameter semantics for the description to compensate for. Per the baseline for zero-parameter tools, this dimension is well satisfied.

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 ('Lists') and defines the resource as 'the account's banking rails and their details.' It goes beyond the tool name by explaining on-ramp vs off-ramp semanticsholics, which clearly separates it from siblings like list_banking_transactions and list_banking_recipients.

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 clear use context: an on-ramp needs routing and account numbers to give to a payer. It also explicitly tells the agent the off-ramp deposit address is deliberately withheld, so it knows this tool is not for payout plumbing. It does not explicitly name alternative tools or state when-not-to-use, so it stops 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.

list_banking_recipientsA
Read-onlyIdempotent
Inspect

List recipients and destinations

Lists payout recipients and their destinations, with account numbers masked to the last four digits. This is where destination_id values come from. Also available as the free paywalled route GET /bank-recipients.

Free.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already cover read-only, idempotent, and non-destructive behavior. The description adds that account numbers are masked and that it is a free paywalled route, which is valuable beyond the annotations. No contradiction found.

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 short and front-loaded with the core purpose. The additional details about masking and the free route are useful and not redundant. Every sentence serves a 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?

For a simple list tool with no parameters and an output schema, the description covers all needed aspects: what it lists, the masking behavior, the source of destination_id, and even the route. Nothing essential is missing.

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

Parameters4/5

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

With zero parameters, the description doesn't need to explain any. The schema is trivially covered, and the description doesn't attempt to document parameters. Baseline for 0 params is 4, which 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 it lists payout recipients and destinations, and explicitly mentions account numbers are masked. It distinguishes itself from other list tools like list_payment_recipients by specifying the banking domain and the destination_id source.

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

Usage Guidelines4/5

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

It states this is where destination_id values come from, giving clear context for when to use it (to obtain destination IDs). It doesn't explicitly mention when not to use it or compare to alternatives, but the context is strong enough for most agents.

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

list_banking_transactionsA
Read-onlyIdempotent
Inspect

List transactions

Lists banking transactions for the account: money arriving over the on-ramp and paying out over the off-ramp, with normalized statuses and amounts.

Free.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior3/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 covered. The description adds useful behavioral context: it lists both incoming and outgoing money and returns normalized statuses and amounts. It does not go into pagination, ordering, or how the account is determined, but with annotations and an output schema present, this is adequate.

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 short and front-loaded, with the main purpose stated immediately. The opening 'List transactions' is slightly redundant with the body, and 'Free.' is terse but informative. Overall, every sentence contributes to understanding the tool's scope and behavior.

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 no-parameter, read-only list operation with annotations and an output schema, the description is complete enough. It explains what kind of transactions are included and what normalization to expect. It does not mention alternatives or limitations, but those are not required for this simple tool.

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. There is no parameter semantics for the description to add, and the schema correctly reflects an empty input. The description focuses on the output scope instead, which 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 states a specific verb and resource: it lists banking transactions for the account, including both incoming and outgoing movements. It also clarifies scope by mentioning on-ramp and off-ramp flows, which distinguishes it from card-transaction or single-transaction siblings like list_card_transactions and get_banking_transaction.

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 clear context about what the tool does and what it covers: banking transactions for the account, with normalized statuses and amounts. It does not explicitly name alternatives or state when not to use it, but the context is specific enough for an agent to know this is the right tool for listing account-level banking transactions.

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

list_card_transactionsA
Read-onlyIdempotent
Inspect

List reloadable card transactions

Returns transactions on the authenticated user's reloadable cards, newest first: amount, merchant, status, and timestamps.

Pass card_id for one card's history, or omit it for every reloadable card on the account. Filter with status and cap the page with limit.

The response carries three lists. transactions holds the card spends the issuer reports. card_events holds the deposits, spending-limit changes, card creations and withdrawal requests that move the balance those spends draw on, which the issuer does not report at all. top_ups follows each GET /fund-card-balance payment across its legs. Merge transactions and card_events by created_at for the account holder's own view of the card; a list of spends alone shows money leaving a balance that grows for no visible reason.

This route covers reloadable cards only. The two non-reloadable products keep their history in Laso's own records and are read through /get-card-data.

If the wallet has no card issuer account linked, all three lists are empty and a note explains how the account holder sets one up at https://laso.finance/agent/dashboard/verified/card.

NameRequiredDescriptionDefault
limitNoMaximum number of transactions to return. Defaults to the issuer's own page size (20).
statusNoFilter by status, e.g. `pending`, `settled`, `declined`, `reversed`, `refunded`.
card_idNoReturn only this card's transactions. Omit for every reloadable card on the account.

Output Schema

NameRequiredDescription
noteNoPresent only when no card issuer account is linked.
top_upsNoEvery top-up paid through `GET /fund-card-balance`, newest first, with the transaction hash behind each leg as it lands. A top-up whose payment never settled is omitted. This is the same tracker the account holder sees in the dashboard.
card_eventsNoThe half of the history the card issuer does not report: what moved the balance behind the spends. Recorded from Laso's own records, newest first.
transactionsNo

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare this as a read-only, idempotent, non-destructive operation, but the description adds substantial behavioral context: newest-first ordering, the three distinct lists, why `card_events` must be merged with `transactions`, and that empty lists plus a `note` occur when no card issuer account is linked.

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 scope, then structured into parameter guidance, output-list semantics, routing, and an edge case. It is somewhat long, but the length is largely justified by the need to explain the three-list response and the reloadable-only constraint.

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?

Although an output schema exists, the description provides essential context about the three lists and how to interpret them together. It also covers the no-issuer-account case and routes non-reloadable card history elsewhere, leaving no obvious gap for an agent calling this 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?

Schema coverage is 100%, so the schema already documents all three parameters, including the default limit of 20. The description reinforces the meaning of `card_id` omission and the purpose of `status` and `limit`, but adds little syntax or format detail beyond the schema.

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

Purpose5/5

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

States a specific verb and resource ('List reloadable card transactions') and immediately distinguishes reloadable cards from the two non-reloadable products routed through /get-card-data. An agent can identify this tool's scope without opening the schema.

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 explains when to pass `card_id` versus omit it for all reloadable cards, how to filter with `status`, and how to cap results with `limit`. It also names the alternative route for non-reloadable card history and describes the no-issuer-linked edge case.

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

list_payment_recipientsA
Read-onlyIdempotent
Inspect

List saved Venmo and PayPal recipients (free)

Lists the Venmo or PayPal recipients this account has paid before, so you can resolve a name your human said ("send $20 to Jane") into the handle that GET /send-payment takes as its recipient_id. Free — only the payout itself is a paid action.

Two different ids are in play. Each entry's recipient_id is an opaque saved-entry id: pass it to POST and DELETE /payment-recipients. Its handle is the phone number or email you actually pay: pass that as recipient_id to GET /send-payment. Passing the saved-entry id to GET /send-payment does not send to the saved person.

Use total_sent and last_sent_timestamp to disambiguate similar names, and confirm with your human rather than guessing between two entries.

NameRequiredDescriptionDefault
platformYesPayment platform whose saved recipients to list.
include_archivedNoInclude archived entries. Defaults to false.

Output Schema

NameRequiredDescription
user_idNo
platformNoOne of: venmo, paypal.
recipientsNo

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the readOnly/idempotent annotations, the description exposes a subtle behavioral trap: two different id types exist, and using the wrong one silently fails to send to the intended person. It also explains how total_sent and last_sent_timestamp help disambiguate similar entries, adding genuine value not present in annotations or schema.

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 front-loaded with the core purpose, then adds high-value operational warnings and disambiguation guidance. Every sentence contributes meaningful information, and the length is justified by the need to prevent a real misuse of recipient identifiers.

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 output schema exists to describe return values, the description covers everything else needed for a safe and correct call: the supported platforms, the free nature, the identifier distinction, and how to handle ambiguous names. No critical operational context 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?

The input schema already documents both parameters with 100% coverage, including enums for platform and a default for include_archived. The description adds context about Venmo/PayPal and the overall purpose, but it does not significantly deepen the meaning of the two input parameters beyond what the schema provides, so the baseline score 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 precise verb-resource pair: 'List saved Venmo and PayPal recipients', and then clarifies the exact scope ('recipients this account has paid before'). It also clearly distinguishes this tool from related operations like GET /send-payment and recipient management endpoints, so an agent can select it accurately.

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 a concrete scenario: resolving a spoken name into a handle before calling GET /send-payment. It explicitly contrasts the free listing action with the paid payout and warns against passing the saved-entry id to GET /send-payment, which is an effective when-not-to behavior.

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

move_agent_wallet_fundsAInspect

Move USDC between your managed agent wallet's own Solana and Base sides. from is the network the USDC leaves; it arrives on the other, less a 0.075% fee taken from amount (minimum 0.10 USDC). Returns once it has arrived, usually within 10 seconds, with sentUsdc and receivedUsdc. Optional: payments and transfers already move what they need, so use this to fund Base ahead of a run of Base payments (none of them then waits on a move) or to bring everything back to Solana. The money never leaves your own wallets.

NameRequiredDescriptionDefault
fromYesThe network the USDC leaves.
amountYesDecimal USDC amount to move, as a string (e.g. 5). The fee comes out of it.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the annotations by disclosing the 0.075% fee taken from amount, the 0.10 USDC minimum, expected latency (~10 seconds), the return timing contract ('returns once it has arrived'), and the custody guarantee that 'the money never leaves your own wallets'. For a non-idempotent, non-read-only mutation, these are exactly the traits an agent needs.

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?

Purpose is front-loaded and the sentences earn their place, though naming sentUsdc/receivedUsdc duplicates the output schema. Slightly long but well organized and free of filler.

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?

With full schema coverage, annotations covering the safety profile, and an output schema for return values, the description supplies everything else an agent needs: fee economics, timing, custody, and the routing guidance. Nothing required to call it correctly 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 coverage is 100%, so the schema already documents both parameters, including that amount is a decimal string and the fee comes out of it. The description's gloss on 'from' ('the network the USDC leaves; it arrives on the other') largely restates the schema, so the baseline 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?

States a specific verb and resource with tight scope: move USDC between the managed agent wallet's own Solana and Base sides. It also distinguishes itself from the transfer/payment siblings by noting they 'already move what they need', so an agent can tell this apart from agent_wallet_transfer without opening either schema.

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

Usage Guidelines5/5

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

Gives explicit when-to-use ('fund Base ahead of a run of Base payments') and when-not ('payments and transfers already move what they need'), plus the second valid case ('bring everything back to Solana'). Alternatives and the condition selecting them are spelled out rather than left to inference.

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

order_cardA
Destructive
Inspect

Order a USA prepaid card

Pay between $5–$1000 USDC to order a Laso Finance USA prepaid card. By default returns JSON with auth credentials and card info (for AI agents). Pass format=html to get an HTML redirect to the card redemption URL (for browser-based flows).

The JSON response includes a card.status of "pending". Card details (number, CVV, etc.) take ~7-10 seconds to become available. Poll GET /get-card-data?card_id=<card_id> with the returned id_token as a Bearer token every 2–3 seconds until status becomes "ready".

U.S. only. This card is issued in USD and can only be used for purchases at U.S.-based merchants. Physical goods must ship to a U.S. address. For non-U.S. merchants or non-USD currencies, use GET /order-intl-card instead. This endpoint is intended for the caller's own use — the card is non-transferable.

PAID ROUTE (5-1000 USD): the x402 USDC price is paid automatically from your managed agent wallet. Make sure the wallet exists and is funded first (get_agent_wallet).

NameRequiredDescriptionDefault
amountYesUSD amount to load on the card (min $5, max $1000)
formatNoResponse format. `json` (default) returns auth credentials and card info for agents. `html` returns a redirect page for browsers.json

Output Schema

NameRequiredDescription
authNo
cardNoCard order info returned by /get-card. Status is always `pending` initially — poll `/get-card-data` to check when card details are ready.
user_idNoOpaque account id for the authenticated user. It is not a wallet or deposit address.
callable_base_urlNo

TDQS

A4.6/5.0
Behavior5/5

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

Annotations (`destructiveHint=true`, `idempotentHint=false`, `openWorldHint=true`) flag a risky spend, and the description adds context those hints cannot convey: the price is a 5–1000 USDC x402 charge auto-debited from the managed wallet, the card is non-transferable, and the returned `card.status` starts as 'pending' with details appearing only after ~7–10 seconds. It even specifies the polling cadence and endpoint, which is exactly the kind of behavior an agent cannot infer from structured fields.

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?

Purpose is front-loaded in the first line, followed by response behavior, then the geographic constraint and paid-route prerequisite. It is longer than average and occasionally dense, but every block (payment range, polling, U.S.-only, wallet funding) carries information the agent needs, so little is wasted.

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?

With an output schema present, the description does not need to enumerate return fields, yet it still explains the key response states and the async readiness transition. For a paid, non-idempotent ordering tool with a funding prerequisite, nothing an agent needs to call it correctly 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 both `amount` and `format` are already fully documented with bounds and enum meanings. The description restates the USDC payment range and the json/html formats without adding syntax or semantics beyond the schema, so baseline 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?

States a specific verb and resource ('Order a USA prepaid card') and immediately scopes it geographically and by currency. It explicitly names the contrasting sibling (`GET /order-intl-card`) for the non-U.S. case, so an agent can differentiate without opening either schema.

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

Usage Guidelines5/5

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

Gives explicit when-to-use conditions (U.S. merchants, USD, own use only) and an explicit when-not with the alternative to use instead (`GET /order-intl-card` for non-U.S./non-USD). It also states the precondition that the managed agent wallet must exist and be funded via get_agent_wallet before calling.

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

order_gift_cardA
Destructive
Inspect

Order a gift card

Pay USDC via x402 to order a gift card. First browse the catalog via GET /search-gift-cards to find the laso_server_id for the card you want, then call this endpoint with the amount and product ID.

Pricing: amount is the card's face value in the product's own currency, not USD. Laso converts it to USD at the current exchange rate and adds the product's fee (typically 4.8%, but it varies by product; the 402 quote is exact); that total is the x402 USDC price. A 100 SAR card costs roughly $28 USDC, not $100. Check the product's currency field in GET /search-gift-cards to see what amount is denominated in.

The $5 minimum and $9,000 maximum apply to the converted USD value, not the raw amount, so a foreign-currency amount is accepted only when its USD equivalent falls inside that range.

Returns redemption details (URL, code, and/or PIN) depending on the gift card brand.

PAID ROUTE (5-9000 USD): the x402 USDC price is paid automatically from your managed agent wallet. Make sure the wallet exists and is funded first (get_agent_wallet).

NameRequiredDescriptionDefault
amountYesGift card face value in the product's own currency (see the product's `currency` field in `GET /search-gift-cards`), not USD. The x402 price is this value converted to USD plus the product fee. After conversion it must be worth at least $5 and at most $9,000 USD.
countryNoISO 3166-1 alpha-2 country code (defaults to "US")US
laso_server_idYesThe product identifier from the gift card catalog (GET /search-gift-cards). Always copy it from a search result; an id that is not in the catalog returns 404 `unknown_laso_server_id`. Amazon is `amazon` for every country, selected with `country`.

Output Schema

NameRequiredDescription
authNo
user_idNoThe user's ID (lowercase wallet address)
gift_cardNoGift card order result with redemption details.
callable_base_urlNo

TDQS

A4.6/5.0
Behavior5/5

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

Annotations declare a non-idempotent, destructive, open-world write, and the description supplies the context an agent actually needs: the price is charged in USDC from the managed agent wallet via x402, pricing includes a variable ~4.8% fee with an exact 402 quote, an uncatalogued id returns 404 `unknown_laso_server_id`, and the call returns redemption details (URL/code/PIN). Nothing here contradicts `destructiveHint: true`.

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?

Action and workflow are front-loaded and the pricing warning is well placed before the agent commits to a wrong amount. It is longer than needed, though: the $5/$9,000 converted-USD rule is stated twice and the pricing paragraph could be tighter.

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 paid, non-idempotent purchase with an output schema already covering returns, the description covers everything material: prerequisite wallet funding, currency denomination, fee behavior, amount bounds, and the likely failure mode. An agent can call this correctly without further exploration.

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 already 100% and the description's parameter explanations largely duplicate it — the `amount`-is-face-value-not-USD point and the Amazon/country note both appear verbatim in the schema. The added value is mainly the ordering of `laso_server_id` behind the catalog search, which is marginal over the schema text.

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?

A specific verb+resource ('Order a gift card') plus an explicit statement of what is being purchased and how it is paid for. It clearly separates itself from the sibling `search_gift_cards`, which it names as the prerequisite lookup step.

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

Usage Guidelines5/5

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

Gives an ordered workflow: browse `GET /search-gift-cards` for `laso_server_id`, ensure the agent wallet exists and is funded via `get_agent_wallet`, then call this endpoint. It also states when the amount is rejected (USD equivalent outside $5–$9,000).

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

order_intl_cardA
Destructive
Inspect

Order an international prepaid card

Order an international non-reloadable prepaid card (USD). The order is queued and fulfilled by an admin — after fulfillment, card details become available via GET /get-card-data with card_type=Non-Reloadable International.

The x402 payment covers the on-card amount plus a 3.8% fee, or a lower rate while a limited-time fee promotion is running (it can be 0%). The 402 challenge always carries the exact total. Minimum $100, maximum $1,000 on-card amount. The $1,000 maximum is the amount loaded on the card and does not change with the fee rate. Submit a whole dollar amount.

Placing the order accepts the card issuer's terms on behalf of the account holder: the Cardholder Agreement, the E-Communications Disclosure, and the Privacy Notice.

If you need to cancel a queued order before it is fulfilled, use POST /cancel-intl-order.

PAID ROUTE (100-1038 USD): the x402 USDC price is paid automatically from your managed agent wallet. Make sure the wallet exists and is funded first (get_agent_wallet).

NameRequiredDescriptionDefault
amountYesOn-card USD amount (min $100, max $1,000 regardless of the fee rate). Must be a whole dollar amount: the issuer only issues whole-dollar cards. The x402 payment is this amount plus a 3.8% fee, or less during a fee promotion.

Output Schema

NameRequiredDescription
authNo
messageNo
user_idNo
intl_card_orderNo
callable_base_urlNo

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the annotations by disclosing the queued/admin-fulfilled lifecycle, the x402 payment mechanics and 3.8% fee (with promotion possibility), the exact min/max on-card amount, the legal effect of placing the order (accepting the Cardholder Agreement, E-Communications Disclosure, and Privacy Notice on behalf of the account holder), and the cancellation path. This is exactly the kind of behavioral context annotations cannot convey.

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

Conciseness4/5

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

Front-loaded with the action, then layers prerequisites, pricing, constraints, and legal terms in scannable paragraphs. Slightly redundant in restating the title in the opening line, but every paragraph carries load-bearing information.

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 paid, destructive, non-idempotent ordering tool with an output schema present, the description covers the lifecycle, pricing model, amount constraints, prerequisite wallet, legal acceptance, and follow-up/cancellation tools. Nothing an agent needs to invoke it correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds interpretive value beyond the schema: it clarifies that the $1,000 max is the on-card load amount and is unaffected by the fee rate, and that the payment total is amount plus fee with the exact total carried in the 402 challenge. This meaningfully disambiguates how the single parameter interacts with payment.

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

Purpose5/5

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

States a specific verb and resource ('Order an international non-reloadable prepaid card (USD)'), which is clearly distinguishable from siblings like order_card, order_gift_card, and create_reloadable_card. The card type and currency are pinned down in the first sentence.

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 usage context: the order is queued and admin-fulfilled, details become available afterward via GET /get-card-data with card_type=Non-Reloadable International, and it explicitly routes cancellation to POST /cancel-intl-order. It also states a prerequisite (funded agent wallet via get_agent_wallet). It does not explicitly contrast against the order_card sibling for non-international cards, so it falls just short of a full 5.

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

pay_x402_endpointA
Destructive
Inspect

Pay ANY external x402-paywalled endpoint from your managed agent wallet: the target's 402 challenge is settled in USDC and the response body is returned, with the settlement transaction as txHash. Endpoints settling in USDC on Solana or on Base mainnet (eip155:8453) are both paid from the same balance with nothing to set up: when a Base payment needs more than the Base side holds, the difference is moved over from Solana just before signing (usually under 10 seconds, 0.075% of the amount moved). No ETH is needed for gas; other EVM networks are refused. If the endpoint offers both, pin expected_network to choose. txHash is the Base transaction hash for a Base payment and the Solana signature for a Solana one. The wallet balance can take up to a minute to reflect a payment, so confirm with txHash rather than an immediate balance read. Use the guardrail arguments to pin what you agreed to pay. For Laso's own paid routes, prefer their dedicated tools instead.

NameRequiredDescriptionDefault
urlYesFull https URL of the x402 endpoint to call and pay.
bodyNoJSON request body (for POST/PUT).
methodNoHTTP method (default GET).
paramsNoQuery parameters to append to the URL.
expected_assetNoRefuse to settle in any other asset (e.g. a USDC mint/contract address; USDC on Base is 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913).
expected_pay_toNoRefuse to settle to any other receiving address.
max_amount_usdcNoRefuse to settle if the endpoint asks for more USDC than this.
expected_networkNoRefuse to settle on any other network (CAIP-2 id): eip155:8453 for Base, solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp for Solana. Pin it when an endpoint offers both, to choose which wallet pays.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

Annotations declare the destructive/non-idempotent/open-world profile, and the description layers on behavior annotations cannot express: USDC settlement, auto-bridging from Solana to Base with ~10s and 0.075% cost, no ETH gas needed, other EVM networks refused, and up-to-a-minute balance lag with a txHash-based verification recommendation. This is materially useful operational context.

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

Conciseness4/5

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

Front-loaded with the core action, then settlement/fee/latency caveats, then guardrail guidance and the sibling redirect. Every sentence carries information, though the long run-on paragraph is denser than ideal for scanning; a small trim or list would sharpen it.

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 an 8-parameter, open-world payment tool with an output schema already describing the return, the description covers the remaining agent questions: cost, latency, gas, network refusal, balance-lag caveat, and verification via txHash. Nothing needed to invoke it correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the schema: guardrail arguments exist to 'pin what you agreed to pay,' expected_network controls which wallet funds the payment when both networks are offered, and txHash format varies by network (Base hash vs Solana signature).

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+scope: 'Pay ANY external x402-paywalled endpoint from your managed agent wallet.' It also distinguishes itself from siblings by telling the agent that Laso's own paid routes have dedicated tools. An agent can select this tool over 60+ siblings without opening the schema.

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 ('Pay ANY external x402-paywalled endpoint'), when an alternative applies ('For Laso's own paid routes, prefer their dedicated tools instead'), and a decision rule for a real ambiguity ('If the endpoint offers both, pin expected_network to choose'). Nothing about routing is left to inference.

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

push_to_cardA
Destructive
Inspect

Send money to a debit card (USD, EUR, GBP)

Pay USDC to initiate a push-to-card transfer. Specify the face value in the target currency (USD, EUR, or GBP); Laso computes the USDC cost using the current exchange rate plus a 4.8% fee (minimum fee of $1.50/€1.50/£1.50 in the transfer currency), and that becomes the x402 price. Returns a redemption_url that must be opened to complete the transfer. The form requires sender name, debit card number, and cardholder name.

Supported currencies:

  • USD — U.S. debit cards (U.S. bank accounts only)

  • EUR — Eurozone debit cards

  • GBP — U.K. debit cards

Laso cannot perform the transfer directly — the redemption URL must be visited and the debit card details entered manually (by the agent or a human).

Fee: 4.8%, with a minimum of 1.50 in the transfer currency (included in the USDC price, computed from the requested face value).

PAID ROUTE (11.50-10000 USD): the x402 USDC price is paid automatically from your managed agent wallet. Make sure the wallet exists and is funded first (get_agent_wallet).

NameRequiredDescriptionDefault
amountYesFace value to send to the debit card, denominated in the chosen `currency` (min 10, max 9,541.98). The x402 payment price is this face value converted to USD plus a 4.8% fee (minimum fee of 1.50 in the chosen currency).
currencyNoTarget currency for the debit card transfer. Defaults to `USD`.USD

Output Schema

NameRequiredDescription
authNo
noteNoImportant information about the currency's regional restriction and required form fields
amountNoThe face value sent to the debit card, in the requested `currency`
messageNo
successNo
user_idNoThe user's ID (lowercase wallet address)
currencyNoThe target currency of the debit card transfer One of: USD, EUR, GBP.
redemption_urlNoURL to open and complete the push-to-card transfer. The form requires: sender name, debit card number, and cardholder name.
callable_base_urlNo

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already indicate destructiveHint=true, so the description's mention of sending money is consistent. It adds valuable behavior beyond annotations: the fee (4.8% with minimum), the requirement to visit a redemption_url, the manual entry of card details, and the automatic payment from the agent wallet. This gives the agent a full picture of side effects and prerequisites.

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 moderately long but well-structured: it leads with the core action, then covers supported currencies, fee, and the paid route. Each section adds necessary information, and the formatting (bold headers) aids scanning. It could be trimmed slightly, but nothing is redundant.

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 money-transfer tool with multiple prerequisites and a manual step, the description covers all essential aspects: the transfer mechanism, currency restrictions, fee structure, the redemption_url requirement, the need for a funded agent wallet, and the manual entry of card details. The presence of an output schema means return values need not be described, so this is complete for an agent to execute 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 already describes both parameters thoroughly (amount and currency), with coverage at 100%. The description reinforces this and adds nuance: the amount is a 'face value' that gets converted to USDC with a fee, and the currency restricts card eligibility. This exceeds the schema's detail, particularly around the fee calculation and currency-specific limits.

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 clear action verb and resource ('Send money to a debit card') and specifies the currencies and the payment mechanism (USDC). It distinguishes itself from other money-movement tools like send_bank_payment or withdraw by focusing on debit card transfers, making the purpose unambiguous.

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 strong contextual guidance: it explains the manual redemption step, the wallet funding prerequisite, and the fee structure. It does not explicitly name alternative tools or state when not to use it, but the context is clear enough that an agent can infer appropriate use. A small deduction for lacking explicit exclusions.

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

refresh_card_dataAInspect

Trigger a card data refresh

Requests an updated balance for a card.

For U.S. non-reloadable cards (default), the card is re-scraped from the issuer via a retrieval queue and processed asynchronously. Rate limited per card to one request every 5 minutes, and to at most 12 refreshes in any rolling 24-hour period.

For international non-reloadable cards, a balance update request is recorded; an admin will manually update the balance within 24 hours. While a balance update is already pending for a card, additional requests for that card return 409.

NameRequiredDescriptionDefault
card_idYesThe card ID to refresh data for
card_typeNoThe type of card. Defaults to `Non-Reloadable U.S.` if omitted.

Output Schema

NameRequiredDescription
messageNo
successNo

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint=false, destructiveHint=false), the description discloses async processing, rate limits (5-minute and 12 per 24h), manual handling for international cards, and the 409 conflict behavior. This gives the agent a clear picture of side effects and failure modes without contradiction.

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 concise, front-loaded with the purpose, and structured into clear paragraphs for U.S. and international behavior. Every sentence adds value, with no redundancy or filler.

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 the action, parameters, rate limits, error condition, and async behavior. An output schema is present, so return values are covered. For a refresh tool with this complexity, nothing essential is missing.

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

Parameters4/5

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

Schema coverage is 100%, so both parameters are documented. The description adds value by explaining the impact of card_type (defaulting to U.S., different processing paths) and the meaning of card_id in context, which goes beyond the schema's terse descriptions.

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 triggers a card data refresh and requests an updated balance. It distinguishes itself from siblings like get_card_data by focusing on the refresh action, and the title and description align with the resource and action.

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 explains when to use the tool: to refresh card data, and it differentiates behavior for U.S. vs international cards, including rate limits and async processing. It also notes the 409 error when a refresh is already pending. However, it doesn't explicitly contrast with get_card_data or other alternatives, leaving some inference needed.

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

refresh_tokenAInspect

Refresh an ID token

Exchange a refresh token for a new ID token. This is a free endpoint — no x402 payment required. Uses the standard OAuth2 grant_type=refresh_token pattern.

NameRequiredDescriptionDefault
grant_typeYesMust be "refresh_token"
refresh_tokenYesThe refresh token received from a previous /auth or /get-card call

Output Schema

NameRequiredDescription
user_idNoThe user's ID (lowercase wallet address)
id_tokenNoNew ID token — use as Bearer token for Laso Finance APIs
expires_inNoToken lifetime in seconds
refresh_tokenNoNew refresh token — use for the next refresh

TDQS

A4.1/5.0
Behavior4/5

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

Beyond annotations, the description adds valuable behavioral context: 'free endpoint — no x402 payment required' and 'standard OAuth2 grant_type=refresh_token pattern.' It does not disclose refresh-token rotation or auth requirements, but the annotations and output schema cover the remaining safety profile.

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 short, front-loaded with the action, and every clause earns its place. The payment/cost note is a single useful addition, and the protocol reference is concise.

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 simple token-refresh endpoint, the description plus full parameter schema and output schema covers purpose, parameters, cost, and protocol. There is no significant missing information needed to call the tool correctly.

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%, and both parameters already have descriptive text: grant_type must be 'refresh_token' and refresh_token comes from a previous /auth or /get-card call. The description reinforces their purpose but adds little new parameter-level meaning, 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 gives a specific verb and resource: 'Refresh an ID token' and 'Exchange a refresh token for a new ID token.' It is immediately clear what this tool does and how it differs from auth-related siblings by naming the OAuth2 refresh-token flow.

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

Usage Guidelines3/5

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

The intended use is implied: use this when you have a refresh token and need a new ID token. However, there is no explicit 'use when' guidance or mention of alternatives such as exchange_api_key, so the agent must infer the selection context.

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

register_webhookAInspect

Register a notification webhook (free)

Registers (or replaces) an HTTPS webhook URL to receive the calling wallet's account notifications as signed POSTs — banking application status changes, bank transfer and payout completions, agent wallet deposits, card orders, and every other event the user is notified about. This closes the polling gap for agents: instead of re-fetching status endpoints, point this at any URL you can receive HTTP on (your harness's inbound webhook endpoint, or a relay you poll).

Deliveries are signed per the Standard Webhooks specification (https://www.standardwebhooks.com/): each POST carries webhook-id, webhook-timestamp, and webhook-signature (v1,<base64 HMAC-SHA256>) headers verifiable with any standard-webhooks library using the returned secret. The body is {"type": "notification.<category>", "timestamp": "<ISO 8601>", "data": {"user_id", "title", "text", "category"}}.

The secret is returned exactly once, by this call. Re-registering rotates the secret, replaces the URL, and re-enables a registration that was auto-disabled after 50 consecutive failed deliveries. Registering also notifies the account owner through their other channels and fires a first signed test delivery (type notification.account) at the new URL.

Deliveries time out after 10 seconds and are not retried; treat the webhook as a low-latency hint and the status endpoints as the source of truth. The URL must be public HTTPS.

NameRequiredDescriptionDefault
urlYesPublic HTTPS URL to receive signed notification POSTs. Max 512 characters. Private/internal hosts are rejected.

Output Schema

NameRequiredDescription
urlNo
secretNoStandard Webhooks signing secret (`whsec_...`). Shown only in this response — store it now. Rotate by re-registering.
signingNoAlways `standard-webhooks`.
registeredNo

TDQS

A4.6/5.0
Behavior5/5

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

The description discloses rich behavioral detail beyond the sparse annotations: registering replaces the existing webhook, rotates the secret, re-enables disabled registrations, sends a test delivery, notifies the account owner, times out after 10 seconds, and does not retry. It also documents the signing headers and one-time secret return. This fully informs the agent of side effects and operational constraints.

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 longer than average but every paragraph adds distinct operational detail: registration semantics, signing format, failure/disabling behavior, and delivery timeout. Small redundancies such as 'free' and repeated HTTPS requirements exist, but the structure is logical and 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?

For a tool with one well-documented parameter and an output schema, the description is complete. It explains the returned secret, webhook payload shape, signature verification, replacement behavior, disable condition, timeout policy, and the relationship to status endpoints. An agent has everything needed to invoke and interpret 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?

Schema coverage is 100% and the schema already documents the URL requirements. The description adds context about what kind of URL is acceptable ('your harness's inbound webhook endpoint, or a relay you poll') and reinforces that private/internal hosts are rejected. This goes beyond the schema without being redundant.

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 and resource: 'Registers (or replaces) an HTTPS webhook URL to receive the calling wallet's account notifications as signed POSTs.' This clearly differentiates it from sibling tools like get_webhook and delete_webhook. The scope and effect are 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?

The description gives clear context for when to use the tool: 'This closes the polling gap for agents: instead of re-fetching status endpoints, point this at any URL...' It also explains delivery limitations and directs agents to treat status endpoints as the source of truth. It does not explicitly name alternatives/exclusions, but the context is strong enough for an agent to decide.

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

revoke_agent_api_keyAInspect

Revoke an API key

Revokes one lasoak_ API key, the same action as Revoke on the dashboard. A revoked key can no longer be exchanged for a session at agentAuth, and its MCP event subscriptions stop. A session already minted from the key is not cut off: its id_token lasts out its hour. Revoking a key that is already revoked succeeds and changes nothing.

To revoke a key you hold the raw value of, you can instead POST it as token to /oauth/revoke (RFC 7009) without looking up its keyId.

Free.

NameRequiredDescriptionDefault
keyIdYesThe key's id, as returned by `createAgentApiKey` or `listAgentApiKeys`.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only supply the boolean profile (readOnly=false, destructive=false, idempotent=false); the description goes well beyond them by stating the blast radius: the key can no longer be exchanged at `agentAuth`, its MCP event subscriptions stop, but an already-minted session lives out its `id_token` hour. It also discloses that re-revoking an already-revoked key succeeds as a no-op and that the call is free, which is exactly the operational context an agent needs before mutating state.

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 the action and effects, and nearly every sentence carries distinct information (equivalence, effects, session survival, idempotence, alternative, cost). The heading-plus-first-sentence repetition of 'Revoke an API key' and the RFC citation are mild padding, keeping it just short of a 5.

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 single-parameter mutation with an output schema present, everything the agent needs is covered: what is revoked, what stops, what survives, what happens on repeat calls, and the alternative endpoint. Return-value details are correctly left to the declared output 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 coverage is 100% and the single `keyId` parameter is fully documented in the schema, including its source (`createAgentApiKey` / `listAgentApiKeys`) and an example value. The description adds no format or syntax detail beyond that (it only implies which identifier the alternative path avoids), so the baseline 3 is correct.

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 ('Revoke an API key') and immediately disambiguates it from the create/list key siblings by naming the `lasoak_` key format and equating the action to the dashboard's Revoke. An agent can place it precisely among create_agent_api_key, list_agent_api_keys, and exchange_api_key.

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 explicitly routes the agent: use this tool with a `keyId`, or POST the raw token to `/oauth/revoke` (RFC 7009) if you already hold the value and don't want to look up its id. That is a concrete when-to-use-this-vs-alternative condition rather than vague context.

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

revoke_unused_agent_api_keysAInspect

Revoke all unused API keys

Revokes every live lasoak_ API key on the account that no agent has used yet: never exchanged at agentAuth and never used to connect, the keys the dashboard lists as "Has not signed in yet". The same action as Revoke all on the dashboard. Keys any agent has used are left alone. A key you just issued and have not used yet counts as unused, so do not call this while a new agent is still setting up.

Free.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

Adds substantial context beyond the annotations: the precise definition of 'unused', the guarantee that used keys are untouched, the dashboard equivalence, and the warning about freshly issued keys. The 'Free' note and the explicit blast radius are useful. The destructiveHint=false annotation sits slightly awkwardly next to a revoke action, but the description's 'unused only / used keys left alone' framing resolves that tension rather than contradicting it.

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

Conciseness4/5

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

Front-loaded with the action and then the eligibility rule, with the setup warning and cost note at the end. Slightly wordy in restating 'unused' twice, but every sentence carries actionable information.

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 no-parameter, irreversible-scope bulk revoke, the description covers scope, exclusions, timing caveat, and cost, and an output schema exists so return values need not be described. Nothing an agent needs before calling is missing.

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

Parameters4/5

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

The tool takes zero parameters, so there is no parameter semantics to document and the baseline is 4. The description correctly adds no redundant parameter talk.

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

Purpose5/5

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

States a specific verb and resource ('Revoke all unused API keys') and defines the exact scope: keys never exchanged at agentAuth and never used to connect. It implicitly separates itself from the sibling revoke_agent_api_key and from list_agent_api_keys by stating 'Keys any agent has used are left alone.'

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 a clear when-not-to-use rule ('do not call this while a new agent is still setting up') and maps the action to the dashboard's 'Revoke all', which anchors the agent's mental model. It stops short of explicitly naming revoke_agent_api_key as the alternative for revoking a single known key.

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

save_address_book_entryA
Idempotent
Inspect

Save or rename a recipient

The saved recipient names your human manages on their dashboard, so a request like "send $20 to the coffee vendor" can be resolved to an address instead of asking them for it.

Free.

It operates only on the authenticated account's own book — there is no user parameter to pass.

A name is a label, not an instruction. agentWalletTransfer takes an address and deliberately does not accept a name: a rename between your human asking and you sending would otherwise move money somewhere they did not intend. When you resolve a name to an address, say the address back to them before sending.

The address is the entry's key, so saving one that is already saved renames it rather than creating a duplicate. That makes this safe to retry.

NameRequiredDescriptionDefault
nameYesThe name to save it under. Sanitized and capped server-side (max 60 characters).
addressYesThe recipient's Solana address.

Output Schema

NameRequiredDescription
nameNo
addressNo

TDQS

A4.7/5.0
Behavior5/5

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

Beyond annotations (idempotentHint=true, readOnlyHint=false), it discloses that the address is the key, saving an existing address renames instead of duplicating, retries are safe, and the tool only touches the authenticated account's own book. It also warns that a name is a label, not an instruction, preventing misdirected transfers.

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?

Structured with a bolded critical warning, short paragraphs, and no filler. Each sentence contributes either scoping, retry semantics, or safety guidance; 'Free' is minor but acceptable as context.

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?

Covers scope, idempotency, relationship to transfer, and the no-user-parameter constraint. Output schema exists so return details are covered elsewhere; nothing an agent needs to call this safely is missing.

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

Parameters4/5

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

Schema already documents both parameters at 100% coverage; description adds the key insight that address is the entry's unique key and explains how the two params interact during rename. This is meaningful semantic value beyond the schema, though not exhaustive.

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?

Opening line 'Save or rename a recipient' states a concrete verb and resource, and the rest clarifies it manages the human's address book for name-to-address resolution. It distinguishes itself from agentWalletTransfer by noting that transfer takes an address, not a name.

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 clear context: use it to persist/rename addresses so the human's dashboard can resolve labels, and it explicitly notes agentWalletTransfer does not accept names. It doesn't explicitly enumerate when to prefer sibling address-book tools like list_address_book or delete_address_book_entry, but the intended workflow is clear.

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

search_docsA
Read-onlyIdempotent
Inspect

Search the Laso Finance agent docs (SKILL.md and the full API reference). Returns the most relevant sections. Use this for anything the tool descriptions don't answer: auth flows, funding, fees, webhooks, error handling.

NameRequiredDescriptionDefault
queryYesSearch terms, e.g. fund managed wallet, or: gift card fees.

Output Schema

NameRequiredDescription
noteNoWhere to read the full docs when nothing matched.
resultsNoBest-matching doc sections, most relevant first.

TDQS

A4.3/5.0
Behavior3/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 need not repeat that. The description adds the scope of the search (SKILL.md and API reference) and that it returns sections, which is useful context but not substantial behavioral disclosure 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.

Conciseness5/5

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

Three sentences, front-loaded with the core purpose, then output, then usage guidance. No wasted words.

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 single-parameter read-only search tool with an output schema, the description covers purpose, usage context, and scope. It is complete enough for an agent to decide when and how to invoke it.

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 fully documents the query parameter with examples. The description adds no additional parameter semantics, but with 100% schema coverage the baseline 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 searches the Laso Finance agent docs, specifically SKILL.md and the full API reference, and returns the most relevant sections. This is a specific verb and resource that distinguishes it from sibling search tools like search_gift_cards and search_merchants.

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 when to use: 'for anything the tool descriptions don't answer', with examples like auth flows, funding, fees, webhooks, and error handling. This provides clear decision guidance for agents.

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

search_gift_cardsA
Read-onlyIdempotent
Inspect

Search the gift card catalog

Browse and search available gift cards. Returns a list of gift card products with pricing, denomination, and catalog information. Use the laso_server_id from the results to order a card via GET /order-gift-card.

Every response includes a facets object listing the valid values for the category, currency, and country filters. The facets are computed from the full catalog, so a single unfiltered request (no query parameters) is enough to discover everything you can filter on.

This is a free endpoint — no x402 payment required.

NameRequiredDescriptionDefault
qNoSearch query to filter gift cards by name (e.g. "Amazon", "Uber")
countryNoISO 3166-1 alpha-2 country code to filter by (e.g. "US", "GB"). Returns gift cards available in that country, including borderless products that have no country restriction.
categoryNoCategory to filter by (e.g. "ecommerce", "travel", "gaming"). See the `facets.categories` array in any response for the full list of valid values.
currencyNoCurrency code to filter by (e.g. "USD", "EUR")

Output Schema

NameRequiredDescription
countNoNumber of results returned
facetsNoValid filter values, computed from the full catalog. Use these to discover what you can pass to the `category`, `currency`, and `country` query parameters.
filtersNo
gift_cardsNo

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint=false and destructiveHint=false, so safety is covered. The description adds genuinely new behavioral context beyond annotations: the facets object is computed from the full catalog (explaining result shape semantics) and the endpoint is free with no x402 payment required, which matters in a catalog that mixes paid and free endpoints.

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?

Three short, front-loaded paragraphs: what it does, how filters are discovered, and the cost profile. Every sentence carries information. Slightly more than strictly necessary given the input schema already names the filters, but nothing is wasted.

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?

Output schema exists, yet the description still usefully sketches the return shape (products with pricing, denomination, catalog info) and the facets object. Combined with the free-endpoint note and the ordering handoff, an agent has everything needed to call this correctly and act on the results.

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 and the schema already documents each filter with examples. The description goes beyond that by explaining the facet mechanism — that valid values for category, currency and country can be discovered from any response — which adds meaning about how to use the parameters correctly rather than just restating them.

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

Purpose5/5

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

States a specific verb and resource ('Search the gift card catalog') and immediately clarifies scope via 'Browse and search available gift cards.' It also distinguishes itself from the ordering sibling by naming the handoff field (`laso_server_id`) and the downstream tool (`GET /order-gift-card`), so an agent can tell search apart from order_gift_card without opening either schema.

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 clear operational context: a single unfiltered request is sufficient to discover all filterable values, and results feed into order_gift_card. This is strong routing and usage guidance. It stops short of explicit when-not-to-use conditions or edge cases, so it is not a 5.

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

search_merchantsA
Read-onlyIdempotent
Inspect

Search merchant spend data

Search Laso's merchant database for confirmed spend data for a given card type. Returns whether the card was accepted, not accepted, or unknown at each merchant.

Use card_type to search by the USA prepaid card (Non-Reloadable U.S., the default) or the international prepaid card (Non-Reloadable International). USA searches exclude merchants with non-US country-code TLDs; international searches do not.

Important: This database only contains merchants where Laso users have previously attempted a transaction. A merchant not being listed, or being listed as unknown, does NOT mean the card won't work there — it just means it hasn't been tried yet. If a merchant is listed as accepted, you can confidently use the card there. If listed as not_accepted, the card will fail at that merchant.

Banking and money-transfer merchants are always returned as not_accepted with a restriction_note, whatever the transaction history shows. Spending there counts as a transfer of value and is not supported on any card.

NameRequiredDescriptionDefault
qYesSearch query — the merchant name to search for (e.g. "amazon", "netflix")
card_typeNoWhich card type to search acceptance for. Defaults to `Non-Reloadable U.S.` if omitted (preserves existing client behavior). Pass `Non-Reloadable International` to search for international prepaid card acceptance.Non-Reloadable U.S.

Output Schema

NameRequiredDescription
noteNoImportant caveat about the data — this database only includes merchants where users have previously attempted transactions
countNoNumber of merchants returned
queryNoThe search query that was used
card_typeNoThe card type results are filtered for
merchantsNo

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already establish read-only, idempotent, non-destructive behavior, and the description adds substantial context beyond them: the database only covers merchants previously attempted by Laso users, unknown/absent does not mean rejection, accepted is a confident signal, and banking/money-transfer merchants are always not_accepted with a restriction_note. It also discloses the TLD-filtering difference between card types — genuinely valuable behavioral detail.

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 the core purpose, then flows into parameter guidance, then the critical interpretation caveat, then the banking exception. Each block earns its place given the real risk of misinterpreting results, though the length is slightly more than a minimal search tool would require.

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?

With an output schema present and only two parameters, the description covers everything an agent needs to call the tool correctly and interpret the response safely: database scope, result semantics, the banking edge case, and card-type behavior. No critical gap remains for correct invocation.

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 both q and card_type are already documented, which sets a baseline of 3. The description adds real functional meaning beyond the schema by explaining card_type's behavioral consequences (USA vs international TLD exclusion) and the semantic weight of the default, plus what q represents in the merchant-search context.

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 states a specific verb-resource pair ('Search Laso's merchant database for confirmed spend data') and the concrete outcome: whether a card was accepted, not accepted, or unknown at each merchant. It is clearly distinguishable from sibling search tools (search_docs, search_gift_cards) and from get_card_data by anchoring on merchant-level acceptance results.

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 clear, practical usage context: it explains how to pick card_type (USA vs international, with TLD-exclusion differences), and crucially clarifies how to interpret accepted / not_accepted / unknown results so the agent doesn't over-conclude. It does not explicitly name alternative tools or state when-not-to-use this one, which keeps it just below the top score.

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

search_swap_tokensA
Read-onlyIdempotent
Inspect

Search the tokens agent_wallet_swap can buy, by symbol, name, or mint address; an empty query returns USDC, SOL and USDT. Returns up to 20 tokens with mint (native for SOL), symbol, name, decimals, usdPrice, and verified, verified first. An unverified token is often a copy of a real one with the same symbol: confirm the mint with your human before buying it.

NameRequiredDescriptionDefault
queryNoSymbol, name, or mint address. Empty for the common tokens.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

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

Going beyond the readOnly/openWorld/idempotent annotations, it discloses the result cap (20), the ordering rule (verified first), the default result set for an empty query, and the impersonation risk of unverified tokens with a required human confirmation. That is substantive operational and safety context an agent could not infer from the structured fields.

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 tight sentences: capability and search keys first, then the return shape and ordering, then the risk caveat and required action. No filler and the most decision-relevant facts are front-loaded.

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 one-parameter read-only search with an output schema, the description covers everything an agent needs: what it searches, the default empty-query behavior, result limits, ordering, and the safety check before proceeding to the swap 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?

Schema coverage is 100% and the single parameter already documents 'symbol, name, or mint address; empty for common tokens'. The description restates the same semantics without adding format examples or matching rules, so the baseline holds.

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

Purpose5/5

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

States a specific verb (search) plus the exact resource and scope: tokens that agent_wallet_swap can buy, searchable by symbol, name, or mint address. This clearly separates it from siblings such as agent_wallet_swap and agent_wallet_swap_quote, which execute the trade rather than discover tokens.

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 positions the tool as the discovery step before swapping and gives two concrete usage cues: an empty query yields USDC/SOL/USDT, and an unverified hit should be confirmed with the human before purchase. It stops short of naming an explicit alternative or exclusion case, so it is not a 5.

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

send_bank_paymentA
Destructive
Inspect

Send dollars to a bank account

Pay USDC to send dollars to a bank account by ACH. The x402 USDC price is the requested amount plus a 0.25% transfer fee (with a $1.50 minimum fee). On-chain payment credits the calling wallet's Laso account balance via the standard deposit webhook; the callable then debits the gross amount and queues the transfer.

A bank destination is required first. destination_id comes from the banking callables: create the banking profile with createBankingProfile, register who is being paid with createBankingRecipient, and attach their bank account with addBankingDestination, which returns the id. List what you already have at GET /bank-recipients (free). See the bank accounts guide for the full setup.

Identity verification is required on the account that owns the banking profile, and only the human owner can complete it. createBankingProfile hands back a kycUrl when it is outstanding.

If the payout cannot be fulfilled (no approved banking profile, a destination that is not yours, an amount out of range), nothing is stranded: the USDC you paid has already credited your account balance. Fix the problem and retry, or recover it with POST /withdraw.

Settlement: ACH, normally 1-2 business days. Follow it with listBankingTransactions / getBankingTransaction.

Fee: 0.25% with a $1.50 minimum (included in the USDC price).

PAID ROUTE (11.50-50125 USD): the x402 USDC price is paid automatically from your managed agent wallet. Make sure the wallet exists and is funded first (get_agent_wallet).

NameRequiredDescriptionDefault
amountYesUSD delivered to the recipient's bank account (min $10, max $50,000). The x402 payment price is this amount plus a 0.25% fee (with a $1.50 minimum).
destination_idYesBank destination to pay out to. Returned by `addBankingDestination`, and listed by `GET /bank-recipients`.

Output Schema

NameRequiredDescription
authNo
messageNo
successNo
user_idNo
bank_paymentNo
callable_base_urlNo

TDQS

A4.6/5.0
Behavior5/5

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

Annotations cover safety (destructive, non-readonly, non-idempotent), but the description adds critical behavioral details beyond them: the exact fee structure, the on-chain credit-then-debit flow, failure handling where USDC is credited and recoverable, ACH settlement timing, and the requirement to fund the agent wallet first.

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 definition is front-loaded and well-structured with bold headings, and most sentences earn their place by covering prerequisites, failure modes, and fees. It is slightly verbose and repeats the fee (0.25% with $1.50 minimum) in multiple places, preventing a perfect score.

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

Completeness5/5

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

An output schema exists, so return values need not be described. The description fully covers the prerequisite setup, identity verification, failure recovery, settlement timing, fees, and wallet funding, leaving no significant gaps for correct invocation.

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 procedural meaning for destination_id (how to obtain it via createBankingProfile, createBankingRecipient, and addBankingDestination) and clarifies that amount is the net USD delivered with fees added on top, which goes beyond the schema's brief parameter descriptions.

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 ('Send dollars to a bank account') and clarifies the mechanism (USDC paid to send dollars via ACH). It distinguishes this from card and general payment siblings by explicitly requiring a bank destination and describing the ACH flow.

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

Usage Guidelines4/5

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

It gives extensive prerequisites (banking profile, recipient, destination, KYC verification) and failure recovery via POST /withdraw. However, it does not explicitly compare this tool to sibling alternatives like send_payment for the primary use case, leaving some routing inference to the agent.

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

send_feedbackAInspect

Send feedback about the API

Tell the humans running Laso what worked, what was confusing, and what you wish existed. It lands on their dashboard, so it is the best channel for API friction and feature requests.

Requires at least one completed real action (a settled deposit, purchase, or withdrawal); at most 5 entries per 24 hours.

NameRequiredDescriptionDefault
ratingNoA 1-5 satisfaction rating. Optional; ignored when not an integer in range.
endpointNoWhich API endpoint or route the feedback is about. Optional. Capped at 120 characters.
feedbackYesThe main free-text feedback. Required. Sanitized and capped server-side (max 2000 characters).
how_it_wentNoHow it went. Optional. Capped at 500 characters.
what_they_wantNoWhat you were trying to do. Optional. Capped at 500 characters.

Output Schema

NameRequiredDescription
okNo

TDQS

A4.3/5.0
Behavior4/5

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

The description adds meaningful behavioral context beyond annotations: the feedback lands on a human dashboard, there is a per-24-hour rate limit, and a real prior action is required. This is useful for an agent deciding whether and how often to call this tool. It doesn't cover authentication or side effects beyond emphasizing that it is a channel to humans, but it's still solidly transparent.

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 concise sentences front-load the core purpose, then add audience and constraints. Every sentence earns its place and there is 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?

For a simple feedback submission tool, the description covers purpose, audience, eligibility, and rate limits, while the input schema documents all parameters and an output schema exists. Nothing needed for correct invocation 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%, with each parameter having a description and example, so the description doesn't need to restate parameter details. The prose about 'what worked, what was confusing, and what you wish existed' loosely maps to the optional free-text fields but adds no syntax-level meaning. A baseline 3 is appropriate since the schema carries the heavy lifting.

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 action ('send feedback about the API') and the destination (the humans running Laso's dashboard). It also positions the tool as the channel for API friction and feature requests, which distinguishes it from all sibling tools that perform financial or account operations.

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

Usage Guidelines4/5

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

It explicitly indicates when to use the tool (for feedback, friction, feature requests) and imposes concrete eligibility and rate-limit constraints (requires a completed real action, max 5 entries per 24 hours). It doesn't name alternatives or exclusions, but no comparable feedback tool appears among the siblings, so the guidance is adequate.

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

send_paymentA
Destructive
Inspect

Send a payment via Venmo or PayPal

Pay USDC to send money to a Venmo or PayPal recipient. The x402 USDC price is the requested amount plus a 4.9% fee (with a $1.50 minimum fee). On-chain payment credits the calling wallet's Laso account balance via the standard deposit webhook; the callable then debits the gross amount and dispatches the payout.

Asynchronous. A dispatched payout answers 202 Accepted, not 200: the payment is recorded and handed to the payout provider, which settles it afterwards. Poll the returned status_url (GET /get-payment-status?payment_id=...) until state reaches a terminal value rather than treating the 202 as money received. A 200 means the opposite: nothing was dispatched because identity verification is required.

KYC required. The first time a wallet sends a Venmo or PayPal payout it must complete identity verification. If the wallet is not yet verified the response returns kyc_required: true and a kyc_url — open the URL, complete the flow, and retry. If you don't want to proceed, the credited account balance can be withdrawn with POST /withdraw.

Recipient details. For Venmo, recipient_id is the recipient's 10-digit U.S. phone number, and the first and last name are optional. No email is needed. For PayPal, recipient_id is the recipient's PayPal email, which also serves as recipient_email (so recipient_email is optional), and the first and last name are required.

Fee: 4.9% with a $1.50 minimum (included in the USDC price).

PAID ROUTE (6.50-1049 USD): the x402 USDC price is paid automatically from your managed agent wallet. Make sure the wallet exists and is funded first (get_agent_wallet).

NameRequiredDescriptionDefault
amountYesUSD amount to send to the recipient (min $5, max $1,000). The x402 payment price is this amount plus a 4.9% fee (with a $1.50 minimum).
platformYesPayment platform.
recipient_idYesRecipient identifier. For Venmo: 10-digit U.S. phone number. For PayPal: email address.
recipient_emailNoPayPal only. Recipient's email address; defaults to recipient_id (the PayPal email). Ignored for Venmo.
recipient_last_nameNoRecipient's last name (English letters A-Z and a-z only). Required for PayPal, optional for Venmo.
recipient_first_nameNoRecipient's first name (English letters A-Z and a-z only). Required for PayPal, optional for Venmo.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

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

Goes well beyond the annotations (destructiveHint/openWorld/idempotent) by explaining the 202-vs-200 distinction, the async polling contract via status_url, the on-chain credit/deposit webhook flow, the fee math, and the KYC escape hatch. An agent knows exactly what state the money is in.

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?

Long but tightly organized with bold lead-ins that let an agent skim to the async, KYC, recipient, and fee sections. Front-loaded with the core action, though the fee is stated twice (top and bottom).

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 complex, mutating, cross-chain payment tool this covers everything an agent needs before calling: prerequisites, async semantics, failure/KYC branches, and per-platform recipient rules. The output schema handles return shape, so no gap remains.

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% and the field descriptions already document the Venmo phone/PayPal email rules and the required/optional name fields. The description restates these per-platform rules but adds little the schema does not already carry, 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?

States a specific verb and resource (send a payment) and names the two supported networks. This cleanly separates it from sibling send_bank_payment and the order_/top-up tools.

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 strong procedural context: KYC must be completed before the first payout, the wallet must exist and be funded, and if the user declines they can withdraw instead. It does not explicitly say when to prefer this over send_bank_payment, so it stops short of a full routing rule.

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

start_signupAInspect

Start a signup for a human with no Laso account

Begins account creation for a human who does not have a Laso account yet. Requires no authentication, because the caller has no account.

This does not create the account. An agent cannot: the account is created in the human's own browser when they sign in, so it belongs to them and not to their agent. What this returns is a claim_url to hand over.

Give your human the claim_url verbatim in your very next reply (send message_for_human if unsure what to say), and do not open it yourself. Then poll GET /signup-status, which holds the connection open until they finish and hands you your lasoak_ API key.

Rate limited per IP.

NameRequiredDescriptionDefault
labelNoOptional label recorded on the minted API key so your human can tell keys apart.
agent_nameNoYour name, shown to your human on the claim screen and recorded as the connected agent.

Output Schema

NameRequiredDescription
claim_urlNoGive this to your human verbatim. Never open it yourself.
claim_codeNoThe code inside claim_url. Pass it back to /signup-status alongside claim_token.
expires_atNoEpoch ms when the claim link expires.
expires_inNoSeconds until the claim link expires (86400).
next_stepsNo
claim_tokenNoYour receipt for this signup. Shown once; store it. Exchanged at /signup-status for your API key.
agent_terms_urlNoThe Agent Terms your human accepts by finishing the claim link, as plain text. You act for them under these terms.
message_for_humanNoA ready-to-send reply containing the link. Send this as your next message.

TDQS

A4.7/5.0
Behavior5/5

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

Goes well beyond the annotations: discloses that it requires no authentication, that it does NOT actually create the account (creation happens in the human's browser), that it returns a claim_url, that polling holds the connection open until completion, and that it is rate limited per IP. This is the kind of context annotations cannot carry.

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?

Purpose is front-loaded in the first line, followed by the human-interaction protocol and the polling next step. Every sentence carries operational weight (auth exemption, non-creation, claim_url handling, rate limit) with no filler.

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?

With an output schema present, return values need not be re-explained. Given that, the description covers the auth posture, the full human-in-the-loop workflow, the follow-up call, and rate limiting — nothing an agent needs to call this correctly 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% and both optional parameters (label, agent_name) are fully documented in the schema. The description adds no additional meaning about either parameter, so it sits at the baseline where structured fields do the work.

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

Purpose5/5

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

States a specific verb+resource ('Start a signup', 'Begins account creation') and immediately scopes it ('for a human who does not have a Laso account yet'). This cleanly separates it from siblings like get_signup_status (polling), create_agent_api_key, and get_auth_link without needing to open any schema.

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 the triggering condition (human has no Laso account), the precondition (no authentication needed because the caller has no account), and the required follow-through (hand over claim_url verbatim next reply, do not open it, then poll GET /signup-status). When and when-not are both inferable and the next tool is named.

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

submit_banking_applicationAInspect

Submit the application

Submits the completed application for review. If the partner rejects it as incomplete, the reply says what is still missing rather than failing opaquely.

Free.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

The description adds meaningful behavioral detail beyond the annotations: incomplete submissions are rejected with a reply explaining what is missing rather than an opaque failure. The standalone 'Free' also signals cost behavior. It does not mention side effects such as locking the application or changing its status, but the disclosed failure behavior is valuable.

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 compact and front-loaded with the core action. The opening line 'Submit the application' is somewhat redundant with the tool name, and the standalone 'Free' is terse, but the total length is appropriate and the key behavioral detail earns its place.

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 zero-parameter tool with an output schema already present, the description covers the main action, the prerequisite, and an important failure mode. It does not explain what happens after a successful submission or repeated submissions, but those gaps are minor given the tool's simplicity.

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 there is no parameter detail for the description to provide. The description correctly adds no parameter information, and none is needed for an agent to call this tool correctly.

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 concrete verb and resource: 'Submits the completed application for review.' The action is clearly distinct from sibling tools like get_banking_application, update_banking_application_details, and upload_banking_document, even without naming them explicitly.

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 phrase 'completed application' gives clear context for when the tool is appropriate: only after the application has been finished. It does not explicitly state when not to use it or name alternative tools, but the submission-for-review framing provides enough usage guidance for an agent.

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

update_banking_application_detailsA
Idempotent
Inspect

Answer application questions

Submits answers to the non-identity application questions read from getBankingApplication. Call as many times as needed; each call merges.

Free.

NameRequiredDescriptionDefault
detailsYesThe answers to submit, keyed by the field names `getBankingApplication` reported as outstanding.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already indicate idempotent and non-destructive behavior, but the description adds the key merge semantics and the fact that calls are free. It also makes clear that partial updates are acceptable. There is no contradiction with the provided 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 compact and every sentence earns its place: purpose, merge behavior, and cost. The one-word 'Free.' is terse but communicates a material constraint. No fluff or 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?

For a tool with one nested parameter and a schema that fully describes that parameter, the description plus schema provides enough to call it correctly. A small gap is that it does not explicitly distinguish this from submit_banking_application or describe what happens after all questions are answered, so it is not quite a 5.

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 schema description covers the only parameter fully, explaining that details are keyed by the field names getBankingApplication reported as outstanding. The tool description reinforces the relationship to getBankingApplication but does not add substantial new semantic detail beyond the schema, so the baseline 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 states a specific action ('Submits answers') and resource ('non-identity application questions read from getBankingApplication'), clearly identifying this as a partial update tool rather than a full application submission. The 'non-identity' qualifier and the merge behavior help distinguish it from siblings like submit_banking_application.

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?

Usage is tied to getBankingApplication output and repeated calls are explicitly supported ('Call as many times as needed; each call merges'). However, it does not explicitly name alternative tools such as submit_banking_application or state when not to use this tool, so it falls just short of full guidance.

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

update_banking_destinationA
Idempotent
Inspect

Rename a destination

Sets or clears a destination's nickname. This is the only editable field: bank details are immutable at the partner, so anything else wrong means deleting the recipient and creating a new one.

Free.

NameRequiredDescriptionDefault
nicknameYesThe new nickname. An empty string clears it.
destinationIdYesThe destination to rename.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

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

Adds the constraint that bank details are immutable and describes the fallback of deleting/recreating. It does not contradict the annotations (readOnlyHint false, destructiveHint false, idempotentHint true) and adds context beyond them. The 'Free.' note is unexplained but harmless.

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 mostly concise and front-loads the action, but the trailing 'Free.' is ambiguous and does not earn its place. The title is repeated from annotations, adding slight 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?

For a simple 2-parameter tool with an output schema and annotations covering safety, the description sufficiently covers scope, limitations, and alternatives. No critical information is missing for correct usage.

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 documents both parameters, including that an empty string clears the nickname. The description adds no new parameter-level meaning, so it does not exceed the baseline of 3 given 100% 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 clearly states the verb ('sets or clears') and the resource ('destination's nickname'), making it distinct from other update tools. It also notes this is the only editable field, differentiating it from siblings like update_payment_recipient or delete_banking_recipient.

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 explains when not to use the tool: bank details are immutable, so any other change requires deleting and recreating the recipient. This gives clear guidance on alternatives, though it does not name specific sibling tools directly.

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

update_payment_recipientA
Idempotent
Inspect

Rename or archive a saved recipient (free)

Renames a saved Venmo or PayPal recipient, archives it, or both. Provide at least one of display_name or archived.

Archiving hides an entry from the default list while keeping its history, which is the reversible way to retire a recipient. Prefer it over DELETE.

NameRequiredDescriptionDefault
archivedNoMust be a boolean. A wrong type returns a terminal 400 with code `invalid_archived`.
platformYesPayment platform the recipient is saved under.
display_nameNoMust be a string. A wrong type returns a terminal 400 with code `invalid_display_name`.
recipient_idYesThe entry's `recipient_id` from `GET /payment-recipients` (an opaque id, not the phone number or email).

Output Schema

NameRequiredDescription
user_idNo
archivedNo
platformNo
display_nameNo
recipient_idNo

TDQS

A4.5/5.0
Behavior4/5

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

Annotations declare readOnlyHint=false, destructiveHint=false, and idempotentHint=true. The description adds meaningful context beyond annotations by explaining that archiving hides an entry from the default list while preserving history, making it reversible. It clearly communicates the mutation is non-destructive and reversible, aligning with the annotations. No contradiction.

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?

Concise and front-loaded: the first sentence states the purpose and scope, the second explains the constraint, and the third gives the behavioral nuance about archiving. No wasted words; every sentence adds value.

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 an output schema exists, return values are already covered. The description covers the key usage constraint, the behavior of archiving, and differentiates from DELETE. It is complete for an agent to correctly invoke the tool without missing critical information.

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 baseline is 3. The description adds value by stating the 'at least one of display_name or archived' constraint, which is not captured in the schema's required fields. It also explains the semantics of archived (hides from list, keeps history), going beyond the schema's simple type descriptions.

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

Purpose5/5

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

States a specific verb ('rename or archive') and resource ('saved recipient'), explicitly mentions Venmo/PayPal, and distinguishes itself from the DELETE sibling by recommending archiving over deletion. An agent can immediately understand what the tool does and how it differs.

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 a clear usage constraint: must provide at least one of display_name or archived. Explicitly recommends archiving over DELETE for retiring recipients, which is a direct alternative. However, it does not discuss when to use this versus list or other tools, though the context implies it's for existing recipients only.

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

upload_banking_documentAInspect

Upload a proof-of-address document

Attaches a proof-of-address document to the banking application, for the cases where the partner asks for one. The application must already exist and have an individual on it, so complete the application first.

Two things reject uploads that otherwise look fine. A .jpg file must be sent as fileType: "jpeg" — "jpg" is refused. And the partner caps the decoded size at 10MB, even though their own upload page advertises 20MB; oversized files are rejected here before the round-trip.

fileContent accepts either a bare base64 string or a data: URL, so a browser FileReader.readAsDataURL result can be passed through unchanged.

Free.

NameRequiredDescriptionDefault
countryYesThe document's country, ISO 3166-1 alpha-2.
fileTypeYesThe file's format. Send a .jpg as `jpeg`.
filenameNoThe file's name.
fileContentYesThe file, base64-encoded. A `data:` URL is also accepted. Decoded size must be 10MB or less.
documentTypeYesThe kind of document.

Output Schema

NameRequiredDescription
statusNo
documentIdNo

TDQS

A5/5.0
Behavior5/5

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

Beyond the annotations (which only indicate non-read-only, non-destructive), the description discloses two critical behavioral quirks: the .jpg must be sent as 'jpeg' and the decoded size limit is 10MB despite the partner's page advertising 20MB. It also explains fileContent accepts bare base64 or data URL. These are exactly the kind of hidden behaviors an agent needs to know.

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 well-organized: it opens with the purpose, then details prerequisites and behavioral caveats, then explains the fileContent flexibility. Every sentence earns its place, and the most critical pitfalls (jpg vs. jpeg, size cap) are surfaced prominently. No filler or repetition.

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 has an output schema (not shown) and the input schema is fully covered, the description fills the essential gaps: prerequisites, format constraints, and size limits. An agent can call this tool correctly without needing additional information, making it complete for its complexity.

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%, so all parameters are described. The description adds important nuances: it reinforces the jpg/jpeg mapping and the size constraint, and explains the flexibility of fileContent (data URL accepted). This adds meaning beyond the schema's basic field descriptions, helping the agent construct valid calls.

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 states a specific verb ('Upload') and resource ('proof-of-address document') and clarifies it attaches to an existing banking application. It clearly distinguishes this tool from siblings by its unique purpose, even though it doesn't name alternatives. The purpose is unambiguous and actionable.

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 explicitly mentions the use case ('for the cases where the partner asks for one') and gives a clear prerequisite: the application must already exist with an individual on it. It also instructs to complete the application first, providing concrete context for when to invoke this tool.

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

withdrawA
Destructive
Inspect

Withdraw from account balance

Initiate a withdrawal from the user's account balance. The USDC is sent on Solana to the solana_address you supply; the destination is never inferred, so the address is required.

This is an asynchronous operation. A successful call answers 202 Accepted: the withdrawal is created in a pending state and sent within a few minutes. Poll the returned status_url (GET /get-withdrawal-status?withdrawal_id=...) until state reaches a terminal value rather than treating the 202 as completion.

This draws only on the Laso account balance, never on the managed agent wallet. USDC sitting in the agent wallet is moved with agentWalletTransfer instead. When the account balance is too low but the agent wallet holds funds, the 400 response says so and reports both figures.

An agent's withdrawal counts against the account's spend limits, the same as its payments and wallet sends: it must be under the per-payment limit and fit in what is left of the rolling 24-hour limit. Otherwise it is refused with 403 and code agent_spend_limit or agent_daily_limit, and nothing is withdrawn. Do not split it into smaller withdrawals to get under a limit; tell your human.

NameRequiredDescriptionDefault
amountYesAmount to withdraw in USD
solana_addressYesSolana wallet address that receives the USDC. Must be a valid base58 Solana address.

Output Schema

NameRequiredDescription
successNo
status_urlNoAbsolute URL to poll for this withdrawal's state. Always present, including on an idempotent replay, so prefer it over the `Location` header.
withdrawalNoA withdrawal record.

TDQS

A4.6/5.0
Behavior5/5

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

With annotations declaring destructiveHint=true, the bar is lower, yet the description adds substantial context beyond them: asynchronous 202/pending lifecycle, the status_url to poll, and specific error codes (400 low-balance with both figures, 403 agent_spend_limit/agent_daily_limit). It also discloses that withdrawals count against per-payment and rolling 24-hour limits, which annotations cannot convey.

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

Conciseness4/5

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

Front-loads the core action and destination, then layers async behavior, balance scoping, and spend limits in separate paragraphs that each carry distinct information. Slightly long, but no sentence is pure filler and the ordering matches how an agent would need the facts.

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 destructive async withdrawal with an output schema present, everything an agent needs is covered: destination source, async lifecycle and polling, error semantics, and limit interactions. The output schema handles return shape, so the description is complete without over-explaining responses.

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%, so the schema already documents both parameters, giving a 3 baseline. The description reinforces requiredness and semantics of solana_address ('the destination is never inferred, so the address is required') but adds no format detail beyond the schema, which already states base58 validity.

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

Purpose5/5

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

States a specific verb and resource ('Initiate a withdrawal from the user's account balance') and immediately pins the mechanism: USDC sent on Solana to a supplied address. It explicitly differentiates from siblings by contrasting with agentWalletTransfer and the managed agent wallet. An agent can distinguish this from withdraw_card_balance and move_agent_wallet_funds without opening a schema.

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 when to use it (account balance funds) versus when to use the alternative (agent wallet funds -> agentWalletTransfer). It also gives failure-mode guidance ('Do not split it into smaller withdrawals... tell your human'), which is actionable when-to/when-not behavior rather than implied context.

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

withdraw_card_balanceA
Destructive
Inspect

Withdraw from a reloadable card balance

Move unspent money off the account holder's reloadable card. The balance behind a reloadable card is held by the card issuer, and this asks the issuer to pay amount of it out as USDC on Base to the destination_address you supply. It is the reverse of GET /fund-card-balance, and free: the money is the holder's own, and Laso moves nothing itself.

Base only. The issuer pays on Base and nowhere else, so the destination must be a Base wallet you control. A Laso managed agent wallet holds USDC on Solana and cannot receive this. The card deposit address from GET /get-card-deposit-address is not a valid destination either.

Not instant. The issuer processes payouts manually, usually within 1-3 business days, and emails the account holder when the payout is sent. The response carries the issuer's withdrawal_id; there is no status route to poll. The request is recorded as a withdrawal event under card_events in GET /list-card-transactions, and the balance from GET /get-card-deposit-address drops once it is paid.

Amount: $2 to $10,000, and no more than the balance the issuer can release. Withdrawals the issuer has not paid yet still count against the balance, so a second request can only take what remains.

Confirm the amount and destination with the account holder before calling this. A linked card issuer account is required; the holder sets it up at https://laso.finance/agent/dashboard/verified/card.

NameRequiredDescriptionDefault
amountYesUSD to withdraw from the card balance (min $2, max $10,000).
destination_addressYesThe 0x-prefixed Base wallet address that receives the USDC. Must be one you control; Base only.

Output Schema

NameRequiredDescription
noteNoTiming and where to see the request afterwards.
assetNo
amountNoUSD the issuer will pay out.
statusNoAlways `requested`: the issuer has accepted the request and will pay it out manually.
networkNo
withdrawal_idNoThe card issuer's reference for this payout request. Quote it to support; it also appears on the matching `withdrawal` card event.
destination_addressNoThe Base address the USDC goes to.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already mark destructiveHint=true and idempotentHint=false, and the description adds substantial behavioral context beyond that: payouts are manual and take 1-3 business days, there is no status route to poll, the request is recorded as a withdrawal event, and pending withdrawals count against the balance. 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?

Well-structured with bolded section headers and no filler; every paragraph serves a concrete purpose. It is slightly longer than strictly necessary and repeats a few schema-covered facts such as the amount range and Base-only requirement, but that redundancy is defensible for a destructive financial operation.

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 high-stakes, externally-settled mutation, the description covers prerequisites, destination constraints, timing, ledger visibility, and balance semantics. Since an output schema exists, not describing the response shape in prose is acceptable.

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?

Although schema coverage is 100%, the description adds meaning beyond the schema: the amount is bounded by the issuer-releasable balance including pending withdrawals, and the destination must be a Base wallet you control, explicitly excluding Solana agent wallets and the card deposit address.

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

Purpose5/5

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

Opens with a specific verb+resource: 'Withdraw from a reloadable card balance' and immediately defines the operation as moving unspent money off the card via the issuer paying USDC on Base. It is explicitly contrasted with GET /fund-card-balance, making the tool's purpose distinguishable from a key sibling.

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?

States clear when-to-use and when-not-to-use conditions: Base only; a Solana agent wallet cannot receive this; the card deposit address is not a valid destination. It also names the reverse operation, fund-card-balance, and gives a prerequisite: a linked card issuer account is required.

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.

  1. 3 tool updates
    • Changedagent_wallet_swap1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "type": "object"
        +}
    • Changedagent_wallet_swap_quote1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "type": "object"
        +}
    • Changedsearch_swap_tokens1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "type": "object"
        +}
  2. 2 tool updates
    • Addedagent_wallet_swap_quote
    • Addedsearch_swap_tokens
  3. 2 tool updates
    • Addedagent_wallet_swap
    • Changedagent_wallet_transfer2 fields changed
      • changedInput schema / properties / amount / description
        Previous value: -"Decimal USDC amount to send, as a string (e.g. 25.50)."New value: +"Decimal amount to send, as a string (e.g. 25.50), in USDC unless mint is set."
      • addedInput schema / properties / mint
        Added value: +{
        +  "description": "The asset to send: an SPL token mint address, or native for SOL. Omit for USDC.",
        +  "type": "string"
        +}
  4. 2 tool updates
    • Addeddisconnect_card_issuer
    • Addedfund_card_from_account_balance
  5. 1 tool update
    • Changedlist_card_transactions2 fields changed
      • addedOutput schema / properties / card_events
        Added value: +{
        +  "description": "The half of the history the card issuer does not report: what moved the balance behind the spends. Recorded from Laso's own records, newest first.",
        +  "items": {
        +    "properties": {
        +      "amount": {
        +        "description": "US dollars. The amount deposited or requested for withdrawal. Null on a `limitChange` or `cardCreated`.",
        +        "type": [
        +          "number",
        +          "null"
        +        ]
        +      },
        +      "balance": {
        +        "description": "The balance held with the card issuer immediately after this event, in US dollars.",
        +        "type": [
        +          "number",
        +          "null"
        +        ]
        +      },
        +      "card_id": {
        +        "description": "The card this event applies to, when it applies to one card rather than the account balance.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "created_at": {
        +        "description": "Milliseconds since the epoch.",
        +        "type": [
        +          "number",
        +          "null"
        +        ]
        +      },
        +      "destination_address": {
        +        "description": "`withdrawal` only. The Base address the payout goes to.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "event_type": {
        +        "description": "`deposit`: money settled on the holder's balance. `limitChange`: the card's spend limit was resized, which is what makes a deposit spendable. `cardCreated`: the card was issued. `withdrawal`: a payout requested through `POST /withdraw-card-balance`. One of: deposit, limitChange, cardCreated, withdrawal.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "new_spend_limit": {
        +        "description": "`limitChange` only. The card's spend limit after the change, in US dollars.",
        +        "type": [
        +          "number",
        +          "null"
        +        ]
        +      },
        +      "previous_spend_limit": {
        +        "description": "`limitChange` only. The card's spend limit before the change, in US dollars.",
        +        "type": [
        +          "number",
        +          "null"
        +        ]
        +      },
        +      "top_up_id": {
        +        "description": "Set on a `deposit` that is the final leg of a top-up paid through `GET /fund-card-balance`. That top-up is already in `top_ups` with its full history, so skip a `deposit` carrying this id rather than counting the money twice.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "withdrawal_id": {
        +        "description": "`withdrawal` only. The card issuer's reference for the payout request, which it names when it emails the account holder.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      }
        +    },
        +    "type": [
        +      "object",
        +      "null"
        +    ]
        +  },
        +  "type": [
        +    "array",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / top_ups
        Added value: +{
        +  "description": "Every top-up paid through `GET /fund-card-balance`, newest first, with the transaction hash behind each leg as it lands. A top-up whose payment never settled is omitted. This is the same tracker the account holder sees in the dashboard.",
        +  "items": {
        +    "properties": {
        +      "amount": {
        +        "description": "US dollars loaded onto the balance.",
        +        "type": [
        +          "number",
        +          "null"
        +        ]
        +      },
        +      "balance_after": {
        +        "description": "The balance with the card issuer once this top-up was credited, in US dollars.",
        +        "type": [
        +          "number",
        +          "null"
        +        ]
        +      },
        +      "bridge_transaction_hash": {
        +        "description": "The burn that started the bridge. Absent for a payment made on Base, which needs no bridge.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "bridge_transaction_url": {
        +        "description": "A block explorer link for `bridge_transaction_hash`.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "created_at": {
        +        "description": "Milliseconds since the epoch.",
        +        "type": [
        +          "number",
        +          "null"
        +        ]
        +      },
        +      "credited_at": {
        +        "description": "When the card issuer credited the balance, in milliseconds since the epoch.",
        +        "type": [
        +          "number",
        +          "null"
        +        ]
        +      },
        +      "deposit_address": {
        +        "description": "The holder's own deposit address at the card issuer, where the money is delivered.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "failure_reason": {
        +        "description": "`failed` only. Why delivery could not complete.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "mint_transaction_hash": {
        +        "description": "The mint that delivered the money on Base.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "mint_transaction_url": {
        +        "description": "A block explorer link for `mint_transaction_hash`.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "payer_address": {
        +        "description": "The wallet that paid for the top-up.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "payment_network": {
        +        "description": "The chain the payment was made on, e.g. `solana` or `base`.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "payment_transaction_hash": {
        +        "description": "The settled x402 payment.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "status": {
        +        "description": "`paid`: the payment settled and delivery has started. `bridging`: the burn is confirmed and the mint is pending, skipped for a payment made on Base. `delivered`: the money arrived at the holder's deposit address but the issuer has not credited it. `credited`: posted to the balance, terminal. `failed`: delivery could not complete, terminal. A `failed` top-up stranded nothing, since the payment credited the Laso account balance instead, so retry or recover it with `POST /withdraw`. One of: paid, bridging, delivered, credited, failed.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "top_up_id": {
        +        "description": "The id `GET /fund-card-balance` returned for this top-up.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "updated_at": {
        +        "description": "When the top-up last advanced a leg, in milliseconds since the epoch.",
        +        "type": [
        +          "number",
        +          "null"
        +        ]
        +      }
        +    },
        +    "type": [
        +      "object",
        +      "null"
        +    ]
        +  },
        +  "type": [
        +    "array",
        +    "null"
        +  ]
        +}
  6. 1 tool update
    • Changedstart_signup1 field changed
      • addedOutput schema / properties / agent_terms_url
        Added value: +{
        +  "description": "The Agent Terms your human accepts by finishing the claim link, as plain text. You act for them under these terms.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
  7. 1 tool update
    • Changedget_agent_spend_limit6 fields changed
      • addedOutput schema / properties / maxPaymentNowUsdc
        Added value: +{
        +  "description": "The most one payment may cost right now: the smaller of `maxPerPaymentUsdc` and `remainingTodayUsdc`. Check an amount against this, not against `maxPerPaymentUsdc` alone.",
        +  "type": [
        +    "number",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / maxPerDayUsdc
        Added value: +{
        +  "description": "The most everything the agent moves out may total across any rolling 24 hours: payments, wallet sends, and withdrawals together.",
        +  "type": [
        +    "number",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / nextReleaseAt
        Added value: +{
        +  "description": "When the oldest outflow in the window stops counting, in ms since epoch. Null when nothing is counting.",
        +  "type": [
        +    "number",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / nextReleaseUsdc
        Added value: +{
        +  "description": "How much allowance comes back at `nextReleaseAt`. Null when nothing is counting.",
        +  "type": [
        +    "number",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / remainingTodayUsdc
        Added value: +{
        +  "description": "What is left of the 24-hour limit right now.",
        +  "type": [
        +    "number",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / spentLast24hUsdc
        Added value: +{
        +  "description": "What has counted toward the 24-hour limit in the trailing 24 hours.",
        +  "type": [
        +    "number",
        +    "null"
        +  ]
        +}
  8. 2 tool updates
    • Changedorder_card1 field changed
      • changedOutput schema / properties / user_id / description
        Previous value: -"The user's ID (lowercase wallet address)"New value: +"Opaque account id for the authenticated user. It is not a wallet or deposit address."
    • Changedorder_intl_card1 field changed
      • addedOutput schema / properties / intl_card_order / properties / card_id
        Added value: +{
        +  "description": "Id of the queued order. Pass it as `card_id` to `GET /get-card-data` to poll for the card details, or to `POST /cancel-intl-order` while the order is still queued.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
  9. 3 tool updates
    • Addedget_card_issuer_status
    • Addedstart_card_issuer_link
    • Addedverify_card_issuer_link
  10. 1 tool update
    • Changedsearch_gift_cards1 field changed
      • changedOutput schema / properties / gift_cards / items / properties / increment / description
        Previous value: -"Minimum order increment"New value: +"Step the order amount must be a multiple of, in the product's currency. Usually \"1\" (whole units only, so 160.7 is rejected before payment). \"0\" means the product is only sold at the values in denominations."
  11. 1 tool update
    • Addedrevoke_unused_agent_api_keys
  12. 2 tool updates
    • Addedlist_agent_api_keys
    • Addedrevoke_agent_api_key
  13. 2 tool updates
    • Changedget_account_balance1 field changed
      • changedOutput schema / properties / agent_wallet / description
        Previous value: -"The caller's managed agent wallet: a separate on-chain Solana wallet holding USDC. Not part of the account balance. Spend it through `agentX402Pay` and move it with `agentWalletTransfer`."New value: +"The caller's managed agent wallet: separate on-chain USDC on Solana and Base, with `balance_usdc` the total. Not part of the account balance. Spend it through `agentX402Pay` and move it with `agentWalletTransfer`."
    • Addedmove_agent_wallet_funds
  14. 1 tool update
    • Changedget_account_balance1 field changed
      • changedOutput schema / properties / agent_wallet / description
        Previous value: -"The caller's managed agent wallet: separate on-chain USDC on Solana and Base, with `balance_usdc` the total. Not part of the account balance. Spend it through `agentX402Pay` and move it with `agentWalletTransfer`."New value: +"The caller's managed agent wallet: a separate on-chain Solana wallet holding USDC. Not part of the account balance. Spend it through `agentX402Pay` and move it with `agentWalletTransfer`."
  15. 1 tool update
    • Changedget_account_balance5 fields changed
      • addedOutput schema / properties / agent_wallet
        Added value: +{
        +  "description": "The caller's managed agent wallet: separate on-chain USDC on Solana and Base, with `balance_usdc` the total. Not part of the account balance. Spend it through `agentX402Pay` and move it with `agentWalletTransfer`.",
        +  "properties": {
        +    "balance_usdc": {
        +      "description": "USDC held on-chain by the agent wallet. The same figure `getAgentWallet` reports.",
        +      "type": [
        +        "number",
        +        "null"
        +      ]
        +    },
        +    "has_wallet": {
        +      "description": "False for wallet-native accounts and managed accounts with no wallet provisioned yet.",
        +      "type": [
        +        "boolean",
        +        "null"
        +      ]
        +    },
        +    "wallet_address": {
        +      "description": "The wallet's Solana address, or null when `has_wallet` is false.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "type": [
        +    "object",
        +    "null"
        +  ]
        +}
      • changedOutput schema / properties / balance / description
        Previous value: -"Current available balance in USD"New value: +"Laso account balance in USD. This is a ledger held by Laso and is what `/withdraw` draws on. It is not the agent wallet's on-chain balance; see `agent_wallet`."
      • addedOutput schema / properties / balance_type
        Added value: +{
        +  "description": "Names what `balance` measures: the Laso account balance, not the agent wallet. One of: account_balance.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / note
        Added value: +{
        +  "description": "Plain-language explanation of how the account balance and the agent wallet relate.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • changedOutput schema / properties / total_deposits / description
        Previous value: -"Total lifetime deposits in USD"New value: +"Total lifetime USD credited to the account balance. Includes every paid request settled from the agent wallet, because each one arrives as a deposit before the purchase debits it. It is not a measure of money received from outside."
  16. 1 tool update
    • Changedpay_x402_endpoint2 fields changed
      • changedInput schema / properties / expected_asset / description
        Previous value: -"Refuse to settle in any other asset (e.g. a USDC mint/contract address)."New value: +"Refuse to settle in any other asset (e.g. a USDC mint/contract address; USDC on Base is 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913)."
      • changedInput schema / properties / expected_network / description
        Previous value: -"Refuse to settle on any other network (CAIP-2 id)."New value: +"Refuse to settle on any other network (CAIP-2 id): eip155:8453 for Base, solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp for Solana. Pin it when an endpoint offers both, to choose which wallet pays."
  17. 1 tool update
    • Changedget_payment_status1 field changed
      • changedOutput schema / anyOf
        Previous value: -[
        -  {
        -    "properties": {
        -      "payment": {
        -        "description": "One Venmo or PayPal payout sent from this account.",
        -        "properties": {
        -          "amount_pre_fees": {
        -            "description": "Dollars the recipient receives.",
        -            "type": [
        -              "number",
        -              "null"
        -            ]
        -          },
        -          "amount_with_fees": {
        -            "description": "Dollars debited from the account balance, fee included.",
        -            "type": [
        -              "number",
        -              "null"
        -            ]
        -          },
        -          "fees_paid": {
        -            "type": [
        -              "number",
        -              "null"
        -            ]
        -          },
        -          "id": {
        -            "description": "Pass as `payment_id` to fetch this payout on its own.",
        -            "type": [
        -              "string",
        -              "null"
        -            ]
        -          },
        -          "platform": {
        -            "description": "One of: venmo, paypal.",
        -            "type": [
        -              "string",
        -              "null"
        -            ]
        -          },
        -          "recipient_first_name": {
        -            "type": [
        -              "string",
        -              "null"
        -            ]
        -          },
        -          "recipient_id": {
        -            "description": "The saved recipient this went to, as returned by `GET /payment-recipients`.",
        -            "type": [
        -              "string",
        -              "null"
        -            ]
        -          },
        -          "recipient_last_name": {
        -            "type": [
        -              "string",
        -              "null"
        -            ]
        -          },
        -          "state": {
        -            "description": "`queued` and `in-process` are still in flight. Absent on payouts sent before state tracking existed. One of: queued, in-process, complete, failed, cancelled.",
        -            "type": [
        -              "string",
        -              "null"
        -            ]
        -          },
        -          "state_updated_at": {
        -            "description": "Milliseconds since the epoch when `state` last changed.",
        -            "type": [
        -              "number",
        -              "null"
        -            ]
        -          },
        -          "timestamp": {
        -            "description": "Milliseconds since the epoch when the payout was sent.",
        -            "type": [
        -              "number",
        -              "null"
        -            ]
        -          },
        -          "timestamp_readable": {
        -            "type": [
        -              "string",
        -              "null"
        -            ]
        -          }
        -        },
        -        "type": [
        -          "object",
        -          "null"
        -        ]
        -      }
        -    },
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "payments": {
        -        "items": {
        -          "description": "One Venmo or PayPal payout sent from this account.",
        -          "properties": {
        -            "amount_pre_fees": {
        -              "description": "Dollars the recipient receives.",
        -              "type": [
        -                "number",
        -                "null"
        -              ]
        -            },
        -            "amount_with_fees": {
        -              "description": "Dollars debited from the account balance, fee included.",
        -              "type": [
        -                "number",
        -                "null"
        -              ]
        -            },
        -            "fees_paid": {
        -              "type": [
        -                "number",
        -                "null"
        -              ]
        -            },
        -            "id": {
        -              "description": "Pass as `payment_id` to fetch this payout on its own.",
        -              "type": [
        -                "string",
        -                "null"
        -              ]
        -            },
        -            "platform": {
        -              "description": "One of: venmo, paypal.",
        -              "type": [
        -                "string",
        -                "null"
        -              ]
        -            },
        -            "recipient_first_name": {
        -              "type": [
        -                "string",
        -                "null"
        -              ]
        -            },
        -            "recipient_id": {
        -              "description": "The saved recipient this went to, as returned by `GET /payment-recipients`.",
        -              "type": [
        -                "string",
        -                "null"
        -              ]
        -            },
        -            "recipient_last_name": {
        -              "type": [
        -                "string",
        -                "null"
        -              ]
        -            },
        -            "state": {
        -              "description": "`queued` and `in-process` are still in flight. Absent on payouts sent before state tracking existed. One of: queued, in-process, complete, failed, cancelled.",
        -              "type": [
        -                "string",
        -                "null"
        -              ]
        -            },
        -            "state_updated_at": {
        -              "description": "Milliseconds since the epoch when `state` last changed.",
        -              "type": [
        -                "number",
        -                "null"
        -              ]
        -            },
        -            "timestamp": {
        -              "description": "Milliseconds since the epoch when the payout was sent.",
        -              "type": [
        -                "number",
        -                "null"
        -              ]
        -            },
        -            "timestamp_readable": {
        -              "type": [
        -                "string",
        -                "null"
        -              ]
        -            }
        -          },
        -          "type": [
        -            "object",
        -            "null"
        -          ]
        -        },
        -        "type": [
        -          "array",
        -          "null"
        -        ]
        -      }
        -    },
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "properties": {
        +      "payment": {
        +        "description": "One Venmo or PayPal payout sent from this account.",
        +        "properties": {
        +          "amount_pre_fees": {
        +            "description": "Dollars the recipient receives.",
        +            "type": [
        +              "number",
        +              "null"
        +            ]
        +          },
        +          "amount_with_fees": {
        +            "description": "Dollars debited from the account balance, fee included.",
        +            "type": [
        +              "number",
        +              "null"
        +            ]
        +          },
        +          "fees_paid": {
        +            "type": [
        +              "number",
        +              "null"
        +            ]
        +          },
        +          "id": {
        +            "description": "Pass as `payment_id` to fetch this payout on its own.",
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "platform": {
        +            "description": "One of: venmo, paypal.",
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "recipient_first_name": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "recipient_id": {
        +            "description": "The saved recipient this went to, as returned by `GET /payment-recipients`.",
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "recipient_last_name": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "state": {
        +            "description": "`queued`, `awaiting-funding` and `in-process` are still in flight. `awaiting-funding` means the payout was debited and accepted but is delayed on our side before it reaches Venmo or PayPal, usually until the next business day. Absent on payouts sent before state tracking existed. One of: queued, awaiting-funding, in-process, complete, failed, cancelled.",
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "state_updated_at": {
        +            "description": "Milliseconds since the epoch when `state` last changed.",
        +            "type": [
        +              "number",
        +              "null"
        +            ]
        +          },
        +          "timestamp": {
        +            "description": "Milliseconds since the epoch when the payout was sent.",
        +            "type": [
        +              "number",
        +              "null"
        +            ]
        +          },
        +          "timestamp_readable": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          }
        +        },
        +        "type": [
        +          "object",
        +          "null"
        +        ]
        +      }
        +    },
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "payments": {
        +        "items": {
        +          "description": "One Venmo or PayPal payout sent from this account.",
        +          "properties": {
        +            "amount_pre_fees": {
        +              "description": "Dollars the recipient receives.",
        +              "type": [
        +                "number",
        +                "null"
        +              ]
        +            },
        +            "amount_with_fees": {
        +              "description": "Dollars debited from the account balance, fee included.",
        +              "type": [
        +                "number",
        +                "null"
        +              ]
        +            },
        +            "fees_paid": {
        +              "type": [
        +                "number",
        +                "null"
        +              ]
        +            },
        +            "id": {
        +              "description": "Pass as `payment_id` to fetch this payout on its own.",
        +              "type": [
        +                "string",
        +                "null"
        +              ]
        +            },
        +            "platform": {
        +              "description": "One of: venmo, paypal.",
        +              "type": [
        +                "string",
        +                "null"
        +              ]
        +            },
        +            "recipient_first_name": {
        +              "type": [
        +                "string",
        +                "null"
        +              ]
        +            },
        +            "recipient_id": {
        +              "description": "The saved recipient this went to, as returned by `GET /payment-recipients`.",
        +              "type": [
        +                "string",
        +                "null"
        +              ]
        +            },
        +            "recipient_last_name": {
        +              "type": [
        +                "string",
        +                "null"
        +              ]
        +            },
        +            "state": {
        +              "description": "`queued`, `awaiting-funding` and `in-process` are still in flight. `awaiting-funding` means the payout was debited and accepted but is delayed on our side before it reaches Venmo or PayPal, usually until the next business day. Absent on payouts sent before state tracking existed. One of: queued, awaiting-funding, in-process, complete, failed, cancelled.",
        +              "type": [
        +                "string",
        +                "null"
        +              ]
        +            },
        +            "state_updated_at": {
        +              "description": "Milliseconds since the epoch when `state` last changed.",
        +              "type": [
        +                "number",
        +                "null"
        +              ]
        +            },
        +            "timestamp": {
        +              "description": "Milliseconds since the epoch when the payout was sent.",
        +              "type": [
        +                "number",
        +                "null"
        +              ]
        +            },
        +            "timestamp_readable": {
        +              "type": [
        +                "string",
        +                "null"
        +              ]
        +            }
        +          },
        +          "type": [
        +            "object",
        +            "null"
        +          ]
        +        },
        +        "type": [
        +          "array",
        +          "null"
        +        ]
        +      }
        +    },
        +    "type": "object"
        +  }
        +]

Publisher details

Operator
Laso Finance LLC · Publisher source
Vendor relationship
First-party · Publisher source
Trust center
Not available
Restrictions
Requires a Laso Finance account, connected by OAuth sign-in or a Laso API key. get_version and search_docs work without one. Paid tools settle in USDC from the agent's funded wallet, and some products require the human account owner to complete identity verification. · Publisher source

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    Enables agents to cash out USDC on Arc into a Nigerian bank account by saving a verified payout recipient once and reusing it, quoting exact NGN amounts or USDC budgets, and executing approved payouts with status tracking. Balances, rates, and bank payouts are simulated in the current demo rather than settled on-chain.
    7
    11
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources