Vurto Swap
Server Details
Token swaps at the best net price on 9 EVM chains and Solana. No API key, non-custodial.
- Status
- Healthy
- Uptime
- 100.0% over 38 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-03-26
- URL
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 20 tools
The set is organized into clear domain families (swap_*, double_*, nn_*, invoice_*, payout_*), and the quote-vs-build pairing plus the single/double/N:N distinction is explicitly explained, so selection is usually derivable from names. The main soft spots are the four 'report/report_payment/report_analysis_payment/report_execution' style tools and double_build/nn_build, which are partly conveniences layered over swap_build and could be confused by an inattentive agent, though descriptions disambiguate them.
Most names follow a predictable snake_case domain-prefix pattern (swap_build, invoice_pay, payout_report_payment), which makes related tools group naturally. A few deviate from verb-first (destination_challenge, destination_authorize, payout_batch, wallet_check, prepare_signing), but the conventions remain readable and non-chaotic.
Twenty tools is on the heavy side, but the surface genuinely spans several sub-domains (three swap shapes with quote/build, invoice lifecycle with paid analysis, Solana batch payouts, destination authorization, local signing). Almost every tool maps to a distinct step in a real workflow rather than duplicating another, so the count is defensible though at the upper bound.
Swaps and invoices have full quote/build/execute/report coverage, but there are notable gaps: nn_build's transaction step explicitly cannot be reported or tracked (report_execution and swap_status do not support it), so that path dead-ends into manual receipt checking. There is also no way to list/search invoices, cancel or refund, and no plain balance/transfer tool outside the invoice/payout flows.
Available Tools
20 toolsdestination_authorizeAInspect
Hand over the signature of destination_challenge. The server checks it is the paying wallet's signature over that exact challenge, for that receiver and chain, unexpired and unused, and then lets builds deliver to that receiver for 30 minutes. Nothing else unlocks it. Errors: signature_invalid, authorization_expired, authorization_replayed, authorization_destination_mismatch, authorization_network_mismatch.
| Name | Required | Description | Default |
|---|---|---|---|
| nonce | Yes | From destination_challenge. | |
| wallet | Yes | ||
| chainId | Yes | ||
| message | Yes | From destination_challenge, unchanged. | |
| receiver | Yes | ||
| signature | No | EVM: 0x hex, EIP-712 over typedData or EIP-191 over message. Solana: base58 over message. | |
| transaction | No | Solana only: the signed proofTransaction, base64, instead of signature. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (which only assert non-read-only, non-idempotent, open-world), the description discloses the server-side validation chain, the 30-minute grant duration, single-use/replay protection, and a precise error taxonomy. This is exactly the behavioral context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences, action front-loaded, with a trailing error list that is genuinely useful for handling failures. No filler or restatement of the tool name.
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 mutating authorization call with no output schema, the description covers inputs, validation, lifetime, and errors. It leaves the Solana `transaction` path and the exact success payload to the schema, a minor gap rather than a blocker.
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?
At 57% schema coverage, the description usefully clarifies what the signature must be *over* (the exact challenge, that receiver, that chain) and ties nonce/message back to destination_challenge. It stops short of explaining the Solana-only `transaction` alternative or the wallet/chainId fields, which the schema covers.
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 gives a specific action (hand over the signature from destination_challenge) and the resulting effect (builds may deliver to that receiver for 30 minutes). It clearly distinguishes itself from the sibling destination_challenge, which produces the challenge this tool consumes.
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 makes the prerequisite explicit (you must first call destination_challenge to get nonce/message) and states the outcome window, giving clear context for when to call it. It does not state any when-not-to-call condition or name an alternative path, so 4 rather than 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
destination_challengeAInspect
Destination lock. A receiver different from the signing wallet is refused by swap_build, double_build and nn_build (403 destination_not_authorized) until the paying wallet signs an authorization for that exact address on that chain. This returns {nonce, message, expiresAt} plus, on EVM, typedData (EIP-712, the same fields) and, on Solana, proofTransaction (a memo that can never land, for Ledger). Show the user the full receiver and network and get their explicit yes; then sign: on EVM call prepare_signing with step {type: "signature", typedData} and run it; on Solana sign message (or proofTransaction) with the wallet. Then call destination_authorize. Never sign this without the user asking to send to that address. Paying an invoice does not need it.
| Name | Required | Description | Default |
|---|---|---|---|
| wallet | Yes | The wallet that pays and signs. | |
| chainId | Yes | EVM chain id, or "solana-mainnet". | |
| receiver | Yes | The full destination address. Solana base58 is case-sensitive. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnlyHint=false, openWorldHint=true, idempotentHint=false, destructiveHint=false) only sketch the safety profile, and the description adds substantial context beyond them: the 403 destination_not_authorized enforcement, the chain-specific signing artifacts (EIP-712 typedData on EVM, never-landing memo proofTransaction for Ledger on Solana), and an explicit human-confirmation requirement. This is exactly the behavioral detail annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a dense, run-on paragraph but every clause earns its place – the 403 trigger, the return shape, the per-chain signing path, and the confirmation rule. It is front-loaded with the lock behavior before the signing steps. Slightly overpacked, but 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?
No output schema exists, yet the description fully describes the return values ({nonce, message, expiresAt}, typedData, proofTransaction) and the complete downstream signing flow. For a complex, multi-step, safety-critical authorization tool, 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 description coverage is 100%, so wallet, chainId and receiver are already documented in the schema, and the description adds no syntax or format detail beyond it. It does contextualize the parameters by explaining the EVM vs Solana (chainId) branching and stressing that the full receiver address matters, but that is largely behavioral rather than semantic. Baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Although it opens with the terse label 'Destination lock,' the description immediately states the concrete effect: a receiver different from the signing wallet is refused by swap_build, double_build and nn_build (403 destination_not_authorized) until authorized. It names the sibling tools and the exact return payload ({nonce, message, expiresAt}, plus typedData/proofTransaction), so an agent can distinguish it from destination_authorize without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: sign via prepare_signing (EVM) or wallet message (Solana), then 'call destination_authorize.' It also gives clear when-not guidance: 'Never sign this without the user asking to send to that address. Paying an invoice does not need it.' Both the alternative tool and the exclusion condition are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
double_buildAInspect
Builds signable/sendable plans for BOTH legs of a Double Out or Double In swap — two ordinary swap_build calls under the hood, kept together for convenience. Returns { legA, legB }, each a full SwapPlan exactly like swap_build's. The two legs are NOT atomic — there is no combined contract call, each is a transaction (or CoW signature) the wallet sends separately, same as any other swap. Execute leg A fully first (steps, signing, report_execution) and confirm it landed before starting leg B. If leg A fails or is rejected, do NOT execute leg B — proceeding would leave the wallet with only half the ratio the user asked for, which defeats the purpose of a Double swap.
| Name | Required | Description | Default |
|---|---|---|---|
| legA | Yes | ||
| legB | Yes | ||
| wallet | Yes | Wallet that will sign. Required for builds and EVM execution/history calls. On an anonymous EVM quote, pass it to make the returned quoteId executable; without it the quote is indicative. | |
| chainId | Yes | EVM: integer from GET /v1/chains (1, 10, 56, 100, 137, 8453, 42161, 43114, 130). Solana: string from GET /v1/svm/chains ("solana-mainnet"). | |
| maxSlippageBps | No | Optional ceiling, 0-10000, applied to both legs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnlyHint=false, destructiveHint=false, idempotentHint=false, openWorldHint=true — they say nothing about atomicity or failure modes. The description adds the critical disclosure that the legs are NOT atomic, that there is no combined contract call, that each leg is a separately signed transaction, and that partial execution leaves the wallet with half the intended ratio. This is exactly the behavioral context metadata cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with purpose and return shape before the operational rules. Every sentence carries unique information: what it builds, the swap_build equivalence, the non-atomicity caveat, and the sequencing rule with its rationale. 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?
With no output schema, the description supplies the return contract ('{ legA, legB }, each a full SwapPlan exactly like swap_build's'), and for a nested-object, 4-required-param, open-world mutation tool it also supplies the two things an agent would otherwise get wrong: execution order and abort-on-failure. The remaining field-level detail is adequately covered by the 60% schema coverage.
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 60%, so the schema documents most parameters (amount vs amountRaw, receiver constraints, symbol resolution). The description adds only the conceptual mapping that each of legA/legB is 'a full SwapPlan exactly like swap_build's,' which clarifies the nested object shape but not individual field semantics. 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 ('Builds signable/sendable plans for BOTH legs of a Double Out or Double In swap') and immediately disambiguates from the closest sibling by explaining it is 'two ordinary swap_build calls under the hood.' An agent can tell from the first sentence exactly what this produces and how it differs from swap_build.
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 operational sequencing: 'Execute leg A fully first (steps, signing, report_execution) and confirm it landed before starting leg B,' plus a clear when-not rule ('If leg A fails or is rejected, do NOT execute leg B'). It implies the alternative (two separate swap_build calls) rather than naming it, and never mentions double_quote as the natural predecessor despite the quoteId param, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
double_quoteARead-onlyInspect
Compares ranked routes for TWO swap legs at once — "Double Out" (one source token split into two destinations) or "Double In" (two source tokens converging on one destination). This exists because building a liquidity pool or matching a target ratio needs both legs priced against the market at the same instant, not one after another with the price moving in between. Each leg is independently quoted (two ordinary swap_quote calls under the hood) — this tool is a convenience that keeps them together, not a combined/atomic route. For mode "out": legA.tokenIn must equal legB.tokenIn (the shared source); tokenOut differs. For mode "in": legA.tokenOut must equal legB.tokenOut (the shared destination); tokenIn differs. Pass the exact amount each leg should trade — this tool does not compute percentages or splits for you. If the shared token is the chain's native asset, remember gas is paid twice (once per leg's eventual transaction) — do not quote/build a total that leaves nothing for the second leg's gas.
| Name | Required | Description | Default |
|---|---|---|---|
| legA | Yes | ||
| legB | Yes | ||
| mode | Yes | "out": one source, two destinations. "in": two sources, one destination. | |
| wallet | No | Wallet that will sign. Required for builds and EVM execution/history calls. On an anonymous EVM quote, pass it to make the returned quoteId executable; without it the quote is indicative. | |
| chainId | Yes | EVM: integer from GET /v1/chains (1, 10, 56, 100, 137, 8453, 42161, 43114, 130). Solana: string from GET /v1/svm/chains ("solana-mainnet"). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, openWorldHint=true, so the safety profile is covered. The description adds genuinely non-obvious behavior: this is NOT a combined/atomic route, each leg is an independent swap_quote call, and native-asset legs require gas twice, so a full-balance split will starve the second transaction.
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?
Front-loaded with purpose, then rationale, then constraints and the gas caveat. Dense but every sentence carries a distinct constraint; the gas warning is a slight tangent but materially affects correctness.
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?
Covers mode semantics, cross-leg constraints, non-atomicity, and gas budgeting, which is most of what an agent needs for a nested-object quote call. With no output schema, it does not describe the returned ranked-route/quote shape, a minor remaining gap against annotations that already carry the safety profile.
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 60% on a nested 5-param tool, and the description compensates by spelling out the cross-leg invariants (shared source/destination per mode) and warning that amounts must be supplied exactly because no percentage/split computation happens. It does not re-explain mode's own enum, but cross-parameter logic is the higher-value addition.
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 (compares) and resource (ranked routes for two swap legs), then names the two modes and the sibling it wraps (swap_quote). An agent can distinguish it from swap_quote and double_build without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains exactly when to use it (when both legs must be priced at the same instant, e.g. building a pool or matching a target ratio) and explicitly routes two-sequential-swap needs elsewhere. The per-mode shared-token invariants ('out' requires legA.tokenIn == legB.tokenIn) are stated as hard conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invoice_analysis_payAInspect
Only for an invoice created with paid checks (["scorechain"], ["merkle-science"] or both) whose analysis.status is awaiting_payment (see invoice_get). Builds ONE USDC transfer of analysis.amount (0.15 Scorechain, 0.60 Merkle Science, 0.75 both) to the Vurto fee wallet (analysis.to), signed by the invoice creator. Nothing is signed or sent here. The free screening runs first on the receiving wallet and on the creator: a rejected wallet gets screening_blocked (403) and nothing is built; a screening that cannot be read gets screening_unavailable (503). payer must be the creator (the receiving wallet when the invoice was created without a session, which is always the case over MCP); any other wallet gets not_invoice_creator (403) before anything is built. plan has the same shape as invoice_pay (prepare_signing; on Solana POST the signed transaction to /v1/svm/execute), then call invoice_report_analysis_payment with the hash or signature. Paying it from another token is a swap built over the HTTP API (POST /v1/swap on EVM, POST /v1/svm/swap on Solana) from the creator wallet with tokenOut = analysis.token, receiver = analysis.to and invoiceId = this invoice, sized so the guaranteed minimum covers analysis.amountRaw; report its hash or signature to invoice_report_analysis_payment. On EVM only a swap built that way counts (the transaction must match that build); on Solana the Vurto fee wallet must be the only wallet whose USDC rises in it. A swap that only pays a fee to the same wallet does not count. Errors: no_paid_check, analysis_already_paid, invoice_already_paid, not_invoice_creator, screening_blocked, screening_unavailable. SOLANA invoices (new model, since 23/10/2026): this is how the PAYER buys the paid analysis of the RECEIVING wallet, with their own money, before paying. Pass payer = the paying wallet and checks (["merkle-science"] 0.30, ["scorechain"] 0.075, both 0.375 USDC, the price of ONE wallet). The payer proves the wallet first (destination_challenge/destination_authorize for this invoice's receiver; without it payer_signature_required, 401); the free screening of both wallets must pass (screening_blocked 403). It returns receiverAnalysis {status: awaiting_payment, amount, to} and the USDC transfer to sign; report it with invoice_report_analysis_payment (txHash and payer). While it is awaiting payment, invoice_pay refuses with receiver_analysis_unpaid (409): the invoice can be paid only after this analysis is paid and done. checks: [] gives it up before paying. The result comes back without the receiving wallet. Paying it from another token: POST /v1/svm/swap from the payer with receiver = the fee wallet (receiverAnalysis.to) and invoiceId = this invoice.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | INV-XXXX-XXXX or the 8-character id. | |
| payer | Yes | EVM (old model): the invoice creator wallet, which signs the analysis payment. Solana (new model): the paying wallet, which buys the analysis of the receiving wallet. | |
| checks | No | Solana only: the paid analyses of the RECEIVING wallet the payer buys. [] gives up an unpaid one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare openWorldHint=true, idempotentHint=false, and destructiveHint=false. The description adds substantial context beyond them: no signing or sending happens, a free screening runs first with screening_blocked (403) and screening_unavailable (503), payer must be the creator or the result is not_invoice_creator (403), and the full error set is enumerated. This is rich behavioral disclosure, though some of it, like the swap-build instructions, is operational rather than behavioral.
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 a single wall of text covering two models, with repeated instructions to call invoice_report_analysis_payment and duplicated swap guidance for EVM and Solana. Key constraints like the payer restriction and screening error codes are buried mid-paragraph rather than front-loaded. The content is dense and mostly relevant, but it is not structurally concise.
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 only three parameters but a complex dual-chain flow, the description covers prerequisites, screening behavior, error codes, the EVM plan reference (same shape as invoice_pay), and the Solana receiverAnalysis return. The EVM return shape is left by reference to a sibling rather than detailed, which is a minor gap, but overall the 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 coverage is 100%, so the schema already defines id, payer (EVM creator vs Solana paying wallet), and checks (Solana-only, [] gives up). The description echoes those meanings and adds the pricing context of checks (0.30/0.075/0.375) but does not add syntax or semantics the schema lacks. Baseline 3 is appropriate when the schema carries the parameter 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 states a concrete operation: builds one USDC transfer of analysis.amount to the Vurto fee wallet, signed by the invoice creator, and explicitly says nothing is signed or sent. It distinguishes itself from invoice_pay (which refuses while awaiting payment) and invoice_report_analysis_payment (the reporting step). The dual EVM/Solana semantics make the purpose slightly sprawling, but the core verb+resource remains identifiable.
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 a precise precondition: only for invoices created with paid checks whose analysis.status is awaiting_payment, pointing to invoice_get. It names alternatives: paying from another token must go through POST /v1/swap or POST /v1/svm/swap, and checks: [] explicitly abandons an unpaid analysis. The Solana path spells out that invoice_pay refuses with receiver_analysis_unpaid (409) until this is done, so the agent knows exactly when to route here.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invoice_createAInspect
Create a payment request: who receives, which token, how much, on which network. Returns invoice.id, invoice.label (INV-XXXX-XXXX, what people copy), invoice.url (share this; it previews with the QR on WhatsApp and Telegram) and invoice.qr (PNG). No signature or API key needed. New invoices only receive VERIFIED dollar stablecoins on the network allowlist, even without paid analysis. Without paid analysis there is no split fee. Previously created invoices keep their terms. Tokens resolve by address or symbol — an unverified token is refused because a cloned "USDC" with its own pool would let the creator sell a fake at any price. The payer can pay with ANY token on that network. Optional paid checks (see checks): "scorechain" (0.15 USDC) adds the Scorechain sanctions API and "merkle-science" (0.60 USDC) the Merkle Science analysis via Didit, both on BOTH wallets (payer and receiver), paid by the creator before the invoice can be paid (0.75 USDC in one transfer with both). They send both wallets to the third party, so they run only when chosen. A wallet listed by Scorechain is refused (payer_blocked or receiver_blocked); when Scorechain cannot be read the payment is not held, because the OFAC list is already checked here. On Solana the model is different (see payerChecks): the free screening of the receiving wallet must pass for the invoice to be created (receiver_blocked 403, screening_unavailable 503), and the paid analysis of the payer wallet is paid out of the amount through a split in the payment transaction.
| Name | Required | Description | Default |
|---|---|---|---|
| memo | No | Optional note, up to 80 chars, visible to anyone with the link. | |
| token | Yes | Token to receive: address/mint or symbol of a verified dollar stablecoin on the network allowlist. Other tokens return stablecoin_required, even without paid analysis. | |
| amount | Yes | Human decimal amount, e.g. "100". Decimals come from the token list, not from you. | |
| checks | No | Optional extra screening chosen by the invoice creator; default none. Any other value is refused with invalid_check. Both checks are PAID by the creator, for both wallets (payer and receiver), before the invoice can be paid. EVM networks only (the old model): on Solana paid checks here are refused with paid_check_moved; use payerChecks instead, and the payer contracts the receiver analysis with invoice_analysis_pay. "scorechain" (0.15 USDC): the Scorechain sanctions API, which sends both wallets to Scorechain. Available on Optimism, BNB Chain, Gnosis, Unichain, Polygon, Base, Arbitrum, Avalanche and Solana. "merkle-science" (0.60 USDC): the Merkle Science analysis via Didit (score, summary, risk factors and where the money came from), which sends both wallets to Didit/Merkle Science. Available on Base, Optimism, Arbitrum, BNB Chain, Polygon and Solana. Both together: one transfer of 0.75 USDC. Ethereum answers check_not_available_on_chain for both (coming soon), as do the networks a check does not cover. The invoice comes back with analysis {status: "awaiting_payment", checks, amount (the sum), token (USDC of that network), to (Vurto fee wallet), chainId}: the creator pays it first with invoice_analysis_pay (sign) and invoice_report_analysis_payment; until then the invoice cannot be paid (analysis_unpaid). The creator is the signed-in wallet, or the receiving wallet when there is no session (always the receiving wallet over MCP), and only the creator can pay the analysis. The analysis is not sold when the free screening rejects the receiving or the creating wallet (screening_blocked, 403). | |
| chainId | Yes | EVM: integer from GET /v1/chains (1, 10, 56, 100, 137, 8453, 42161, 43114, 130). Solana: string from GET /v1/svm/chains ("solana-mainnet"). | |
| recipient | Yes | Wallet that receives. EVM 0x address, or base58 on Solana (case-sensitive). | |
| payerChecks | No | Solana and EVM networks with invoiceSplit=true in /v1/chains, stablecoin invoices only: USDC, USDT (including USDT0), PYUSD, USDG and USD1, by verified address on each network. Availability differs by network. The PAID analysis of the PAYER wallet is chosen by you (the receiver) and paid out of the amount you receive. Price per wallet: "merkle-science" 0.30, "scorechain" 0.075 (both 0.375). The fee that goes to the Vurto fee wallet is the LARGER of that sum and 0.5% of the amount. The percentage rounds down on Solana and up on EVM to the token's smallest unit; EVM fees cannot exceed 10% of the amount: a 100 USDC invoice with merkle-science has fee 0.50 (you receive 99.50); a 20 USDC invoice has fee 0.30 (you receive 19.70). invoice.split comes back with fee, receiverAmount and feeWallet. It runs only when the payer clicks pay (invoice_pay), after the free screening passes, and the payer cannot switch it off. The payment is then ONE transaction that splits the amount between you and the fee wallet; a payment without the fee in that same transaction does not settle the invoice. Refused: split_not_available_on_chain where no split contract is configured, stablecoin_required for tokens outside the network allowlist, amount_below_fee, fee_above_maximum (EVM fee exceeds 10%), analysis_offer_suspended (403) when this receiving wallet left 2 approved paid analyses without payment (each completed payment gives 2 back). | |
| confidential | No | Not available yet: private invoices are coming soon, with the Vurto vault. Any value other than false is refused with private_coming_soon and nothing is created. A payment is a direct transfer, so the transaction shows the receiving wallet on-chain; omit this field. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-readonly, open-world, non-idempotent behavior, and the description adds substantial context: no signature/API key needed, verified stablecoin allowlist, split-fee conditions, third-party data sharing, error codes, and Solana-specific screening. This is rich behavioral disclosure beyond structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence is front-loaded and clear, but the description is very long and dense, with repeated error and check details that could be tightened. It is appropriately structured for a complex tool but not concise.
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?
There is no output schema, but the description explains the returned invoice fields and covers major behavioral conditions, error cases, paid checks, and Solana differences. For an 8-parameter creation tool with rich annotations, this is complete enough 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 description coverage is 100%, and the schema already documents each parameter in detail. The description reinforces token resolution, amount decimals, checks, payerChecks, and confidential behavior, but adds little parameter-specific meaning beyond the schema 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 a specific verb and resource: "Create a payment request," then names the key dimensions (recipient, token, amount, network) and the returned invoice fields. An agent can distinguish this creation tool from retrieval/payment siblings without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains when optional paid checks apply, when to use payerChecks instead on Solana, and that invoice_analysis_pay handles payment of analysis. It does not explicitly route retrieval to invoice_get or state when not to create an invoice, but the creation context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invoice_getARead-onlyIdempotentInspect
Read an invoice by id (INV-XXXX-XXXX, with or without dashes): requested amount, token, network, receiver, status (open or paid), the paying transaction once paid, and received (the raw amount measured on-chain so far). Pending payments are re-checked on-chain by the read, at most two per read and each at most every 15 seconds. checks lists the paid screening the creator chose (e.g. ["scorechain"]; [] when none), which paying runs on both wallets once analysis.status is paid. analysis.report (Merkle Science only) carries, once the invoice is paid, the detail of both wallets (over the web app, a signed session of the creator also sees the detail of the receiving wallet while it is open): score, severity, summary, main risk category, risk factors and sourceOfFunds (the largest origins of the money, up to 8, with category, entity, percentage, USD amount and direct or indirect exposure). confidential is true only on a private invoice created before 14/10/2026: its receiver reads null here, it can no longer be paid (invoice_pay answers private_invoice_paused), and its paying transaction, once paid, shows the receiver on-chain.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | INV-XXXX-XXXX or the 8-character id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/idempotent annotations: it discloses that pending payments are re-checked on-chain at most twice per read and once per 15 seconds, that confidential invoices can no longer be paid, and that the receiver field is scrubbed under the confidential rule. These are operational traits the annotations do not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first clause, which is good, but the single paragraph then sprawls into deep nested return detail (analysis.report subfields, sourceOfFunds, confidential legacy rules) that is hard to scan. It is informative rather than wasteful, yet far longer than needed for tool selection.
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?
There is no output schema, so the description must carry return-value semantics, and it does thoroughly: status values, paying transaction, on-chain received amount, checks, analysis.report contents, and confidential edge cases. Nothing an agent needs to interpret a response 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 the single id parameter is fully documented in the schema ("INV-XXXX-XXXX or the 8-character id"); the description's mention of dashes being optional duplicates that. No additional parameter meaning is added, so the baseline 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?
Opens with a specific verb and resource ("Read an invoice by id") and immediately enumerates the exact fields returned, so an agent knows precisely what it gets. It also distinguishes its role from invoice_pay by stating how that sibling behaves on confidential invoices (private_invoice_paused).
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 is implied by the read-oriented framing and by the note that a signed web session sees more detail, but there is no explicit "use this when / use invoice_pay or invoice_analysis_pay instead" routing among the many invoice_* siblings. An agent can infer the read case but must guess at boundaries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invoice_payAInspect
Build the plan to pay an invoice from payer, with the token payer holds (default: the invoice token). Nothing is signed or sent here. Both wallets are screened first (payer_blocked, receiver_blocked); when the invoice has checks ["scorechain"] (see invoice_get), the creator chose and paid the Scorechain sanctions API, so this call sends the payer wallet and the receiver wallet to Scorechain, a third party (an invoice created before 22/10/2026 with the then-free Scorechain keeps running it without a charge). method "transfer": same token, a direct transfer built from the stored invoice (no fee, no gain; the receiver sees the payer as sender). method "swap": another token; amountIn is computed so the GUARANTEED minimum output covers the requested amount, the route is always the one with GAIN when there is one, and the output goes straight to the receiver (the transaction is public and signed by the payer, so the receiver can see the paying wallet on-chain). Any surplus over the requested amount goes to the receiver. plan has the same shape as a swap_build plan: on EVM sign steps[] in order with prepare_signing (approve steps first, then the transaction); on Solana pass {transaction, executionRef} to prepare_signing and POST the signed transaction to /v1/svm/execute. If simulation.status is approval_required, send the approve and call invoice_pay again. When the invoice has paid checks, the creator must have paid the analysis first (analysis_unpaid, 409). With "merkle-science" this call then sends the payer wallet and the receiver wallet to Didit/Merkle Science, and a HIGH or CRITICAL risk (score 70 or more) refuses with payer_blocked or receiver_blocked; the detail shows in invoice_get analysis.report. At most 3 different payer wallets are analysed per invoice by each paid check; a 4th gets analysis_attempts_exceeded (429). Since 23/10/2026 the payer proves the wallet BEFORE the paid analysis runs on it: over MCP that proof is the destination authorization signed by the payer for this invoice's receiver (destination_challenge with wallet = payer, receiver = the invoice receiver, chainId of the invoice, sign the message, then destination_authorize). Without it this call returns payer_signature_required (401) and no analysis slot is spent. Invoices with payerChecks on Solana or enabled EVM networks (see invoice_get payerChecks and split): the paid analysis the receiver chose runs HERE, on the payer wallet, after its free screening passes; it is always on and cannot be switched off. The payer proves the wallet first (destination_challenge/destination_authorize; payer_signature_required 401). At most 2 different payer wallets per invoice (analysis_attempts_exceeded 429); analysis_offer_suspended (403) when the receiving wallet left 2 approved paid analyses without payment. Approved, method "transfer" is ONE payment transaction with the split (on EVM, sign the exact approve step first, then VurtoInvoiceSplit.pay): split.receiverAmount to the receiver and split.fee to the Vurto fee wallet; only that transaction settles the invoice. With another token, method "swap_then_transfer": plan is a swap into the PAYER's own wallet (never straight to the receiver); once it confirms, call invoice_pay again with next.body (tokenIn = the invoice token) and sign the split. If the payer contracted the receiver analysis (invoice_analysis_pay), it must be paid first (receiver_analysis_unpaid 409) and a rejected receiver gets receiver_blocked. Then call invoice_report_payment with the hash (EVM) or signature (Solana). Errors: price_moved (the minimum fell below the request between quote and build — call again), no_route, native_sol_only (an invoice in SOL can only be paid in SOL), invoice_already_paid, private_invoice_paused (a private invoice created before 14/10/2026, paused until the Vurto vault exists). Both wallets are screened before the plan is built: the paying one (payer_blocked) and the receiving one (receiver_blocked). screening_unavailable (503) means the screening could not finish, try again in a few seconds.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | INV-XXXX-XXXX or the 8-character id. | |
| payer | Yes | The wallet that will sign and pay, on the invoice network. | |
| tokenIn | No | Optional: address/mint or symbol of the token the payer pays with. Omit to pay in the invoice token. | |
| slippageBps | No | Optional, default 50. The guaranteed minimum is computed after it, so a tighter slippage asks the payer for less. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only generic annotations, the description carries extensive behavioral context: it discloses third-party Scorechain/Didit screening, auth requirements via destination_challenge/destination_authorize, rate limits like 3 or 2 payer wallets per invoice, status codes such as payer_signature_required and analysis_attempts_exceeded, and the fact that nothing is signed or sent here.
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 sentence is front-loaded well, but the rest is a dense run-on wall of text. Key points are repeated, such as the both-wallet screening and the payer-proof-before-analysis flow, making it harder than necessary 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 complex payment-planning tool with no output schema, the description is unusually complete: it explains the returned plan shape, EVM and Solana signing flows, required follow-up calls, screening behavior, paid analysis constraints, and the major error conditions an agent will encounter.
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 still adds meaningful context beyond the schema by explaining that tokenIn defaults to the invoice token and that choosing another token changes the method, and by connecting slippageBps to the guaranteed minimum and the payer's requested amount.
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 states a specific verb and resource: 'Build the plan to pay an invoice from payer,' and immediately clarifies that nothing is signed or sent. It distinguishes the transfer and swap variants and their scope, so an agent can tell what the tool does 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?
The description gives explicit branching instructions: use method "transfer" for same-token payment, "swap" for another token, and "swap_then_transfer" for the split flow. It also names required follow-ups like prepare_signing, invoice_report_payment, destination_authorize, and invoice_pay again with next.body, plus error-specific alternatives such as retrying after price_moved.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invoice_report_analysis_paymentAIdempotentInspect
Hand the analysis payment transaction to the server once it is mined. The server reads it on-chain: a direct USDC transfer (the USDC of the invoice network) from the invoice creator to the Vurto fee wallet, of at least analysis.amount, newer than the invoice, never used for another analysis or invoice. screening_blocked (403): the free screening rejects the receiving wallet or the creator, and the payment is not registered. analysis_payment_pending (409): not mined yet, call again in a few seconds. analysis_payment_rejected (400) with details.reason (wrong_token, wrong_destination, amount_too_low, sender_not_creator, not_a_transfer, tx_reverted, tx_before_invoice): that transaction does not pay this analysis. tx_already_used (409): the hash already paid something else. Once paid, analysis.status is paid and the invoice can be paid. On Solana (new model) pass payer too: the transaction must be signed by that payer and only the fee wallet may gain USDC in it (the split payment of an invoice never pays it, usdc_to_other_wallet); once paid the receiver analysis runs right away and receiverAnalysis.result comes back (verdict and the paid tools, never the receiving wallet).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | INV-XXXX-XXXX or the 8-character id. | |
| payer | No | Solana (new model): the paying wallet that bought the receiver analysis. | |
| txHash | Yes | EVM transaction hash, or the Solana signature, of the analysis payment. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral context beyond the annotations: on-chain verification rules, screening behavior, pending and rejected states, specific rejection reasons, tx_already_used handling, and Solana payer constraints. It is consistent with the annotations and gives the agent a rich picture of what happens on success and failure.
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 core action is front-loaded and the dense error-code details are relevant to correct invocation. The single-paragraph format is somewhat run-on, but most sentences carry useful operational 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 complex payment-reporting tool with no output schema, the description covers success behavior, retry conditions, error codes, Solana-specific requirements, and the receiver analysis result. It gives enough context for an agent to call and interpret 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, but the description adds meaningful semantics for txHash and especially payer on Solana, including the requirement that the transaction be signed by that payer. It does not add much beyond the schema for id, but overall it improves parameter understanding.
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: reporting an analysis payment transaction to the server after it is mined, with on-chain verification details. It is clear what the tool does, but it does not explicitly distinguish itself from sibling tools such as invoice_analysis_pay or invoice_report_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?
It clearly says to call once the transaction is mined and to retry after a few seconds when the payment is pending. It also explains error conditions, but it does not explicitly name when to use this tool versus related siblings like invoice_analysis_pay.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invoice_report_paymentAIdempotentInspect
Hand the payment transaction to the server, right after sending it. The server reads the transaction on-chain and measures what reached the receiver in the invoice token; the payer must be the signer and the transaction must be newer than the invoice. The payer is screened again here (payer_blocked: a sanctioned or issuer-frozen payer does not count as paid, and once the network confirms the transaction the refusal is kept in the 10-year analysis record). With a paid analysis on the invoice and no prior proof of the payer wallet, the transaction itself is the proof: until the network confirms it the call returns payment_pending (409) and records nothing, so call again once it is mined. Pending until mined; invoice_get re-checks. An invoice holds at most 5 pending and 30 unconfirmed payments; past that, too_many_pending (429) until the network confirms the transaction, and a confirmed one is always accepted, so call again once it is mined. A hash pays each receiver once (tx_already_used once it confirmed another invoice of the same receiver and token); different receivers in one transaction are a batch payout.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | INV-XXXX-XXXX or the 8-character id. | |
| payer | Yes | The wallet that signed the payment. | |
| method | No | From invoice_pay.method. | |
| txHash | Yes | EVM transaction hash, or the Solana signature. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing payer re-screening with payer_blocked semantics, the 10-year retention of refusals, the pending-until-mined behavior with 409, the 5-pending/30-unconfirmed throttling with 429, and single-use txHash rules with tx_already_used. This is exactly the error/limit/auth context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and keeps every sentence substantive with no filler. However, it is a dense single paragraph where distinct concerns (screening, pending, limits, hash reuse) run together rather than being cleanly separated, slightly reducing scannability.
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 write-oriented reporting tool with no output schema, the description covers return-relevant states and error codes, idempotency behavior, rate limits, and proof semantics. An agent can invoke and handle responses correctly with this alone.
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 four parameters (id, payer, method, txHash) are already documented in the schema. The description reinforces that the payer must be the signer and the txHash is the proof, but adds no format or constraint detail beyond what the schema already provides, so the baseline 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?
States a specific action (report a payment transaction to the server) and resource (invoice payment), and explains that the server verifies on-chain what reached the receiver. It is clearly distinguishable from invoice_pay (which sends the payment) by the 'right after sending it' framing, though it never explicitly names the sibling it complements.
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 concrete usage context: call right after sending the transaction, call again once mined when you get payment_pending (409) or too_many_pending (429). It stops short of explicitly contrasting with invoice_report_analysis_payment or payout_report_payment, leaving that routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nn_buildAInspect
Builds ONE signable/sendable atomic transaction executing every leg of an N:N basket through VurtoSwapRouter. Always re-quotes the whole basket fresh from chainId/inputLegs/outputLegs — there is no quoteId handoff for N:N, pass the same fields used for nn_quote (or skip nn_quote and call this directly). No API key required: pass the wallet that will sign. A machine credential is optional and only raises your limit from the per-IP cap to the credential budget. Returns steps[]: one approve step per DISTINCT input token that still needs allowance, followed by ONE transaction step that executes every leg atomically. The approve target is the VurtoSwapRouter address (steps[].spender / the build's router), NOT each leg's underlying provider — this router pulls every input token itself inside one contract call, so approving providers individually the way swap_build does would approve the wrong address. If simulation.status is approval_required, send the approve step(s) first and call nn_build again for the executable transaction. legs[].routeSwitch, when present on a leg, means the provider the quote picked for THAT leg refused to build (it hit its request limit) and the leg was built with another provider instead: {from, to, reason}. Only that leg changed, the others are untouched, and the replacement is what will be signed: say which provider replaced it before the user signs. IMPORTANT: report_execution and swap_status do NOT support nn_build's transaction step — both key off a single quoteId, and this build has none (it is one transaction covering every leg, not one quote). After sending it, confirm success by checking the transaction receipt directly, not swap_status.
| Name | Required | Description | Default |
|---|---|---|---|
| wallet | Yes | Wallet that will sign. Required for builds and EVM execution/history calls. On an anonymous EVM quote, pass it to make the returned quoteId executable; without it the quote is indicative. | |
| chainId | Yes | EVM: integer from GET /v1/chains (1, 10, 56, 100, 137, 8453, 42161, 43114, 130). Solana: string from GET /v1/svm/chains ("solana-mainnet"). | |
| inputLegs | Yes | ||
| outputLegs | Yes | ||
| slippageBps | No | Optional, 5-500, applied to every leg. Default 50. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses critical behavior beyond the minimal annotations: no quoteId handoff, fresh re-quoting, optional machine credential rate-limit effects, approve-step targeting of VurtoSwapRouter rather than underlying providers, approval_required simulation flow, routeSwitch fallback semantics, and unsupported status endpoints. This is far more than the annotations alone 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 long, but the complexity of the tool justifies the length. It is front-loaded with the core purpose and organized around major behavioral topics (quoting, auth, steps, routeSwitch, status). A few sentences are slightly redundant, such as the repeated no-quoteId point, but no sentence 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?
With no output schema, the description fully explains the return shape (steps[] with approve steps and one transaction step), the approval flow, the routeSwitch replacement behavior, and the correct post-send verification path. It covers auth, prerequisites, and error/fallback conditions, leaving no critical gap 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 moderate at 60%, and the description adds contextual meaning by tying chainId/inputLegs/outputLegs to the fresh re-quote behavior and by explaining that wallet is the signing wallet. It does not walk through every parameter, but the schema already documents the individual fields, and the description clarifies how they are used together.
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: 'Builds ONE signable/sendable atomic transaction executing every leg of an N:N basket through VurtoSwapRouter.' It clearly distinguishes itself from related tools by emphasizing the N:N basket scope, the absence of quoteId handoff, and the contrast with swap_build's per-provider approvals.
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 when-to-use guidance: pass the same fields as nn_quote or skip nn_quote and call directly, and no API key is required. It also states when not to use supporting tools: report_execution and swap_status do not support this build's transaction step, so the agent should check the receipt directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nn_quoteARead-onlyInspect
N:N — quotes a basket where N input tokens fund M output tokens in ONE atomic on-chain transaction. The backend runs a waterfall allocation deciding which input finances which output, then quotes the real tokenIn->tokenOut route for each resulting slice through the same provider fan-out swap_quote uses. NOT decomposable into independent swap_quote/double_quote calls — the allocation itself is the thing being computed, not just N+M separate prices for legs you already know. inputLegs[]: what you sell (tokenIn + amount or amountRaw, each). outputLegs[]: what you want back, as outputPercent — an integer percent of the TOTAL basket value, not a fixed amount, because the actual split depends on the allocation; every outputLegs[].outputPercent in the request must sum to exactly 100. Up to 10 combined input+output legs; the waterfall never produces more than inputLegs.length + outputLegs.length - 1 real on-chain legs. Returns { legs[], failures[] }. Each entry in legs[] is a real quoted tokenIn->tokenOut leg (a NormalizedQuote under .quote, plus amountIn/tokenIn/tokenOut/receiver for that slice) — this is what nn_build will execute, not a rough preview. failures[] lists any slice that found no route; a partial basket is possible and reported, never silently dropped.
| Name | Required | Description | Default |
|---|---|---|---|
| wallet | No | Wallet that will sign. Required for builds and EVM execution/history calls. On an anonymous EVM quote, pass it to make the returned quoteId executable; without it the quote is indicative. | |
| chainId | Yes | EVM: integer from GET /v1/chains (1, 10, 56, 100, 137, 8453, 42161, 43114, 130). Solana: string from GET /v1/svm/chains ("solana-mainnet"). On EVM the multi-swap router must be deployed on the chain or the quote fails with multi_swap_not_supported_on_chain; on Solana there is no router contract, several top-level instructions in one transaction are already all-or-nothing by runtime rule. | |
| inputLegs | Yes | ||
| outputLegs | Yes | ||
| slippageBps | No | Optional, 5-500, applied to every leg. Default 50. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context: the waterfall allocation, the atomicity, the fact that failures[] can result in a partial basket that is 'never silently dropped,' and the relationship to nn_build (legs are what will be executed). It also discloses chain-specific failure modes (multi_swap_not_supported_on_chain) and Solana's runtime all-or-nothing rule. This goes well beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: it defines the tool, explains the allocation, gives the outputPercent constraint, states limits, and describes the return shape. It is longer than average, but the complexity of the tool justifies the length. The most critical differentiator (NOT decomposable) is front-loaded early. Slight redundancy exists between the schema's outputPercent description and the tool description, but that is minor.
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 complex N:N quoting tool with no output schema, the description does a strong job: it explains the return shape (legs[] with NormalizedQuote, failures[]), the partial-basket behavior, the leg count bound, and the chain-specific constraints. It does not detail pagination or exact failure error formats, but those are less critical for a quote tool. The annotations cover safety, and the schema covers parameters. The description is complete enough for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 60%, so the description carries some burden. It adds meaning to inputLegs[] and outputLegs[] by explaining the allocation semantics: outputPercent is 'an integer percent of the TOTAL basket value, not a fixed amount, because the actual split depends on the allocation.' It also clarifies the leg count limit and the resulting on-chain leg count formula. The wallet parameter is not discussed in the description, but the schema already covers it well. The description compensates for the schema's gaps on the core basket semantics.
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 precise definition: 'N:N — quotes a basket where N input tokens fund M output tokens in ONE atomic on-chain transaction.' It names the specific verb (quotes), the resource (a basket), and the key differentiator (atomic, waterfall allocation). It also explicitly contrasts with swap_quote/double_quote, making sibling differentiation clear.
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 states when NOT to use this tool: 'NOT decomposable into independent swap_quote/double_quote calls — the allocation itself is the thing being computed.' It also explains the outputPercent constraint and the partial-basket behavior, giving an agent clear conditions for invocation. The sibling list includes swap_quote and double_quote, and the description directly addresses why those alternatives are not equivalent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
payout_batchAInspect
Payroll and supplier payouts on Solana: pay up to 20 wallets their exact amounts, in the token the payer holds (no swap). The paying wallet and every receiving wallet are screened first (OFAC SDN list and the issuer freeze of six stablecoins); a blocked payer refuses with payer_blocked (403), and one blocked recipient refuses the whole batch with receiver_blocked (403) and details.index of that row, before anything is created. Each recipient becomes a regular invoice (history, on-chain verification). Returns { invoices[], transactions[] }: the transfers are packed in as few transactions as fit the network limit, each with its invoiceIds. Sign each transactions[i].transaction (prepare_signing, then POST to /v1/svm/execute), then payout_report_payment with that signature and those invoiceIds. Errors: batch_svm_only, batch_duplicate_recipient (add the amounts up in one row), batch_self_payment, too_many_recipients, token_not_listed, screening_unavailable (503, try again).
| Name | Required | Description | Default |
|---|---|---|---|
| payer | Yes | The wallet that signs and pays. | |
| token | Yes | Mint or symbol of a verified token, e.g. "USDC". Every recipient is paid in it. | |
| chainId | Yes | ||
| recipients | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations: discloses pre-flight OFAC/freeze screening, that failures are atomic (refused before anything is created), and pins each error to a code and HTTP status (payer_blocked, receiver_blocked with details.index, screening_unavailable 503). It also explains output shape and transaction packing against the network limit, which matters for a non-idempotent, open-world write.
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?
Front-loads purpose, then workflow, then errors — a sensible order with no filler sentences. It is a single very dense paragraph with heavy parenthetical nesting, which slightly hurts scannability for such a long body.
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?
No output schema exists, and the description supplies the return contract (invoices[], transactions[], invoiceIds per transaction) plus the next step for each signature. For a 4-param, non-idempotent, multi-step money-movement tool, an agent has everything needed to call it and recover from each documented failure.
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 only 50% (chainId and the recipients array lack field descriptions), and the description compensates: it ties 'token' to a verified/listed token via token_not_listed, states the 20-wallet cap, and converts recipient rules into actionable errors (batch_duplicate_recipient says to sum amounts into one row, batch_self_payment enforces payer exclusion). Remaining gap is that chainId and the per-recipient memo/amount formatting are only covered 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?
Opens with a specific verb+resource+scope: pay up to 20 wallets their exact amounts, in the payer's token, on Solana, with an explicit 'no swap' qualifier that separates it from swap_build/swap_quote. The follow-up relationship to payout_report_payment and prepare_signing is named, so an agent can place it in the sibling set immediately.
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 the full activation-to-completion chain: build the batch, sign each transactions[i].transaction via prepare_signing + /v1/svm/execute, then confirm with payout_report_payment. It is clear when to reach for this rather than swap/double/nn builds, but it never states exclusion conditions (e.g. when to use invoice_pay for a single recipient instead).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
payout_report_paymentAIdempotentInspect
Hand one batch transaction to the server, right after sending it, with the invoiceIds that payout_batch listed for it. Each invoice is verified on-chain like any invoice payment (what reached that receiver); call again a few seconds later if some are still pending.
| Name | Required | Description | Default |
|---|---|---|---|
| payer | Yes | The wallet that signed. | |
| txHash | Yes | The Solana signature. | |
| invoiceIds | Yes | From payout_batch.transactions[i].invoiceIds. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true and destructiveHint=false; the description corroborates this by telling the agent re-calling is safe and expected while items are pending. It also discloses that verification is on-chain against the actual receiver, which the annotations do not convey. Return shape is not described, but no output schema exists to lean on.
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, no filler, and the primary action plus its prerequisite (send first) is front-loaded ahead of the pending/retry caveat. Every clause carries 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 3-parameter reporting tool with no output schema, the description covers the prerequisite, the source of invoiceIds, the verification model, and the pending/retry behavior. It is close to complete; only the sibling-vs-sibling distinction is left implicit.
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 payer, txHash and invoiceIds are already documented, including that invoiceIds come from payout_batch.transactions[i].invoiceIds. The description adds only the framing that the call handles 'one batch transaction', leaving the baseline 3 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 action (hand a batch transaction to the server) on a specific resource, and ties the input back to payout_batch. It does not explicitly distinguish itself from the sibling invoice_report_payment, so the batch-vs-single boundary is only implied by the word 'batch'.
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 clear timing ('right after sending it') and a retry rule ('call again a few seconds later if some are still pending'), which is genuinely actionable. It never names the alternative tool (invoice_report_payment) or states an exclusion, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prepare_signingARead-onlyIdempotentInspect
Synthesizes the local CLI signer invocation for one step of a swap_build plan. Does not call the Vurto backend — this only assembles the payload. You (the agent) do not need a private key and must never ask for one in chat: signing happens locally on the user's machine. RUN the command yourself as a background task (it blocks until the user approves/rejects/times out, then prints one JSON line and exits) and react to its exit — never ask the user "did you sign?". EVM supports "approve"/"transaction" steps (send tx.to/tx.data on-chain) and "signature" steps (sign step.typedData off-chain, EIP-712 — a CoW order; no gas, no transaction, no hash). expected_keys in the response tells you which result field to read: txHash for the first two, signature for the third. Solana has no steps[] and no approve: pass chainId "solana-mainnet" and step {transaction: build.transaction, executionRef: build.executionRef}. The response returns a different signer (Solana keys are not EVM keys) with the same shape, and expected_keys is signedTransaction — POST it to /v1/svm/execute, which broadcasts it and returns the signature.
| Name | Required | Description | Default |
|---|---|---|---|
| step | Yes | EVM: one entry from swap_build's steps[]. Solana: {transaction, executionRef} from the build. | |
| buildId | Yes | From a prior swap_build/swap_refresh response. | |
| chainId | Yes | EVM: integer from GET /v1/chains (1, 10, 56, 100, 137, 8453, 42161, 43114, 130). Solana: string from GET /v1/svm/chains ("solana-mainnet"). | |
| walletAddress | Yes | The wallet the plan was built for. The signer refuses to sign if the connected wallet does not match. On Solana this is base58 and CASE-SENSITIVE: lowercasing it produces a different, non-existent address. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and idempotentHint annotations, the description discloses critical behavior: the command blocks until user approval/rejection/timeout, prints one JSON line, and exits; expected_keys tells which result field to read; Solana returns a different signer with the same shape and requires POSTing to /v1/svm/execute. This is rich, non-obvious behavioral context that annotations alone would not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence carries high-signal operational detail. It is front-loaded with the core purpose, then flows into agent instructions, EVM behavior, and Solana behavior. There is no filler or repetition of schema content.
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 the return behavior: one JSON line, expected_keys values (txHash, signature, signedTransaction), and the follow-up POST for Solana. It also covers blocking behavior, chain-specific differences, and the private-key handling rule, making it complete for a complex 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, but the description adds meaningful parameter semantics: it explains EVM step types (approve/transaction/signature), Solana's lack of steps[] and approve, the exact step shape to pass for Solana, and the significance of executionRef absence. This goes beyond the schema's field-level 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 states a specific verb and resource: it 'synthesizes the local CLI signer invocation for one step of a swap_build plan' and explicitly distinguishes itself by noting it 'does not call the Vurto backend'. This clearly separates it from backend-calling siblings and makes its role 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 gives explicit operational guidance: the agent must not ask for a private key, should run the command as a background task, and should never ask the user 'did you sign?'. It also clarifies when EVM vs Solana parameter shapes apply. It does not name sibling tools as alternatives, but the context is clear enough for correct use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
report_executionAIdempotentInspect
Reports a completed swap, closing the loop. EVM transaction: pass wallet + txHash + quoteId; never report an approve step as an execution. EVM CoW signature: pass wallet + chainId + quoteId + signature; the server reloads the stored build and submits the signed order, returning uid (there is no transaction hash for this path). Solana: pass buildId + signature; the server verifies the fee payer and transaction on the network. No API key required; a machine credential only raises limits.
| Name | Required | Description | Default |
|---|---|---|---|
| txHash | No | EVM transaction swap only; do not report approve hashes. | |
| wallet | No | Wallet that will sign. Required for builds and EVM execution/history calls. On an anonymous EVM quote, pass it to make the returned quoteId executable; without it the quote is indicative. | |
| buildId | No | Solana: buildId returned by swap_build. | |
| chainId | No | EVM CoW: integer chain id. Solana may use "solana-mainnet", but buildId + signature are sufficient. | |
| quoteId | No | EVM: quote id from the built plan. | |
| signature | No | EVM: EIP-712 CoW signature. Solana: transaction signature. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations by disclosing server-side behavior: the server reloads the stored build, submits the signed CoW order, returns a uid, verifies the Solana fee payer/transaction, and has no transaction hash for the CoW path. It also clarifies credential behavior, adding real context without contradicting the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every clause earns its place. It front-loads the purpose, then gives three compact path-specific sentences and a final credential note, with no filler or repetition.
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 multi-path, 6-parameter tool with no output schema, the description covers parameter routing, server-side effects, auth, and the CoW path's uid return. It stop short of describing return or error semantics for the EVM-transaction and Solana paths, which is a minor but real 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?
Schema coverage is 100%, so the baseline is 3, but the description adds crucial cross-parameter relationships: wallet + txHash + quoteId for EVM, wallet + chainId + quoteId + signature for CoW, and buildId + signature for Solana. This combinatorial guidance is not visible in the flat schema and meaningfully helps an agent assemble correct calls.
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 'Reports a completed swap, closing the loop,' which clearly names the action and resource. It then details three distinct invocation paths (EVM transaction, EVM CoW signature, Solana), making it easy to distinguish from sibling build/quote/status 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 precise parameter combinations for each execution path and an explicit exclusion: 'never report an approve step as an execution.' It also notes that no API key is required. It does not explicitly name sibling alternatives like swap_status, but the path-specific guidance is strong enough to route correct usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
swap_buildAInspect
Build a signable/sendable plan for a swap. This is the tool that does the work — an agent that only knows this tool can execute a swap end to end. Quotes and builds the best route in one call when quoteId is omitted (recommended): a route with GAIN first, re-quoting up to 3 rounds total before accepting one without gain, the same rule as Invoice; pass quoteId from a prior swap_quote to build exactly that route instead. No API key required: pass the wallet that will sign. A machine credential is optional and only raises your limit from the per-IP cap to the credential budget. Four things to hold onto: 1. steps[] are ORDERED and REQUIRED. Skipping an approve step guarantees a revert. 2. If simulation.status is "approval_required", sign/send only the approve step(s), do not report them as the swap execution, then call swap_build again with quoteId set to the quote.id of that build (the approved route; without it a fresh quote may pick another provider whose spender you never approved). If it is "incomplete", do not sign anything: the transaction was never independently verified. 3. If a step has type "signature", there is no transaction and never will be one for that step — what exists afterward is the uid from report_execution, not a hash. 4. If the provider is cowswap and the token sold is the chain's native asset, the transaction only REGISTERS the order — a successful receipt is not a successful swap. Use swap_status, not the receipt, to know what actually happened. 5. routeSwitch, when present, means the route you asked for refused to build (it hit its request limit) and the plan was built with another provider instead: {from, to, reason}. The quote in the plan is the route that will actually be signed. If the user picked that route themselves, say which provider replaced it before they sign.
| Name | Required | Description | Default |
|---|---|---|---|
| amount | No | Human decimal amount, e.g. "100". Use this OR amountRaw, not both. | |
| wallet | Yes | Wallet that will sign. Required for builds and EVM execution/history calls. On an anonymous EVM quote, pass it to make the returned quoteId executable; without it the quote is indicative. | |
| chainId | Yes | EVM: integer from GET /v1/chains (1, 10, 56, 100, 137, 8453, 42161, 43114, 130). Solana: string from GET /v1/svm/chains ("solana-mainnet"). | |
| quoteId | No | Optional: build exactly this route from a prior swap_quote, instead of quoting fresh. | |
| tokenIn | No | Contract address (Solana: mint), or symbol (case-insensitive). A symbol matching more than one token on this chain fails with ambiguous_token and every candidate — pick the address you meant and retry. On Solana only VERIFIED tokens resolve by symbol, because there anyone can mint a token using another one's symbol; an unverified token has to be named by its mint. | |
| receiver | No | Optional: deliver the output to this address instead of the signing wallet. Only providers with supportsReceiver true on the resulting quote honor it — others are left out of quotes[] entirely rather than risk sending to the wrong address. supportsReceiver is present on Solana quotes too, so read it instead of assuming. On Solana, selling into native SOL with a separate destination is refused on every provider (receiver_native_sol_unsupported): closing the wrapped-SOL account sends balance and rent to whoever signs. Ask for wSOL instead. Building with a receiver needs the paying wallet's signed authorization first (destination_challenge, then destination_authorize), or the build fails with destination_not_authorized. | |
| tokenOut | No | Contract address, or symbol. | |
| amountRaw | No | Raw integer string in tokenIn's smallest unit. | |
| slippageBps | No | Optional, a sane per-pair default applies when omitted. | |
| maxSlippageBps | No | Optional ceiling, 0-10000, enforced on every future refresh of this build — once set it never loosens. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the safety profile (readOnly=false, openWorld=true, idempotent=false), so the description carries real behavioral weight and delivers: step ordering/required-revert behavior, approval_required vs incomplete simulation handling, signature-step semantics (uid not hash), the cowswap native-asset registration caveat, routeSwitch fallback meaning, and the destination authorization prerequisite. This is far beyond what annotations 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?
Front-loaded with the purpose and the recommended mode, then a clearly enumerated list of pitfalls. Dense but each sentence earns its place; minor flaw is the numbered list introduced as 'Four things' that actually contains five items.
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 complex, multi-step mutation tool with no output schema, the description covers execution flow, failure modes, ordering requirements, credentials, and downstream verification. An agent has everything needed to call it and interpret results 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 genuine meaning: wallet is the signer and only a machine credential (not an API key) raises limits, amount vs amountRaw are mutually exclusive, and receiver behavior/authorization constraints are spelled out. Some of this duplicates schema text, keeping it just below 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?
States a specific verb+resource ('Build a signable/sendable plan for a swap') and immediately distinguishes itself from swap_quote by explaining the quoteId-omitted vs quoteId-passed modes. An agent can route between the quote and build tools without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly recommends omitting quoteId to quote-and-build in one call, names the alternative (pass quoteId from swap_quote to build exactly that route), and points to swap_status for post-execution verification. When-to-use and the sibling alternative are both stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
swap_quoteARead-onlyInspect
Compare ranked routes across providers for a swap, without building or spending anything. Ranked by net value after gas and platform fee, not raw output, with ONE unit price for the output token across every route, so a friendlier price feed can never put a route that delivers fewer tokens on top. Each quote also carries estimatedGas, the gas in units behind the same gasUsd, if you would rather rank against a gas price you read yourself. A quote is only usable by swap_build for about 10-12 seconds — do not hold onto a quoteId and build it later, quote again instead.
| Name | Required | Description | Default |
|---|---|---|---|
| amount | No | Human decimal amount, e.g. "100". Use this OR amountRaw, not both. | |
| wallet | No | Wallet that will sign. Required for builds and EVM execution/history calls. On an anonymous EVM quote, pass it to make the returned quoteId executable; without it the quote is indicative. | |
| chainId | Yes | EVM: integer from GET /v1/chains (1, 10, 56, 100, 137, 8453, 42161, 43114, 130). Solana: string from GET /v1/svm/chains ("solana-mainnet"). | |
| tokenIn | Yes | Contract address (Solana: mint), or symbol (case-insensitive). A symbol matching more than one token on this chain fails with ambiguous_token and every candidate — pick the address you meant and retry. On Solana only VERIFIED tokens resolve by symbol, because there anyone can mint a token using another one's symbol; an unverified token has to be named by its mint. | |
| receiver | No | Optional: deliver the output to this address instead of the signing wallet. Only providers with supportsReceiver true on the resulting quote honor it — others are left out of quotes[] entirely rather than risk sending to the wrong address. supportsReceiver is present on Solana quotes too, so read it instead of assuming. On Solana, selling into native SOL with a separate destination is refused on every provider (receiver_native_sol_unsupported): closing the wrapped-SOL account sends balance and rent to whoever signs. Ask for wSOL instead. Building with a receiver needs the paying wallet's signed authorization first (destination_challenge, then destination_authorize), or the build fails with destination_not_authorized. | |
| tokenOut | Yes | Contract address, or symbol. | |
| amountRaw | No | Raw integer string in tokenIn's smallest unit. | |
| slippageBps | No | Optional, a sane per-pair default applies when omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations: discloses the ~10-12 second quote TTL and the non-persistable quoteId, the ranking basis (net value after gas and platform fee, single unit price for the output token), the estimatedGas/gasUsd pairing for self-sourced gas prices, and provider filtering when a receiver is set. The idempotentHint=false annotation is corroborated by the ephemeral-quote 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?
Purpose and the 'no build, no spend' guarantee are front-loaded, and the operational caveat (quote expiry) closes the entry. It is dense and mostly earns its length, though the ranking rationale sentence is wordier than needed.
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?
With no output schema and eight parameters, the description covers what matters: return concepts (quotes[], quoteId, estimatedGas, gasUsd, supportsReceiver), key error paths (ambiguous_token, receiver_native_sol_unsupported, destination_not_authorized), and cross-tool linkage to destination_challenge/authorize. It stops short of describing the full quote payload shape, but nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter including the subtle wallet/receiver semantics is already documented structurally. The description restates the wallet executability rule and receiver provider-filtering rather than adding syntax or constraints the schema lacks, so it lands at the baseline 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?
States a specific verb and resource ('Compare ranked routes across providers for a swap') plus an explicit negative scope ('without building or spending anything'), which cleanly separates it from swap_build. An agent can pick this over its siblings without reading either 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?
Clear when-to-use context (pre-build comparison) and a routing hint to swap_build as the consumer of a quoteId, including the advice to re-quote rather than hold a stale id. It does not, however, differentiate itself from other quote siblings such as double_quote or nn_quote, so the alternative-selection guidance is incomplete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
swap_statusARead-onlyIdempotentInspect
Re-checks a swap. EVM: pass wallet + executionId (the id from report_execution); for CoW ETH-flow this consults the orderbook and distinguishes order_expired_refundable from order_expired_refunded instead of trusting the registration receipt. Solana: pass signature; answers come directly from the network and may be confirmed, pending, failed or expired.
| Name | Required | Description | Default |
|---|---|---|---|
| wallet | No | Wallet that will sign. Required for builds and EVM execution/history calls. On an anonymous EVM quote, pass it to make the returned quoteId executable; without it the quote is indicative. | |
| signature | No | Solana: the transaction signature. Answers come from the network itself: confirmed, pending, failed, or expired (past lastValidBlockHeight the transaction can no longer enter any block). | |
| executionId | No | EVM: the id returned by report_execution. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool read-only and idempotent; the description adds meaningful behavioral detail: for CoW ETH-flow it consults the orderbook and distinguishes order_expired_refundable from order_expired_refunded (rather than trusting the receipt), and for Solana it lists the possible network statuses (confirmed, pending, failed, expired). This goes beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two well-organized sentences with no fluff. The core purpose is front-loaded ('Re-checks a swap'), and the EVM/Solana split is clear and scannable. Every clause adds value; nothing is redundant.
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 handles multiple chains and optional parameters, yet the description explains the chain-specific inputs and even hints at possible outcomes (statuses for Solana, distinguishing expiry types for CoW). With no output schema, it gives enough about the expected return behavior. It doesn't describe the exact return structure, but for a status-check tool this is sufficient.
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%, giving a baseline of 3. The description adds cross-chain usage context: it specifies which parameters apply to which chain (wallet+executionId for EVM, signature for Solana), and clarifies that executionId comes from report_execution. This is additional meaning beyond the schema's per-parameter descriptions, which are more generic.
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 ('Re-checks a swap') and immediately separates EVM and Solana variants, clarifying that this is a status-check tool distinct from the build/quote/execution siblings. It even names the source of the executionId (report_execution), which disambiguates it from that sibling.
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 parameters to pass for each chain ('EVM: pass wallet + executionId', 'Solana: pass signature') and references report_execution as the source of the id, implying this tool is used after execution to re-check status. It doesn't explicitly say 'use this instead of X', but the contextual guidance is clear enough given the sibling names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wallet_checkARead-onlyIdempotentInspect
Check any wallet (EVM 0x address or Solana base58, case-sensitive) before paying it or taking its money: OFAC SDN list on both families; on Solana also the issuer freeze of USDC and EURC (Circle), USDT (Tether), PYUSD and USDG (Paxos) and USD1 (World Liberty), the issuer freeze index, and a fund trail up to three hops back. Returns verdict passed, blocked or unavailable, with each check. Paying an invoice (invoice_pay) runs this check on the receiving wallet and refuses with receiver_blocked, so a payment through Vurto Payments never reaches a sanctioned or frozen wallet. To pay someone directly, create an invoice to their wallet (invoice_create) and pay it with invoice_pay. Plain swaps (swap_build, double_build, nn_build) do not run it. The Scorechain and Merkle Science checks are paid and run only inside an invoice whose analysis was paid; asking for them here returns paid_check_requires_invoice (400).
| Name | Required | Description | Default |
|---|---|---|---|
| checks | No | Kept for compatibility; leave it out. Every extra check is paid since 22/10/2026 ("scorechain" 0.15 and "merkle-science" 0.60 USDC) and runs only inside an invoice whose analysis was paid (invoice_create with checks, then invoice_analysis_pay): here any of them is refused with paid_check_requires_invoice (400), so the paid analysis never becomes a free lookup. Any other value is refused with invalid_check. | |
| wallet | Yes | The wallet to check. EVM 0x address, or Solana base58 (case-sensitive). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, yet the description adds substantive behavior: the three possible verdicts (passed, blocked, unavailable), that invoice_pay auto-runs this and refuses with receiver_blocked, and that paid checks (Scorechain/Merkle Science) return paid_check_requires_invoice (400) here. These are non-obvious failure modes and costs that annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action in the opening clause, then layers scope, then integrations. It is dense but not padded; the only mild redundancy is the paid-check caveat appearing both in the description prose and again in the schema's `checks` description.
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?
With no output schema, the description carries the return-value burden and does so ('Returns verdict passed, blocked or unavailable, with each check'). It also covers cost, error codes, and the invoice-flow integration — everything an agent needs to call it and interpret the result.
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 goes further by explaining the trap around the `checks` parameter: it is 'kept for compatibility; leave it out', costs 0.15/0.60 USDC, and is refused here with a specific error code — meaning an agent understands not just the type but why it exists and what will happen.
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 + resource + scope: 'Check any wallet (EVM 0x address or Solana base58, case-sensitive) before paying it'. It then enumerates exactly what is checked (OFAC SDN, issuer freeze lists, fund trail), which distinguishes it from sibling tools like invoice_pay or swap_build without requiring 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?
Gives an explicit when ('before paying it or taking its money'), names the automatic alternative ('Paying an invoice (invoice_pay) runs this check... so a payment... never reaches a sanctioned or frozen wallet'), and names exclusions ('Plain swaps (swap_build, double_build, nn_build) do not run it'). An agent can route correctly with no inference.
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.
4 tool updates
- Added
invoice_analysis_pay - Changed
invoice_create4 fields changed- changed
Input schema / properties / checks / descriptionPrevious value: -"Optional extra screening chosen by the invoice creator; default none. \"scorechain\": when this invoice is paid, both wallets (payer and receiver) are also checked against the Scorechain sanctions API, which means both are sent to Scorechain. Runs only when chosen. Any other value is refused with invalid_check."New value: +"Optional extra screening chosen by the invoice creator; default none. Any other value is refused with invalid_check. Both checks are PAID by the creator, for both wallets (payer and receiver), before the invoice can be paid. EVM networks only (the old model): on Solana paid checks here are refused with paid_check_moved; use payerChecks instead, and the payer contracts the receiver analysis with invoice_analysis_pay. \"scorechain\" (0.15 USDC): the Scorechain sanctions API, which sends both wallets to Scorechain. Available on Optimism, BNB Chain, Gnosis, Unichain, Polygon, Base, Arbitrum, Avalanche and Solana. \"merkle-science\" (0.60 USDC): the Merkle Science analysis via Didit (score, summary, risk factors and where the money came from), which sends both wallets to Didit/Merkle Science. Available on Base, Optimism, Arbitrum, BNB Chain, Polygon and Solana. Both together: one transfer of 0.75 USDC. Ethereum answers check_not_available_on_chain for both (coming soon), as do the networks a check does not cover. The invoice comes back with analysis {status: \"awaiting_payment\", checks, amount (the sum), token (USDC of that network), to (Vurto fee wallet), chainId}: the creator pays it first with invoice_analysis_pay (sign) and invoice_report_analysis_payment; until then the invoice cannot be paid (analysis_unpaid). The creator is the signed-in wallet, or the receiving wallet when there is no session (always the receiving wallet over MCP), and only the creator can pay the analysis. The analysis is not sold when the free screening rejects the receiving or the creating wallet (screening_blocked, 403)." - changed
Input schema / properties / checks / items / enumPrevious value: -[ - "scorechain" -]New value: +[ + "scorechain", + "merkle-science" +] - added
Input schema / properties / payerChecksAdded value: +{ + "description": "Solana and EVM networks with invoiceSplit=true in /v1/chains, stablecoin invoices only: USDC, USDT (including USDT0), PYUSD, USDG and USD1, by verified address on each network. Availability differs by network. The PAID analysis of the PAYER wallet is chosen by you (the receiver) and paid out of the amount you receive. Price per wallet: \"merkle-science\" 0.30, \"scorechain\" 0.075 (both 0.375). The fee that goes to the Vurto fee wallet is the LARGER of that sum and 0.5% of the amount. The percentage rounds down on Solana and up on EVM to the token's smallest unit; EVM fees cannot exceed 10% of the amount: a 100 USDC invoice with merkle-science has fee 0.50 (you receive 99.50); a 20 USDC invoice has fee 0.30 (you receive 19.70). invoice.split comes back with fee, receiverAmount and feeWallet. It runs only when the payer clicks pay (invoice_pay), after the free screening passes, and the payer cannot switch it off. The payment is then ONE transaction that splits the amount between you and the fee wallet; a payment without the fee in that same transaction does not settle the invoice. Refused: split_not_available_on_chain where no split contract is configured, stablecoin_required for tokens outside the network allowlist, amount_below_fee, fee_above_maximum (EVM fee exceeds 10%), analysis_offer_suspended (403) when this receiving wallet left 2 approved paid analyses without payment (each completed payment gives 2 back).", + "items": { + "enum": [ + "scorechain", + "merkle-science" + ], + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / token / descriptionPrevious value: -"Token to receive: address/mint or symbol of a verified token on this network."New value: +"Token to receive: address/mint or symbol of a verified dollar stablecoin on the network allowlist. Other tokens return stablecoin_required, even without paid analysis."
- Added
invoice_report_analysis_payment - Changed
wallet_check2 fields changed- changed
Input schema / properties / checks / descriptionPrevious value: -"Optional extra checks; default none. \"scorechain\" sends this wallet to the Scorechain sanctions API and adds a scorechain line (listed, clear or unavailable). Runs only when chosen; limited to 10 per hour per IP. Any other value is refused with invalid_check."New value: +"Kept for compatibility; leave it out. Every extra check is paid since 22/10/2026 (\"scorechain\" 0.15 and \"merkle-science\" 0.60 USDC) and runs only inside an invoice whose analysis was paid (invoice_create with checks, then invoice_analysis_pay): here any of them is refused with paid_check_requires_invoice (400), so the paid analysis never becomes a free lookup. Any other value is refused with invalid_check." - changed
Input schema / properties / checks / items / enumPrevious value: -[ - "scorechain" -]New value: +[ + "scorechain", + "merkle-science" +]
2 tool updates
- Changed
invoice_create1 field changed- added
Input schema / properties / checksAdded value: +{ + "description": "Optional extra screening chosen by the invoice creator; default none. \"scorechain\": when this invoice is paid, both wallets (payer and receiver) are also checked against the Scorechain sanctions API, which means both are sent to Scorechain. Runs only when chosen. Any other value is refused with invalid_check.", + "items": { + "enum": [ + "scorechain" + ], + "type": "string" + }, + "type": "array" +}
- Changed
wallet_check1 field changed- added
Input schema / properties / checksAdded value: +{ + "description": "Optional extra checks; default none. \"scorechain\" sends this wallet to the Scorechain sanctions API and adds a scorechain line (listed, clear or unavailable). Runs only when chosen; limited to 10 per hour per IP. Any other value is refused with invalid_check.", + "items": { + "enum": [ + "scorechain" + ], + "type": "string" + }, + "type": "array" +}
7 tool updates
- Added
destination_authorize - Added
destination_challenge - Changed
double_build2 fields changed- changed
Input schema / properties / legA / properties / receiver / descriptionPrevious value: -"Optional: deliver the output to this address instead of the signing wallet. Only providers with supportsReceiver true on the resulting quote honor it — others are left out of quotes[] entirely rather than risk sending to the wrong address. supportsReceiver is present on Solana quotes too, so read it instead of assuming. On Solana, selling into native SOL with a separate destination is refused on every provider (receiver_native_sol_unsupported): closing the wrapped-SOL account sends balance and rent to whoever signs. Ask for wSOL instead."New value: +"Optional: deliver the output to this address instead of the signing wallet. Only providers with supportsReceiver true on the resulting quote honor it — others are left out of quotes[] entirely rather than risk sending to the wrong address. supportsReceiver is present on Solana quotes too, so read it instead of assuming. On Solana, selling into native SOL with a separate destination is refused on every provider (receiver_native_sol_unsupported): closing the wrapped-SOL account sends balance and rent to whoever signs. Ask for wSOL instead. Building with a receiver needs the paying wallet's signed authorization first (destination_challenge, then destination_authorize), or the build fails with destination_not_authorized." - changed
Input schema / properties / legB / properties / receiver / descriptionPrevious value: -"Optional: deliver the output to this address instead of the signing wallet. Only providers with supportsReceiver true on the resulting quote honor it — others are left out of quotes[] entirely rather than risk sending to the wrong address. supportsReceiver is present on Solana quotes too, so read it instead of assuming. On Solana, selling into native SOL with a separate destination is refused on every provider (receiver_native_sol_unsupported): closing the wrapped-SOL account sends balance and rent to whoever signs. Ask for wSOL instead."New value: +"Optional: deliver the output to this address instead of the signing wallet. Only providers with supportsReceiver true on the resulting quote honor it — others are left out of quotes[] entirely rather than risk sending to the wrong address. supportsReceiver is present on Solana quotes too, so read it instead of assuming. On Solana, selling into native SOL with a separate destination is refused on every provider (receiver_native_sol_unsupported): closing the wrapped-SOL account sends balance and rent to whoever signs. Ask for wSOL instead. Building with a receiver needs the paying wallet's signed authorization first (destination_challenge, then destination_authorize), or the build fails with destination_not_authorized."
- Changed
double_quote2 fields changed- changed
Input schema / properties / legA / properties / receiver / descriptionPrevious value: -"Optional: deliver the output to this address instead of the signing wallet. Only providers with supportsReceiver true on the resulting quote honor it — others are left out of quotes[] entirely rather than risk sending to the wrong address. supportsReceiver is present on Solana quotes too, so read it instead of assuming. On Solana, selling into native SOL with a separate destination is refused on every provider (receiver_native_sol_unsupported): closing the wrapped-SOL account sends balance and rent to whoever signs. Ask for wSOL instead."New value: +"Optional: deliver the output to this address instead of the signing wallet. Only providers with supportsReceiver true on the resulting quote honor it — others are left out of quotes[] entirely rather than risk sending to the wrong address. supportsReceiver is present on Solana quotes too, so read it instead of assuming. On Solana, selling into native SOL with a separate destination is refused on every provider (receiver_native_sol_unsupported): closing the wrapped-SOL account sends balance and rent to whoever signs. Ask for wSOL instead. Building with a receiver needs the paying wallet's signed authorization first (destination_challenge, then destination_authorize), or the build fails with destination_not_authorized." - changed
Input schema / properties / legB / properties / receiver / descriptionPrevious value: -"Optional: deliver the output to this address instead of the signing wallet. Only providers with supportsReceiver true on the resulting quote honor it — others are left out of quotes[] entirely rather than risk sending to the wrong address. supportsReceiver is present on Solana quotes too, so read it instead of assuming. On Solana, selling into native SOL with a separate destination is refused on every provider (receiver_native_sol_unsupported): closing the wrapped-SOL account sends balance and rent to whoever signs. Ask for wSOL instead."New value: +"Optional: deliver the output to this address instead of the signing wallet. Only providers with supportsReceiver true on the resulting quote honor it — others are left out of quotes[] entirely rather than risk sending to the wrong address. supportsReceiver is present on Solana quotes too, so read it instead of assuming. On Solana, selling into native SOL with a separate destination is refused on every provider (receiver_native_sol_unsupported): closing the wrapped-SOL account sends balance and rent to whoever signs. Ask for wSOL instead. Building with a receiver needs the paying wallet's signed authorization first (destination_challenge, then destination_authorize), or the build fails with destination_not_authorized."
- Changed
invoice_create1 field changed- changed
Input schema / properties / confidential / descriptionPrevious value: -"Optional, Solana only. A private (confidential) invoice hides the receiving wallet from anyone with the link (invoice_get returns recipient: null), and every payment route screens the payer first: OFAC SDN list plus the issuer freeze of USDC and EURC (Circle), USDT (Tether), PYUSD and USDG (Paxos) and USD1 (World Liberty), the issuer freeze index, and a fund trail up to three hops back through the same checks (a flagged sender on the first hop blocks; on hops two and three it only warns). These are checks of the paying wallet, whatever token it pays with. A blocked payer gets payer_blocked."New value: +"Not available yet: private invoices are coming soon, with the Vurto vault. Any value other than false is refused with private_coming_soon and nothing is created. A payment is a direct transfer, so the transaction shows the receiving wallet on-chain; omit this field."
- Changed
swap_build1 field changed- changed
Input schema / properties / receiver / descriptionPrevious value: -"Optional: deliver the output to this address instead of the signing wallet. Only providers with supportsReceiver true on the resulting quote honor it — others are left out of quotes[] entirely rather than risk sending to the wrong address. supportsReceiver is present on Solana quotes too, so read it instead of assuming. On Solana, selling into native SOL with a separate destination is refused on every provider (receiver_native_sol_unsupported): closing the wrapped-SOL account sends balance and rent to whoever signs. Ask for wSOL instead."New value: +"Optional: deliver the output to this address instead of the signing wallet. Only providers with supportsReceiver true on the resulting quote honor it — others are left out of quotes[] entirely rather than risk sending to the wrong address. supportsReceiver is present on Solana quotes too, so read it instead of assuming. On Solana, selling into native SOL with a separate destination is refused on every provider (receiver_native_sol_unsupported): closing the wrapped-SOL account sends balance and rent to whoever signs. Ask for wSOL instead. Building with a receiver needs the paying wallet's signed authorization first (destination_challenge, then destination_authorize), or the build fails with destination_not_authorized."
- Changed
swap_quote1 field changed- changed
Input schema / properties / receiver / descriptionPrevious value: -"Optional: deliver the output to this address instead of the signing wallet. Only providers with supportsReceiver true on the resulting quote honor it — others are left out of quotes[] entirely rather than risk sending to the wrong address. supportsReceiver is present on Solana quotes too, so read it instead of assuming. On Solana, selling into native SOL with a separate destination is refused on every provider (receiver_native_sol_unsupported): closing the wrapped-SOL account sends balance and rent to whoever signs. Ask for wSOL instead."New value: +"Optional: deliver the output to this address instead of the signing wallet. Only providers with supportsReceiver true on the resulting quote honor it — others are left out of quotes[] entirely rather than risk sending to the wrong address. supportsReceiver is present on Solana quotes too, so read it instead of assuming. On Solana, selling into native SOL with a separate destination is refused on every provider (receiver_native_sol_unsupported): closing the wrapped-SOL account sends balance and rent to whoever signs. Ask for wSOL instead. Building with a receiver needs the paying wallet's signed authorization first (destination_challenge, then destination_authorize), or the build fails with destination_not_authorized."
2 tool updates
- Added
payout_batch - Added
payout_report_payment
1 tool update
- Added
wallet_check
1 tool update
- Changed
invoice_create1 field changed- added
Input schema / properties / confidentialAdded value: +{ + "description": "Optional, Solana only. A private (confidential) invoice hides the receiving wallet from anyone with the link (invoice_get returns recipient: null), and every payment route screens the payer first: OFAC SDN list plus the issuer freeze of USDC and EURC (Circle), USDT (Tether), PYUSD and USDG (Paxos) and USD1 (World Liberty), the issuer freeze index, and a fund trail up to three hops back through the same checks (a flagged sender on the first hop blocks; on hops two and three it only warns). These are checks of the paying wallet, whatever token it pays with. A blocked payer gets payer_blocked.", + "type": "boolean" +}
4 tool updates
- Added
invoice_create - Added
invoice_get - Added
invoice_pay - Added
invoice_report_payment
9 tool updates
- First observed
double_build - First observed
double_quote - First observed
nn_build - First observed
nn_quote - First observed
prepare_signing - First observed
report_execution - First observed
swap_build - First observed
swap_quote - First observed
swap_status
Related MCP Connectors
Best-price cross-chain swap quotes across 70 chains (EVM + Solana). Holds no keys, never signs.
Non-custodial DEX aggregator for autonomous AI agents: best-price swaps on 8 chains, no API key.
Cross-chain swap API for native Bitcoin, Solana and EVM chains. No API key, no custody.
Swap, bridge and get gas on 6 EVM chains. Each plan states its outcome before you sign. No API key.
Related MCP Servers
- AlicenseAqualityAmaintenanceReal-time non-custodial crypto swap rates, fees, and on-chain routing across 240+ multi-chain pairs.142MIT
- AlicenseNot gradedqualityDmaintenanceFree DEX aggregator API that returns executable swap calldata across 46 EVM chains. No API key required. Single GET request returns ready-to-sign transactions for any token pair.22MIT
- AlicenseNot gradedqualityCmaintenanceNon-custodial Solana swap routing with best-price execution, flat 0.25% fee, and built-in on-chain scam checking for token safety.46 npmMIT
- AlicenseNot gradedqualityCmaintenanceEnables users and agents to obtain MEV-protected multichain swap and cross-chain bridge quotes, check supported chains, and generate prefilled swap URLs, with gasless Permit2 execution and x402 or API-key access.107 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.