Laso Finance
Server Details
Spend USDC in the real world: prepaid cards, gift cards, push-to-card, and bank payouts.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 62 tools
Several tools have unclear boundaries: `list_banking_recipients` and `list_bank_recipients` appear to be duplicate endpoints for the same purpose, and `get_card` actually orders a paid card while `get_card_data` reads card details, creating a dangerous misselection risk. Most other tools are domain-separated, but these overlaps force agents to read descriptions very carefully.
The set mostly follows a predictable verb_noun snake_case pattern (`create_`, `get_`, `list_`, `delete_`, `update_`), but there are notable deviations: `get_card` is an order action rather than a read, card creation uses inconsistent verbs (`create_reloadable_card`, `get_card`, `order_intl_card`), and the duplicate `bank`/`banking` recipient listers use different affixes.
At 62 tools, this is far beyond the well-scoped range and will burden an agent's tool-selection step. The breadth of the finance platform explains some of the count, but duplicate endpoints, niche utilities, and highly granular status/setup tools inflate it unnecessarily.
Core workflows are well covered across onboarding, banking, cards, payments, gift cards, KYC, and webhooks, with create/read/update/delete and status-checking represented in each domain. Minor gaps exist—no API key revocation, no bank-transfer cancellation, no card closure—but agents can complete realistic tasks without dead ends.
Available Tools
62 toolsadd_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.
| Name | Required | Description | Default |
|---|---|---|---|
| nickname | No | An optional label. The only field editable later, via `updateBankingDestination`. | |
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. | |
| destination | Yes | The 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`. | |
| recipientId | Yes | The recipient from `createBankingRecipient`. | |
| recipientAddress | No | Sets 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It adds useful facts: the operation attaches an account/address, returns a destination ID, and is free. However, it does not disclose side effects such as whether calling it repeatedly creates multiple destinations, whether it replaces existing ones, or what auth setup is required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The text is short and front-loaded, but the first sentence 'Attach bank details to a recipient' is redundant with the second sentence. 'Free.' is informative but abrupt; a single tighter statement would be better.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a nested five-parameter mutation with no output schema, the description covers the core purpose and the key return value but omits operational context such as needing an existing recipient and the `recipientAddress` caveat for name-only recipients. The schema fills some of these gaps, making the definition adequate but not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds only high-level context about the destination type and the returned ID's role; it does not add per-parameter meaning beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a concrete action and resource: it attaches a bank account or crypto address to a recipient. It also names the meaningful output (`destination_id`) and the downstream consumer (`/send-bank-payment`), which makes the tool's role distinct from siblings like `update_banking_destination` or `create_banking_recipient`.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the main usage context: call this before `/send-bank-payment` because the returned `destination_id` is what that payment tool pays out to. It does not explicitly state when not to use it or contrast it with alternatives such as `update_banking_destination`, so the guidance remains inferential.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
agent_wallet_transferAInspect
Transfer USDC out of your managed agent wallet to any Solana address. Use this to recover funds or move them to another wallet you control.
| Name | Required | Description | Default |
|---|---|---|---|
| amount | Yes | Decimal USDC amount to send, as a string (e.g. 25.50). | |
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. | |
| destination_address | Yes | Solana address to send the USDC to. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the action ('transfer') but omits critical behavioral aspects such as irreversibility, balance requirements, fees, or any side effects. For a financial mutation tool, this is a significant gap—an agent cannot anticipate risks or preconditions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with zero fluff. The primary action and scope are front-loaded in the first sentence, followed by a clear purpose in the second. It is appropriately concise and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the absence of annotations and an output schema, the description should compensate with cautionary notes (e.g., irreversible transfer, sufficient balance needed). It does not mention any errors, limits, or prerequisites. For a financial transfer tool, this is under-specified—an agent might not know to check balance or verify the destination before invoking.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters clearly. The description adds no extra parameter meaning beyond saying 'transfer USDC' (implicitly covering destination and amount). Since the schema does the heavy lifting, a baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Transfer'), a specific resource ('USDC out of your managed agent wallet'), and a target ('any Solana address'). It also adds a use case ('recover funds or move them to another wallet you control'). This clearly distinguishes it from siblings like 'withdraw' or 'send_payment' which deal with different contexts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear context for use: 'to recover funds or move them to another wallet you control.' It implies the tool is for agent wallet transfers only, but does not explicitly mention when not to use it or name alternative tools. However, the context is unambiguous enough that an agent could select it correctly.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| message | No | A short greeting shown to your human, in your own words. Max 280 characters. | |
| agent_name | No | What to call you in your human's dashboard, e.g. Claude Code. Max 60 characters. | |
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It explains what the tool does (resolves screen, names agent, starts session) and that it returns wallet funding state. It doesn't mention error conditions or side effects beyond session creation, but for a simple announcement tool this is adequate. No contradictions with annotations (none provided).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single paragraph with no wasted words. The most critical instruction ('Call this FIRST') is front-loaded, and every sentence contributes new information: what it does, what to provide, and what it returns. It is concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with only 3 parameters, all documented, no output schema, and no nested objects, the description is complete. It covers the purpose, the exact timing (first), the parameters to use, and the return value (wallet funding state). No additional information is needed for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for all three parameters, so the baseline is 3. The description adds value by explicitly instructing to use agent_name and message for the introduction, and it frames auth_token as conditional on the absence of an Authorization header. This goes beyond the schema's dry descriptions and helps the agent select the right parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific purpose: it is the initialization tool that resolves a connection screen, names the agent in the dashboard, and starts a session. It explicitly says 'Call this FIRST, before any other Laso tool,' which distinguishes it from all sibling tools. The verb is clear and the resource is the session/connection state.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage guidance: 'Call this FIRST' establishes when to use it, and it tells the agent to introduce itself with agent_name and message. It also notes that it doubles as a setup check, covering both primary and secondary use. No ambiguity about when to invoke it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_intl_orderAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| card_id | Yes | The card ID of the queued order to cancel (returned from `/order-intl-card`) | |
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It adds meaningful context: only queued orders can be cancelled, the order is non-reloadable, and the charged amount is credited back to the account balance. This goes well beyond a bare 'cancel order' statement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, with the core action front-loaded in the first sentence and the key behavioral details in the second. Every sentence earns its place and there is no redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-required-parameter cancel operation with no output schema, the description covers the essential details: what can be cancelled, the state requirement, and the refund behavior. It is complete enough for an agent to invoke the tool correctly, though it could mention the expected failure mode for already-fulfilled orders.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 fully. The description adds no new parameter meaning beyond what the schema provides, which matches the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('Cancel') and a specific resource ('queued international non-reloadable card order'), and adds the state precondition (`state=queued`). This clearly distinguishes it from siblings like order_intl_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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear condition for use: the order must be previously queued and not yet fulfilled by an admin. It does not explicitly name alternatives or state when not to use the tool, but the precondition makes the intended usage unambiguous.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| label | No | A label to recognize the key by. | |
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does so excellently: it discloses that the raw key is shown only once, that only the hash is stored, and that the key cannot be retrieved again. It also notes the key is durable and free.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the main purpose, then delivers critical behavioral caveats. Every sentence earns its place, though the trailing 'Free.' is minor extra information that does not reduce clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter tool with no output schema, the description covers the essential behavior including the one-time visibility of the key and the durable nature of the credential. Nothing critical is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the input schema fully documents both parameters. The description does not add parameter-specific meaning, which is acceptable given the schema already provides adequate descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: issuing a durable `lasoak_` API key for the account. It uses a specific verb and resource, and the context is distinct from siblings like get_auth_link or refresh_token.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this is normally a human dashboard action, which gives contextual guidance, but it does not explicitly state when an agent should use this tool versus alternatives or when not to use it. The guidance is present but indirect.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_agent_walletAInspect
Create your managed agent wallet (one per account; idempotent). Returns the wallet's Solana address. Fund it with USDC to pay for the paid tools.
| Name | Required | Description | Default |
|---|---|---|---|
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It discloses idempotency, the one-per-account constraint, the returned Solana address, and the need to fund the wallet with USDC. It does not mention auth requirements or failure modes, but for an idempotent creation call these are minor gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences with no filler. It front-loads the primary action and constraint, then gives the return value and practical funding purpose. Every sentence contributes useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, idempotent creation tool with no output schema and no annotations, the description is mostly complete: it states the result, return value, uniqueness constraint, and follow-up funding need. It does not state prerequisites such as account existence, but 'one per account' implies the account context and the optional auth_token is covered by the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents the optional auth_token parameter, and the description adds no parameter-specific meaning. Baseline 3 applies because the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Create your managed agent wallet.' It clarifies scope with 'one per account', notes idempotency, states the returned value ('Solana address'), and its purpose ('pay for the paid tools'). This clearly distinguishes it from siblings like get_agent_wallet and agent_wallet_transfer.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: create a wallet before using paid tools, one per account, and idempotent behavior if called again. It does not explicitly name alternative tools or state when not to use it, but the context is specific enough that callers know the intended scenario.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| rail | No | The payment rail for the account. | |
| asset | No | Crypto asset ticker, uppercase. | |
| networkId | No | On-ramp only. Defaults to Solana mainnet. | |
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. | |
| accountType | Yes | Which rail to open. | |
| capabilities | No | On-ramp only. Bank rails to support. Defaults to ACH and wire. | |
| cryptoAddress | No | On-ramp only. Where the converted USDC should land. Defaults to the managed agent wallet. | |
| fiatDestinationId | No | Off-ramp only. The bank destination payouts go to, from `addBankingDestination`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It meaningfully explains what happens when an on-ramp or off-ramp is opened, notes the automatic off-ramp creation path, and discloses that the operation is 'Free.' It does not cover prerequisites like KYC or what the response contains, but it provides substantial behavioral context beyond a mere creation statement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized and front-loaded: the primary purpose is in the first line, followed by bolded explanations of on-ramp and off-ramp. The 'Free.' note is economical. Minor redundancy exists between 'Open an on-ramp or off-ramp account' and 'Opens a banking rail,' but overall it is tight and scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity, 8 parameters, and the absence of annotations and output schema, the description covers the key context: what the two account types do, when an off-ramp is unnecessary, and default behavior like the managed wallet. It could mention prerequisites such as a banking profile or KYC status, but the provided guidance is sufficient for most agents to decide whether and how to call it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds useful conceptual context about on-ramp vs off-ramp behavior, but it does not clarify ambiguous parameters such as 'rail' or 'capabilities' beyond what the schema already states. It is adequate but does not go further than the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: 'Open an on-ramp or off-ramp account.' It then explains what each account type does, and the second sentence, 'Opens a banking rail,' reinforces the core resource. This clearly distinguishes the tool from siblings like create_banking_profile or add_banking_destination.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells the agent when NOT to use this tool for off-ramps: it 'is opened automatically by /send-bank-payment, so most agents never call this for one directly.' It also implies the correct on-ramp use case: receiving dollars as USDC in the managed wallet. This gives concrete routing guidance relative to a named sibling.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral disclosure burden. It discloses the human-in-the-loop requirement, the kycRequired/kycUrl response condition, and that this is the only step the agent cannot complete itself. It could add idempotency or success behavior, but it covers the critical operational details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, front-loaded, and actionable. The minor redundancy between 'Create the banking profile' and 'Opens the banking profile' plus the stray 'Free.' line keep it from a perfect score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter tool with no output schema, the description explains the key failure response and the human handoff, which is the core operational knowledge an agent needs. Success-side details are minimal but inferable from the tool's role as the foundation for other banking calls.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the optional auth_token parameter is already fully documented. The description adds no further parameter-specific meaning, which matches the high-coverage baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as creating/opening the banking profile that all other banking calls depend on. This distinguishes it from sibling tools like create_banking_account and create_banking_recipient by establishing it as the foundational prerequisite.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides strong usage context: identity verification must happen first, the agent should hand the kycUrl to the human if needed, and then retry after they finish. It does not explicitly name alternative tools or when-not-to-use situations, so it stops short of the highest bar.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The recipient's name. | |
| address | No | The recipient's postal address. Required before a bank destination can be attached, so supplying it here avoids a second call. | |
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It only states 'Free' and the creation action, but does not disclose side effects, permission requirements, reversibility, or what happens on duplicate creation. The mention of 'Free' is a minor behavioral note but insufficient for a mutation tool with no annotation safety coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very short, with the core purpose front-loaded. However, the first two sentences ('Create a payout recipient' and 'Creates a person or company money can be sent to') are somewhat redundant and could be condensed. Still, it is efficient and avoids unnecessary detail, so it earns a 4.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple nature of the tool, the description provides enough context for an agent to call it correctly: it states what it creates and flags the need to use addBankingDestination for bank details. The schema covers all parameters, and the lack of an output schema is not a major gap because the creation outcome is straightforward. It is adequate but could benefit from a note about expected response or error cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters fully. The description adds no additional parameter-level meaning beyond pointing out that bank details are attached separately, which is already implicitly covered by the address parameter description. Baseline of 3 is appropriate because the schema carries the parameter documentation burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Create a payout recipient' and clarifies that it creates 'a person or company money can be sent to.' It also distinguishes itself from add_banking_destination by noting bank details are attached separately, which is a clear example of sibling differentiation. The purpose 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the workflow: create the recipient first, then attach bank details with addBankingDestination. This gives clear contextual guidance on when to use this tool in relation to its sibling. However, it does not explicitly mention alternatives like create_banking_account or create_banking_profile, nor does it state when not to use the tool, so it lacks full exclusionary guidance.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| reusable | No | Whether the card stays open across charges. Defaults to `true`; `false` closes it after the first approved charge. | |
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. | |
| usd_amount | Yes | Amount in US dollars to load onto the card, minimum $1. Sent as dollars, not cents. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full responsibility for behavioral disclosure. It thoroughly explains the card's reusability, the funding source, the free nature, the 402 error condition, the deposit address retrieval, and the direct availability of card_details for Laso-issued cards. This is comprehensive and exceeds what annotations would typically provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear paragraphs and bold key terms. It front-loads the main purpose and then covers reusability, cost, error handling, and follow-up actions. While it is somewhat long, each sentence contributes meaningful information, and the structure aids comprehension.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for a tool with no output schema. It explains what the tool returns ('returns it'), how to access card data via /get-card-data, and the distinction from other card creation routes. It also covers edge cases like insufficient balance and funding methods, ensuring an agent has all necessary information to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 extra meaning beyond the schema: it clarifies 'usd_amount' is in dollars (not cents) and has a $1 minimum, and elaborates on 'reusable' with the behavior of staying open until limit is spent. This adds value beyond the schema definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb and resource: 'Create a reloadable card' and explains it is funded from the account holder's balance and returns the card. It distinguishes from sibling tools by noting it is the same card created in the Laso dashboard and contrasts with cards from other apps that require approval. This makes the tool's purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 this tool: it creates a reloadable card, is free (no x402 payment), and is Laso-issued so no approval step is needed. It also explains the error case (402 when balance is short) and how to fund the card. While it doesn't explicitly name alternative tools to avoid, the context effectively guides usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_address_book_entryAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| address | No | The address to remove. | |
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does it well. It states the operation is free, scoped to the own account book, affects only the name mapping, and has no effect on past transfers. It also warns that names are labels and to echo resolved addresses before sending, giving an accurate side-effect model.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and then organized with bolded safety guidance. The name-vs-address warning is somewhat tangential to the delete operation itself, but it supports the address-book mental model and the final sentence directly clarifies the delete's limited effect.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter delete operation, the description covers scope, side effects, and cost. It does not mention expected return values or behavior when the address is absent, but the parameter schema is complete and the operational semantics are clear enough for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters are already described in the schema, so the baseline is 3. The description adds context that no user parameter exists and that an address rather than a name is used, but it does not add meaningful parameter-level detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening line 'Remove a saved recipient' states a specific verb and resource, and the follow-up explains this is the dashboard-managed saved recipient book. It is not a tautology and is distinct from the banking/payment recipient delete tools, though it does not explicitly call out those siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives useful operational context: it operates only on the authenticated account's own book and there is no user parameter. However, it never explicitly says when to prefer this tool over delete_payment_recipient or delete_banking_recipient, so usage conditions remain mostly implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_banking_recipientAInspect
Delete a recipient
Deletes a recipient, its destinations, and any off-ramp account that paid out to it. Irreversible.
Free.
| Name | Required | Description | Default |
|---|---|---|---|
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. | |
| recipientId | Yes | The recipient to delete. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It explicitly states the operation is irreversible and cascades to destinations and off-ramp accounts, which are critical side effects. It adds a note that the operation is free, though it does not mention authentication requirements or error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with a header and two short sentences. It is front-loaded with the core action and side effects. The 'Free.' note is an extra detail that may be useful but not essential, and the header is slightly redundant with the first sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a delete operation with two parameters and no output schema, the description covers the essential behavioral context: what gets deleted, irreversibility, and cost. It does not describe return values or error scenarios, but these are less critical for a delete tool and the schema already documents both parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so a baseline of 3 is appropriate. The tool description adds meaning to recipientId by explaining it triggers cascading deletion of related destinations and off-ramp accounts, which is not stated in the schema. This adds value beyond the structured fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Delete a recipient' and elaborates that it deletes the recipient, its destinations, and any off-ramp account that paid out to it. This goes beyond a generic description and distinguishes the tool from sibling delete tools by describing the scope of deletion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool through its clear purpose but does not explicitly mention alternatives or conditions. There is no guidance on when to choose delete_banking_recipient over delete_payment_recipient or other delete tools, though the tool name itself provides some disambiguation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_payment_recipientAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| platform | No | Required unless sent in the body. | |
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. | |
| recipient_id | No | Required unless sent in the body. The entry's `recipient_id` from `GET /payment-recipients` (an opaque id, not the phone number or email). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states that payment history is kept, only the saved entry is removed, and that the operation is not reversible through the API. It also notes that parameters can be sent in the body or query string. This is adequate though it does not explicitly state success/failure outcomes or idempotency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose in the first line, followed by essential behavioral and usage notes. It is appropriately sized, though the '(free)' suffix is cryptic and could be removed. The structure flows logically from purpose to behavior to guidance, with no unnecessary filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, irreversible operation, the description covers the key aspects: what is removed, what is preserved, and the recommended alternative. It also addresses the transport flexibility. It does not mention behavior for non-existent recipients or error cases, but given the schema and lack of output schema, it is reasonably complete for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already describes all three parameters with 100% coverage, including the enum for platform and the explanation for recipient_id. The description adds a minor usage note that platform and recipient_id may be sent in the JSON body or query string, which is a transport detail rather than deeper parameter semantics. Given full 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.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Remove' and the resource 'saved recipient' with explicit mention of Venmo or PayPal. It distinguishes from sibling delete tools like delete_banking_recipient and delete_address_book_entry by specifying payment recipients, and from update_payment_recipient which modifies rather than removes. The parenthetical '(free)' is ambiguous but does not undermine the core purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly provides when to use the tool (to remove a saved recipient) and when to prefer an alternative: 'prefer archiving (`POST /payment-recipients` with `archived: true`) when the account owner may want the recipient back'. It also advises confirming before removing someone not asked to remove, giving clear conditional guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_webhookAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With zero annotations, the description carries the full burden, and it does well: it discloses cost ('free'), scope ('calling wallet's' own registration, implying no cross-account effect), partial effect (only webhook deliveries stop, not push/SMS/Telegram/in-app), and the side effect of notifying the account owner. It omits idempotency/error behavior for a non-existent webhook, but this is solid coverage for an unannotated tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with no filler: the headline action and cost are front-loaded, then precise behavioral scope, then the notification side effect. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-optional-parameter tool with no output schema and no annotations, the description covers purpose, scope, side effects, and cost — enough for an agent to call it correctly. The only gaps are edge-case behavior (calling delete when no webhook exists) and return/confirmation shape, which are minor for a tool this simple.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% — auth_token is fully documented in the schema ('Laso credential. Only if the MCP connection has no Authorization header'). The description adds no parameter-level detail, so the baseline of 3 applies; the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Delete the notification webhook' / 'Removes the calling wallet's webhook registration.' The line about other channels continuing distinguishes this from broader notification-disable tools, and it is clearly differentiated from sibling register_webhook and get_webhook.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is implied rather than explicit: the description makes clear this stops webhook deliveries while other channels continue, so an agent can infer when to call it. However, it never names register_webhook as the reversal path or states when not to use it, leaving the when-vs-alternative guidance entirely implicit.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| api_key | Yes | Your `lasoak_` API key. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does substantial work: it discloses token lifetime, the presence of a human-visible `auth_url`, the durable key prefix, the fact that this is the entry point for all other calls, and that it is free. It does not state whether the API key remains valid after exchange, but the description still provides unusually rich behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and then delivers token details, usage positioning, and acquisition instructions in compact paragraphs. Every sentence earns its place, including the final 'Free.' which adds cost transparency without bloat.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description explains the returned values (`id_token`, `refresh_token`, `auth_url`) and their roles. It covers the single parameter fully via the schema, explains the prerequisite for obtaining a key, and gives the call's place in the agent lifecycle, making it complete for such a simple tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the parameter is a single `api_key` string with an example and description already. The tool description adds only the adjective 'durable' and the URL for obtaining a key, which is helpful context but not substantial new parameter-level semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: exchanging a durable `lasoak_` API key for a session containing `id_token`, `refresh_token`, and `auth_url`. It clearly positions this as the first call an agent makes, which distinguishes it from siblings like `create_agent_api_key` and `refresh_token`.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says this is the first call an agent makes and that the returned `id_token` authenticates every other endpoint, giving clear when-to-use context. It also explains how to obtain a key if the agent lacks one, though it does not explicitly contrast with the `refresh_token` sibling for later sessions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fund_card_balanceAInspect
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-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).
| Name | Required | Description | Default |
|---|---|---|---|
| amount | Yes | USD of USDC to load onto the card balance (min $5, max $1,000). The x402 price equals this amount; Laso absorbs the bridge cost. | |
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully carries the behavioral burden and does so: it discloses payment settlement, CCTP bridging/burning/minting, exact fee behavior, status lifecycle (paid -> bridging -> delivered -> credited), response top_up_id, and failure recovery via withdraw. This is far beyond the minimal 'loads balance' statement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Although long, the description is front-loaded with the one-sentence purpose and uses bolded section headers (Why this exists, Price, Delivery, Failure) so an agent can scan efficiently. Each paragraph adds a distinct operational fact and none is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a payment endpoint with no output schema or annotations, the description explains prerequisites, response behavior, status monitoring endpoints, post-conditions, and failure handling. An agent has enough to decide, execute, and verify the operation successfully.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and already documents amount's min/max and x402 price. The description adds the valuable guarantee that the credited balance equals the paid amount and that Laso covers bridge cost by burning slightly more than the requested amount, which clarifies the financial contract beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb and resource: 'Load a reloadable card balance' and 'Pay USDC to load the account holder's reloadable card balance at the card issuer.' It also explains the unique cross-chain bridging mechanism, which differentiates it from sibling actions like create_reloadable_card or withdraw_card_balance.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete usage context: a linked issuer account is required, the wallet must exist and be funded (get_agent_wallet), and the correct follow-up is POST /create-reloadable-card. It does not explicitly list when-not-to-use or name an alternative for the same goal, which keeps it just shy 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_account_balanceBInspect
Get account balance
Returns the current account balance and total deposits for the authenticated user.
| Name | Required | Description | Default |
|---|---|---|---|
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It states what the tool returns but does not disclose side effects, authentication requirements beyond the optional auth_token parameter, rate limits, or any limitations. For a tool with zero annotation coverage, this is a significant gap in transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise, consisting of two short sentences. The purpose is front-loaded with 'Get account balance' and the return information follows immediately. There is no wasted wording, making it highly efficient for an agent to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with one optional parameter and no output schema, the description covers the core return values (balance and total deposits). However, it omits any mention of error conditions, currency, or authentication prerequisites beyond the implied 'authenticated user'. Given the low complexity, the description is minimally adequate but not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema describes the auth_token parameter with 'Laso credential. Only if the MCP connection has no Authorization header.' Since schema description coverage is 100%, the schema already documents the parameter fully. The tool description adds no additional meaning about parameters, 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.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Get' and the resource 'account balance', and specifies that it returns the current account balance and total deposits for the authenticated user. This is specific and unambiguous, though it does not explicitly differentiate from sibling tools like get_agent_wallet or get_card, which is why it falls 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage: if you need the account balance, use this tool. However, it provides no explicit guidance on when to use it versus alternatives, nor does it mention any prerequisites or exclusions. The usage is implied rather than stated, so it meets the baseline for implied guidance but lacks explicit routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_agent_spend_limitAInspect
Read the per-payment spend limit
Returns the maximum the account owner allows for any single payment from the managed wallet: maxPerPaymentUsdc, plus the min, max, and default bounds it can be set within, all in whole USDC. 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 this 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.
| Name | Required | Description | Default |
|---|---|---|---|
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses that the operation is read-only, that it applies to all payment types (agentX402Pay, Laso routes, external url endpoints), the default and range, and that fees are added on top. It also explicitly warns against splitting payments. This is transparent and thorough for a read-only tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is fairly long but each sentence adds valuable information: the return value, bounds, default, scope, and usage guidance. It is well-structured and front-loaded with the core purpose. It is slightly wordy but not redundant, earning a 4.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description fully explains what is returned (maxPerPaymentUsdc plus min, max, default) and provides context (default $1,000, range $1–$50,000). It also covers the operational guidance and the read-only nature. For a read-only tool with a single optional parameter, this is complete; an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one parameter, auth_token, which is fully described in the schema ('Laso credential. Only if the MCP connection has no Authorization header.'). The description does not add any additional meaning beyond that. Since schema coverage is 100%, a baseline of 3 is appropriate; the description does not need to repeat parameter details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Read the per-payment spend limit.' It specifies the exact resource (managed wallet's per-payment limit) and the key returned field (maxPerPaymentUsdc). The name and description are unambiguous, and it is distinct from sibling tools, which are mostly about other banking/payment operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit guidance: check the limit before attempting a payment, compare fee-inclusive total, do not split payments that exceed the limit, and stop to tell the human. It also clarifies that the tool is read-only and only the owner can change the limit, which informs when it's appropriate to call. This is more than adequate for an agent to decide when to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_agent_walletAInspect
Get your managed agent wallet: whether one exists, its Solana address, 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 (Solana) to wallet_address.
| Name | Required | Description | Default |
|---|---|---|---|
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral disclosure burden. It clearly discloses the tool's read-style behavior, the returned fields, and the wallet's role as the funding source for paid tools. It does not explicitly state error/auth failure modes, but the key side-effect expectations are transparent enough for a simple getter.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler: the first sentence front-loads all returned values, the second provides a concrete trigger, and the third gives a follow-up funding action. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with zero required parameters and no output schema, the description covers purpose, return fields, and the next action (sending USDC to the returned address). It stops short of explicitly saying what to do when no wallet exists, such as using create_agent_wallet, but the 'whether one exists' output makes that branch easy for the agent to infer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is 100%, and the only parameter, auth_token, is already fully described in the input schema. The tool description adds no additional parameter-level semantics, so the baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a concrete verb + resource ('Get your managed agent wallet') and enumerates the exact outputs: existence, Solana address, USDC balance, and funding status. This clearly distinguishes it from siblings like create_agent_wallet, agent_wallet_transfer, and get_agent_spend_limit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit trigger and rationale: 'Paid tools draw from this wallet, so check it before your first paid call.' It does not name alternative tools or state when not to use it, but the call context is clear enough for an agent to route correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_auth_linkAInspect
Get a login link for the web dashboard
Returns a URL that a human can open in a browser to log in to the Laso Finance web dashboard as the authenticated user. Useful for humans who want to see what their AI agent has been doing (view cards, transactions, balances, etc.).
The URL carries a short single-use login code rather than a long token, so relay it to your human verbatim; it passes through tool-output credential filters intact. Do not fetch or open the URL yourself: redeeming the code consumes the human's login.
| Name | Required | Description | Default |
|---|---|---|---|
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does so well. It discloses that the URL embeds a short single-use login code rather than a long-lived token, that it passes through credential filters, and that fetching or opening the URL consumes the human's login. This gives the agent critical behavioral knowledge it could not infer from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is tightly organized with a front-loaded purpose, followed by the human use case and then the critical handling warnings. Every sentence adds value: no filler, no repetition of the schema, and no unnecessary context. It is exactly as long as it needs to be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with one optional parameter, no output schema, and no annotations, the description is complete. It explains what the tool returns, what the human should do with it, what the agent should not do, and why. An agent has everything needed to invoke this tool correctly and relay the result appropriately.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already describes the only parameter (auth_token) with 100% coverage: 'Laso credential. Only if the MCP connection has no Authorization header.' The description adds no further parameter detail, but the schema is already sufficient, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: 'Get a login link for the web dashboard.' It then clarifies exactly what the tool returns: a URL a human can open in a browser to log in as the authenticated user. This is clearly distinguished from sibling link tools like get_kyc_link by focusing on the dashboard and authenticated-user session.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: 'Useful for humans who want to see what their AI agent has been doing (view cards, transactions, balances, etc.).' It also gives operational guidance: relay the URL verbatim and do not fetch or open it. It does not explicitly name alternatives or state when not to use this tool, but the intended use case is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_banking_applicationAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full responsibility. It discloses the return content (ready, applicationStatus, outstanding questions) and adds context about the nature of those questions (non-identity, such as employment status and source of funds). However, it does not state explicitly that the operation is read-only or side-effect free, nor does it mention any auth prerequisites beyond the auth_token parameter, which is already in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is reasonably concise but has minor redundancy. The opening line 'Read the banking application' is essentially a title and repeats the tool name. The additional explanation about identity answers and non-identity questions is useful but could be condensed. The trailing 'Free.' is ambiguous and likely unnecessary. Overall, it is well-structured but not maximally tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read tool with a single optional parameter and no output schema, the description adequately covers what the tool returns and the nature of the outstanding questions. It does not mention error scenarios or behavior when no application exists, but such details are not critical for basic invocation. The description is sufficient for an agent to understand the tool's purpose and expected output.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is only one parameter, auth_token, and the schema description covers it fully (100% coverage). The description does not add any extra semantic detail about the parameter beyond what the schema already provides, so it meets the baseline but adds no value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Read' and the resource 'banking application', and specifies the exact returned fields (ready, applicationStatus, outstanding questions). This distinguishes it from sibling tools like get_banking_profile_status or get_kyc_status, which focus on other aspects of the banking flow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for checking application progress ('Reads what the application still needs') but does not explicitly mention when to use this tool over alternatives or list exclusions. There is no reference to sibling tools or conditions that would make another getter more appropriate, leaving the routing decision to the agent's inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_banking_profile_statusBInspect
Check the banking profile status
Reads the current state of the banking profile: whether it exists, and where its application stands.
Free.
| Name | Required | Description | Default |
|---|---|---|---|
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. 'Reads' conveys a read-only operation and 'Free' discloses no cost, which adds useful context. However, it does not describe behavior when a profile does not exist, error cases, or whether any side effect could occur.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loads the core meaning in the second sentence. The first sentence mostly restates the tool name, and the standalone 'Free.' is terse, but there is no unnecessary elaboration.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only status tool with one optional parameter and no output schema, the description conveys the essential outcome: whether the profile exists and where the application stands. It does not specify the exact return shape, but complexity is low enough that this is not a major gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter auth_token has 100% schema description coverage, so the schema already explains it sufficiently. The description adds no parameter-specific detail, earning the baseline score of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description uses a specific verb ('Reads') and names a concrete resource ('the current state of the banking profile'), clarifying what it reports: existence and application standing. It stops short of 5 because it does not explicitly distinguish itself from sibling tools like get_banking_application or get_banking_profile-related operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given for when to use this tool versus alternatives such as get_banking_application or get_signup_status. The word 'Free' hints at a cost property but does not explain usage context, prerequisites, 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_transactionBInspect
Read one transaction
Reads a single banking transaction — an on-ramp arriving or an off-ramp paying out — with its normalized status.
Free.
| Name | Required | Description | Default |
|---|---|---|---|
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. | |
| transactionId | Yes | The transaction to read. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It does disclose that the operation is read-only ('Reads'), that statuses are normalized, and that it is 'Free,' which adds meaningful context. However, it does not describe response contents beyond normalized status, error behavior, or auth requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded, with a quick lead line followed by a sentence that adds scope, status, and cost. There is slight redundancy between 'Read one transaction' and 'Reads a single banking transaction,' which prevents a perfect score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple, but with no output schema and no annotations, the description should carry more weight around return values and edge cases. It explains the core purpose and status normalization, but not what the full transaction response looks like or when this tool is preferred over related siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and transactionId is already documented as 'The transaction to read.' The description adds no further parameter-level detail beyond transaction type context, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Reads') and a precise resource ('a single banking transaction'), further scoped as on-ramp or off-ramp and normalized status. The word 'single' distinguishes it from list-style siblings like list_banking_transactions, so an agent can identify the intended operation 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to choose this tool over alternatives such as list_banking_transactions, get_payment_status, or get_withdrawal_status. The only contextual hint is the word 'single,' which implies one transaction, but no exclusions or alternative routing are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_cardAInspect
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 getCardData at the callableBaseUrl to check when 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).
| Name | Required | Description | Default |
|---|---|---|---|
| amount | Yes | USD amount to load on the card (min $5, max $1000) | |
| format | No | Response format. `json` (default) returns auth credentials and card info for agents. `html` returns a redirect page for browsers. | json |
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and excels. It discloses that this is a paid route (x402 USDC auto-payment from agent wallet), requires a funded wallet (references get_agent_wallet), returns a pending status, and that card details take 7-10 seconds to become available. It also notes the US-only restriction and non-transferability. No contradictions exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with bolded key sections (U.S. only, PAID ROUTE). It front-loads the core purpose and then logically expands to response handling, restrictions, and payment details. Each paragraph adds distinct value without redundancy, making it thorough yet organized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (payment, async status, geographic restrictions) and lack of output schema, the description covers all necessary aspects: payment flow, response format, polling instructions, alternatives, and prerequisites. It explains the return values (JSON with auth credentials and card info, pending status) and the callableBaseUrl for polling, making it 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.
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 minimal extra meaning beyond the schema: it explains that format=html is for browser-based flows and that auth_token is only needed if no Authorization header, but these are already in the schema descriptions. The description does not add new parameter semantics beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb+resource: 'Order a USA prepaid card.' It specifies the payment method (USDC), the amount range, and the output format options. It distinguishes itself from siblings like order_intl_card and get_card_data by explicitly naming the alternative for non-U.S. use and the polling mechanism for card readiness.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use and when-not-to-use guidance: 'For non-U.S. merchants or non-USD currencies, use `GET /order-intl-card` instead.' It also instructs to poll getCardData after ordering, and warns that the card is non-transferable and intended for the caller's own use. This gives clear context and exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_card_dataAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| card_id | No | The 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_type | No | When 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. |
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. | |
| approval_id | No | Reloadable 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations to fall back on, the description carries the full burden and fully delivers: it discloses timing windows (7-10 seconds, ~24 hours), polling guidance, the queue-id-to-card-id lifecycle for international orders, the three-way reloadable card result (card_details/details_approval/details_error), and the perpetual null billing_address with AVS implications. It also clarifies that no approval step is involved for Laso-issued reloadable cards, preventing a false assumption.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but it is organized by card type and front-loads the core behavior before special cases. A few sentences, such as the merchant checkout guidance, are arguably beyond what an API invocation requires, but most paragraphs earn their place given the complex multi-state behavior being documented.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given there is no output schema and no annotations, the description is notably complete: it names the key response fields, statuses, polling cadence, empty-list behavior with explanatory note, and error/approval states. An agent has the information needed to decide when to call the tool and how to handle the response without additional lookup.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Even though schema coverage is 100%, the description materially enriches the parameters: it explains card_id can be a queue id that resolves after fulfillment, card_type values map to distinct product behaviors, and approval_id is only valid in the specific 'different app' scenario. This goes well beyond the schema's baseline descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the operation ('Get card details') and resource ('card orders'), and specifies the single-vs-list behavior plus the three card types it covers. However, it does not explicitly differentiate itself from sibling tools like get_card or refresh_card_data, so it stops short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides very clear contextual guidance: use card_id for a single lookup, list by card_type with a default preserving old behavior, poll every 2-3 seconds for U.S. cards, and pass approval_id only for the described reloadable-card approval flow. It does not explicitly state when not to use this tool or name alternatives such as refresh_card_data, but the usage context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_card_deposit_addressAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even though no annotations are provided, the description fully discloses the key side effect: simply calling this creates the address at the issuer. It also explains user-funded semantics, the Base-only chain constraint with irreversible loss risk, typical confirmation timing, and that the stable address should only be considered authoritative via this endpoint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average but every sentence earns its place: purpose, funding flow, chain warning, polling behavior, and caching guidance. It is front-loaded with the main purpose and then provides essential operational detail in clearly separated paragraphs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema and no annotations, the description is remarkably complete. It explains what will be returned (address and balance), the important side effect of creation, chain constraints, expected timing, next step, and why the agent should call this endpoint rather than caching the value.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers the only parameter, auth_token, with a clear description and 100% coverage, so the baseline applies. The tool description does not add much about the parameter itself, but none is needed because the schema already explains when auth_token is required.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 gets the holder's USDC deposit address at the card issuer and the current balance. It also clearly positions this as the way an agent funds a reloadable card with crypto, which distinguishes it from sibling tools like get_card or 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says when to use this: this is how an agent funds a reloadable card balance. It gives critical when-not guidance: USDC sent on another chain is unrecoverable, and agents should not transfer directly from a managed Solana wallet. It also advises polling until balance updates and then calling POST /create-reloadable-card, plus warns against caching the address.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_kyc_linkAInspect
Get a KYC verification link (optional)
KYC is optional. 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.
Returns a one-time identity-verification link (kyc_url) for the calling wallet. Open it (or hand it to the wallet owner) to complete verification. The typical flow is: call /get-kyc-status, and only if kyc_verified is false call this to get a link, complete it, then proceed to /send-payment.
| Name | Required | Description | Default |
|---|---|---|---|
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It explains the returned link is one-time, belongs to the calling wallet, and can be opened or handed to the wallet owner. It also describes the intended flow, which helps the agent understand side effects and prerequisites. It stops short of stating auth requirements or error behavior, but is still substantive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and uses bold to emphasize optionality. The flow explanation is useful and earns its place, though a small amount of repetition ('KYC is optional' / 'you can ignore the verification endpoints') could be trimmed. Overall it is well-organized and not bloated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one optional parameter and no output schema, the description explains what is returned (`kyc_url`), when to call it, and how it fits into the broader flow. It does not describe failure modes or what happens if KYC is already verified, but those are less critical given the explicit flow guidance.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is only one optional parameter (`auth_token`) and the schema already describes it as the Laso credential used when no Authorization header exists. The description adds no parameter-specific detail, but with 100% schema coverage, the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific action ('Get'), a specific resource ('KYC verification link'), and clearly distinguishes it from the related `get-kyc-status` sibling by explaining that it returns the link rather than the status. It also clarifies that KYC itself is optional, which prevents confusion about when this endpoint matters.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: only needed for certain features like `/send-payment`, and should be called only after `get-kyc-status` shows `kyc_verified: false`. It even says to ignore the verification endpoints when not using those features, which is strong directional guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_kyc_statusAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It clearly states this is a read-only cached lookup: 'reads the cached status,' 'does not start verification or return a verification link,' and 'kept up to date by the verification webhook.' This gives strong non-mutation clarity, though it does not discuss cache freshness limits or rate limiting.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than strictly necessary, but every section contributes: optionality, when to use, behavioral guarantees, and alternative endpoints. The key information is front-loaded with 'KYC is optional' and the purpose statement before deeper payout-specific details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity tool with zero required parameters and no output schema, the description covers the return concept ('kyc_verified'), the side-effect-free nature, the webhook-backed cache, and the alternative verification flow. It is not a 5 because it does not fully specify the exact response shape or possible status values beyond true/false.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the optional auth_token parameter is already fully documented in the schema. The description adds only the context 'calling wallet's' but no new parameter-specific semantics, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Get KYC verification status' and 'Returns the calling wallet's cached KYC verification status.' It also distinguishes itself from a sibling by explicitly noting it 'does not start verification or return a verification link,' which separates it from get_kyc_link.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance: 'Use this as a free pre-flight check before paying for /send-payment.' It also gives when-not-to-use context and alternatives: 'To start verification when not verified, call /get-kyc-link' and 'If you are not using those features, you can ignore the verification endpoints entirely.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_payment_statusAInspect
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), in-process (dispatched to the platform), complete, failed, or cancelled. queued and in-process are the two 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.
| Name | Required | Description | Default |
|---|---|---|---|
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. | |
| payment_id | No | Fetch one payout by its `id`. Takes precedence over `recipient_id`. | |
| recipient_id | No | List every payout to one saved recipient. This is the `recipient_id` returned by `GET /payment-recipients`, not the phone number or email. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the free nature, enumerates all possible state values and their meanings, notes that state is absent for older payouts, and clarifies that push-to-card transfers have no server-side state. It also flags that in-process over an hour warrants investigation. This is comprehensive behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
While the description is longer than average, every sentence earns its place: it covers call modes, state meanings, polling guidance, webhook alternative, and exclusions. It is well-structured and front-loads the core purpose, then provides necessary detail without fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has three distinct call patterns and a complex state model. The description fully explains when to use each pattern, what the state field means, and how to handle in-flight states. It also clarifies what is not covered (bank payouts, push-to-card), leaving no gaps for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides 100% coverage with descriptions for all three parameters. The description adds critical semantics: payment_id takes precedence over recipient_id, and recipient_id must be the ID returned by GET /payment-recipients, not phone/email. It also explains the 'neither' case, which is not in the schema. This adds substantial meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool checks Venmo and PayPal payout status, naming the specific action and resource. It differentiates from siblings by explicitly noting that bank payouts are not listed here and should be followed via listBankingTransactions, and it distinguishes from push-to-card transfers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives three explicit invocation patterns (with payment_id, with recipient_id, or with neither) and explains what each returns. It also advises when to poll versus register a webhook, and directs users to the appropriate alternative for bank payouts. This is thorough, actionable usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_signup_statusAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| claim_code | Yes | The claim_code from the same POST /signup response. | |
| claim_token | Yes | The claim_token from POST /signup. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description takes full burden. It discloses the ~60s hold, the 204 timeout, the terminal statuses with 'terminal': true in the body, the api_key delivered exactly once, and the fact that subsequent polls omit it. This is exceptionally transparent about behavior and edge cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is multi-paragraph and fairly long, but every section adds critical operational detail: retry semantics, terminal codes, api_key delivery, and the announceAgentConnection note. It is front-loaded with the main purpose and uses bold and bullet-like formatting for emphasis, making it scannable despite length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a long-polling tool with no output schema, the description covers all necessary context: return values (204, api_key, terminal statuses), retry loop behavior, and downstream implications (wallet provisioned, agent recorded). 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters are well-described in the schema (claim_token and claim_code from POST /signup). The description only restates 'the same POST /signup response' without adding new meaning, so it stays at the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Wait for your human to finish the signup' and then explains it long-polls until the account is created. It specifies the resource (signup status), the action (long-poll), and the outcome (returns api_key). This clearly distinguishes it from sibling tools like start_signup or get_auth_link.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit retry guidance: 'Retry on 204 and nothing else' and explains that 401 and 410 are terminal. It also notes that announceAgentConnection is not needed on this path, implying when it would be. It does not name specific sibling alternatives, but the context is clear enough for an agent to decide when to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_versionAInspect
Get the current docs version
Returns the current 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".
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and handles it well: it states the call is free, requires no auth or payment header, returns a cacheable content-hash version, and explains the relationship to response headers and the API catalog. No side effects or hidden requirements are left ambiguous.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose in the first sentence and is organized into logical paragraphs: return value/auth, cache-freshness guidance, and catalog integration. It is slightly verbose for a zero-parameter endpoint, especially the RFC 9727 and Link-header details, but each paragraph contributes meaningful context for an agent deciding when and why to call it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool with no output schema, the description covers everything an agent needs: what is returned, the specific files involved, cost/auth implications, the stale-cache detection workflow, and an alternative way to obtain the same version from response headers. Nothing required 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.
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 useful meaning by explaining that the version is a content-hash over a fixed set of documentation files rather than a user-facing release number, which clarifies what the returned value represents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: 'Get the current docs version' and clarifies it is the content-hash version of the Laso Finance agent docs, listing the exact files covered. This clearly separates it from the many get_* sibling tools by identifying a distinct, concrete deliverable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a concrete use case: agents aggressively cache docs, so call this to detect a stale cache when the last-seen docs_version differs. It also mentions that every API response carries the value in the X-Laso-Docs-Version header, providing a context-aware alternative source, though it does not explicitly state when-not-to-call the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_webhookAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and does well: it states that the signing secret is never returned, that it is shown only once at registration, and that registrations auto-disable after 50 consecutive failed deliveries. This goes beyond a generic 'get' description and surfaces critical operational behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, well-structured, and front-loaded with the main purpose. Every sentence adds meaningful information: what is returned, what is not returned, and the auto-disable behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with one optional parameter and no output schema. The description explains the core return concept, the important exception about the signing secret, and a key failure mode. It could be slightly more explicit about the full set of returned fields, but it is complete enough for safe invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents the only parameter, auth_token, at 100% coverage. The description adds nothing about parameters, but since the schema fully covers them, the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get') with a clear resource ('webhook registration & delivery health') and scopes it to the calling wallet. It also distinguishes itself from register/delete webhook siblings by clarifying what this endpoint 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool: to retrieve webhook registration and delivery health. It explicitly directs users away from expecting the signing secret here and points to POST /register-webhook for secret rotation/re-registration, which is solid alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_withdrawal_statusAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. | |
| withdrawal_id | No | Get a specific withdrawal by ID. If omitted, returns all withdrawals. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description is the sole source of behavioral disclosure. It communicates that this is a read-only operation and clarifies the single-vs-all behavior, which is helpful. However, it does not describe response shape, ordering, error behavior, or authorization details beyond 'authenticated user', leaving some behavioral ambiguity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the core purpose is in the first line, followed by two short sentences that fully explain the optional parameter behavior. Every sentence adds value, and there is no fluff or repetition beyond what is necessary for clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter read tool with no output schema, the description covers essential operational details: what resource is accessed, whose data is returned, and how the optional parameter changes the result. The main gap is the lack of information about the returned data structure, but given the tool's low complexity, the description is reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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. The description reinforces the withdrawal_id behavior ('If omitted, returns all withdrawals') but does not add meaning beyond what the schema property description already states. This meets the baseline but does not exceed it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool's purpose: getting withdrawal statuses. It distinguishes itself from sibling status tools (get_payment_status, get_kyc_status, get_signup_status) by naming the specific resource (withdrawals) and the authenticated-user scope. The optional ID behavior is also clearly stated, leaving no ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context on when to use the tool: when you need withdrawal statuses for the authenticated user. It explains the conditional behavior of providing or omitting withdrawal_id, which functions as usage guidance. It does not explicitly name alternatives or exclusion criteria, 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_address_bookAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and does substantial work: it says the call is free, scoped to the authenticated account, has no user parameter, and warns that names are labels to be confirmed against addresses. It stops short of explicitly stating read-only/no side effects or describing returned fields, but 'List' plus the warning makes the core behavior clear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first line immediately states the action, and the following sentences each add selection or safety value. It is longer than a minimal stub but not padded; the bold label warning is substantively important.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter read-only list with no output schema, the description provides the pricing, scope, and name-resolution purpose an agent needs. It doesn't spell out the exact response shape or read-only guarantee, but enough context is present to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter, auth_token, is already fully documented in the schema (100% coverage), so the baseline is met. The description adds meaning by explicitly telling agents there is no user parameter to pass, preventing a likely mis-invocation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with 'List saved recipients,' a specific verb and resource, and explains the address-book purpose concisely. The title and references to the human-managed dashboard distinguish it from banking/payment recipient tools, though it doesn't name any sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Describes an explicit use case: resolving a human's saved label like 'coffee vendor' to an address. Scope is clearly bounded to the authenticated account's own book, and the note that agentWalletTransfer takes an address rather than a name helps the agent choose/sequence the tool. It doesn't mention when to use sibling list tools for bank/payment recipients.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_banking_accountsAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It does this well: it discloses exactly what is returned (routing/account numbers), deliberately withholds the off-ramp deposit address with a reason ('internal payout plumbing'), and discloses cost ('Free'). The withholding note is valuable behavioral context that prevents an agent from expecting the off-ramp address here. It omits response format and auth expectations, but the safety-relevant behaviors are covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Extremely efficient. The header states the purpose, one sentence clarifies the return content, one discloses the deliberate omission, and 'Free.' conveys cost. Every sentence earns its place, with the purpose front-loaded and no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with one optional parameter, 100% schema coverage, and no output schema, the description covers the essentials: what the tool does, what data it returns, what it deliberately excludes, and cost. The only gap is the absence of return format details, but since no output schema exists, the content description partially compensates. Nothing an agent needs to decide whether to call it is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% — the single auth_token parameter is fully documented in the schema ('Laso credential. Only if the MCP connection has no Authorization header.'). The description adds nothing about parameters, which is fine since the schema already covers it. Per the baseline, a 3 is appropriate 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.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('List') and resource ('banking accounts'), then clarifies the resource as 'banking rails and their details' — routing and account numbers for on-ramp payments. This detail distinguishes it from siblings like list_banking_transactions (transactions, not rails) and create_banking_account (creation, not listing), though it doesn't name those siblings explicitly. The on-ramp vs off-ramp distinction adds useful specificity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool — when you need the routing/account numbers to give whoever is paying in — which is clear context. However, it names no alternatives and gives no exclusions (e.g., it doesn't say to use list_banking_transactions when you need transaction history, or get_banking_profile_status for KYC status). Usage is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_banking_recipientsAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the disclosure burden. It goes beyond the basic purpose by stating that account numbers are masked to the last four digits and that the endpoint is the source of destination_id values, both genuinely useful behaviors. It omits minor details like pagination or response shape, but for a simple list operation the disclosures are sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded, but it contains redundancy: 'List recipients and destinations' restates the next sentence, and the final 'Free.' is a near-repeat of the earlier cost remark. The phrase 'free paywalled route' is also confusing. It earns a mid score because the core content is still compact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only listing tool with one optional documented parameter and no output schema, the description covers the key facts an agent needs: what is returned, the masking behavior, the destination_id use, and cost implications. The confusing route phrasing and lack of explicit sibling comparison are gaps, but they do not make the tool uncallable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter, auth_token, is fully documented in the input schema with 100% coverage, so the description does not need to add parameter-level detail. There is no extra semantic context in the description, matching the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and resource ('Lists payout recipients and their destinations') and adds a concrete behavioral detail (masked account numbers). It does not explicitly distinguish this tool from the similarly named sibling list_bank_recipients, so it falls 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The line 'This is where destination_id values come from' implies a clear use case, but there is no explicit guidance about when to choose this tool over siblings such as list_bank_recipients or list_payment_recipients, nor any exclusions. The route/cost remark is tangential rather than decision guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_banking_transactionsAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the behavioral burden. It discloses that results are normalized and limited to on-ramp/off-ramp banking flows, but it omits pagination, ordering, exact response shape, or any operational constraints. The 'Free.' line adds minor context but not 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loads the action ('List transactions') before explaining scope. The standalone 'Free.' fragment is not clearly useful for selection or invocation, which keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity read-only list tool with one optional parameter and no output schema, the description explains what flows are included and that statuses/amounts are normalized. It could mention pagination or response format, but those are not essential for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter, auth_token, has 100% schema description coverage ('Laso credential. Only if the MCP connection has no Authorization header'). The tool description adds no extra parameter guidance, but with full schema coverage the baseline applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource — banking transactions for the account — and clarifies scope with on-ramp/off-ramp money movement and normalized statuses/amounts. This distinguishes it from sibling tools like list_card_transactions and list_banking_accounts without requiring schema inspection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context (account-level banking transactions) but does not explicitly state when to prefer it over sibling tools such as list_card_transactions or get_banking_transaction. No alternatives or exclusions are named, so routing must be inferred from the resource name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_bank_recipientsAInspect
List bank payout recipients (free)
Lists the recipients registered on your banking profile and the destinations attached to each, so you can find the destination_id that GET /send-bank-payment pays out to. Free — only the payout itself is a paid action.
Bank account numbers are returned masked to their last four digits; routing numbers are returned in full. Create recipients and destinations with the createBankingRecipient and addBankingDestination callables, rename a destination's nickname (the only editable field) with updateBankingDestination, and remove a recipient with deleteBankingRecipient (see the bank accounts guide).
| Name | Required | Description | Default |
|---|---|---|---|
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral disclosure burden. It explains the read-only nature, that listing is free while payouts are paid, and reveals sensitive data handling: account numbers masked to last four digits, routing numbers returned in full. It omits pagination or error behavior, but for this simple list operation the disclosure is solid.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core sentence, and each subsequent paragraph earns its place: workflow purpose, pricing, output masking, and related operations. There is no fluff or redundant restating.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description conveys what the response contains: recipients, attached destinations, masked account numbers, and full routing numbers. It also links to relevant sibling operations and a guide. Exact response shape is not specified, but enough context is present for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single optional parameter auth_token is already fully documented in the input schema, so schema description coverage is 100%. The tool description adds no additional parameter semantics, which matches the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb and resource: it lists bank payout recipients and the destinations attached to each. However, it does not explicitly differentiate itself from the similarly named sibling list_banking_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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives concrete usage context: use this tool to find the destination_id that send-bank-payment pays out to. It also frames related create/update/delete tools as complementary steps. It does not explicitly state when not to use it, but the workflow guidance is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_card_transactionsAInspect
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.
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, the list is empty and a note explains how the account holder sets one up at https://laso.finance/agent/dashboard/verified/card.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of transactions to return. Defaults to the issuer's own page size (20). | |
| status | No | Filter by status, e.g. `pending`, `settled`, `declined`, `reversed`, `refunded`. | |
| card_id | No | Return only this card's transactions. Omit for every reloadable card on the account. | |
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations supplied, the description carries the burden and covers ordering (newest first), output fields, the empty-list behavior when no issuer account is linked, and the note explaining setup. It does not mention authentication requirements beyond 'authenticated user' or error/rate-limit behavior, but the read-only nature is clear from 'List'/'Returns'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is five sentences, all relevant, and front-loaded with the tool's purpose before usage and edge-case detail. It is somewhat repetitive about 'reloadable' and the note about no issuer account could be considered extra, but each sentence adds useful context for selection or invocation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no annotations, the description is nearly complete: it names return fields, ordering, filtering, the card-scope behavior, the non-reloadable alternative, and the empty-wallet edge case with a setup link. It stops short of describing response pagination beyond the limit parameter or error cases, but an agent has enough to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 limit, status, card_id, and auth_token fully. The description mostly repeats that guidance ('Pass card_id... omit it', 'Filter with status', 'cap the page with limit') without adding new parameter-level meaning, 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.
Does the description clearly state what the tool does and how it differs from similar tools?
The description leads with a specific verb-resource pair ('List reloadable card transactions') and immediately states what is returned (amount, merchant, status, timestamps, newest first). It also disambiguates the scope from non-reloadable products and names /get-card-data as the sibling for those, so the agent can distinguish this 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit invocation guidance: pass card_id for one card, omit it for all reloadable cards, use status to filter, and limit to cap page size. It also states the exclusion ('reloadable cards only') and directs non-reloadable history to /get-card-data, making the when-to-use/when-not-to-use decision explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_payment_recipientsAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| platform | Yes | Payment platform whose saved recipients to list. | |
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. | |
| include_archived | No | Include archived entries. Defaults to false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and does so thoroughly. It discloses that the operation is free, that two distinct ids exist, that the saved-entry recipient_id must not be passed to send-payment, and that total_sent/last_sent_timestamp help disambiguate entries.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is front-loaded, compact, and every sentence earns its place: free call, use case, id warning, and disambiguation guidance. The formatting with paragraphs and inline code makes the trap easy to notice.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a list tool with no output schema, the description is complete: it names the output fields an agent needs (recipient_id, handle, total_sent, last_sent_timestamp), explains how they relate to send_payment endpoints, and warns about the common id-misuse failure. The required/enum parameters are already in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents all three parameters, so the baseline is 3. The description adds important meaning beyond the schema, especially that recipients are limited to those previously paid and that the entry's handle (not recipient_id) is what send-payment consumes. It doesn't add new detail for auth_token or include_archived, but those were already covered.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('list'), a specific resource ('saved Venmo or PayPal recipients'), and a scoping condition ('this account has paid before'). It distinguishes this tool from banking-address or generic listing siblings by naming both platforms and the downstream purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context: use it before a payment to resolve a human-provided name into the handle that GET /send-payment expects. It doesn't explicitly enumerate alternatives or when not to use it, but the naming and 'so you can' framing make the intended trigger unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
order_gift_cardAInspect
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 (up to 4.8%); 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-9432 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).
| Name | Required | Description | Default |
|---|---|---|---|
| amount | Yes | Gift 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. | |
| country | No | ISO 3166-1 alpha-2 country code (defaults to "US") | US |
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. | |
| laso_server_id | Yes | The 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`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully carries the behavioral burden. It discloses the material financial behavior: amount is not USD, conversion and fee calculation, the 5–9000 USD minimum/maximum applied to converted value, automatic payment from the agent wallet, and the return shape. This is unusually transparent for a paid action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear bold labels and front-loaded operational steps. Every section earns its place: workflow, pricing, limits, return behavior, and payment route. Despite its length, it avoids fluff and is easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, the absence of an output schema, and no annotations, the description is remarkably complete. It covers prerequisites, pricing, currency semantics, constraints, return content, and the funding requirement. There is no output schema, but the description compensates by naming the expected redemption details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaningful behavior beyond the schema by explaining the conversion and fee mechanics with a concrete example (100 SAR ≈ $28 USDC) and reinforcing that the USD limits apply post-conversion. This adds real value to the agent's understanding of both amount and laso_server_id.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Order a gift card') and clearly differentiates it from related sibling tools like order_intl_card by focusing on gift cards, catalog search, and x402 payment. It also specifies the exact workflow and what the call returns, leaving no ambiguity about the tool's purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides strong usage context: first browse GET /search-gift-cards, then call with amount and product ID, and ensure the managed agent wallet exists and is funded. It does not explicitly name or exclude alternative payment/order tools, but the catalog-first workflow and wallet prerequisite give clear actionable 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.
order_intl_cardAInspect
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. Minimum $100, maximum $1,000 on-card amount. 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 (103.80-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).
| Name | Required | Description | Default |
|---|---|---|---|
| amount | Yes | On-card USD amount (min $100, max $1,000). Must be a whole dollar amount: the issuer only issues whole-dollar cards. The x402 payment is this amount plus a 3.8% fee. | |
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full disclosure burden, and it does so thoroughly. It discloses that the order is queued and fulfilled by an admin, that payment includes a 3.8% fee, that placing the order accepts legal terms, and that cancellation is possible before fulfillment. This is far more transparent than a generic 'order card' statement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but organized into clear paragraphs covering fulfillment, fees, legal consent, cancellation, and payment. It loses one point because the opening sentence 'Order an international prepaid card' is redundant and less precise than the following sentence, which repeats and refines the same idea.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers prerequisites, amount limits, fee structure, legal acceptance, cancellation, and the downstream data retrieval path, which is excellent for an asynchronous order tool. It does not specify the response shape or how an agent should poll for fulfillment, but it does point to get-card-data for accessing the final card details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already describes amount constraints and auth_token, so the baseline is 3, and the description adds real value by explaining the paid route, the automatic wallet payment, and the need to fund the wallet first. The auth_token parameter gains no new context, but the schema already covers it adequately.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource type ('international non-reloadable prepaid card'), a concrete verb ('order'), and the currency. It distinguishes itself from siblings by explicitly saying 'non-reloadable' and by describing an admin-queued fulfillment flow that ends with data retrieval via 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when this tool is appropriate: ordering a non-reloadable international USD card with specific amount constraints and a wallet-funding prerequisite. It explicitly routes to cancel_intl_order for cancellations and get_agent_wallet for wallet checks, but it does not explicitly explain when to prefer create_reloadable_card or order_gift_card instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pay_x402_endpointAInspect
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. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Full https URL of the x402 endpoint to call and pay. | |
| body | No | JSON request body (for POST/PUT). | |
| method | No | HTTP method (default GET). | |
| params | No | Query parameters to append to the URL. | |
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. | |
| expected_asset | No | Refuse to settle in any other asset (e.g. a USDC mint/contract address). | |
| expected_pay_to | No | Refuse to settle to any other receiving address. | |
| max_amount_usdc | No | Refuse to settle if the endpoint asks for more USDC than this. | |
| expected_network | No | Refuse to settle on any other network (CAIP-2 id). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the settlement action, USDC asset, returned txHash, and the balance-update delay. It does not cover failure/error behavior, but the core financial side effect is clearly stated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four focused sentences with no filler. The core action is front-loaded, followed by the balance-lag warning, guardrail guidance, and the routing note about Laso's own routes. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given nine parameters, no output schema, and no annotations, the description is reasonably complete: it explains the return value (response body + txHash), the settlement behavior, and guardrails. It could add error/failure behavior, but nothing critical is missing for selecting and invoking the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters. The description adds useful context by referring to guardrail arguments, but it does not substantially expand on individual parameter meaning beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: paying external x402-paywalled endpoints from the managed agent wallet, settling in USDC, and returning the response body and txHash. It also differentiates from Laso's own paid routes, making the tool's scope clear against the large sibling list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly tells the agent to use guardrail arguments to pin agreed payment terms and to prefer dedicated tools for Laso's own paid routes. This is a clear when-to-use and when-not-to-use instruction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
push_to_cardAInspect
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 cardsGBP— 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).
| Name | Required | Description | Default |
|---|---|---|---|
| amount | Yes | Face 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). | |
| currency | No | Target currency for the debit card transfer. Defaults to `USD`. | USD |
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses that the transfer is not automatic, requires opening a redemption_url and manually entering card details, includes a 4.8% fee with minimum, and requires a funded managed wallet for the paid route. This is substantial behavioral disclosure, though it doesn't mention error handling or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is detailed and well-structured with headings for currencies and fees, and it front-loads the primary action. It is somewhat long but each section adds necessary context for a complex operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the process, fee, currencies, manual step, and wallet requirement. However, there is an inconsistency between the stated paid route range (11.50-10000 USD) and the schema's max of 9541.98, and the minimum of 10 vs 11.50. This could confuse an agent. Also, it does not describe the redemption_url format or error scenarios.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides detailed descriptions for all three parameters (100% coverage). The description repeats the face value and fee calculation but does not add new parameter-specific meaning beyond what the schema states. It does clarify the auth_token condition, but that is also in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool sends money to a debit card in USD, EUR, or GBP, and explains the mechanism. It distinguishes itself from sibling payment tools by focusing on push-to-card transfers, though it doesn't name a specific alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this is for sending to debit cards, but it does not explicitly contrast with alternatives like send_bank_payment or send_payment. It does not provide 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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| card_id | Yes | The card ID to refresh data for | |
| card_type | No | The type of card. Defaults to `Non-Reloadable U.S.` if omitted. | |
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It does this well: it explains the asynchronous processing via a retrieval queue, the difference between U.S. and international card handling, the manual admin update for international cards, rate limits, and the 409 conflict behavior. This is rich behavioral context beyond what the schema provides. It doesn't mention side effects like whether the refresh mutates stored data, but the async and rate-limit details are substantial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: a one-line summary followed by two paragraphs of behavioral detail. It's front-loaded with the core action. The length is justified by the genuinely important behavioral differences (U.S. vs international, rate limits, 409). Every sentence adds value. It could be slightly tighter, but the structure is clear and scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema and no annotations, the description covers the key operational details: what happens for each card type, rate limits, conflict behavior, and the async nature. It doesn't explain what the response looks like (no output schema), but the description's behavioral detail compensates. The main gap is not stating what the return value indicates (e.g., success vs. pending), but overall it's quite complete for an async trigger tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters. The description adds context about card_type behavior (U.S. vs international) which maps to the card_type parameter, and the rate-limit/409 behavior relates to card_id. However, the description doesn't add much detail about the auth_token parameter beyond what the schema says. Baseline 3 is appropriate since the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('refresh'), a resource ('card data'), and the core action ('Requests an updated balance for a card'). It clearly distinguishes this from sibling tools like get_card_data (read current data) and fund_card_balance (add funds). The first sentence is a clear, specific statement of what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context on when to use the tool: when an updated balance is needed. It also gives important usage constraints: rate limits (one request per 5 minutes, max 12 per 24 hours) and the 409 behavior when a refresh is already pending. However, it doesn't explicitly name alternative tools or state when NOT to use this tool (e.g., 'use get_card_data if you just need current data'). The usage context is strong but lacks explicit exclusions.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| grant_type | Yes | Must be "refresh_token" | |
| refresh_token | Yes | The refresh token received from a previous /auth or /get-card call |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must disclose behavioral traits itself. It does state that this is a 'free endpoint — no x402 payment required,' which is a useful behavioral note. However, it does not mention side effects (e.g., whether the old refresh token is invalidated), rate limits, or error conditions. The disclosure is minimal but not misleading.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long, front-loaded with the purpose, and includes a key differentiator (free endpoint) without unnecessary fluff. Every sentence earns its place, making it efficient and easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter tool with fully documented schema and no output schema, the description covers the purpose, the OAuth2 pattern, and the free endpoint aspect. It does not describe the response format explicitly, but the phrase 'new ID token' implies the output. Minor gaps like potential errors or token rotation behavior are not critical for a straightforward refresh operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents both parameters thoroughly (grant_type enum and refresh_token description). The description adds no additional parameter-level detail; it only mentions the tool's free status and OAuth2 pattern. Since schema coverage is 100%, the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Refresh an ID token' and 'Exchange a refresh token for a new ID token.' This is a specific verb and resource, distinguishing it from sibling tools like get_auth_link or agent_auth, which handle initial authentication flows. The purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by referencing the standard OAuth2 grant_type=refresh_token pattern and the schema notes the refresh token comes from a previous /auth or /get-card call. However, it does not explicitly state when to use this over alternatives, nor does it exclude use cases like initial authentication. The guidance is implied rather than explicit.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Public HTTPS URL to receive signed notification POSTs. Max 512 characters. Private/internal hosts are rejected. | |
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so thoroughly. It discloses signed delivery headers, the one-time secret, secret rotation on re-registration, auto-disable after 50 failed deliveries, a first test delivery, and 10-second timeout with no retries.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every paragraph adds essential operational detail: delivery format, secret lifecycle, failure behavior, timeout rules, and URL requirements. The core purpose is front-loaded in the first sentence, and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given there is no output schema and no annotations, the description covers the critical return value (the one-time secret), delivery payload shape, failure policy, replacement semantics, and URL constraints. An agent has enough information to invoke and understand consequences correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 url and auth_token. The description reinforces that the URL must be public HTTPS and that private/internal hosts are rejected, but it adds no new parameter-specific semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific action+resource ('Register a notification webhook') and explains that it creates or replaces an HTTPS endpoint for signed notifications. The verb 'register' plus the described behavior clearly distinguishes it from siblings like get_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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly frames this as the push-based alternative to polling: 'instead of re-fetching status endpoints, point this at any URL you can receive HTTP on.' It does not explicitly list when not to use it or name specific sibling tools for inspecting/removing webhooks, 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.
save_address_book_entryAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The name to save it under. Sanitized and capped server-side (max 60 characters). | |
| address | Yes | The recipient's Solana address. | |
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden, and it does so thoroughly. It discloses that saving an already-saved address renames the entry, making the operation safe to retry. It warns that a name is a label, not an instruction, and advises confirming the resolved address before sending. These are meaningful behavioral insights beyond what schemas could convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average but every section adds value: the rename semantics, the safety guidance, and the retry behavior. It is front-loaded with a one-line purpose, then expands into necessary caveats. A few sentences could be tightened, but the structure is logical and not padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given three parameters, no output schema, and no annotations, the description covers the operation's purpose, usage, key behavioral nuances, and parameter meaning. It does not explicitly mention what the tool returns (e.g., success message or entry), but the emphasis on rename behavior and retry safety largely compensates. This is sufficient for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 valuable semantic context: the address is the entry's key (so re-saving renames), the name is capped at 60 characters server-side, and no user parameter exists. It clarifies the auth_token's conditional use better than a plain schema note, tying it to header absence.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: 'Save or rename a recipient.' It clearly identifies the address book as the target and distinguishes it from sibling tools like delete_address_book_entry and list_address_book by emphasizing the save/rename operation on a single entry.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the intended use case: resolving human-friendly names to addresses for later actions. It explicitly contrasts with agentWalletTransfer, stating that transfer takes an address and deliberately does not accept a name. While it doesn't explicitly say 'use this when you need to persist a name', the context and alternative are clear. It also notes that it operates on the authenticated account's own book with no user parameter.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_docsAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search terms, e.g. fund managed wallet, or: gift card fees. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It discloses that the tool searches a specific doc set and returns the most relevant sections, which is sufficient to understand it as a read-only lookup. It does not detail pagination or result formatting, but for a docs search tool this is a minor gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no wasted words. The core function and scope are front-loaded, followed by concrete usage guidance and example topics. Every sentence earns its place and the description is immediately scannable for an agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter search tool with no output schema, the description covers what is needed: what is searched, what is returned, and when to use it. It also gives practical examples of the kinds of questions it answers, making it complete in the context of the large sibling tool set.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has one parameter with 100% description coverage, so the baseline is 3. The description itself adds no additional parameter-level nuance beyond naming the search behavior and context; the schema already defines 'query' with an example. This meets the minimum viable bar but does not elevate it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Search'), a clear resource ('Laso Finance agent docs (SKILL.md and the full API reference)'), and the expected output ('most relevant sections'). It clearly distinguishes itself from the many sibling tools by being the documentation search fallback rather than a banking, card, or payment operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells the agent when to use this tool: 'Use this for anything the tool descriptions don't answer' and lists concrete example topics (auth flows, funding, fees, webhooks, error handling). This provides a clear routing rule and implicitly excludes using it for questions already answered by other tool descriptions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_gift_cardsAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Search query to filter gift cards by name (e.g. "Amazon", "Uber") | |
| country | No | ISO 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. | |
| category | No | Category to filter by (e.g. "ecommerce", "travel", "gaming"). See the `facets.categories` array in any response for the full list of valid values. | |
| currency | No | Currency code to filter by (e.g. "USD", "EUR") | |
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description carries the full burden. It discloses that it's a free endpoint (no x402 payment), returns facets computed from the full catalog, and provides the ordering path. It does not mention pagination or rate limits, but for a search tool this is acceptable and adds value beyond a simple 'search' statement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded with the purpose. Each sentence adds value: purpose, return contents, ordering path, facets discovery, and free status. No fluff or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description provides enough context for an agent to use the tool correctly: what it returns, how to order using the results, how to discover filters, and that it's free. With no output schema, it still describes the output and the workflow, making it complete for this search tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with each parameter having a description. The description adds some context about how facets relate to parameters, but does not substantially expand on parameter semantics beyond what the schema already provides. Baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches and browses the gift card catalog, returning a list of products with pricing and catalog info. It distinguishes from siblings like search_merchants and order_gift_card by focusing specifically on gift cards, making its purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context: it explains the workflow of using the returned `laso_server_id` to order via `GET /order-gift-card`, and notes that a single unfiltered request can discover all valid filter values via facets. However, it does not explicitly state when not to use this tool or mention alternatives, so it lacks exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_merchantsAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| q | Yes | Search query — the merchant name to search for (e.g. "amazon", "netflix") | |
| card_type | No | Which 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. |
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden — and it does so thoroughly. It discloses the database's limited coverage (only merchants previously attempted by Laso users), the treatment of banking/money-transfer merchants as always not_accepted with a restriction_note, and the TLD filtering behavior between card types.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded: core purpose first, then parameter guidance, then critical caveats. Every sentence earns its place, and the markdown formatting makes the important caveat easy to notice.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a search tool with no output schema and no annotations, the description is unusually complete. It explains what the tool returns, how to interpret each possible status, the database limitation, and the special banking-merchant rule — so an agent can call it and act on the results without guessing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaningful value beyond the schema by explaining the card_type default, the difference between the two card_type values, and the country-TLD filtering consequence. The q parameter is adequately described in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource — 'Search Laso's merchant database' — and states the core output: whether a card was accepted, not accepted, or unknown at each merchant. This clearly distinguishes it from other search-family tools like search_docs and search_gift_cards.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly tells the agent which card_type to use, explains the USA vs international behavior, and gives strong interpretation guidance: unlisted or unknown merchants do not mean failure, while accepted and not_accepted have definitive meanings. This equips the agent to decide when and how to use the tool correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_bank_paymentAInspect
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-10025 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).
| Name | Required | Description | Default |
|---|---|---|---|
| amount | Yes | USD 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). | |
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. | |
| destination_id | Yes | Bank destination to pay out to. Returned by `addBankingDestination`, and listed by `GET /bank-recipients`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It discloses fee structure, settlement timing, the credit-then-debit flow, failure behavior with recovery via withdraw, and wallet funding requirements. This is far beyond a typical description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with bold section headers and front-loaded core behavior. It is long and repeats the fee twice, but every section adds operational value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a high-complexity banking payout with no annotations and no output schema, it covers prerequisites, failure recovery, settlement, and follow-up. An agent has enough to invoke correctly and handle outcomes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema already covers all 3 params, but the description adds provenance for destination_id (createBankingProfile → createBankingRecipient → addBankingDestination) and fee/price context for amount. The paid-route range '11.50-10025' is slightly inconsistent with the schema max of 50,000, which keeps this from a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource ('Send dollars to a bank account') and clarifies the mechanism ('Pay USDC ... by ACH'). The banking-specific language and references to banking callables distinguish it from generic siblings like send_payment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit prerequisites (bank destination, identity verification, funded wallet) and a setup sequence, plus follow-up calls. It doesn't explicitly contrast with send_payment or other transfer tools, but the conditions for using this tool are unambiguous.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| rating | No | A 1-5 satisfaction rating. Optional; ignored when not an integer in range. | |
| endpoint | No | Which API endpoint or route the feedback is about. Optional. Capped at 120 characters. | |
| feedback | Yes | The main free-text feedback. Required. Sanitized and capped server-side (max 2000 characters). | |
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. | |
| how_it_went | No | How it went. Optional. Capped at 500 characters. | |
| what_they_want | No | What you were trying to do. Optional. Capped at 500 characters. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses that feedback 'lands on their dashboard', requires a completed real action, and has a rate limit of 5 per 24 hours. These are genuine behavioral traits. It does not mention auth details or the response format, but for a feedback submission tool these are less critical and partially covered by the schema (auth_token param).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, with the core action stated first, the value proposition second, and constraints third. Every sentence earns its place, and there is zero fluff. It is efficiently front-loaded and easy to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a feedback tool with 100% schema coverage and no output schema, the description is fairly complete. It covers the purpose, the target audience, the prerequisite, and the rate limit. It does not explicitly state the response or that it is a write operation, but that is implied and not a critical gap for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all six parameters with descriptions. The description adds no parameter-specific details beyond what the schema provides; it only frames the overall purpose. This meets the baseline of 3, as the description need not compensate for a coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Send feedback' and the resource 'the API', then elaborates with a concrete purpose: telling the humans running Laso what worked, what was confusing, and feature requests. It is immediately distinguishable from all sibling tools, none of which serve a feedback purpose, so an agent can select it without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 it ('best channel for API friction and feature requests') and even imposes a prerequisite (at least one completed real action) and a rate limit (at most 5 per 24 hours). It does not explicitly name alternatives or state when not to use it, but given the unique purpose, that omission is minor.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_paymentAInspect
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.
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. Both Venmo and PayPal require the recipient's first name and last name. For Venmo, recipient_id is the recipient's 10-digit U.S. phone number and recipient_email is required. For PayPal, recipient_id is the recipient's PayPal email, which also serves as recipient_email (so recipient_email is optional).
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).
| Name | Required | Description | Default |
|---|---|---|---|
| amount | Yes | USD 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). | |
| platform | Yes | Payment platform. | |
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. | |
| recipient_id | Yes | Recipient identifier. For Venmo: 10-digit U.S. phone number. For PayPal: email address. | |
| recipient_email | No | Recipient's email address. Required for Venmo. Optional for PayPal, where it defaults to recipient_id (the PayPal email). | |
| recipient_last_name | Yes | Recipient's last name (English letters A-Z and a-z only). | |
| recipient_first_name | Yes | Recipient's first name (English letters A-Z and a-z only). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full transparency burden and meets it: it discloses the 4.9% fee with minimum, the on-chain credit/deposit-webhook mechanism, the debit from the callable, and the KYC verification gate with its kyc_required/kyc_url response. It also warns about the wallet-funding prerequisite for the paid route and offers the withdraw alternative. This goes well beyond a generic 'sends money' statement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but organized with bold headers and each section earns its place. The main redundancy is the fee being stated twice — once in the intro and again under 'Fee' — which could be consolidated. Overall, the density is justified by the amount of operational detail needed to make a cross-platform payout correctly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the KYC failure path, platform-specific recipient requirements, fee computation, and wallet funding prerequisites. Without an output schema, it leaves the successful response shape unspecified and doesn't mention polling via get_payment_status, but the information provided is sufficient to invoke the tool correctly and handle its main failure mode.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Even with 100% schema coverage, the description adds critical meaning: it explains the per-platform interpretation of recipient_id (phone number vs. email), the conditional requirement of recipient_email, the English-letters-only constraint on names, and the fee formula tied to amount. This transforms schema fields into actionable rules an agent would otherwise have to guess at.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening line, 'Send a payment via Venmo or PayPal,' uses a specific verb and resource, and the platform names immediately differentiate it from send_bank_payment. The description's scope is unambiguous: pay USDC to dispatch a payout on either platform. It also distinguishes itself from siblings like pay_x402_endpoint by explaining the payout flow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly states the payment mechanism, the KYC requirement, and the fallback withdrawal path, telling the agent what to do when kyc_required is true. It names the paid-route dependency on get_agent_wallet for funding. It doesn't explicitly say 'use send_bank_payment for bank transfers,' but the platform-specific framing makes the intended use obvious.
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 by Privy in the human's own browser, 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.
| Name | Required | Description | Default |
|---|---|---|---|
| label | No | Optional label recorded on the minted API key so your human can tell keys apart. | |
| agent_name | No | Your name, shown to your human on the claim screen and recorded as the connected agent. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations to lean on, the description fully carries behavioral disclosure. It states that no account is created, that Privy creates it in the human's browser, that ownership belongs to the human rather than the agent, that the endpoint is rate limited per IP, and that the status poll holds the connection open until completion. This is exceptionally transparent for an unannotated tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and organized into clear paragraphs covering behavior, workflow, and rate limits. It is slightly redundant in the first two sentences both describing the signup start, but every sentence otherwise earns its place and the structure aids comprehension.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no annotations, this description is unusually complete: it covers purpose, auth requirements, side effects, return value, the exact handoff action, the follow-up polling tool, and the rate limit. An agent has everything needed to invoke it correctly and understand the unexpected non-creation behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 does not add new parameter-level detail about label or agent_name beyond what the schema already provides, though the mention of the returned lasoak_ API key subtly reinforces label's purpose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening line 'Start a signup for a human with no Laso account' states a specific verb, resource, and target user, and the description immediately clarifies what the tool is not: 'This does **not** create the account.' It is clearly distinguishable from siblings like get_signup_status, which it explicitly references as the polling follow-up.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives concrete when-to-use context: a human with no Laso account, and explicitly says 'Requires no authentication, because the caller has no account.' It also lays out a precise workflow: hand over the claim_url verbatim, do not open it yourself, then poll GET /signup-status, with a cross-reference to message_for_human for uncertain wording.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
submit_banking_applicationBInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds a useful behavioral detail: if the partner rejects as incomplete, the reply indicates what is missing rather than failing opaquely. This goes beyond a generic 'submit' action. However, with no annotations provided, the description carries the full burden for disclosure, and it doesn't mention side effects, idempotency, auth requirements, or what happens on success. It covers one aspect of error handling but leaves other behaviors undisclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise: a one-line summary, a single behavioral sentence, and a trailing 'Free.' No fluff or repetition. The key information is front-loaded in the first sentence. It earns its keep with minimal length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool performs a mutation (submission) with no output schema, the description should clarify what the agent can expect on success (e.g., a confirmation, status change) and any prerequisites (e.g., application must be complete, prior steps). It also omits whether this is a one-time action or if it can be called multiple times. The 'Free.' note is ambiguous and doesn't clarify behavioral context. The description is adequate for the error case but incomplete for the overall operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema documents the single parameter auth_token with a clear description ('Laso credential. Only if the MCP connection has no Authorization header.'), so coverage is 100%. The tool description adds no additional meaning about how to use this parameter, so it meets the baseline without adding extra value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action: submitting the completed application for review. It distinguishes from siblings like update_banking_application_details and upload_banking_document by its focus on final submission. However, it doesn't explicitly name the resource (e.g., banking application) beyond the tool name, so it's clear but not fully explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no mention of when to use this tool versus alternatives like update_banking_application_details or get_banking_application. It implies submission after completion but doesn't state prerequisites, sequencing, or cases where another tool would be more appropriate. The description offers no exclusions or alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_banking_application_detailsAInspect
Answer application questions
Submits answers to the non-identity application questions read from getBankingApplication. Call as many times as needed; each call merges.
Free.
| Name | Required | Description | Default |
|---|---|---|---|
| details | Yes | The answers to submit, keyed by the field names `getBankingApplication` reported as outstanding. | |
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry behavioral disclosure. It states the tool 'submits' (mutation) and that calls 'merge' – useful context. However, it does not disclose side effects such as whether questions become marked answered, how invalid answers are handled, or what response is returned. The 'Free.' note is ambiguous and adds no behavioral clarity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded with the purpose. However, the 'Free.' line is cryptic and appears to add no value, which prevents a perfect score. Otherwise, it is efficient and free of redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with only two parameters (one nested) and no output schema, the description is adequate. It explains what 'details' contains and references the source tool. It does not mention error handling or response format, but those are not essential for this simple submission tool given the schema's clarity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters have descriptive comments. The 'details' parameter description explicitly ties it to field names from getBankingApplication, adding meaning beyond the bare parameter name. The auth_token is also explained. This exceeds the baseline of 3 for full coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it submits answers to non-identity application questions sourced from getBankingApplication. This distinguishes it from siblings like submit_banking_application (which likely submits the whole application) and get_banking_application (which reads questions). The verb 'submits' and resource are explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides practical guidance: 'Call as many times as needed; each call merges.' This tells the agent it can be invoked multiple times and that calls combine rather than overwrite. It references the source tool for context, but does not explicitly contrast with alternatives like submit_banking_application, which would make it a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_banking_destinationAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| nickname | Yes | The new nickname. An empty string clears it. | |
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. | |
| destinationId | Yes | The destination to rename. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does substantial work: it discloses that the operation is a mutation limited to one field, that bank details are immutable at the partner, and that the operation is free of charge. The 'Free.' note adds a cost-related behavioral trait an agent would not otherwise know, though it stops short of describing the response shape or immediacy of the change.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: a one-line headline, a clarifying restatement, the key constraint, and a one-word cost disclosure. Every sentence earns its place and nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple 3-parameter tool with no output schema and no nested objects, the description covers purpose, scope, the only editable field, the alternative procedure, and cost, while the schema documents all parameters at 100%. The only minor gaps are not naming the sibling delete/create tools explicitly and not stating what the response contains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already fully documents nickname (including the empty-string-clears behavior), destinationId, and the conditional auth_token. The description's 'Sets or clears' reinforces the nickname semantics but adds only marginal meaning beyond the schema, which is the baseline-3 situation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource pair ('Rename a destination') and immediately clarifies the exact operation ('Sets or clears a destination's nickname'). It differentiates from siblings by stating that the nickname is the only editable field, which is a meaningful distinction from delete/create banking tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance (renaming/setting/clearing a nickname) and explicit when-not-to-use guidance ('anything else wrong means deleting the recipient and creating a new one'). This clearly routes the agent to the delete+create alternative instead of attempting edits this tool cannot perform.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_payment_recipientAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| archived | No | Must be a boolean. A wrong type returns a terminal 400 with code `invalid_archived`. | |
| platform | Yes | Payment platform the recipient is saved under. | |
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. | |
| display_name | No | Must be a string. A wrong type returns a terminal 400 with code `invalid_display_name`. | |
| recipient_id | Yes | The entry's `recipient_id` from `GET /payment-recipients` (an opaque id, not the phone number or email). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry behavioral disclosure. It discloses that archiving hides the entry and keeps history, and that it is reversible. However, it does not mention potential side effects of renaming (e.g., impact on history), does not describe what the response looks like (no output schema), and does not note any permission or rate-limit requirements beyond the auth_token parameter already in the schema. Some gaps remain.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded. The first line gives the purpose, and the next two sentences cover usage guidance and the key alternative. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple update tool with no output schema and no annotations, the description covers the essential usage and the archived behavior. However, it omits return value expectations, potential side effects of renaming, and any mention of authorization beyond what's in the schema. For a mutation tool, this is a moderate gap, but the schema carries some of the burden (e.g., invalid type errors).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already describes all parameters at 100% coverage, so the baseline is 3. The description adds value by stating the at-least-one constraint for display_name and archived, and by explaining the semantic effect of archived (hides from default list, keeps history). This goes beyond the schema's simple boolean description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool renames or archives a saved Venmo or PayPal recipient. It distinguishes from the sibling delete_payment_recipient by explicitly framing archiving as the reversible alternative, so an agent can tell them apart 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to prefer this over DELETE for retiring a recipient, and explains that archiving is reversible while deletion is not. It also names the exact operation types (rename, archive, or both) and the requirement to provide at least one of display_name or archived, giving clear selection criteria.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| country | Yes | The document's country, ISO 3166-1 alpha-2. | |
| fileType | Yes | The file's format. Send a .jpg as `jpeg`. | |
| filename | No | The file's name. | |
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. | |
| fileContent | Yes | The file, base64-encoded. A `data:` URL is also accepted. Decoded size must be 10MB or less. | |
| documentType | Yes | The kind of document. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It reveals two critical edge cases: jpg must be sent as jpeg, and decoded size is capped at 10MB despite the partner advertising 20MB. It also documents that data: URLs are accepted. These are valuable beyond the schema. However, it does not mention the response format or any side effects, which is acceptable given the lack of an output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: it opens with purpose, then a prerequisite, then bolded critical rejection reasons, then an explanation of fileContent. Each sentence serves a purpose and the formatting (bold, paragraphs) aids scanning. It is slightly longer than minimal but efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an upload tool with 6 parameters and no output schema, the description covers prerequisites, key constraints, and parameter quirks. It does not explain authentication, but that is present in the schema (auth_token) and not required for a basic call. The main omission is a note about the response or error handling, but that is minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 to fileType (jpg→jpeg) and fileContent (data: URL acceptance, size cap). It does not add detail for documentType or country beyond the schema, but the added insights for two parameters justify a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Upload a proof-of-address document'), and further clarifies it attaches to a banking application. The description clearly distinguishes this from sibling tools like submit_banking_application or list_banking_documents by focusing on the document-upload action and its purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the condition for use ('when the partner asks for one') and a prerequisite ('complete the application first'). It does not list exclusions or alternatives, but the context is clear enough for an agent to decide when this tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
withdrawAInspect
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. The withdrawal is created in a pending state and sent within a few minutes.
| Name | Required | Description | Default |
|---|---|---|---|
| amount | Yes | Amount to withdraw in USD | |
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. | |
| solana_address | Yes | Solana wallet address that receives the USDC. Must be a valid base58 Solana address. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral disclosure burden. It reveals useful traits: the transfer is USDC on Solana, the destination is never inferred, the withdrawal starts in a pending state, and it is sent within a few minutes. These details go beyond the input schema and give the agent a realistic model of the operation. It does not cover reversibility or fees, but the key execution behavior is transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description consists of two sentences with no filler. The core purpose is front-loaded ('Withdraw from account balance'), followed by the most important constraints. Every sentence adds value: network/asset, address requirement, and pending-state timing. It is appropriately sized for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the operational result (pending state, settlement within minutes) and the key requirements. However, since there is no output schema, it does not state what the tool returns (e.g., a withdrawal ID or confirmation), which the agent would likely need to follow up with get_withdrawal_status. It is adequate but leaves a moderate gap for a financial mutation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 beyond the schema by explaining that the solana_address is never inferred and thus required, and that the amount is in USD. This reinforces and enriches the parameter definitions, especially for the withdrawal address. The auth_token parameter is not discussed, but its schema description is complete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: 'Withdraw from account balance' and then clarifies the asset and network (USDC on Solana). It is distinct from sibling tools like withdraw_card_balance (card balance) and send_payment (sending funds) by making clear this is a withdrawal from the user's account balance to an external Solana address.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool: whenever the user needs to withdraw from their account balance to a Solana address. It states the destination is never inferred and must be supplied. However, it does not explicitly compare against alternatives such as agent_wallet_transfer or send_payment, nor does it say when not to use it. The context is clear but no exclusions or alternative routing are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
withdraw_card_balanceAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| amount | Yes | USD to withdraw from the card balance (min $2, max $10,000). | |
| auth_token | No | Laso credential. Only if the MCP connection has no Authorization header. | |
| destination_address | Yes | The 0x-prefixed Base wallet address that receives the USDC. Must be one you control; Base only. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, description carries full burden. It discloses manual processing (1-3 days), no status route, response contains withdrawal_id, event recorded in card_events, balance drops after paid, amount limits, pending withdrawals count against balance, and requirement for linked issuer account. Highly transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with bold headers (Base only, Not instant, Amount) and each sentence adds value. Though somewhat long, the detail is necessary for a complex financial operation; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Comprehensive for a withdrawal tool with no output schema: covers limits, network, timing, prerequisites, response contents, and balance impact. 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for amount and destination_address, but description adds extra meaning: pending withdrawals count against balance, second request only takes what remains, destination must be controlled Base wallet. These constraints go beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: withdraw from a reloadable card balance, moving unspent money as USDC on Base. Clearly distinguishes from fund_card_balance and other withdrawal tools by explaining it is the reverse and specifying the network.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly specifies when to use (Base only, destination must be a Base wallet you control) and exclusions (Solana wallet, card deposit address). Also gives prerequisites (linked issuer account, confirm with holder) and contrasts with fund_card_balance.
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.
6 tool updates
- Removed
agent_auth - Added
exchange_api_key - Removed
feedback - Changed
list_payment_recipients1 field changed- added
Input schema / properties / platform / descriptionAdded value: +"Payment platform whose saved recipients to list."
- Added
send_feedback - Changed
update_payment_recipient1 field changed- added
Input schema / properties / platform / descriptionAdded value: +"Payment platform the recipient is saved under."
64 tool updates
- Changed
add_banking_destination1 field changed- changed
Output schema / (root)Previous value: -{ - "type": "object" -}New value: +null
- Added
agent_auth - Changed
agent_wallet_transfer1 field changed- changed
Output schema / (root)Previous value: -{ - "type": "object" -}New value: +null
- Changed
announce_connection1 field changed- changed
Output schema / (root)Previous value: -{ - "type": "object" -}New value: +null
- Changed
cancel_intl_order1 field changed- changed
Output schema / (root)Previous value: -{ - "properties": { - "card_id": { - "type": [ - "string", - "null" - ] - }, - "message": { - "type": [ - "string", - "null" - ] - } - }, - "type": "object" -}New value: +null
- Changed
create_agent_api_key1 field changed- changed
Output schema / (root)Previous value: -{ - "type": "object" -}New value: +null
- Changed
create_agent_wallet1 field changed- changed
Output schema / (root)Previous value: -{ - "type": "object" -}New value: +null
- Changed
create_banking_account1 field changed- changed
Output schema / (root)Previous value: -{ - "type": "object" -}New value: +null
- Changed
create_banking_profile1 field changed- changed
Output schema / (root)Previous value: -{ - "type": "object" -}New value: +null
- Changed
create_banking_recipient1 field changed- changed
Output schema / (root)Previous value: -{ - "type": "object" -}New value: +null
- Changed
create_reloadable_card1 field changed- changed
Output schema / (root)Previous value: -{ - "properties": { - "card": { - "properties": { - "balance": { - "description": "Card balance in US dollars.", - "type": [ - "number", - "null" - ] - }, - "card_id": { - "type": [ - "string", - "null" - ] - }, - "card_type": { - "type": [ - "string", - "null" - ] - }, - "expiry": { - "type": [ - "string", - "null" - ] - }, - "last4": { - "type": [ - "string", - "null" - ] - }, - "reusable": { - "type": [ - "boolean", - "null" - ] - }, - "spend_limit": { - "type": [ - "number", - "null" - ] - }, - "status": { - "type": [ - "string", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] - } - }, - "type": "object" -}New value: +null
- Changed
delete_address_book_entry1 field changed- changed
Output schema / (root)Previous value: -{ - "properties": { - "address": { - "type": [ - "string", - "null" - ] - } - }, - "type": "object" -}New value: +null
- Changed
delete_banking_recipient1 field changed- changed
Output schema / (root)Previous value: -{ - "type": "object" -}New value: +null
- Changed
delete_payment_recipient1 field changed- changed
Output schema / (root)Previous value: -{ - "properties": { - "deleted": { - "type": [ - "boolean", - "null" - ] - }, - "recipient_id": { - "type": [ - "string", - "null" - ] - }, - "user_id": { - "type": [ - "string", - "null" - ] - } - }, - "type": "object" -}New value: +null
- Changed
delete_webhook1 field changed- changed
Output schema / (root)Previous value: -{ - "properties": { - "deleted": { - "description": "False when there was no registration to delete.", - "type": [ - "boolean", - "null" - ] - } - }, - "type": "object" -}New value: +null
- Removed
exchange_api_key - Added
feedback - Changed
fund_card_balance1 field changed- changed
Output schema / (root)Previous value: -{ - "properties": { - "asset": { - "type": [ - "string", - "null" - ] - }, - "deposit_address": { - "description": "The account holder's own deposit address at the card issuer, on Base.", - "type": [ - "string", - "null" - ] - }, - "funded_usd": { - "description": "USD loaded onto the card balance.", - "type": [ - "number", - "null" - ] - }, - "network": { - "type": [ - "string", - "null" - ] - }, - "note": { - "type": [ - "string", - "null" - ] - }, - "payment_network": { - "description": "The chain the payment settled on: `solana` (bridged to Base over CCTP) or `base` (forwarded directly).", - "type": [ - "string", - "null" - ] - }, - "status": { - "description": "Always `paid` here: the payment settled and delivery to the card balance has started. Follow the later states in `GET /list-card-transactions`.", - "type": [ - "string", - "null" - ] - }, - "top_up_id": { - "description": "Identifies this top-up under `top_ups` in `GET /list-card-transactions`.", - "type": [ - "string", - "null" - ] - } - }, - "type": "object" -}New value: +null
- Changed
get_account_balance1 field changed- changed
Output schema / (root)Previous value: -{ - "description": "Account balance information.", - "properties": { - "balance": { - "description": "Current available balance in USD", - "type": [ - "number", - "null" - ] - }, - "created_timestamp": { - "type": [ - "number", - "null" - ] - }, - "created_timestamp_readable": { - "type": [ - "string", - "null" - ] - }, - "total_deposits": { - "description": "Total lifetime deposits in USD", - "type": [ - "number", - "null" - ] - }, - "user_id": { - "description": "The user's ID (lowercase wallet address)", - "type": [ - "string", - "null" - ] - } - }, - "type": "object" -}New value: +null
- Changed
get_agent_spend_limit1 field changed- changed
Output schema / (root)Previous value: -{ - "properties": { - "default": { - "description": "The limit that applies when the owner has never set one.", - "type": [ - "number", - "null" - ] - }, - "max": { - "description": "The highest value the owner can set.", - "type": [ - "number", - "null" - ] - }, - "maxPerPaymentUsdc": { - "description": "The most a single payment may total, fees included.", - "type": [ - "number", - "null" - ] - }, - "min": { - "description": "The lowest value the owner can set.", - "type": [ - "number", - "null" - ] - } - }, - "type": "object" -}New value: +null
- Changed
get_agent_wallet1 field changed- changed
Output schema / (root)Previous value: -{ - "type": "object" -}New value: +null
- Changed
get_auth_link1 field changed- changed
Output schema / (root)Previous value: -{ - "properties": { - "auth_url": { - "description": "URL to open in a browser to log in to the Laso Finance dashboard. Carries a short single-use login code.", - "type": [ - "string", - "null" - ] - }, - "expires_in": { - "description": "Seconds until the login code expires", - "type": [ - "number", - "null" - ] - }, - "user_id": { - "description": "The authenticated user's ID (wallet address)", - "type": [ - "string", - "null" - ] - } - }, - "type": "object" -}New value: +null
- Changed
get_banking_application1 field changed- changed
Output schema / (root)Previous value: -{ - "type": "object" -}New value: +null
- Changed
get_banking_profile_status1 field changed- changed
Output schema / (root)Previous value: -{ - "type": "object" -}New value: +null
- Changed
get_banking_transaction1 field changed- changed
Output schema / (root)Previous value: -{ - "type": "object" -}New value: +null
- Changed
get_card1 field changed- changed
Output schema / (root)Previous value: -{ - "properties": { - "auth": { - "properties": { - "expires_in": { - "description": "Token lifetime in seconds", - "type": [ - "string", - "null" - ] - }, - "id_token": { - "description": "ID token — use as Bearer token for Laso Finance APIs", - "type": [ - "string", - "null" - ] - }, - "refresh_token": { - "description": "Use with POST /auth (grant_type=refresh_token) to get a new id_token when it expires", - "type": [ - "string", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] - }, - "callable_base_url": { - "type": [ - "string", - "null" - ] - }, - "card": { - "description": "Card order info returned by /get-card. Status is always `pending` initially — poll `/get-card-data` to check when card details are ready.", - "properties": { - "card_id": { - "type": [ - "string", - "null" - ] - }, - "country": { - "type": [ - "string", - "null" - ] - }, - "status": { - "description": "Always `pending` at order time. Poll `/get-card-data` to check for `ready`. One of: pending.", - "type": [ - "string", - "null" - ] - }, - "timestamp": { - "type": [ - "number", - "null" - ] - }, - "timestamp_readable": { - "type": [ - "string", - "null" - ] - }, - "usd_amount": { - "type": [ - "number", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] - }, - "user_id": { - "description": "The user's ID (lowercase wallet address)", - "type": [ - "string", - "null" - ] - } - }, - "type": "object" -}New value: +null
- Changed
get_card_data1 field changed- changed
Output schema / (root)Previous value: -{ - "anyOf": [ - { - "description": "Response from `/get-card-data`. Three card types share this shape and each populates a different subset.\n\n**Non-reloadable (U.S. and International):** when `status` is `ready`, `card_details` carries the number, CVV, and expiry. International cards add `label`, `charged_usd_amount`, `fees_paid`, `state`, `balance_update_requested_timestamp`, and `queued_order_card_id`.\n\n**Reloadable:** returns `last4`, `expiry`, `balance`, `spend_limit`, `reusable`, `issuer_status`, `created_at`, and `expires_at` instead of the `usd_amount`/`timestamp` fields above. Reading its number and CVV is gated by the card issuer, so exactly one of `card_details`, `details_approval`, or `details_error` is present on a single-card lookup.", - "properties": { - "balance": { - "description": "Reloadable cards only. Spendable balance in dollars.", - "type": [ - "number", - "null" - ] - }, - "balance_update_requested_timestamp": { - "description": "International cards only. Unix timestamp (ms) of an outstanding admin balance update request, or null if none is pending.", - "type": [ - "number", - "null" - ] - }, - "card_details": { - "description": "Only present when status is `ready` (U.S.) or `complete` (international).", - "properties": { - "available_balance": { - "type": [ - "number", - "null" - ] - }, - "billing_address": { - "description": "The card billing address to enter when a merchant asks for one at checkout. The billing name is always `Laso Finance`. For USA non-reloadable cards `required` is `false` (any valid U.S. billing address works; this is a known-good default). For international non-reloadable cards `required` is `true` and the merchant AVS check is validated against exactly this address. On reloadable cards this is always null: the card issuer holds no billing address for a card, and they are AVS-checked against the address the account holder gave at their own identity verification. Ask the holder for it; do not substitute Laso's address.", - "properties": { - "city": { - "type": [ - "string", - "null" - ] - }, - "country": { - "type": [ - "string", - "null" - ] - }, - "line_1": { - "type": [ - "string", - "null" - ] - }, - "line_2": { - "type": [ - "string", - "null" - ] - }, - "name": { - "description": "Always `Laso Finance`.", - "type": [ - "string", - "null" - ] - }, - "note": { - "type": [ - "string", - "null" - ] - }, - "required": { - "description": "`true` if the card enforces AVS against this exact address (international cards); `false` if any valid U.S. address works (USA cards).", - "type": [ - "boolean", - "null" - ] - }, - "state": { - "type": [ - "string", - "null" - ] - }, - "zip": { - "type": [ - "string", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] - }, - "card_number": { - "type": [ - "string", - "null" - ] - }, - "cvv": { - "type": [ - "string", - "null" - ] - }, - "exp_month": { - "type": [ - "string", - "null" - ] - }, - "exp_year": { - "type": [ - "string", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] - }, - "card_id": { - "type": [ - "string", - "null" - ] - }, - "card_type": { - "description": "One of: Non-Reloadable U.S., Non-Reloadable International, Reloadable.", - "type": [ - "string", - "null" - ] - }, - "charged_usd_amount": { - "description": "International cards only. Amount the user was charged including fees.", - "type": [ - "number", - "null" - ] - }, - "country": { - "description": "U.S. cards only.", - "type": [ - "string", - "null" - ] - }, - "created_at": { - "description": "Reloadable cards only. Epoch milliseconds.", - "type": [ - "number", - "null" - ] - }, - "details_approval": { - "description": "Reloadable cards only, and only for a card the holder created in ANOTHER app. The issuer has emailed them an approve/deny link; retry with `approval_id` once they approve. Cards created through `/create-reloadable-card` are Laso-issued and never take this path.", - "properties": { - "approval_id": { - "type": [ - "string", - "null" - ] - }, - "note": { - "type": [ - "string", - "null" - ] - }, - "status": { - "description": "One of: pending.", - "type": [ - "string", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] - }, - "details_error": { - "description": "Reloadable cards only. Present when the issuer could not return the number, so a card with no `card_details` is never silently indistinguishable from one whose details are pending.", - "type": [ - "string", - "null" - ] - }, - "expires_at": { - "description": "Reloadable cards only. Epoch milliseconds, or null when the card does not expire.", - "type": [ - "number", - "null" - ] - }, - "expiry": { - "description": "Reloadable cards only. MM/YY.", - "type": [ - "string", - "null" - ] - }, - "fees_paid": { - "description": "International cards only. Fees paid for this card.", - "type": [ - "number", - "null" - ] - }, - "issuer_status": { - "description": "Reloadable cards only. The issuer's own status string, kept verbatim.", - "type": [ - "string", - "null" - ] - }, - "label": { - "description": "International cards only. User-supplied label, may be empty.", - "type": [ - "string", - "null" - ] - }, - "last4": { - "description": "Reloadable cards only. Last four digits.", - "type": [ - "string", - "null" - ] - }, - "last_updated_timestamp": { - "description": "U.S. cards only. Unix timestamp (ms) of the last time card data was refreshed.", - "type": [ - "number", - "null" - ] - }, - "queued_order_card_id": { - "description": "International cards only. The original `card_id` returned by `/order-intl-card`. After admin fulfillment the card is reissued with a new `card_id` (the issuer's transaction id); querying `/get-card-data?card_id=<original>` continues to resolve to the fulfilled card via this field.", - "type": [ - "string", - "null" - ] - }, - "reusable": { - "description": "Reloadable cards only. True for a multi-use card.", - "type": [ - "boolean", - "null" - ] - }, - "spend_limit": { - "description": "Reloadable cards only. Spend cap in dollars.", - "type": [ - "number", - "null" - ] - }, - "state": { - "description": "International cards only. Raw card state. One of: queued, redeemable, complete, refund-requested, refund-requested-approved-for-queue, archived, refunded.", - "type": [ - "string", - "null" - ] - }, - "status": { - "description": "One of: pending, ready, queued, complete, refund-requested, refunded, archived.", - "type": [ - "string", - "null" - ] - }, - "timestamp": { - "type": [ - "number", - "null" - ] - }, - "timestamp_readable": { - "type": [ - "string", - "null" - ] - }, - "transactions": { - "description": "Card transaction history. U.S. and international cards use slightly different shapes — see `CardTransaction` and `IntlCardTransaction`.", - "items": { - "anyOf": [ - { - "description": "U.S. prepaid card transaction.", - "properties": { - "amount": { - "type": [ - "number", - "null" - ] - }, - "date": { - "type": [ - "string", - "null" - ] - }, - "description": { - "type": [ - "string", - "null" - ] - }, - "is_credit": { - "type": [ - "boolean", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] - }, - { - "description": "International prepaid card transaction.", - "properties": { - "amount": { - "description": "Transaction amount in USD.", - "type": [ - "number", - "null" - ] - }, - "date": { - "description": "Unix timestamp (ms) of the transaction.", - "type": [ - "number", - "null" - ] - }, - "merchant": { - "type": [ - "string", - "null" - ] - }, - "status": { - "description": "Optional status, e.g. `pending`.", - "type": [ - "string", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] - } - ] - }, - "type": [ - "array", - "null" - ] - }, - "usd_amount": { - "type": [ - "number", - "null" - ] - } - }, - "type": "object" - }, - { - "properties": { - "cards": { - "items": { - "description": "Response from `/get-card-data`. Three card types share this shape and each populates a different subset.\n\n**Non-reloadable (U.S. and International):** when `status` is `ready`, `card_details` carries the number, CVV, and expiry. International cards add `label`, `charged_usd_amount`, `fees_paid`, `state`, `balance_update_requested_timestamp`, and `queued_order_card_id`.\n\n**Reloadable:** returns `last4`, `expiry`, `balance`, `spend_limit`, `reusable`, `issuer_status`, `created_at`, and `expires_at` instead of the `usd_amount`/`timestamp` fields above. Reading its number and CVV is gated by the card issuer, so exactly one of `card_details`, `details_approval`, or `details_error` is present on a single-card lookup.", - "properties": { - "balance": { - "description": "Reloadable cards only. Spendable balance in dollars.", - "type": [ - "number", - "null" - ] - }, - "balance_update_requested_timestamp": { - "description": "International cards only. Unix timestamp (ms) of an outstanding admin balance update request, or null if none is pending.", - "type": [ - "number", - "null" - ] - }, - "card_details": { - "description": "Only present when status is `ready` (U.S.) or `complete` (international).", - "properties": { - "available_balance": { - "type": [ - "number", - "null" - ] - }, - "billing_address": { - "description": "The card billing address to enter when a merchant asks for one at checkout. The billing name is always `Laso Finance`. For USA non-reloadable cards `required` is `false` (any valid U.S. billing address works; this is a known-good default). For international non-reloadable cards `required` is `true` and the merchant AVS check is validated against exactly this address. On reloadable cards this is always null: the card issuer holds no billing address for a card, and they are AVS-checked against the address the account holder gave at their own identity verification. Ask the holder for it; do not substitute Laso's address.", - "properties": { - "city": { - "type": [ - "string", - "null" - ] - }, - "country": { - "type": [ - "string", - "null" - ] - }, - "line_1": { - "type": [ - "string", - "null" - ] - }, - "line_2": { - "type": [ - "string", - "null" - ] - }, - "name": { - "description": "Always `Laso Finance`.", - "type": [ - "string", - "null" - ] - }, - "note": { - "type": [ - "string", - "null" - ] - }, - "required": { - "description": "`true` if the card enforces AVS against this exact address (international cards); `false` if any valid U.S. address works (USA cards).", - "type": [ - "boolean", - "null" - ] - }, - "state": { - "type": [ - "string", - "null" - ] - }, - "zip": { - "type": [ - "string", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] - }, - "card_number": { - "type": [ - "string", - "null" - ] - }, - "cvv": { - "type": [ - "string", - "null" - ] - }, - "exp_month": { - "type": [ - "string", - "null" - ] - }, - "exp_year": { - "type": [ - "string", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] - }, - "card_id": { - "type": [ - "string", - "null" - ] - }, - "card_type": { - "description": "One of: Non-Reloadable U.S., Non-Reloadable International, Reloadable.", - "type": [ - "string", - "null" - ] - }, - "charged_usd_amount": { - "description": "International cards only. Amount the user was charged including fees.", - "type": [ - "number", - "null" - ] - }, - "country": { - "description": "U.S. cards only.", - "type": [ - "string", - "null" - ] - }, - "created_at": { - "description": "Reloadable cards only. Epoch milliseconds.", - "type": [ - "number", - "null" - ] - }, - "details_approval": { - "description": "Reloadable cards only, and only for a card the holder created in ANOTHER app. The issuer has emailed them an approve/deny link; retry with `approval_id` once they approve. Cards created through `/create-reloadable-card` are Laso-issued and never take this path.", - "properties": { - "approval_id": { - "type": [ - "string", - "null" - ] - }, - "note": { - "type": [ - "string", - "null" - ] - }, - "status": { - "description": "One of: pending.", - "type": [ - "string", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] - }, - "details_error": { - "description": "Reloadable cards only. Present when the issuer could not return the number, so a card with no `card_details` is never silently indistinguishable from one whose details are pending.", - "type": [ - "string", - "null" - ] - }, - "expires_at": { - "description": "Reloadable cards only. Epoch milliseconds, or null when the card does not expire.", - "type": [ - "number", - "null" - ] - }, - "expiry": { - "description": "Reloadable cards only. MM/YY.", - "type": [ - "string", - "null" - ] - }, - "fees_paid": { - "description": "International cards only. Fees paid for this card.", - "type": [ - "number", - "null" - ] - }, - "issuer_status": { - "description": "Reloadable cards only. The issuer's own status string, kept verbatim.", - "type": [ - "string", - "null" - ] - }, - "label": { - "description": "International cards only. User-supplied label, may be empty.", - "type": [ - "string", - "null" - ] - }, - "last4": { - "description": "Reloadable cards only. Last four digits.", - "type": [ - "string", - "null" - ] - }, - "last_updated_timestamp": { - "description": "U.S. cards only. Unix timestamp (ms) of the last time card data was refreshed.", - "type": [ - "number", - "null" - ] - }, - "queued_order_card_id": { - "description": "International cards only. The original `card_id` returned by `/order-intl-card`. After admin fulfillment the card is reissued with a new `card_id` (the issuer's transaction id); querying `/get-card-data?card_id=<original>` continues to resolve to the fulfilled card via this field.", - "type": [ - "string", - "null" - ] - }, - "reusable": { - "description": "Reloadable cards only. True for a multi-use card.", - "type": [ - "boolean", - "null" - ] - }, - "spend_limit": { - "description": "Reloadable cards only. Spend cap in dollars.", - "type": [ - "number", - "null" - ] - }, - "state": { - "description": "International cards only. Raw card state. One of: queued, redeemable, complete, refund-requested, refund-requested-approved-for-queue, archived, refunded.", - "type": [ - "string", - "null" - ] - }, - "status": { - "description": "One of: pending, ready, queued, complete, refund-requested, refunded, archived.", - "type": [ - "string", - "null" - ] - }, - "timestamp": { - "type": [ - "number", - "null" - ] - }, - "timestamp_readable": { - "type": [ - "string", - "null" - ] - }, - "transactions": { - "description": "Card transaction history. U.S. and international cards use slightly different shapes — see `CardTransaction` and `IntlCardTransaction`.", - "items": { - "anyOf": [ - { - "description": "U.S. prepaid card transaction.", - "properties": { - "amount": { - "type": [ - "number", - "null" - ] - }, - "date": { - "type": [ - "string", - "null" - ] - }, - "description": { - "type": [ - "string", - "null" - ] - }, - "is_credit": { - "type": [ - "boolean", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] - }, - { - "description": "International prepaid card transaction.", - "properties": { - "amount": { - "description": "Transaction amount in USD.", - "type": [ - "number", - "null" - ] - }, - "date": { - "description": "Unix timestamp (ms) of the transaction.", - "type": [ - "number", - "null" - ] - }, - "merchant": { - "type": [ - "string", - "null" - ] - }, - "status": { - "description": "Optional status, e.g. `pending`.", - "type": [ - "string", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] - } - ] - }, - "type": [ - "array", - "null" - ] - }, - "usd_amount": { - "type": [ - "number", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] - }, - "type": [ - "array", - "null" - ] - } - }, - "type": "object" - } - ], - "type": "object" -}New value: +null
- Changed
get_card_deposit_address1 field changed- changed
Output schema / (root)Previous value: -{ - "properties": { - "address": { - "description": "The holder's own USDC receiving address at the card issuer.", - "type": [ - "string", - "null" - ] - }, - "asset": { - "description": "The asset the address accepts. Always `USDC`.", - "type": [ - "string", - "null" - ] - }, - "balance": { - "description": "Dollars currently on the card balance, or `null` when the issuer cannot read it (which is not the same as zero).", - "type": [ - "number", - "null" - ] - }, - "network": { - "description": "The chain the address accepts. Always `base`.", - "type": [ - "string", - "null" - ] - }, - "note": { - "description": "Chain warning and the next step.", - "type": [ - "string", - "null" - ] - } - }, - "type": "object" -}New value: +null
- Changed
get_kyc_link1 field changed- changed
Output schema / (root)Previous value: -{ - "properties": { - "kyc_url": { - "description": "One-time URL to open to complete identity verification.", - "type": [ - "string", - "null" - ] - }, - "user_id": { - "type": [ - "string", - "null" - ] - } - }, - "type": "object" -}New value: +null
- Changed
get_kyc_status1 field changed- changed
Output schema / (root)Previous value: -{ - "properties": { - "kyc_last_reviewed_at": { - "description": "Epoch milliseconds of the last review, or null if never reviewed.", - "type": [ - "number", - "null" - ] - }, - "kyc_review_answer": { - "description": "Latest review answer (e.g. GREEN for approved, RED for rejected), or null if never reviewed.", - "type": [ - "string", - "null" - ] - }, - "kyc_review_status": { - "description": "Latest review status from the verification provider, or null if never reviewed.", - "type": [ - "string", - "null" - ] - }, - "kyc_verified": { - "description": "Whether 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.", - "type": [ - "boolean", - "null" - ] - }, - "user_id": { - "type": [ - "string", - "null" - ] - } - }, - "type": "object" -}New value: +null
- Changed
get_payment_status1 field changed- changed
Output schema / (root)Previous value: -{ - "anyOf": [ - { - "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" - } - ], - "type": "object" -}New value: +null
- Changed
get_signup_status1 field changed- changed
Output schema / (root)Previous value: -{ - "properties": { - "api_key": { - "description": "Your lasoak_ key. Delivered EXACTLY ONCE — null on any later poll.", - "type": [ - "string", - "null" - ] - }, - "api_key_note": { - "description": "Present only when api_key is null, explaining that it was already delivered.", - "type": [ - "string", - "null" - ] - }, - "auth": { - "description": "An id_token / refresh_token bundle you can use immediately.", - "type": [ - "object", - "null" - ] - }, - "callable_base_url": { - "type": [ - "string", - "null" - ] - }, - "next_steps": { - "items": { - "type": [ - "string", - "null" - ] - }, - "type": [ - "array", - "null" - ] - }, - "status": { - "type": [ - "string", - "null" - ] - }, - "user_id": { - "description": "The Laso user id of the new account.", - "type": [ - "string", - "null" - ] - } - }, - "type": "object" -}New value: +null
- Changed
get_version1 field changed- changed
Output schema / (root)Previous value: -{ - "properties": { - "api_catalog_url": { - "description": "URL of the RFC 9727 API catalog (`application/linkset+json`) indexing the OpenAPI description, the agent docs, and this status route.", - "type": [ - "string", - "null" - ] - }, - "docs": { - "description": "Per-file entries, each with a `url` and a stable `sha256` content identifier. Compare against the values you last saw to tell which file changed.", - "type": [ - "object", - "null" - ] - }, - "docs_manifest_url": { - "description": "URL of the authoritative freshness beacon, served with no-cache.", - "type": [ - "string", - "null" - ] - }, - "docs_version": { - "description": "12-character content hash of the agent docs. Changes only when the docs change.", - "type": [ - "string", - "null" - ] - }, - "note": { - "type": [ - "string", - "null" - ] - } - }, - "type": "object" -}New value: +null
- Changed
get_webhook1 field changed- changed
Output schema / (root)Previous value: -{ - "properties": { - "consecutive_failures": { - "type": [ - "number", - "null" - ] - }, - "disabled": { - "description": "True when auto-disabled after repeated delivery failures. Re-register to re-enable.", - "type": [ - "boolean", - "null" - ] - }, - "disabled_reason": { - "type": [ - "string", - "null" - ] - }, - "last_delivery_detail": { - "description": "`HTTP <status>` of the last attempt, or the error message.", - "type": [ - "string", - "null" - ] - }, - "last_delivery_message_id": { - "description": "The `webhook-id` header of the last delivery.", - "type": [ - "string", - "null" - ] - }, - "last_delivery_status": { - "description": "`delivered` or `failed`, or null before the first delivery.", - "type": [ - "string", - "null" - ] - }, - "last_delivery_timestamp": { - "description": "Epoch milliseconds of the last delivery attempt.", - "type": [ - "number", - "null" - ] - }, - "registered": { - "type": [ - "boolean", - "null" - ] - }, - "url": { - "type": [ - "string", - "null" - ] - } - }, - "type": "object" -}New value: +null
- Changed
get_withdrawal_status1 field changed- changed
Output schema / (root)Previous value: -{ - "anyOf": [ - { - "properties": { - "withdrawal": { - "description": "A withdrawal status record.", - "properties": { - "address": { - "description": "The wallet address the withdrawal is sent to", - "type": [ - "string", - "null" - ] - }, - "amount": { - "type": [ - "number", - "null" - ] - }, - "asset": { - "type": [ - "string", - "null" - ] - }, - "id": { - "type": [ - "string", - "null" - ] - }, - "network": { - "type": [ - "string", - "null" - ] - }, - "state": { - "type": [ - "string", - "null" - ] - }, - "timestamp": { - "type": [ - "number", - "null" - ] - }, - "timestamp_readable": { - "type": [ - "string", - "null" - ] - }, - "tx_hash": { - "description": "On-chain transaction hash, present once the withdrawal is processed", - "type": [ - "string", - "null" - ] - }, - "tx_url": { - "description": "Block explorer URL for the transaction, present when tx_hash exists", - "type": [ - "string", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] - } - }, - "type": "object" - }, - { - "properties": { - "withdrawals": { - "items": { - "description": "A withdrawal status record.", - "properties": { - "address": { - "description": "The wallet address the withdrawal is sent to", - "type": [ - "string", - "null" - ] - }, - "amount": { - "type": [ - "number", - "null" - ] - }, - "asset": { - "type": [ - "string", - "null" - ] - }, - "id": { - "type": [ - "string", - "null" - ] - }, - "network": { - "type": [ - "string", - "null" - ] - }, - "state": { - "type": [ - "string", - "null" - ] - }, - "timestamp": { - "type": [ - "number", - "null" - ] - }, - "timestamp_readable": { - "type": [ - "string", - "null" - ] - }, - "tx_hash": { - "description": "On-chain transaction hash, present once the withdrawal is processed", - "type": [ - "string", - "null" - ] - }, - "tx_url": { - "description": "Block explorer URL for the transaction, present when tx_hash exists", - "type": [ - "string", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] - }, - "type": [ - "array", - "null" - ] - } - }, - "type": "object" - } - ], - "type": "object" -}New value: +null
- Changed
list_address_book1 field changed- changed
Output schema / (root)Previous value: -{ - "properties": { - "entries": { - "items": { - "properties": { - "address": { - "description": "The recipient's Solana address. This is the entry's key.", - "type": [ - "string", - "null" - ] - }, - "last_used_at": { - "description": "When a transfer last went to this address, in milliseconds since epoch. Absent if never sent to.", - "type": [ - "number", - "null" - ] - }, - "name": { - "description": "The name your human gave this recipient.", - "type": [ - "string", - "null" - ] - }, - "saved_at": { - "description": "When the entry was last saved or renamed, in milliseconds since epoch.", - "type": [ - "number", - "null" - ] - }, - "send_count": { - "description": "How many transfers have gone to this address.", - "type": [ - "number", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] - }, - "type": [ - "array", - "null" - ] - } - }, - "type": "object" -}New value: +null
- Changed
list_bank_recipients1 field changed- changed
Output schema / (root)Previous value: -{ - "properties": { - "recipients": { - "items": { - "properties": { - "address": { - "description": "The payee's postal address, when one is set.", - "type": [ - "object", - "null" - ] - }, - "destinations": { - "items": { - "properties": { - "account_holder_name": { - "type": [ - "string", - "null" - ] - }, - "account_number_last4": { - "type": [ - "string", - "null" - ] - }, - "bank_name": { - "type": [ - "string", - "null" - ] - }, - "crypto_address": { - "type": [ - "string", - "null" - ] - }, - "destination_id": { - "description": "Pass this as `destination_id` to `GET /send-bank-payment`.", - "type": [ - "string", - "null" - ] - }, - "destination_type": { - "description": "One of: fiat_us, fiat_iban, crypto.", - "type": [ - "string", - "null" - ] - }, - "name": { - "type": [ - "string", - "null" - ] - }, - "network_id": { - "type": [ - "string", - "null" - ] - }, - "nickname": { - "description": "User-chosen label, present when one is set. The only editable field on a destination: set it at creation with `addBankingDestination` or later with `updateBankingDestination`.", - "type": [ - "string", - "null" - ] - }, - "routing_number": { - "type": [ - "string", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] - }, - "type": [ - "array", - "null" - ] - }, - "name": { - "type": [ - "string", - "null" - ] - }, - "recipient_id": { - "type": [ - "string", - "null" - ] - }, - "status": { - "type": [ - "string", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] - }, - "type": [ - "array", - "null" - ] - }, - "user_id": { - "type": [ - "string", - "null" - ] - } - }, - "type": "object" -}New value: +null
- Changed
list_banking_accounts1 field changed- changed
Output schema / (root)Previous value: -{ - "type": "object" -}New value: +null
- Changed
list_banking_recipients1 field changed- changed
Output schema / (root)Previous value: -{ - "type": "object" -}New value: +null
- Changed
list_banking_transactions1 field changed- changed
Output schema / (root)Previous value: -{ - "type": "object" -}New value: +null
- Changed
list_card_transactions1 field changed- changed
Output schema / (root)Previous value: -{ - "properties": { - "note": { - "description": "Present only when no card issuer account is linked.", - "type": [ - "string", - "null" - ] - }, - "transactions": { - "items": { - "properties": { - "amount": { - "description": "Transaction amount in US dollars.", - "type": [ - "number", - "null" - ] - }, - "card_id": { - "type": [ - "string", - "null" - ] - }, - "created_at": { - "description": "Milliseconds since the epoch.", - "type": [ - "number", - "null" - ] - }, - "issuer_status": { - "description": "The issuer's own status string, kept verbatim for support.", - "type": [ - "string", - "null" - ] - }, - "merchant": { - "description": "Merchant name, when the issuer reports one.", - "type": [ - "string", - "null" - ] - }, - "status": { - "description": "Lowercased status, e.g. `settled`.", - "type": [ - "string", - "null" - ] - }, - "transaction_id": { - "type": [ - "string", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] - }, - "type": [ - "array", - "null" - ] - } - }, - "type": "object" -}New value: +null
- Changed
list_payment_recipients2 fields changed- removed
Input schema / properties / platform / descriptionRemoved value: -"Payment platform whose saved recipients to list." - changed
Output schema / (root)Previous value: -{ - "properties": { - "platform": { - "description": "One of: venmo, paypal.", - "type": [ - "string", - "null" - ] - }, - "recipients": { - "items": { - "properties": { - "display_name": { - "description": "The label the account owner chose. Prefer it when confirming a payment back to a human.", - "type": [ - "string", - "null" - ] - }, - "handle": { - "description": "What to pay them at: a 10-digit phone number for Venmo, an email address for PayPal. Pass this as `recipient_id` to `GET /send-payment`.", - "type": [ - "string", - "null" - ] - }, - "last_sent_timestamp": { - "description": "Milliseconds since the epoch.", - "type": [ - "number", - "null" - ] - }, - "name": { - "description": "The recipient's own name on the platform.", - "type": [ - "string", - "null" - ] - }, - "recipient_id": { - "description": "Opaque id of this saved entry (for example `aQ3xK9mZpL2vB7nR4tYw`). Pass it as `recipient_id` to `POST` and `DELETE /payment-recipients`. It is not what `GET /send-payment` takes; use `handle` there.", - "type": [ - "string", - "null" - ] - }, - "send_count": { - "type": [ - "number", - "null" - ] - }, - "status": { - "type": [ - "string", - "null" - ] - }, - "total_sent": { - "description": "Total dollars sent to this recipient from this account.", - "type": [ - "number", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] - }, - "type": [ - "array", - "null" - ] - }, - "user_id": { - "type": [ - "string", - "null" - ] - } - }, - "type": "object" -}New value: +null
- Changed
order_gift_card1 field changed- changed
Output schema / (root)Previous value: -{ - "properties": { - "auth": { - "properties": { - "expires_in": { - "description": "Token lifetime in seconds", - "type": [ - "string", - "null" - ] - }, - "id_token": { - "description": "ID token — use as Bearer token for Laso Finance APIs", - "type": [ - "string", - "null" - ] - }, - "refresh_token": { - "description": "Use with POST /auth (grant_type=refresh_token) to get a new id_token when it expires", - "type": [ - "string", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] - }, - "callable_base_url": { - "type": [ - "string", - "null" - ] - }, - "gift_card": { - "description": "Gift card order result with redemption details.", - "properties": { - "amount": { - "description": "Gift card face value, denominated in the product's own `currency` (not USD)", - "type": [ - "number", - "null" - ] - }, - "card_id": { - "type": [ - "string", - "null" - ] - }, - "country": { - "type": [ - "string", - "null" - ] - }, - "currency": { - "description": "ISO 4217 code the `amount` is denominated in, e.g. `USD`, `SAR`, `EUR`", - "type": [ - "string", - "null" - ] - }, - "laso_server_id": { - "type": [ - "string", - "null" - ] - }, - "pin_code": { - "description": "PIN code for the gift card (if applicable)", - "type": [ - "string", - "null" - ] - }, - "redemption_code": { - "description": "Code to redeem the gift card (if applicable)", - "type": [ - "string", - "null" - ] - }, - "redemption_url": { - "description": "URL to redeem the gift card (if applicable)", - "type": [ - "string", - "null" - ] - }, - "status": { - "description": "One of: completed.", - "type": [ - "string", - "null" - ] - }, - "timestamp": { - "type": [ - "number", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] - }, - "user_id": { - "description": "The user's ID (lowercase wallet address)", - "type": [ - "string", - "null" - ] - } - }, - "type": "object" -}New value: +null
- Changed
order_intl_card1 field changed- changed
Output schema / (root)Previous value: -{ - "properties": { - "auth": { - "properties": { - "expires_in": { - "description": "Token lifetime in seconds", - "type": [ - "string", - "null" - ] - }, - "id_token": { - "description": "ID token — use as Bearer token for Laso Finance APIs", - "type": [ - "string", - "null" - ] - }, - "refresh_token": { - "description": "Use with POST /auth (grant_type=refresh_token) to get a new id_token when it expires", - "type": [ - "string", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] - }, - "callable_base_url": { - "type": [ - "string", - "null" - ] - }, - "intl_card_order": { - "properties": { - "charged_usd_amount": { - "type": [ - "number", - "null" - ] - }, - "on_card_usd_amount": { - "type": [ - "number", - "null" - ] - }, - "status": { - "type": [ - "string", - "null" - ] - }, - "timestamp": { - "type": [ - "number", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] - }, - "message": { - "type": [ - "string", - "null" - ] - }, - "user_id": { - "type": [ - "string", - "null" - ] - } - }, - "type": "object" -}New value: +null
- Changed
pay_x402_endpoint1 field changed- changed
Output schema / (root)Previous value: -{ - "type": "object" -}New value: +null
- Changed
push_to_card1 field changed- changed
Output schema / (root)Previous value: -{ - "properties": { - "amount": { - "description": "The face value sent to the debit card, in the requested `currency`", - "type": [ - "number", - "null" - ] - }, - "auth": { - "properties": { - "expires_in": { - "description": "Token lifetime in seconds", - "type": [ - "string", - "null" - ] - }, - "id_token": { - "description": "ID token — use as Bearer token for Laso Finance APIs", - "type": [ - "string", - "null" - ] - }, - "refresh_token": { - "description": "Use with POST /auth (grant_type=refresh_token) to get a new id_token when it expires", - "type": [ - "string", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] - }, - "callable_base_url": { - "type": [ - "string", - "null" - ] - }, - "currency": { - "description": "The target currency of the debit card transfer One of: USD, EUR, GBP.", - "type": [ - "string", - "null" - ] - }, - "message": { - "type": [ - "string", - "null" - ] - }, - "note": { - "description": "Important information about the currency's regional restriction and required form fields", - "type": [ - "string", - "null" - ] - }, - "redemption_url": { - "description": "URL to open and complete the push-to-card transfer. The form requires: sender name, debit card number, and cardholder name.", - "type": [ - "string", - "null" - ] - }, - "success": { - "type": [ - "boolean", - "null" - ] - }, - "user_id": { - "description": "The user's ID (lowercase wallet address)", - "type": [ - "string", - "null" - ] - } - }, - "type": "object" -}New value: +null
- Changed
refresh_card_data1 field changed- changed
Output schema / (root)Previous value: -{ - "properties": { - "message": { - "type": [ - "string", - "null" - ] - }, - "success": { - "type": [ - "boolean", - "null" - ] - } - }, - "type": "object" -}New value: +null
- Changed
refresh_token1 field changed- changed
Output schema / (root)Previous value: -{ - "properties": { - "expires_in": { - "description": "Token lifetime in seconds", - "type": [ - "string", - "null" - ] - }, - "id_token": { - "description": "New ID token — use as Bearer token for Laso Finance APIs", - "type": [ - "string", - "null" - ] - }, - "refresh_token": { - "description": "New refresh token — use for the next refresh", - "type": [ - "string", - "null" - ] - }, - "user_id": { - "description": "The user's ID (lowercase wallet address)", - "type": [ - "string", - "null" - ] - } - }, - "type": "object" -}New value: +null
- Changed
register_webhook1 field changed- changed
Output schema / (root)Previous value: -{ - "properties": { - "registered": { - "type": [ - "boolean", - "null" - ] - }, - "secret": { - "description": "Standard Webhooks signing secret (`whsec_...`). Shown only in this response — store it now. Rotate by re-registering.", - "type": [ - "string", - "null" - ] - }, - "signing": { - "description": "Always `standard-webhooks`.", - "type": [ - "string", - "null" - ] - }, - "url": { - "type": [ - "string", - "null" - ] - } - }, - "type": "object" -}New value: +null
- Changed
save_address_book_entry1 field changed- changed
Output schema / (root)Previous value: -{ - "properties": { - "address": { - "type": [ - "string", - "null" - ] - }, - "name": { - "type": [ - "string", - "null" - ] - } - }, - "type": "object" -}New value: +null
- Changed
search_docs1 field changed- changed
Output schema / (root)Previous value: -{ - "properties": { - "note": { - "description": "Where to read the full docs when nothing matched.", - "type": "string" - }, - "results": { - "description": "Best-matching doc sections, most relevant first.", - "items": { - "properties": { - "content": { - "description": "Section text, truncated to 2500 characters.", - "type": "string" - }, - "heading": { - "description": "Section heading.", - "type": "string" - }, - "source": { - "description": "Document the section came from.", - "type": "string" - } - }, - "type": "object" - }, - "type": "array" - } - }, - "type": "object" -}New value: +null
- Changed
search_gift_cards1 field changed- changed
Output schema / (root)Previous value: -{ - "properties": { - "count": { - "description": "Number of results returned", - "type": [ - "number", - "null" - ] - }, - "facets": { - "description": "Valid filter values, computed from the full catalog. Use these to discover what you can pass to the `category`, `currency`, and `country` query parameters.", - "properties": { - "categories": { - "description": "All valid `category` filter values.", - "items": { - "type": [ - "string", - "null" - ] - }, - "type": [ - "array", - "null" - ] - }, - "countries": { - "description": "All valid `country` filter values (ISO 3166-1 alpha-2 codes).", - "items": { - "type": [ - "string", - "null" - ] - }, - "type": [ - "array", - "null" - ] - }, - "currencies": { - "description": "All valid `currency` filter values.", - "items": { - "type": [ - "string", - "null" - ] - }, - "type": [ - "array", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] - }, - "filters": { - "properties": { - "category": { - "type": [ - "string", - "null" - ] - }, - "country": { - "type": [ - "string", - "null" - ] - }, - "currency": { - "type": [ - "string", - "null" - ] - }, - "query": { - "type": [ - "string", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] - }, - "gift_cards": { - "items": { - "description": "A gift card product from the catalog.", - "properties": { - "catalog_info": { - "properties": { - "brand_description": { - "type": [ - "string", - "null" - ] - }, - "redemption_instructions": { - "type": [ - "string", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] - }, - "category": { - "description": "Catalog category for the gift card (e.g. \"ecommerce\", \"travel\").", - "type": [ - "string", - "null" - ] - }, - "country": { - "description": "ISO 3166-1 alpha-2 country the gift card belongs to. Null for borderless products available in more than one country.", - "type": [ - "string", - "null" - ] - }, - "currency": { - "description": "Currency code for the gift card", - "type": [ - "string", - "null" - ] - }, - "denominations": { - "description": "If set, only these exact amounts can be ordered. Null for range-based products.", - "items": { - "type": [ - "string", - "null" - ] - }, - "type": [ - "array", - "null" - ] - }, - "description": { - "type": [ - "string", - "null" - ] - }, - "increment": { - "description": "Minimum order increment", - "type": [ - "string", - "null" - ] - }, - "laso_server_id": { - "description": "Product identifier to use when ordering via GET /order-gift-card", - "type": [ - "string", - "null" - ] - }, - "max": { - "description": "Maximum order amount", - "type": [ - "number", - "null" - ] - }, - "min": { - "description": "Minimum order amount", - "type": [ - "number", - "null" - ] - }, - "name": { - "description": "Gift card brand name", - "type": [ - "string", - "null" - ] - }, - "product_image_url": { - "description": "URL of the gift card image", - "type": [ - "string", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] - }, - "type": [ - "array", - "null" - ] - } - }, - "type": "object" -}New value: +null
- Changed
search_merchants1 field changed- changed
Output schema / (root)Previous value: -{ - "properties": { - "card_type": { - "description": "The card type results are filtered for", - "type": [ - "string", - "null" - ] - }, - "count": { - "description": "Number of merchants returned", - "type": [ - "number", - "null" - ] - }, - "merchants": { - "items": { - "description": "A merchant from the spend data database with its acceptance status for the Non-Reloadable U.S. card.", - "properties": { - "description": { - "description": "Brief description of the merchant", - "type": [ - "string", - "null" - ] - }, - "name": { - "description": "Merchant name", - "type": [ - "string", - "null" - ] - }, - "notes": { - "description": "Additional notes about using the card at this merchant", - "type": [ - "string", - "null" - ] - }, - "restriction_note": { - "description": "Present when the merchant is restricted rather than merely untested. Banking and money-transfer merchants are always reported as `not_accepted`, because spending there counts as a transfer of value. Approvals do occur at these merchants, so acceptance cannot be read off the transaction history. `null` for every other merchant.", - "type": [ - "string", - "null" - ] - }, - "status": { - "description": "Whether the Non-Reloadable U.S. card is accepted at this merchant. `accepted` = confirmed working, `not_accepted` = confirmed failing or restricted, `unknown` = card type not yet tried at this merchant. One of: accepted, not_accepted, unknown.", - "type": [ - "string", - "null" - ] - }, - "url": { - "description": "Merchant website URL", - "type": [ - "string", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] - }, - "type": [ - "array", - "null" - ] - }, - "note": { - "description": "Important caveat about the data — this database only includes merchants where users have previously attempted transactions", - "type": [ - "string", - "null" - ] - }, - "query": { - "description": "The search query that was used", - "type": [ - "string", - "null" - ] - } - }, - "type": "object" -}New value: +null
- Changed
send_bank_payment1 field changed- changed
Output schema / (root)Previous value: -{ - "properties": { - "auth": { - "properties": { - "expires_in": { - "description": "Token lifetime in seconds", - "type": [ - "string", - "null" - ] - }, - "id_token": { - "description": "ID token — use as Bearer token for Laso Finance APIs", - "type": [ - "string", - "null" - ] - }, - "refresh_token": { - "description": "Use with POST /auth (grant_type=refresh_token) to get a new id_token when it expires", - "type": [ - "string", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] - }, - "bank_payment": { - "properties": { - "amount": { - "description": "USD delivered to the bank account.", - "type": [ - "number", - "null" - ] - }, - "charged_amount": { - "description": "amount + fee_amount, the total debited.", - "type": [ - "number", - "null" - ] - }, - "destination": { - "description": "The bank account being paid, summarized. The account number is masked to its last four digits.", - "properties": { - "account_holder_name": { - "type": [ - "string", - "null" - ] - }, - "account_number_last4": { - "type": [ - "string", - "null" - ] - }, - "bank_name": { - "type": [ - "string", - "null" - ] - }, - "name": { - "type": [ - "string", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] - }, - "destination_id": { - "type": [ - "string", - "null" - ] - }, - "fee_amount": { - "description": "Transfer fee charged on top of the amount.", - "type": [ - "number", - "null" - ] - }, - "payout_id": { - "type": [ - "string", - "null" - ] - }, - "state": { - "type": [ - "string", - "null" - ] - }, - "timestamp": { - "type": [ - "number", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] - }, - "callable_base_url": { - "type": [ - "string", - "null" - ] - }, - "message": { - "type": [ - "string", - "null" - ] - }, - "success": { - "type": [ - "boolean", - "null" - ] - }, - "user_id": { - "type": [ - "string", - "null" - ] - } - }, - "type": "object" -}New value: +null
- Removed
send_feedback - Changed
send_payment1 field changed- changed
Output schema / (root)Previous value: -{ - "anyOf": [ - { - "properties": { - "amount": { - "type": [ - "number", - "null" - ] - }, - "auth": { - "properties": { - "expires_in": { - "description": "Token lifetime in seconds", - "type": [ - "string", - "null" - ] - }, - "id_token": { - "description": "ID token — use as Bearer token for Laso Finance APIs", - "type": [ - "string", - "null" - ] - }, - "refresh_token": { - "description": "Use with POST /auth (grant_type=refresh_token) to get a new id_token when it expires", - "type": [ - "string", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] - }, - "callable_base_url": { - "type": [ - "string", - "null" - ] - }, - "message": { - "type": [ - "string", - "null" - ] - }, - "platform": { - "description": "One of: venmo, paypal.", - "type": [ - "string", - "null" - ] - }, - "recipient_id": { - "type": [ - "string", - "null" - ] - }, - "state": { - "description": "Payment lifecycle state (e.g. `in-process`, `queued`).", - "type": [ - "string", - "null" - ] - }, - "success": { - "type": [ - "boolean", - "null" - ] - }, - "user_id": { - "type": [ - "string", - "null" - ] - } - }, - "type": "object" - }, - { - "properties": { - "amount": { - "type": [ - "number", - "null" - ] - }, - "auth": { - "properties": { - "expires_in": { - "description": "Token lifetime in seconds", - "type": [ - "string", - "null" - ] - }, - "id_token": { - "description": "ID token — use as Bearer token for Laso Finance APIs", - "type": [ - "string", - "null" - ] - }, - "refresh_token": { - "description": "Use with POST /auth (grant_type=refresh_token) to get a new id_token when it expires", - "type": [ - "string", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] - }, - "callable_base_url": { - "type": [ - "string", - "null" - ] - }, - "kyc_required": { - "description": "One of: true.", - "type": [ - "boolean", - "null" - ] - }, - "kyc_url": { - "description": "URL the wallet owner must open to complete identity verification. No payout was sent, but the x402 payment you made was still credited to your Laso account balance. After verifying, retry /send-payment to dispatch the payout, or call POST /withdraw to pull the credited USDC back to your wallet.", - "type": [ - "string", - "null" - ] - }, - "message": { - "description": "Human-readable explanation of the KYC requirement and how to recover the credited funds via retry or POST /withdraw.", - "type": [ - "string", - "null" - ] - }, - "platform": { - "description": "One of: venmo, paypal.", - "type": [ - "string", - "null" - ] - }, - "recipient_id": { - "type": [ - "string", - "null" - ] - }, - "user_id": { - "type": [ - "string", - "null" - ] - } - }, - "type": "object" - } - ], - "type": "object" -}New value: +null
- Changed
start_signup1 field changed- changed
Output schema / (root)Previous value: -{ - "properties": { - "claim_code": { - "description": "The code inside claim_url. Pass it back to /signup-status alongside claim_token.", - "type": [ - "string", - "null" - ] - }, - "claim_token": { - "description": "Your receipt for this signup. Shown once; store it. Exchanged at /signup-status for your API key.", - "type": [ - "string", - "null" - ] - }, - "claim_url": { - "description": "Give this to your human verbatim. Never open it yourself.", - "type": [ - "string", - "null" - ] - }, - "expires_at": { - "description": "Epoch ms when the claim link expires.", - "type": [ - "number", - "null" - ] - }, - "expires_in": { - "description": "Seconds until the claim link expires (86400).", - "type": [ - "number", - "null" - ] - }, - "message_for_human": { - "description": "A ready-to-send reply containing the link. Send this as your next message.", - "type": [ - "string", - "null" - ] - }, - "next_steps": { - "items": { - "type": [ - "string", - "null" - ] - }, - "type": [ - "array", - "null" - ] - } - }, - "type": "object" -}New value: +null
- Changed
submit_banking_application1 field changed- changed
Output schema / (root)Previous value: -{ - "type": "object" -}New value: +null
- Changed
update_banking_application_details1 field changed- changed
Output schema / (root)Previous value: -{ - "type": "object" -}New value: +null
- Changed
update_banking_destination1 field changed- changed
Output schema / (root)Previous value: -{ - "type": "object" -}New value: +null
- Changed
update_payment_recipient2 fields changed- removed
Input schema / properties / platform / descriptionRemoved value: -"Payment platform the recipient is saved under." - changed
Output schema / (root)Previous value: -{ - "properties": { - "archived": { - "type": [ - "boolean", - "null" - ] - }, - "display_name": { - "type": [ - "string", - "null" - ] - }, - "platform": { - "type": [ - "string", - "null" - ] - }, - "recipient_id": { - "type": [ - "string", - "null" - ] - }, - "user_id": { - "type": [ - "string", - "null" - ] - } - }, - "type": "object" -}New value: +null
- Changed
upload_banking_document1 field changed- changed
Output schema / (root)Previous value: -{ - "properties": { - "documentId": { - "type": [ - "string", - "null" - ] - }, - "status": { - "type": [ - "string", - "null" - ] - } - }, - "type": "object" -}New value: +null
- Changed
withdraw1 field changed- changed
Output schema / (root)Previous value: -{ - "properties": { - "success": { - "type": [ - "boolean", - "null" - ] - }, - "withdrawal": { - "description": "A withdrawal record.", - "properties": { - "amount": { - "type": [ - "number", - "null" - ] - }, - "id": { - "type": [ - "string", - "null" - ] - }, - "solana_address": { - "description": "The Solana address the USDC will be sent to.", - "type": [ - "string", - "null" - ] - }, - "state": { - "description": "One of: pending.", - "type": [ - "string", - "null" - ] - }, - "timestamp": { - "type": [ - "number", - "null" - ] - }, - "timestamp_readable": { - "type": [ - "string", - "null" - ] - } - }, - "type": [ - "object", - "null" - ] - } - }, - "type": "object" -}New value: +null
- Changed
withdraw_card_balance1 field changed- changed
Output schema / (root)Previous value: -{ - "properties": { - "amount": { - "description": "USD the issuer will pay out.", - "type": [ - "number", - "null" - ] - }, - "asset": { - "type": [ - "string", - "null" - ] - }, - "destination_address": { - "description": "The Base address the USDC goes to.", - "type": [ - "string", - "null" - ] - }, - "network": { - "type": [ - "string", - "null" - ] - }, - "note": { - "description": "Timing and where to see the request afterwards.", - "type": [ - "string", - "null" - ] - }, - "status": { - "description": "Always `requested`: the issuer has accepted the request and will pay it out manually.", - "type": [ - "string", - "null" - ] - }, - "withdrawal_id": { - "description": "The card issuer's reference for this payout request. Quote it to support; it also appears on the matching `withdrawal` card event.", - "type": [ - "string", - "null" - ] - } - }, - "type": "object" -}New value: +null
62 tool updates
- First observed
add_banking_destination - First observed
agent_wallet_transfer - First observed
announce_connection - First observed
cancel_intl_order - First observed
create_agent_api_key - First observed
create_agent_wallet - First observed
create_banking_account - First observed
create_banking_profile - First observed
create_banking_recipient - First observed
create_reloadable_card - First observed
delete_address_book_entry - First observed
delete_banking_recipient - First observed
delete_payment_recipient - First observed
delete_webhook - First observed
exchange_api_key - First observed
fund_card_balance - First observed
get_account_balance - First observed
get_agent_spend_limit - First observed
get_agent_wallet - First observed
get_auth_link - First observed
get_banking_application - First observed
get_banking_profile_status - First observed
get_banking_transaction - First observed
get_card - First observed
get_card_data - First observed
get_card_deposit_address - First observed
get_kyc_link - First observed
get_kyc_status - First observed
get_payment_status - First observed
get_signup_status - First observed
get_version - First observed
get_webhook - First observed
get_withdrawal_status - First observed
list_address_book - First observed
list_bank_recipients - First observed
list_banking_accounts - First observed
list_banking_recipients - First observed
list_banking_transactions - First observed
list_card_transactions - First observed
list_payment_recipients - First observed
order_gift_card - First observed
order_intl_card - First observed
pay_x402_endpoint - First observed
push_to_card - First observed
refresh_card_data - First observed
refresh_token - First observed
register_webhook - First observed
save_address_book_entry - First observed
search_docs - First observed
search_gift_cards - First observed
search_merchants - First observed
send_bank_payment - First observed
send_feedback - First observed
send_payment - First observed
start_signup - First observed
submit_banking_application - First observed
update_banking_application_details - First observed
update_banking_destination - First observed
update_payment_recipient - First observed
upload_banking_document - First observed
withdraw - First observed
withdraw_card_balance
Related MCP Connectors
Issue and top up x402 virtual cards or buy Freeland travel eSIMs with Base USDC.
Travel eSIMs in 200+ destinations and top-ups in 150+ countries, paid in USDC via x402
Non-custodial stablecoin bill-pay rails on Celo & Base for AI agents, settled on-chain via MCP.
Prepaid virtual cards for AI agents: one-time cards, spend caps, human approvals.
Related MCP Servers
AlicenseAqualityFmaintenancePrepare custody-separated Base USDC cash-out plans, list supported fiat rails, and track settlement state through Peer Cash.932 npmMIT- AlicenseNot gradedqualityCmaintenanceEnables agents to spend funds on Visa/MasterCard prepaid cards, travel eSIMs, and gift cards, with paid KYT address screening and USDT TRC-20 funding.MIT
- AlicenseAqualityCmaintenanceEnables AI agents to spend with the user's own key by paying via USDT TRC-20 and buying Visa/Mastercard prepaid cards, travel eSIMs, and gift cards, and also provides access to policy and how-to documentation.6MIT

fiatdock-mcpofficial
AlicenseAqualityCmaintenanceNon-custodial USDC <-> bank for AI agents. Free quotes; $0.05 USDC per session via x402; 1% commission itemised in every quote. Own funds only. PT + EU/EEA (not UK). 18+.4490 npm1MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.