Skip to main content
Glama
stables-money

Stables MCP Server

Official

Stables MCP Server

An MCP (Model Context Protocol) server that exposes the Stables fiat-to-crypto API to AI agents. This allows AI assistants like Claude, ChatGPT, Cursor, Codex, and other MCP-compatible clients to manage customers, create USDC and USDT quotes, execute approved transfers, and handle virtual accounts programmatically.

Use it to build stablecoin payment workflows for AI agents and agentic commerce: payouts, virtual account deposits, treasury movement, fiat off-ramping, and webhook reconciliation.

What is MCP?

MCP (Model Context Protocol) is an open standard that provides a standardized way to connect AI applications to external tools and data sources. Think of it like a "USB-C port for AI" - any AI that supports MCP can use any MCP server.

Related MCP server: Yolfi MCP Server

Features

This MCP server provides 51 tools across 11 categories, one for every operation documented on docs.stables.money (a contract test checks this, see below):

Customer Management

  • create_customer - Create individual or business customers

  • create_customer_onboarding_link - Create a customer and a hosted verification link in one call

  • get_customer - Get customer details and verification status

  • list_customers - List all customers

  • get_verification_link - Generate KYC verification links

  • update_customer - Update customer details and entitlements

  • update_customer_metadata - Update customer metadata key-value pairs

Entitlements

  • list_available_entitlements - Products and rails a customer can still apply for

  • request_entitlements - Apply for entitlements (e.g. aed_local) for an existing customer

  • submit_entitlement_requirements - Send the extra verification Stables asks for

Compliance requests (RFIs)

  • list_rfis - The organisation's RFIs: what compliance needs before it releases a held payment or verification

  • list_customer_rfis - One customer's RFIs

  • get_rfi - One RFI, its requirements and how to answer each

  • get_rfi_evidence_form - The form an evidence requirement asks for

  • submit_rfi_evidence - Send the answers and documents for an evidence requirement

  • get_kyc_capabilities - Verification capabilities a customer holds

Documents

  • add_document - Attach an invoice, contract or other document to a transfer or a deposit

  • list_documents - Documents on a transfer or a deposit

  • get_document_download_url - Short-lived download link for a document

  • delete_document - Remove a document

Quotes

  • create_quote - Get exchange rate quotes (USDC/USDT to fiat)

  • get_quote - Check quote status and details

Transfers

  • validate_payment_method - Check payout details against a corridor's rules before transferring

  • create_transfer - Execute a transfer using an active quote, paid by deposit or from your balance

  • get_transfer - Check transfer status

  • list_transfers - List transfers with filters

Virtual Accounts

  • create_virtual_account - Create virtual bank accounts for fiat deposits

  • list_virtual_accounts - List virtual accounts for a customer, or across all customers

  • update_virtual_account - Update virtual account settings

  • register_route_payid - Register a PayID on an AUD payment route

  • get_virtual_account_history - Get deposits and their payouts for a payment route

  • update_route_destination - Change the payout wallet on an existing route

  • list_route_whitelist / add_route_whitelist_account / update_route_whitelist_account - Source-account whitelisting for AUD routes

Balances

  • get_balance - Your organisation's balance per asset and network

  • get_balance_wallet / create_balance_wallet - The deposit wallet that tops up the balance

  • list_balance_activity - Deposits credited to the balance

  • list_pending_balance_deposits - Deposits held before crediting, and why

  • list_whitelisted_wallets - Wallets allowed to fund the balance

Sandbox

  • simulate_route_deposit - Simulate a fiat deposit into a payment route (sandbox only)

  • simulate_transfer_deposit - Simulate the inbound crypto an off-ramp transfer awaits (sandbox only)

API Keys

  • create_api_key - Create a new API key

  • list_api_keys - List all API keys

  • get_api_key - Get API key details

  • revoke_api_key - Revoke an API key

Webhooks

  • create_webhook - Subscribe to events via webhook

  • list_webhooks - List all webhook subscriptions

  • delete_webhook - Delete a webhook subscription

  • list_webhook_deliveries - Recent delivery attempts, status codes and retry state

The server runs as a hosted service, so there is nothing to install. Point your MCP client at:

https://mcp.stables.money/mcp

and send your Stables API key as a bearer token. The key you get during onboarding is all you need: a sti_test_… key reaches sandbox, a sti_live_… key reaches production and moves real money. The hosted server keeps no credentials of its own; every request carries yours.

Claude Code

claude mcp add --transport http stables https://mcp.stables.money/mcp --header "Authorization: Bearer ${STABLES_API_KEY}"

Cursor, VS Code, Windsurf and other clients with a url field

{
  "mcpServers": {
    "stables": {
      "url": "https://mcp.stables.money/mcp",
      "headers": {
        "Authorization": "Bearer sti_test_..."
      }
    }
  }
}

Codex

[mcp_servers.stables]
url = "https://mcp.stables.money/mcp"
bearer_token_env_var = "STABLES_API_KEY"

Claude.ai and ChatGPT

Claude.ai custom connectors and ChatGPT connectors sign in with OAuth rather than a fixed key. OAuth sign-in for the hosted server is in progress; until it ships, use one of the clients above, or run the server locally as described below.

Running locally

The same server also runs as a local process over stdio, which is what npx stables-mcp-server does. Use this for a sti_local_… key against your own deployment, or when your client cannot reach the internet.

Installation

# Install from npm
npm install -g stables-mcp-server

# Or clone and build from source
git clone https://github.com/stables-money/mcp-server.git
cd mcp-server
npm install
npm run build

Configuration

The server requires the following environment variables:

Variable

Required

Description

STABLES_API_KEY

Yes

Your Stables API key

STABLES_API_URL

No

API base URL. Defaults to the environment your key belongs to (see below). Must use HTTPS.

Which environment you're talking to

Stables keys carry their environment: sti_test_… is a sandbox key, sti_live_… is a production key, and the API refuses a key that arrives at the wrong environment. So you don't have to set a URL — leave STABLES_API_URL unset and the key decides:

Your key

Where requests go

sti_test_…

https://api.sandbox.stables.money

sti_live_…

https://api.stables.money — real money

sti_local_… or anything else

production, unless you set STABLES_API_URL

Setting STABLES_API_URL always wins, which is how you reach staging, dev or a local deployment.

Start with a sandbox key. An agent holding a live key can move real money on your behalf; see agent safety.

Usage

With Claude Desktop

Add to ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "stables": {
      "command": "npx",
      "args": ["stables-mcp-server"],
      "env": {
        "STABLES_API_KEY": "your-api-key",
        "STABLES_API_URL": "https://api.sandbox.stables.money"
      }
    }
  }
}

Then restart Claude Desktop.

With Cursor, Codex, ChatGPT, or another MCP client

Use the same command and environment variables in any MCP-compatible client:

{
  "mcpServers": {
    "stables": {
      "command": "npx",
      "args": ["stables-mcp-server"],
      "env": {
        "STABLES_API_KEY": "your-api-key",
        "STABLES_API_URL": "https://api.sandbox.stables.money"
      }
    }
  }
}

Agent safety

Stables is financial infrastructure. Agents should create quotes, prepare payment objects, and reconcile webhooks, but should require explicit human approval before creating transfers or other money movement. Check customer KYC/KYB status and entitlements before transactional actions, and treat sanctions, unsupported jurisdiction, verification, or compliance failures as hard stops.

With MCP Inspector (for testing)

# Set environment variables
export STABLES_API_KEY=your-api-key
export STABLES_API_URL=https://api.sandbox.stables.money

# Run the inspector
npm run inspect

Direct Execution

STABLES_API_KEY=your-api-key node build/index.js

Example Conversations

Creating a customer and getting a quote

User: "Create a customer for john@example.com and get a quote to convert 1000 USDT to EUR"

AI (using MCP tools):

  1. Calls create_customer with email and type

  2. Calls create_quote with source USDT + network, destination EUR + country, and destinationNetwork (swift or bank)

  3. Returns customer details and quote information

Checking transfer status

User: "What's the status of all my pending transfers?"

AI (using MCP tools):

  1. Calls list_transfers with status=created or status=in_progress (statuses are lowercase)

  2. Returns a formatted list of in-flight transfers

Setting up auto-payout

User: "Create a payment route for customer abc123 that pays AUD deposits out to my Polygon USDT wallet 0x..."

AI (using MCP tools):

  1. Calls create_virtual_account with the customer ID, AUD source currency, and the Polygon destination (the payout address is mandatory)

  2. Returns the deposit instructions to share with the customer

Paying out to a European beneficiary

User: "Pay 500 EUR to this German bank account"

AI (using MCP tools):

  1. Collects the extra beneficiary details EUR requires — recipientType, a full address, and dateOfBirth for individuals — before doing anything else

  2. Calls create_quote, then create_transfer once a human approves

Development

# Watch mode for development
npm run dev

# Build for production
npm run build

# Run tests
npm test

# Run linter
npm run lint

# Format code
npm run format

# Test with MCP Inspector
npm run inspect

Project Structure

stables-mcp-server/
├── src/
│   ├── index.ts              # Main entry point
│   ├── lib/
│   │   ├── stables-client.ts # Stables API client (with retries, timeouts)
│   │   └── stables-client.test.ts
│   └── tools/
│       ├── customers.ts      # Customer management tools (7)
│       ├── entitlements.ts   # Entitlement tools (3)
│       ├── compliance.ts     # RFI and KYC capability tools (6)
│       ├── documents.ts      # Transfer and deposit document tools (4)
│       ├── quotes.ts         # Quote tools (2)
│       ├── transfers.ts      # Transfer tools (4)
│       ├── virtual-accounts.ts # Payment route tools (9)
│       ├── balances.ts       # Balance tools (6)
│       ├── api-keys.ts       # API key tools (4)
│       ├── webhooks.ts       # Webhook tools (3)
│       └── sandbox.ts        # Sandbox deposit simulation (2)
├── package.json
├── tsconfig.json
├── vitest.config.ts
├── eslint.config.js
└── README.md

API Reference

Customer Tools

create_customer

Create a new customer for KYC and transfers.

Parameter

Type

Required

Description

email

string

Yes

Customer's email

customerType

"individual" | "business"

Yes

Type of customer

firstName

string

No

First name (for individuals)

lastName

string

No

Last name (for individuals)

companyName

string

No

Company name (for businesses)

entitlements

string[]

No

Entitlements to request (e.g., ["base_payout", "virtual_account"])

get_customer

Get customer details.

Parameter

Type

Required

Description

customerId

string

Yes

Customer ID

list_customers

List all customers for the authenticated tenant. No parameters required.

Generate a KYC verification link.

Parameter

Type

Required

Description

customerId

string

Yes

Customer ID

ttlInSecs

number

No

Link expiry in seconds (default: 1800)

successUrl

string

No

Redirect URL after successful verification

rejectUrl

string

No

Redirect URL after rejected verification

update_customer

Update customer details or entitlements.

Parameter

Type

Required

Description

customerId

string

Yes

Customer ID

email

string

No

Updated email

phone

string

No

Updated phone

firstName

string

No

Updated first name

lastName

string

No

Updated last name

entitlements

string[]

No

Updated entitlements

update_customer_metadata

Update customer metadata key-value pairs.

Parameter

Type

Required

Description

customerId

string

Yes

Customer ID

metadata

object

Yes

Key-value pairs to set

Quote Tools

create_quote

Get a quote for currency exchange (crypto to fiat).

Parameter

Type

Required

Description

fromCurrency

"USDC" | "USDT"

Yes

Source cryptocurrency

fromAmount

string

Yes

Amount to convert

fromNetwork

"ethereum" | "polygon" | "polygon-amoy"

Yes

Blockchain network

toCurrency

string

Yes

Destination currency (e.g., "EUR")

toCountry

string

Yes

Destination country code (e.g., "GR")

paymentMethodType

"SWIFT" | "LOCAL"

Yes

Payment method for payout

get_quote

Get quote details.

Parameter

Type

Required

Description

quoteId

string

Yes

Quote ID

Transfer Tools

create_transfer

Execute a transfer from a quote.

Parameter

Type

Required

Description

customerId

string

Yes

Customer ID

quoteId

string

Yes

Quote ID to execute

accountHolderName

string

No

Bank account holder name

iban

string

No

IBAN

accountNumber

string

No

Bank account number

bankName

string

No

Bank name

bankCountry

string

No

Bank country code

bankCurrency

string

No

Payout currency

accountType

"savings" | "checking" | "payment"

No

Account type

swiftCode

string

No

SWIFT/BIC code

routingNumber

string

No

ABA routing number (US)

sortCode

string

No

Sort code (UK)

ifscCode

string

No

IFSC code (India)

bsbCode

string

No

BSB code (Australia)

get_transfer

Get transfer status.

Parameter

Type

Required

Description

transferId

string

Yes

Transfer ID

list_transfers

List transfers with filters.

Parameter

Type

Required

Description

status

string

No

Filter by status

type

string

No

Filter by type

customerId

string

No

Filter by customer

pageSize

number

No

Results per page

pageToken

string

No

Pagination token

Virtual Account Tools

create_virtual_account

Create a virtual bank account.

Parameter

Type

Required

Description

customerId

string

Yes

Customer ID

sourceCurrency

string

Yes

Currency (e.g., "USD")

depositHandlingMode

string

No

"auto_payout", "hold", or "manual"

destinationAddress

string

No

Crypto wallet address

destinationPaymentRail

string

No

Blockchain network

destinationCurrency

string

No

Stablecoin (default: "usdc")

list_virtual_accounts

List virtual accounts for a customer.

Parameter

Type

Required

Description

customerId

string

Yes

Customer ID

status

string

No

Filter by status

limit

number

No

Max results

update_virtual_account

Update virtual account settings.

Parameter

Type

Required

Description

customerId

string

Yes

Customer ID

virtualAccountId

string

Yes

Virtual account ID

depositHandlingMode

string

Yes

New deposit handling mode

get_virtual_account_history

Get activity history for a virtual account.

Parameter

Type

Required

Description

customerId

string

Yes

Customer ID

virtualAccountId

string

Yes

Virtual account ID

limit

number

No

Max events to return

eventType

string

No

Filter by event type

API Key Tools

create_api_key

Create a new API key.

Parameter

Type

Required

Description

name

string

Yes

Descriptive name for the key

metadata

object

No

Optional metadata

list_api_keys

List all API keys.

Parameter

Type

Required

Description

pageSize

number

No

Results per page

pageToken

string

No

Pagination token

get_api_key

Get API key details.

Parameter

Type

Required

Description

apiKeyId

string

Yes

API key ID

revoke_api_key

Revoke an API key (permanent).

Parameter

Type

Required

Description

apiKeyId

string

Yes

API key ID

Webhook Tools

create_webhook

Subscribe to events via webhook.

Parameter

Type

Required

Description

name

string

Yes

Webhook name

url

string

Yes

HTTPS endpoint URL

eventTypes

string[]

Yes

Events to subscribe to

secret

string

No

HMAC-SHA256 signing secret

Available event types:

  • WEBHOOK_EVENT_TYPE_CUSTOMER_CREATED

  • WEBHOOK_EVENT_TYPE_CUSTOMER_UPDATED

  • WEBHOOK_EVENT_TYPE_KYC_STATUS_CHANGED

  • WEBHOOK_EVENT_TYPE_PAYMENT_CREATED

  • WEBHOOK_EVENT_TYPE_PAYMENT_STATUS_CHANGED

  • WEBHOOK_EVENT_TYPE_QUOTE_CREATED

  • WEBHOOK_EVENT_TYPE_QUOTE_EXPIRED

  • WEBHOOK_EVENT_TYPE_VA_DEPOSIT_RECEIVED

  • WEBHOOK_EVENT_TYPE_VA_PAYOUT_COMPLETED

  • WEBHOOK_EVENT_TYPE_VA_PAYOUT_FAILED

  • WEBHOOK_EVENT_TYPE_ALL

list_webhooks

List all webhook subscriptions. No parameters required.

delete_webhook

Delete a webhook subscription.

Parameter

Type

Required

Description

webhookId

string

Yes

Webhook subscription ID

Security

  • API keys are only read from environment variables

  • HTTPS required for API URL (enforced at startup)

  • No debug logging to stderr (would corrupt MCP STDIO transport)

  • All inputs are validated with Zod schemas

  • Request timeouts (30s) prevent hung connections

  • Automatic retries with exponential backoff for transient failures

License

MIT

Available Tools

51 tools
add_documentA

Attach a supporting document (invoice, contract or other) to a transfer or a payment route deposit, for example when Stables compliance asks for one. The file goes as a base64 data URL ('data:application/pdf;base64,...').

ParametersJSON Schema
NameRequiredDescriptionDefault
onYesWhat the document belongs to: a transfer, or a deposit on a payment route
typeNoWhat the document is (default other)
fileNameYesFile name shown to Stables, e.g. 'invoice-2041.pdf'
base64UrlYesThe file as a data URL: 'data:<mime>;base64,<data>'
transactionIdYesThe transfer ID, or the deposit ID from get_virtual_account_history

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations, the description carries the full burden and does disclose the critical input constraint: the file must be a base64 data URL with an explicit example. It does not say what happens on duplicate uploads, size or MIME limits, required permissions, or whether the document then becomes visible to compliance review.

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

Conciseness5/5

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

Two sentences, zero filler, with the operation and target front-loaded and the format constraint second. Nothing could be removed without losing information.

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

Completeness4/5

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

For a five-parameter mutation with full schema coverage and no output schema, the description supplies purpose, target objects and payload format. It stops short of covering behavioral outcomes (post-upload visibility, error conditions) that an agent would want before invoking a write tool.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all five parameters including the enums and their defaults. The description only reinforces the base64Url format with an example, adding minor value over the schema. Baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource ('Attach a supporting document') plus the two attachment targets (transfer or payment route deposit). This is clearly distinguishable from siblings like list_documents, get_document_download_url and delete_document, which operate on already-existing documents.

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

Usage Guidelines3/5

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

Offers one concrete use case ('for example when Stables compliance asks for one'), which implies when to reach for it. However, it never mentions alternatives such as submit_rfi_evidence when an RFI is open, nor any when-not-to-use condition, so routing among document-related siblings is left to inference.

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

add_route_whitelist_accountC

Whitelist an Australian bank account (BSB and account number) to pay into an AUD payment route.

ParametersJSON Schema
NameRequiredDescriptionDefault
enabledNoWhether deposits from it are accepted now
bsbNumberYesSource account BSB
customerIdYesThe customer ID
accountNumberYesSource account number
virtualAccountIdYesThe AUD payment route (virtual account) ID

TDQS

C2.9/5.0
Behavior2/5

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

No annotations exist, so the description carries the full behavioral burden, and it adds little. It states a mutation but says nothing about permissions/entitlements required, idempotency or duplicate handling, whether whitelisting triggers verification, or what happens if the account is already whitelisted for the route. Only the Australian format implied by 'BSB and account number' is disclosed.

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

Conciseness4/5

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

A single tight sentence with the action front-loaded and a useful parenthetical clarifying the account identifiers. Nothing is padded, though the brevity comes partly from omitting information an agent would want.

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

Completeness2/5

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

For a 4-required-parameter mutation with no annotations, no output schema and no enum constraints, the description should say more about prerequisites, entitlement requirements and post-call state. Given that complexity, a one-line description leaves meaningful gaps, though it does not mislead.

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

Parameters3/5

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

Schema description coverage is 100% across all 5 parameters, so the schema already documents customerId, virtualAccountId, bsbNumber, accountNumber and enabled. The description only restates BSB and account number and adds no format, constraint, or default information beyond the schema, so the baseline 3 applies.

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

Purpose4/5

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

The description gives a specific verb ('Whitelist') plus two concrete resources (an Australian bank account identified by BSB/account number, and an AUD payment route). This implicitly separates it from register_route_payid (PayID, not bank account) and create_virtual_account, but it never explicitly names or contrasts a sibling, so it falls short of a 5.

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

Usage Guidelines2/5

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

There is no when-to-use guidance, no prerequisites (e.g. the route must already exist, the customer must be verified), and no mention of alternatives such as update_route_whitelist_account or list_route_whitelist despite both being siblings. The scenario is only faintly implied by 'to pay into an AUD payment route'.

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

create_api_keyA

Create a new API key for accessing the Stables API. The secret key is only shown once on creation - save it immediately.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesA descriptive name for this API key (e.g., 'Production Bot', 'Agent Smith')
metadataNoOptional metadata to attach to the key

TDQS

A3.6/5.0
Behavior3/5

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

With no annotations provided, the description carries full burden. It discloses that the secret key is only shown once and must be saved immediately, which is a critical behavioral trait. However, it does not mention other relevant behaviors such as side effects, authentication requirements, or typical response structure.

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

Conciseness5/5

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

Two sentences: the first clearly states purpose, the second provides critical behavioral information. Every word earns its place, and the description is front-loaded.

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

Completeness4/5

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

Given no output schema and a simple creation tool, the description covers the essential purpose and the one-time secret behavior. It could be improved by mentioning that the API key ID is returned or providing more context about the response, but the current information is largely sufficient for an agent to use the tool correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so the input schema already documents both parameters adequately. The description does not add meaning beyond the schema; the note about saving the secret key is unrelated to parameter semantics. Baseline score of 3 is appropriate.

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

Purpose5/5

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

The description clearly states the verb ('Create') and the resource ('a new API key for accessing the Stables API'). It is specific and distinguishes this tool from sibling tools like `get_api_key`, `list_api_keys`, and `revoke_api_key`.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives (e.g., when to create vs. get vs. list). It only includes a note to save the secret key immediately, which is about post-creation action, not usage context.

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

create_balance_walletA

Create the deposit wallet that tops up your balance on a network. Creation is asynchronous: the first answer is 'creating'; poll get_balance_wallet until it is 'active'. Safe to call again while creation is in flight.

ParametersJSON Schema
NameRequiredDescriptionDefault
networkYesNetwork for the wallet

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations, the description carries the full behavioral burden and does well: it discloses the asynchronous lifecycle, the initial 'creating' state, and that repeat calls during flight are safe. It omits auth/permission requirements and any rate-limit or failure semantics, keeping it short of a 5.

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

Conciseness5/5

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

Three short sentences, each earning its place: purpose first, then the async contract, then the retry safety. No filler and no redundancy with the schema.

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

Completeness5/5

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

For a one-parameter async creation tool with no output schema, the description covers everything an agent needs: what it makes, that the result is deferred, which sibling to poll, and that retries are safe. Nothing material is missing.

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

Parameters3/5

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

Schema coverage is 100% and the single 'network' parameter has a documented enum, so the schema already does the heavy lifting. The description only echoes 'on a network' without adding format or selection meaning, so the baseline 3 is appropriate.

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

Purpose5/5

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

States a specific verb and resource ('Create the deposit wallet') plus its purpose ('tops up your balance on a network'). It also names the related sibling get_balance_wallet, so an agent can distinguish this creation tool from the read tool without opening either schema.

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

Usage Guidelines5/5

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

Gives explicit operational guidance: creation is asynchronous, the first answer is 'creating', and the agent should poll get_balance_wallet until 'active'. It also states the retry condition ('safe to call again while creation is in flight'), covering both the follow-up action and idempotent re-invocation.

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

create_customerB

Create a new customer in Stables for KYC verification and transfers. Use 'individual' for personal accounts or 'business' for company accounts. Include entitlements like 'base_payout' to enable transactions.

ParametersJSON Schema
NameRequiredDescriptionDefault
dobNoDate of birth in YYYY-MM-DD format (e.g., '1990-01-15')
typeNoCompany type (e.g., 'Private Company Limited by Shares')
emailNoCustomer's email address
phoneNoPhone number with country code (e.g., '+14155552671')
taxIdNoTax ID (e.g., '12-3456789')
countryNoCountry code ISO 3166-1 alpha-2 (required for businesses, e.g., 'US')
websiteNoWebsite URL
lastNameNoLast name (required for individuals)
firstNameNoFirst name (required for individuals)
middleNameNoMiddle name
acceptTermsNoAccept Stables' terms of service and privacy policy
addressCityNoCity
companyNameNoCompany name (required for businesses)
nationalityNoTwo-letter country code (e.g., 'US', 'GB')
addressLine1NoStreet address line 1
addressLine2NoStreet address line 2
addressStateNoState or region
customerTypeYesType of customer - 'individual' for personal, 'business' for companies
entitlementsNoList of entitlements to request
sourceOfFundsNoSource of funds
accountPurposeNoWhat will you use Stables for?
addressCountryNoTwo-letter country code (e.g., 'US')
incorporatedOnNoDate of incorporation in YYYY-MM-DD format
describeBusinessNoDescription of the business
legalAddressCityNoLegal address city (for businesses)
addressPostalCodeNoPostal/ZIP code
legalAddressLine1NoLegal address line 1 (for businesses)
legalAddressLine2NoLegal address line 2 (for businesses)
legalAddressStateNoLegal address state (for businesses)
externalCustomerIdNoYour own reference ID for this customer
registrationNumberNoBusiness registration number
accountPurposeOtherNoExplain purpose (required if accountPurpose is OTHER)
legalAddressCountryNoLegal address country code (for businesses)
conductMoneyServicesNoWhether the company conducts money services
registrationLocationNoRegistration location (e.g., state for USA)
describeMoneyServicesNoDescribe money services (required if conductMoneyServices is true)
expectedAnnualRevenueNoEstimated annual revenue in USD
legalAddressPostalCodeNoLegal address postal code (for businesses)
expectedMonthlyPaymentsNoExpected monthly payments in USD
sourceOfFundsDescriptionNoDescribe where your business funds come from
describeComplianceControlsNoDescription of compliance controls
operateInProhibitedCountryNoDoes your business operate in any prohibited countries?
doesYourBusinessEngageInHighRiskActivitiesNoDoes your business engage in high risk activities?

TDQS

B3.1/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden. It implies a write operation ('Create'), but discloses nothing about idempotency, required permissions, the subsequent KYC state, or what happens to fields not supplied. For a 43-parameter mutation tool this is a substantial gap.

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

Conciseness4/5

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

Three short sentences, front-loaded with the core action and with the type guidance close behind. No filler, though the entitlements sentence is slightly loose ('like').

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

Completeness2/5

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

Given 43 parameters, a single required field, several conditional field groups (business legal address, money-services descriptions), no annotations and no output schema, the description is too thin. It omits any guidance on the field dependencies an agent must satisfy to get a valid creation through.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already documents every parameter including enums and conditional requirements. The description's mention of customerType values and entitlements largely restates what the schema provides, meriting the baseline 3.

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

Purpose4/5

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

States a specific verb and resource ('Create a new customer') plus the downstream purpose (KYC verification and transfers). It does not, however, distinguish this from closely-named siblings such as create_customer_onboarding_link or update_customer, so the agent must infer which creation path applies.

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

Usage Guidelines3/5

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

It gives conditional guidance on customerType ('individual' for personal, 'business' for company) and hints that entitlements like 'base_payout' enable transactions, but offers no when-to-use versus alternatives like create_customer_onboarding_link, and no prerequisites such as accepting terms.

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

create_quoteA

Get a quote for a currency exchange: the rate, the fees, and what the customer receives. Quotes are short-lived, so create one immediately before the transfer. Off-ramp converts a stablecoin to fiat (source network required, destination country required); on-ramp converts fiat to a stablecoin (destination address required). Set preview to price without committing.

ParametersJSON Schema
NameRequiredDescriptionDefault
previewNoPrice the quote without persisting it, to show an estimate
metadataNoOptional metadata
sourceAmountYesAmount to convert, in major units (e.g. '125.75')
sourceNetworkNoBlockchain network of the source. Required for off-ramp, omitted for on-ramp
sourceCurrencyYesSource currency: a stablecoin for off-ramp (e.g. 'USDT'), fiat for on-ramp
destinationAddressNoDestination wallet address. Required for on-ramp
destinationCountryNoDestination country, ISO 2-letter. Required for off-ramp
destinationNetworkNoOff-ramp: payment network, 'swift' or 'bank'. On-ramp: blockchain network. Replaces the old paymentMethodType
destinationCurrencyYesDestination currency: fiat for off-ramp (e.g. 'EUR'), a stablecoin for on-ramp

TDQS

A4.1/5.0
Behavior4/5

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

No annotations are present, so the description carries the full behavioral burden and does disclose meaningful traits: quotes expire, preview prices 'without committing', and the off-ramp/on-ramp requirements differ. It omits the expiry window, whether a non-preview call persists an artifact, auth/permission needs, and error behavior, which leaves gaps for an unannotated creation tool.

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

Conciseness5/5

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

Four sentences that are front-loaded with purpose, then timing, then mode conditions, then the preview flag. Every sentence earns its place and no phrasing is wasted.

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

Completeness4/5

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

With no annotations and no output schema, the description needs to carry the operational context, and it covers purpose, lifetime, mode requirements and the preview distinction adequately. The remaining gaps (expiry duration, what a persisted quote returns, failure modes) are minor for a 100%-covered schema but keep it short of complete.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds value by synthesizing the cross-parameter conditional logic (source network and destination country for off-ramp; destination address for on-ramp) into a single readable rule rather than leaving the agent to reconcile scattered per-field notes. It does not add format details beyond the schema.

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

Purpose4/5

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

States a specific resource ('a quote for a currency exchange') and enumerates what it produces (rate, fees, what the customer receives), so the agent knows exactly what it gets. It implicitly separates itself from the get_quote sibling via 'create one immediately before the transfer', but never names that sibling explicitly, so full differentiation credit is withheld.

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

Usage Guidelines4/5

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

Gives clear when-to-use context ('create one immediately before the transfer' because quotes are short-lived) and branches by mode, spelling out what each of off-ramp vs on-ramp requires. It stops short of naming alternatives (e.g. get_quote for retrieving an existing quote) or stating when not to call it.

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

create_transferA

Execute a transfer using an active quote. The quote must not be expired. This initiates real money movement, so get explicit human approval first. For payouts in AED, CAD, EUR, GBP, MXN, USD you must also supply recipientType, the full beneficiary address, and dateOfBirth when the recipient is an individual.

ParametersJSON Schema
NameRequiredDescriptionDefault
ibanNoIBAN (EU/international)
cnapsNoCNAPS (China)
payIdNoPayID alias (AUD only). Requires payIdType
bicCodeNoBIC (EUR/GBP international)
bsbCodeNoBSB code (Australia)
quoteIdYesThe quote ID to execute
bankCodeNoBank code / institution number (CAD)
bankNameNoName of the destination bank
ifscCodeNoIFSC code (India)
metadataNoOptional metadata
sortCodeNoSort code (UK)
payIdTypeNoPayID alias type. Required when payId is given
swiftCodeNoSWIFT code
branchCodeNoBranch code / transit number (CAD)
customerIdYesThe customer ID for this transfer
accountTypeNoAccount type. Required for CAD and USD bank payouts
addressCityNoBeneficiary city
bankCountryNoBank country, ISO 2-letter (e.g. 'AU', 'US')
dateOfBirthNoBeneficiary date of birth, YYYY-MM-DD. Required when recipientType is individual for AED, CAD, EUR, GBP, MXN, USD
purposeCodeNoPurpose of the transfer (e.g. 'SALARY'). Required on some corridors
addressStateNoBeneficiary state or region
bankCurrencyNoPayout currency, ISO 3-letter (e.g. 'EUR')
accountNumberNoBank account number, if not using IBAN
addressStreetNoBeneficiary street address
fundingSourceNofund_transfer (default) returns deposit instructions for the customer; prefund_balance pays from your organisation's balance and starts immediately. Check get_balance first: transfers_enabled must be true and the quote's source asset must be held on its network
recipientTypeNoBeneficiary type. Required for AED, CAD, EUR, GBP, MXN, USD
routingNumberNoABA routing number (US)
addressCountryNoBeneficiary country, ISO 2-letter. The complete address is required for AED, CAD, EUR, GBP, MXN, USD
destinationTypeNoPayout target: a bank account (off-ramp) or a wallet addressbank
accountHolderNameNoAccount holder's full name, or the company name when recipientType is business
addressPostalCodeNoBeneficiary postal code
destinationAddressNoWallet address when destinationType is crypto
destinationNetworkNoBlockchain network when destinationType is crypto (e.g. 'polygon')
destinationCurrencyNoStablecoin to deliver when destinationType is crypto (e.g. 'USDT')

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does well: it discloses that this initiates real money movement, requires human approval, and depends on an unexpired quote. It does not cover failure/idempotency behavior or the fundingSource/destinationType branches, leaving some gaps.

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

Conciseness4/5

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

Four sentences, front-loaded with the core action and then the critical constraints. Every sentence earns its place, though the final corridor sentence is dense and could be slightly tightened.

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

Completeness4/5

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

For a 34-parameter mutation tool with no annotations and no output schema, the description covers the essential safety and corridor requirements. It omits the crypto-destination and fundingSource paths, but those are thoroughly documented in the schema, so the gap is minor.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds cross-field conditional logic (recipientType + full address + dateOfBirth required for AED/CAD/EUR/GBP/MXN/USD when the recipient is an individual) that is not obvious from individual field descriptions.

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

Purpose5/5

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

States a specific verb and resource ('Execute a transfer using an active quote') and clearly distinguishes itself from siblings like create_quote (prerequisite) and get_transfer/list_transfers (read operations). An agent can identify the action without opening the schema.

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

Usage Guidelines4/5

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

Gives concrete preconditions: the quote must not be expired and explicit human approval is required before execution. It also states corridor-specific requirements. It stops short of naming explicit alternatives or when-not-to-use cases, but the context is clear.

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

create_virtual_accountA

Create a payment route (virtual bank account) so a customer can receive fiat deposits that convert to a stablecoin and pay out to a wallet. The payout destination is mandatory: the API refuses a fiat-to-crypto route without one. Deposit handling is set server-side and defaults to auto_payout; change it afterwards with update_virtual_account.

ParametersJSON Schema
NameRequiredDescriptionDefault
customerIdYesThe customer ID to create the payment route for
sourceCurrencyYesFiat currency the route collects in (e.g. 'AUD', 'USD', 'EUR')
destinationAddressYesWallet address deposits are paid out to. Validated against the chosen network
destinationCurrencyNoStablecoin to receiveusdt
destinationPaymentRailYesBlockchain network the payout address belongs to

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does disclose meaningful behavior: a server-side validation that rejects routes lacking a destination, a server-side default of auto_payout, and the fact that deposit handling is mutable after creation. It omits auth/permission requirements and idempotency behavior, keeping it short of a 5.

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

Conciseness5/5

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

Three sentences, no filler, and the core purpose plus the critical constraint (mandatory destination) are front-loaded before the optional follow-up guidance.

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

Completeness4/5

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

For a mutation tool with no annotations and no output schema, the description covers purpose, the blocking validation, defaults, and the follow-up tool. It leaves the response shape (e.g., returned route/account identifiers) unspecified, which is a minor gap given no output schema exists.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all five parameters including enums and the destinationCurrency default. The description adds the mandatory nature of the payout destination and the network-validation of destinationAddress, but nothing beyond what the schema states.

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

Purpose5/5

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

The description uses a specific verb+resource ("Create a payment route (virtual bank account)") and explains the end-to-end effect: receive fiat deposits, convert to stablecoin, pay out to a wallet. It is clearly distinguishable from siblings like update_virtual_account and create_customer.

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

Usage Guidelines4/5

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

It states a hard precondition (payout destination is mandatory; the API refuses a fiat-to-crypto route without one) and routes the agent to update_virtual_account for later changes to deposit handling. It does not cover when to prefer other route types or account-creation alternatives, but the primary when-to-use context is explicit.

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

create_webhookA

Subscribe to Stables events via webhook. You'll receive POST requests to your URL when events occur.

Event types are dotted and lowercase. Use 'all' to receive everything.

Security: Set a secret to enable HMAC-SHA256 signature verification via X-Webhook-Signature header.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesThe HTTPS URL to receive webhook POST requests
nameYesA descriptive name for this webhook (e.g., 'Transfer status notifications')
secretNoOptional signing secret for HMAC-SHA256 webhook signature verification
eventTypesYesEvent types to subscribe to (e.g. ['transfer.updated.status_transitioned']), or ['all']

TDQS

A3.9/5.0
Behavior4/5

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

With no annotations, this carries the full burden and does fairly well: it discloses the delivery mechanism (POST callbacks), the event-type naming convention (dotted, lowercase), and the security model (secret enables HMAC-SHA256 via X-Webhook-Signature). It omits retry behavior, failure handling, and what is returned on creation.

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

Conciseness5/5

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

Three short paragraphs, purpose front-loaded, then event-type convention, then the security note. No filler sentences; each line carries information an agent needs.

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

Completeness4/5

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

For a 4-parameter mutation tool with no annotations and no output schema, the description covers mechanics and security adequately. Remaining gaps are operational details (retries, delivery failure behavior, whether the secret is returned once) that an agent might want before committing.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3, but the description adds genuine meaning: event types follow a dotted lowercase convention and 'all' is a valid wildcard, and the secret parameter is tied to signature verification rather than left as an abstract option.

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

Purpose4/5

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

States a specific verb and resource ('Subscribe to Stables events via webhook') plus the outcome ('POST requests to your URL when events occur'). It doesn't distinguish itself from siblings like list_webhooks or delete_webhook, but the creation intent is unambiguous.

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

Usage Guidelines3/5

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

Offers one usage hint ('Use all to receive everything') but does not say when to create a webhook versus using alternatives such as list_webhooks to check existing subscriptions, nor any prerequisites like URL validation or entitlement requirements.

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

delete_documentA

Remove a document from a transfer or a payment route deposit. This cannot be undone, so confirm with a human first.

ParametersJSON Schema
NameRequiredDescriptionDefault
onYesWhat the document belongs to: a transfer, or a deposit on a payment route
documentIdYesThe document ID from list_documents
transactionIdYesThe transfer ID, or the deposit ID from get_virtual_account_history

TDQS

A3.8/5.0
Behavior4/5

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

With no annotations, the description carries the full behavioral burden, and it does disclose the two most important traits: the operation is irreversible ('cannot be undone') and it requires human confirmation before execution. It omits auth/permission requirements, idempotency, and what happens to the parent transfer or deposit, which keeps it below 5.

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

Conciseness5/5

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

Two short sentences, front-loaded with the action and scope, followed immediately by the destructive warning. No filler or repetition.

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

Completeness4/5

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

For a three-parameter destructive tool with no annotations and no output schema, the description covers the essential decision inputs: what it removes, from what, and that it is irreversible and needs human sign-off. Remaining gaps (auth needs, response shape, effect on the parent record) are minor but real.

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

Parameters3/5

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

Schema description coverage is 100%, so all three parameters (on, documentId, transactionId) are already documented in the schema, including the enum and where IDs come from. The description's phrase 'from a transfer or a payment route deposit' merely restates the `on` enum, adding no new meaning; baseline 3 applies.

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

Purpose4/5

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

States a specific verb (Remove) and resource (a document) and scopes it to two container types (transfer or payment route deposit), which separates it from add_document, list_documents, and get_document_download_url. It does not explicitly name or route against any sibling, so it falls short of a 5.

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

Usage Guidelines3/5

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

Usage is only implied by the object scope; there is no explicit when-to-use versus an alternative. The one concrete guideline given — 'confirm with a human first' — is a workflow prerequisite rather than a selection rule, so this is minimum-viable guidance.

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

delete_webhookA

Delete a webhook subscription. You will stop receiving events at this endpoint.

ParametersJSON Schema
NameRequiredDescriptionDefault
webhookIdYesThe webhook subscription ID to delete

TDQS

A3.7/5.0
Behavior3/5

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

The description discloses that deletion stops event delivery, which is a key behavioral detail. However, it does not mention if the action is immediate or reversible, nor any authentication requirements. With no annotations, the description carries the full burden but provides only moderate transparency.

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

Conciseness5/5

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

The description is concise with two sentences, front-loading the action and consequence. No unnecessary words.

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

Completeness5/5

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

For a simple delete tool with one parameter and no output schema, the description covers purpose and effect adequately. It is complete enough for an agent to understand usage.

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

Parameters3/5

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

The input schema already fully describes the parameter (webhookId) with a description. The tool description adds no additional parameter semantics, so baseline 3 is appropriate.

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

Purpose5/5

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

The description clearly states the action 'Delete a webhook subscription' and explains the consequence 'You will stop receiving events at this endpoint.' This distinguishes it from sibling tools like create_webhook or list_webhooks.

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

Usage Guidelines2/5

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

No guidance on when to use this tool versus alternatives. The description does not mention prerequisites, such as requiring existing webhook IDs, or when deletion is appropriate.

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

get_api_keyB

Get details about a specific API key

ParametersJSON Schema
NameRequiredDescriptionDefault
apiKeyIdYesThe API key ID to look up

TDQS

B3.4/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden. It states 'Get details' implying a read operation, but provides no additional behavioral context such as authentication requirements, rate limits, or what constitutes 'details'. The minimal description leaves significant gaps.

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

Conciseness4/5

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

The description is a single sentence, concise and front-loaded with the action and resource. However, it lacks additional context that would improve its utility without being overly long.

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

Completeness3/5

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

Given the low complexity (1 param, no output schema), the description is adequate but incomplete. It does not explain what 'details' are returned, leaving the agent uncertain about the tool's output. For a simple tool, this is a minor gap.

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

Parameters3/5

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

Schema description coverage is 100% for the single parameter, which already documents 'The API key ID to look up'. The description adds no additional meaning beyond what the schema provides, resulting in a baseline score of 3.

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

Purpose5/5

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

The description clearly uses the verb 'Get' and specifies the resource 'details about a specific API key'. It distinguishes from siblings like list_api_keys (listing all) and revoke_api_key (revoking), making the tool's specific retrieval purpose unambiguous.

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

Usage Guidelines3/5

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

No explicit guidance on when to use this tool versus alternatives like list_api_keys or revoke_api_key. The description implies usage when you have an API key ID, but does not state exclusions or compare with sibling tools.

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

get_balanceA

Get your organisation's stablecoin balance, one entry per asset and network held. Also says whether transfers may be paid from it (transfers_enabled), which create_transfer with fundingSource 'prefund_balance' needs.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does disclose useful return structure (one entry per asset and network) plus a semantic field (transfers_enabled) and its cross-tool dependency. It does not describe auth requirements or the full response shape, but for a zero-parameter read operation this is meaningful added context.

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

Conciseness5/5

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

Two tightly written sentences, front-loaded with the core purpose followed by the one non-obvious field and its downstream use. No filler.

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

Completeness4/5

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

There is no output schema, so the description must convey the return shape, and it does provide the key structural fact (per asset/network entries) and the significant transfers_enabled flag. It is close to complete for a zero-param read tool, missing only full field-level return detail.

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

Parameters4/5

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

The tool takes zero parameters, so the baseline is 4. There are no parameter semantics to clarify, and nothing in the description misleads on inputs.

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

Purpose4/5

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

States a specific verb and resource ('Get your organisation's stablecoin balance') and clarifies the granularity ('one entry per asset and network held'), which helps distinguish it from the wallet-scoped sibling. It does not explicitly contrast with get_balance_wallet or list_pending_balance_deposits, so it stops short of a 5.

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

Usage Guidelines3/5

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

Usage is implied rather than stated: the mention that transfers_enabled is what create_transfer with fundingSource 'prefund_balance' needs tells the agent why the field matters, but there is no explicit 'use this when / not when' guidance and no differentiation from the other balance-related siblings.

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

get_balance_walletA

Get the deposit wallet that tops up your balance on one network, and its status. The address is only present once the status is 'active'.

ParametersJSON Schema
NameRequiredDescriptionDefault
networkNoNetwork (default polygon)

TDQS

A3.6/5.0
Behavior4/5

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

With no annotations provided, the description carries the full behavioral burden and delivers a genuinely non-obvious trait: the address field is only populated once status is 'active'. It does not mention auth requirements or whether the wallet must be created first, but the conditional-field disclosure is the key quirk an agent needs.

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

Conciseness5/5

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

Two short sentences, zero waste, and the important conditional (address only present when active) is front-loaded right after the tool's purpose.

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

Completeness4/5

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

There is no output schema, so the description must convey return-shape information; it does so for the critical address field, which is the one an agent would otherwise misread. It could say more about the status values, but for a one-parameter read tool this is nearly complete.

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

Parameters3/5

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

The single 'network' parameter is fully documented in the schema (100% coverage), including its default of polygon and enum values. The description adds only the vague phrase 'on one network', so the schema is doing the heavy lifting; baseline 3 applies.

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

Purpose4/5

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

States a specific verb (get) and resource (deposit wallet that tops up your balance) scoped to one network, which separates it from create_balance_wallet and get_balance. It does not explicitly name the sibling it complements, so it falls short of full differentiation.

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

Usage Guidelines2/5

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

There is no when-to-use guidance or reference to alternatives such as get_balance, list_balance_activity, or create_balance_wallet. The agent must infer from the resource name alone that this is the read counterpart to create_balance_wallet.

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

get_customerC

Get details about a specific customer including their verification status

ParametersJSON Schema
NameRequiredDescriptionDefault
includeNoAlso return the normalized KYC/KYB data ('verification-profile') or submitted document images ('doc-images'). Slower; only to sync verification data
customerIdYesThe customer ID to look up

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden, and it discloses almost nothing: it doesn't state that the call is read-only, that the 'include' option is slower or intended only for syncing verification data, or what the response looks like. It only hints that verification status is part of the payload.

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

Conciseness4/5

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

A single front-loaded sentence with no padding or redundancy. It is efficient, though its brevity overlaps with its lack of substance rather than reflecting well-chosen density.

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

Completeness2/5

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

With no annotations and no output schema, the description should explain what 'details' actually contains and flag the include-parameter tradeoff. Neither is present, leaving the agent under-informed about both the return payload and the costly optional path.

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

Parameters3/5

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

Schema coverage is 100%, and the schema already documents both customerId ('customer ID to look up') and the include enum with its slowness caveat. The description's mention of 'verification status' faintly maps to the include parameter but adds no syntax or behavioral detail beyond the schema, so baseline 3 applies.

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

Purpose4/5

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

States a clear verb ('Get') and resource ('a specific customer'), which distinguishes it from list_customers, create_customer, and update_customer by the singular, read-oriented framing. It doesn't explicitly name a sibling, so it stops short of a 5.

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

Usage Guidelines2/5

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

The description gives no when-to-use, when-not-to-use, or alternative routing. With list_customers available for browsing and update_customer for mutation, an agent gets no help deciding between them beyond the word 'specific'.

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

get_document_download_urlA

Get a short-lived link to download a document attached to a transfer or a payment route deposit.

ParametersJSON Schema
NameRequiredDescriptionDefault
onYesWhat the document belongs to: a transfer, or a deposit on a payment route
documentIdYesThe document ID from list_documents
transactionIdYesThe transfer ID, or the deposit ID from get_virtual_account_history

TDQS

A3.6/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It usefully discloses that the link is 'short-lived' (an expiration behavior), which is valuable. However, it omits other behavioral traits such as read-only nature, permission requirements, error behavior, or rate limits.

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

Conciseness5/5

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

The description is a single, well-structured sentence with no wasted words. The core action and resource are front-loaded, making it easy to parse quickly.

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

Completeness4/5

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

For a simple read tool with complete parameter schema coverage, the description is largely complete: it states the purpose and the short-lived nature of the link. It could be more complete by explaining the return value (a URL) explicitly, since no output schema exists, but it is adequate overall.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all three parameters in detail. The description only restates the 'transfer or payment route deposit' concept already covered by the 'on' enum, adding no new syntax or format details. Baseline 3 is appropriate.

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

Purpose5/5

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

The description states a specific verb ('Get') and resource ('short-lived link to download a document attached to a transfer or a payment route deposit'). It clearly distinguishes this tool from siblings like list_documents, add_document, and delete_document by focusing on obtaining a download URL.

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

Usage Guidelines2/5

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

There is no explicit guidance on when to use this tool versus alternatives. It does not mention that documentId should come from list_documents (the schema does), nor does it state any prerequisites or exclusions. Usage is only implied by the purpose.

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

get_kyc_capabilitiesA

List the verification capabilities a customer holds (for example proof_of_address), the level that granted each, and when. A kyc_capability requirement on an RFI is satisfied once the customer holds that capability.

ParametersJSON Schema
NameRequiredDescriptionDefault
customerIdYesThe customer ID

TDQS

A3.8/5.0
Behavior3/5

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

No annotations are provided, so the description carries the behavioral burden. 'List' implies a read-only operation, and the description discloses what information is returned, but it does not mention permissions, pagination, error behavior, or side effects.

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

Conciseness5/5

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

The description is two compact sentences with no wasted text. The return contents are front-loaded, followed by the key domain usage note about RFI requirements.

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

Completeness4/5

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

For a simple one-parameter read tool with complete schema coverage and no output schema, the description explains the main returned information and the RFI satisfaction semantics. It is nearly complete, though it could say more about scope or historical versus current capabilities.

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

Parameters3/5

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

Schema description coverage is 100%, and the single customerId parameter is fully documented in the schema. The description reinforces that results are scoped to a customer, but it does not add syntax or formatting details beyond what the schema already provides.

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

Purpose4/5

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

The description uses a specific verb and resource: it lists the verification capabilities a customer holds, with examples and returned fields (level, when). It is clearly a customer-scoped KYC read tool, though it does not explicitly distinguish itself from siblings such as list_available_entitlements.

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

Usage Guidelines4/5

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

The second sentence gives a concrete usage context: checking whether a kyc_capability requirement on an RFI is satisfied. It does not name alternatives or exclusions, but the primary use case is clear enough for an agent.

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

get_quoteA

Get details about an existing quote including its current status

ParametersJSON Schema
NameRequiredDescriptionDefault
quoteIdYesThe quote ID to look up

TDQS

A3.7/5.0
Behavior3/5

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

No annotations provided so description carries full burden. States it gets details and status but doesn't disclose that it is read-only, or any authentication/rate limit needs. Adequate but minimal.

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

Conciseness5/5

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

Single sentence, no wasted words. Essential information presented efficiently.

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

Completeness3/5

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

Simple tool with one parameter and no output schema; description covers main purpose. However, lacks information on return structure or potential errors, which would be helpful.

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

Parameters3/5

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

Schema coverage is 100% and parameter description is clear ('The quote ID to look up'). Description adds no extra context beyond the schema.

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

Purpose5/5

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

Clearly states the tool retrieves details of an existing quote including status, with a specific verb 'get' and resource 'quote'. Distinguishes from sibling 'create_quote' which creates quotes.

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

Usage Guidelines3/5

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

Implies use for existing quotes but no explicit guidance on when to use versus alternatives like 'list_transfers' or when not to use. Sibling tools exist but no comparison.

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

get_rfiA

Get one compliance request for information (RFI): why it was raised, its requirements and how to answer each.

ParametersJSON Schema
NameRequiredDescriptionDefault
rfiIdYesThe RFI ID

TDQS

A3.6/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. 'Get' plus the content preview establishes a read-only retrieval, which is useful, but it says nothing about permission requirements, behavior on an unknown/closed RFI ID, or sensitivity of compliance data.

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

Conciseness5/5

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

A single sentence with the verb and scope front-loaded and a compact clause enumerating the response contents. Nothing is wasted and nothing needs to be trimmed.

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

Completeness4/5

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

For a single-parameter read tool with no output schema and no annotations, the description supplies the essentials and even characterizes the return payload. It falls short only on permission/error behavior, which is a minor gap at this complexity.

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

Parameters3/5

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

One parameter with 100% schema description coverage, so the schema already documents rfiId as 'The RFI ID' and the baseline is 3. The description adds no format, sourcing (e.g., obtained via list_rfis), or validity detail beyond that.

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

Purpose4/5

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

States a specific verb and resource ('Get one ... RFI'), expands the acronym, and previews the returned content (why raised, requirements, how to answer). It implicitly distinguishes itself from list_rfis/list_customer_rfis by scoping to a single request, though it never names those siblings explicitly.

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

Usage Guidelines3/5

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

Usage is only implied: 'one' suggests singular retrieval versus the list_* siblings, but there is no explicit when-to-use guidance, no mention of what precondition (e.g., needing an existing rfiId from list_rfis) applies, and no named alternative for the plural case.

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

get_rfi_evidence_formA

Get the form an evidence requirement on an RFI asks for (for example the source of funds behind one held payment), with the current submission if one was sent. Build the submit_rfi_evidence answers from its fields and documents.

ParametersJSON Schema
NameRequiredDescriptionDefault
rfiIdYesThe RFI ID
customerIdYesThe customer ID
requirementIdYesThe requirement ID (type 'evidence')

TDQS

A4/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It usefully discloses the return content (the form plus the current submission if one was sent), which is genuine behavioral context, but says nothing about permission/auth requirements, whether it is strictly read-only, or failure behavior for a missing/invalid requirement.

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

Conciseness5/5

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

Two sentences, front-loaded with the primary purpose and immediately followed by the actionable next step. No filler; every clause contributes either scope, an example, or the downstream workflow.

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

Completeness4/5

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

With no output schema present, the description partly compensates by stating that it returns the form along with any current submission and referencing fields/documents. This is sufficient for an agent to know what comes back and how to use it, though it stops short of describing the form's structure in any detail.

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

Parameters3/5

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

Schema description coverage is 100% (rfiId, customerId, requirementId are each documented), so the schema already carries parameter meaning. The description adds a clarifying note that requirementId is of type 'evidence', but no syntax or format detail beyond the schema. Baseline 3 is appropriate.

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

Purpose5/5

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

States a specific verb (Get) and a precise resource: the form an `evidence` requirement on an RFI asks for, with a concrete example (source of funds behind a held payment). It also distinguishes itself from the sibling submit_rfi_evidence by framing this as the retrieval step that feeds that tool's answers.

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

Usage Guidelines4/5

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

Clear workflow context: use this to obtain the form, then build submit_rfi_evidence answers from its fields and documents. It routes the agent toward the related submit tool, but offers no explicit when-not-to-use or alternative retrieval paths (e.g. get_rfi / list_customer_rfis).

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

get_transferA

Get the current status and details of a transfer

ParametersJSON Schema
NameRequiredDescriptionDefault
transferIdYesThe transfer ID to look up

TDQS

A3.6/5.0
Behavior2/5

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

No annotations are provided, so the description carries full burden. It only says 'get', implying read-only, but does not explicitly state that it is non-destructive, lacks side effects, or mention any authentication or rate limit considerations.

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

Conciseness5/5

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

The description is a single clear sentence with no wasted words, front-loading the purpose.

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

Completeness4/5

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

Given the low complexity (1 parameter, no nested objects, no output schema), the description adequately covers the tool's purpose and what it returns. However, it could elaborate on the specific details included in the response.

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

Parameters3/5

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

Schema coverage is 100% with the 'transferId' parameter described. The description adds minimal extra meaning by mentioning 'current status and details', hinting at the response content, but does not elaborate on parameter format or constraints beyond the schema.

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

Purpose5/5

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

The description clearly states the verb 'Get' and the resource 'a transfer', specifying it retrieves 'current status and details', which distinguishes it from sibling tools like 'create_transfer' and 'list_transfers'.

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

Usage Guidelines3/5

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

The description implies usage for checking a specific transfer's status and details, but provides no explicit guidance on when to use this versus alternatives, or when not to use it.

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

get_virtual_account_historyC

Get the activity history for a virtual account (deposits, payouts, etc.)

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of events to return (default: 10)
customerIdYesThe customer ID
virtualAccountIdYesThe virtual account ID

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations, the description carries the full behavioral burden and falls short: it says nothing about pagination or cursors, result ordering, the time window covered, or whether history is bounded. The 'etc.' leaves the set of returned event types undefined, which matters when the agent must reason about what it will receive.

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

Conciseness4/5

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

A single front-loaded sentence with the verb and resource first. The trailing 'etc.' is mild filler that slightly weakens precision but costs little space.

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

Completeness2/5

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

For a paginated list-style tool with no output schema and no annotations, the description should cover return shape and paging behavior; it only gestures at return content via two examples. Ordering, pagination, and the meaning of the limit cap are absent, leaving real operational gaps.

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

Parameters3/5

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

Schema description coverage is 100%, with all three parameters documented in the schema including the limit default of 10. The description adds no parameter meaning beyond that, so the baseline of 3 applies.

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

Purpose4/5

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

States a specific verb ('Get') and resource ('activity history for a virtual account') and clarifies the content with concrete event examples (deposits, payouts). An agent can distinguish it from the other virtual-account siblings (create/update/list_virtual_accounts), though the description never names those alternatives explicitly.

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

Usage Guidelines2/5

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

No when-to-use guidance and no exclusions or alternatives. It does not tell the agent how this differs from list_balance_activity or list_virtual_accounts, leaving the choice entirely to inference.

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

list_api_keysB

List all API keys for the current account

ParametersJSON Schema
NameRequiredDescriptionDefault
pageSizeNoNumber of keys per page
pageTokenNoToken for the next page

TDQS

B3.2/5.0
Behavior2/5

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

No annotations provided, so description bears full burden. It does not disclose pagination behavior, response format, or potential limits. Only says 'list all', which may imply a single response without pagination.

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

Conciseness4/5

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

Single sentence with no waste. However, it could be slightly expanded to mention pagination or response format without losing conciseness.

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

Completeness3/5

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

For a list tool with pagination and no output schema or annotations, the description is minimal. It does not mention that the result is a list, that it could be empty, or any authentication requirements. Adequate but with clear gaps.

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

Parameters3/5

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

Schema has 100% description coverage for both parameters. Description adds no additional meaning beyond the schema, but baseline 3 is appropriate as the schema already documents the parameters.

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

Purpose5/5

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

Description clearly states verb 'list', resource 'API keys', and scope 'for the current account'. It distinguishes from sibling tools like create_api_key, get_api_key, and revoke_api_key.

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

Usage Guidelines2/5

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

No guidance on when to use this tool versus alternatives like get_api_key (single key) or other list tools. No context about prerequisites or when to use pagination.

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

list_available_entitlementsB

List the entitlements (products and payment rails, e.g. 'aed_local') a customer has not applied for yet, whether each is available to them now, and the verification it needs.

ParametersJSON Schema
NameRequiredDescriptionDefault
customerIdYesThe customer ID

TDQS

B3.2/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It does disclose the shape of what is returned (per-entitlement availability and required verification), which is genuinely useful, but says nothing about auth requirements, pagination, rate limits, or read-only guarantees. A 'list' verb implies a safe read, but the disclosure is partial.

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

Conciseness4/5

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

A single dense sentence with zero filler, front-loaded on the verb and resource. The parenthetical definition and the three output facets are packed efficiently, though the trailing clauses make it slightly heavy to parse.

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

Completeness4/5

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

With no output schema and no annotations, the description usefully compensates by enumerating the three things returned per entitlement (existence, current availability, verification needed). For a single-param read tool this is close to sufficient; only pagination and auth context are absent.

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

Parameters3/5

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

There is one parameter (customerId) with 100% schema description coverage, so the schema already documents it fully. The description adds no format, sourcing, or constraint detail beyond what the schema provides, which is the expected baseline when the schema does the heavy lifting.

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

Purpose4/5

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

States a specific verb (List) and resource (entitlements), defines the resource inline (products and payment rails) with a concrete example ('aed_local'), and narrows scope to entitlements the customer 'has not applied for yet.' This scope effectively distinguishes it from request_entitlements and submit_entitlement_requirements, though it never names those siblings explicitly.

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

Usage Guidelines2/5

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

There is no explicit when-to-use, when-not-to-use, or alternative routing. The phrase 'has not applied for yet' hints that this is a pre-request discovery step relative to request_entitlements, but the agent must infer that; nothing tells it whether to call this first or what to do with the results.

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

list_balance_activityA

List deposits that have credited your balance, newest first, with amount, network, transaction hash and sender.

ParametersJSON Schema
NameRequiredDescriptionDefault
networkNoOnly this network
pageSizeNoResults per page (default 20)
pageTokenNonext_page_token from the previous page

TDQS

A3.8/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It usefully discloses sort order ('newest first') and the returned fields, but says nothing about permissions, pagination behavior, or whether results are user- or account-scoped.

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

Conciseness5/5

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

One sentence, front-loaded with verb and resource, and the ordering and payload hints are packed in without waste. Every clause earns its place.

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

Completeness4/5

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

With no output schema, the description valuably enumerates the returned fields and ordering, which an agent would otherwise have to guess. It is nearly complete for a simple read-only list; only pagination semantics and scope behavior are left implicit.

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

Parameters3/5

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

Schema description coverage is 100%, so network, pageSize, and pageToken are already documented in the schema. The description only echoes 'network' via the returned fields and adds no filter syntax or enum context beyond the schema, so baseline 3 applies.

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

Purpose5/5

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

Specific verb (List) plus resource (deposits crediting the balance) with the scope qualifier 'credited' that separates it from sibling list_pending_balance_deposits. An agent can tell what it returns and how it differs from pending-deposit and get_balance tools without opening the schema.

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

Usage Guidelines3/5

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

Usage is implied: 'credited your balance' and 'newest first' suggest a historical, settled-deposit listing as opposed to the pending variant, but no explicit when-to-use or when-not guidance and no sibling is named. Adequate but leaves routing to inference.

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

list_customer_rfisB

List one customer's compliance requests for information (RFIs), with what each requirement needs next.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusNoOnly this status
customerIdYesThe customer ID

TDQS

B3.2/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full behavioral burden. 'List' implies a read-only operation and the phrase 'with what each requirement needs next' discloses something about the returned content, but there is no mention of permissions, pagination, rate limits, or other operational traits.

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

Conciseness4/5

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

A single front-loaded sentence with no wasted words; the verb and scope appear immediately. It is appropriately sized for a simple two-parameter list tool.

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

Completeness3/5

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

With no output schema and no annotations, the description should carry more of the return-value burden. It says each requirement includes 'what each requirement needs next', which is helpful, but omits pagination behavior and the broader shape of returned RFI records.

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

Parameters3/5

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

Schema description coverage is 100%, with both customerId and status fully documented including enum values. The description adds no parameter syntax or format detail beyond what the schema already provides, so the baseline of 3 applies.

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

Purpose4/5

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

The description states a specific verb (List) and resource (compliance requests for information / RFIs), scoped to one customer, which distinguishes it from the general list_rfis and single get_rfi siblings. However, it does not explicitly name those alternatives, so it falls short of the 5-calibration example that routes the agent by naming the sibling.

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

Usage Guidelines2/5

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

There is no when-to-use guidance, no prerequisites, and no mention of alternatives such as list_rfis or get_rfi. The scoping word 'one customer's' hints at context but does not tell the agent when this tool is preferred over the sibling listers.

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

list_customersA

List customers for the authenticated tenant. Without pageSize the API returns its default first page; pass pageSize and follow pageToken to read them all

ParametersJSON Schema
NameRequiredDescriptionDefault
pageSizeNoCustomers per page
pageTokenNonext_page_token from the previous page

TDQS

A3.9/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does disclose a real behavioral trait: omitting pageSize yields only the API's default first page, so the agent must deliberately paginate. It does not cover auth model, rate limits, ordering, or return shape, but it surfaces the main operational trap.

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

Conciseness5/5

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

Two sentences, zero filler, and the scope statement is front-loaded ahead of the pagination guidance. Nothing here is redundant with the name or schema.

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

Completeness4/5

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

For a two-param read-only list tool with no output schema and no annotations, the description covers the critical gap (pagination) and tenancy scope. It leaves ordering, filtering options, and the shape of returned customer objects unspecified, but no output schema exists to relieve that burden either.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline would be 3; the description goes beyond the schema by explaining the consequence of omitting pageSize (default first page) and the combined pageSize + pageToken pagination loop, which the schema alone does not convey.

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

Purpose4/5

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

States a specific verb and resource ('List customers') and scopes it to 'the authenticated tenant'. It does not explicitly name sibling tools, but 'list_customers' vs 'get_customer'/'create_customer' is unambiguous from the name alone, so differentiation is effectively achieved.

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

Usage Guidelines3/5

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

The second sentence gives practical guidance on how to read the full result set ('pass pageSize and follow pageToken to read them all'), which is genuine usage direction. However, it never states when to prefer this tool over siblings or any exclusions/preconditions beyond the pagination mechanics.

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

list_documentsA

List the documents attached to a transfer or a payment route deposit, newest first.

ParametersJSON Schema
NameRequiredDescriptionDefault
onYesWhat the document belongs to: a transfer, or a deposit on a payment route
transactionIdYesThe transfer ID, or the deposit ID from get_virtual_account_history

TDQS

A3.8/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full behavioral burden. It discloses the sort order ('newest first'), which is useful, but it does not mention pagination, authentication requirements, or the shape of returned document objects. The read-only nature is implied by 'List' but not stated.

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

Conciseness5/5

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

It is a single front-loaded sentence with no filler. Every element—verb, resource, scope, and ordering—earns its place.

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

Completeness4/5

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

For a simple two-parameter read tool with no output schema, the description states what is listed, the two parent types, and the ordering. It does not describe the response fields or pagination, but it is complete enough for an agent to call it correctly given the schema.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already fully documents both 'on' and 'transactionId', including the enum values and the source of the deposit ID. The description adds no syntax or format details beyond what the schema provides. 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.

Purpose5/5

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

The description uses a specific verb+resource ('List the documents') and states the exact scope ('attached to a transfer or a payment route deposit'). It also specifies ordering ('newest first'), which distinguishes it from sibling tools like add_document or get_document_download_url. An agent can identify the operation without opening the schema.

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

Usage Guidelines3/5

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

The description implies when the tool applies by naming the two possible parent objects (transfer or deposit), but it does not explicitly say when to prefer this over alternatives such as get_document_download_url. No exclusions or prerequisites are stated.

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

list_pending_balance_depositsA

List deposits seen on-chain but held before crediting your balance, with the reason: the sender is not a whitelisted wallet, or compliance review.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full burden, and it does disclose real behavioral context: the deposits are on-chain but withheld before crediting, and the hold reasons are an unwhitelisted sender or compliance review. It still omits anything about permissions/scoping, whether the state is transient, pagination, or return shape.

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

Conciseness5/5

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

A single sentence that front-loads the resource and the essential distinction (held vs. credited), then supplies the reasons as a compact clause. 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.

Completeness4/5

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

For a zero-parameter, no-annotation, no-output-schema list tool, the description covers what the list contains and why items appear, which is enough to call it correctly. It stops short of describing the returned fields (amounts, timestamps, sender) or ordering, which an agent might want since no output schema exists.

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

Parameters4/5

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

The tool takes zero parameters, so there is nothing to document and the baseline of 4 applies. The description correctly adds no parameter-like details, consistent with the empty schema.

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

Purpose4/5

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

The description gives a specific verb and resource ("List deposits") and qualifies it precisely as "seen on-chain but held before crediting your balance", which separates it from the balance-history sibling list_balance_activity. It never names that sibling, so the differentiation is implicit rather than stated.

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

Usage Guidelines3/5

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

The holding condition plus the enumerated reasons imply when an agent would call this (to diagnose why a deposit hasn't credited). There is no explicit when-to-use, when-not-to-use, or named alternative such as list_balance_activity, so usage must be inferred.

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

list_rfisA

List the organisation's compliance requests for information (RFIs), newest first: what Stables compliance needs before it releases a held payment or verification. Open and submitted ones by default. Check this when a transfer or deposit is held, or subscribe to the rfi.* webhooks.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNoOnly these RFI types
limitNoResults per page
cursorNonext_cursor from the previous page
statusNoOnly these statuses (default: open and submitted)
customerIdNoOnly this customer's RFIs
transactionReferenceIdNoOnly RFIs about this transfer or deposit

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden. It discloses sort order and default statuses, which is useful, but omits permissions, pagination behavior, and return-value characteristics for a six-parameter list tool.

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

Conciseness5/5

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

The description is front-loaded, appropriately sized, and every sentence contributes: purpose, default behavior, and operational trigger. There is no redundant or wasted text.

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

Completeness4/5

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

For a list tool with full schema coverage, the description is sufficient to select and invoke it correctly. It is slightly thin on return format and pagination, but those gaps are minor given the schema and the tool's straightforward read-only nature.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all six parameters. The description only reinforces the default status behavior and adds no extra syntax or filter semantics beyond what the schema provides.

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

Purpose4/5

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

The description states a specific verb and resource: it lists the organisation's compliance RFIs and defines RFI. It also specifies ordering (newest first) and default statuses, though it does not explicitly name the sibling list_customer_rfis as the customer-scoped alternative.

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

Usage Guidelines4/5

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

It gives a clear use case: check this when a transfer or deposit is held, or subscribe to rfi.* webhooks instead. It does not explicitly say when not to use it versus list_customer_rfis or get_rfi, but the guidance is actionable.

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

list_route_whitelistB

List the bank accounts whitelisted to pay into an AUD payment route. Some Australian routes only accept deposits from whitelisted source accounts.

ParametersJSON Schema
NameRequiredDescriptionDefault
customerIdYesThe customer ID
virtualAccountIdYesThe AUD payment route (virtual account) ID

TDQS

B3.3/5.0
Behavior2/5

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

With no annotations at all, the description carries the full behavioral burden, and it omits anything beyond the data's meaning: no pagination, ordering, empty-list behavior, permission requirements, or return shape. The domain context about Australian routes is useful but is semantic framing rather than behavioral disclosure.

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

Conciseness5/5

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

Two short sentences, zero waste, with the core action stated first and the qualifying context second. Nothing needs to be trimmed or reordered.

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

Completeness3/5

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

For a simple two-parameter read tool with fully documented params this is close to adequate, but with no output schema the description should ideally say what the returned list contains (account identifiers, bank details, status) so the agent knows what it will get back.

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

Parameters3/5

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

Schema description coverage is 100%, so both customerId and virtualAccountId are already documented, including the note that virtualAccountId is the AUD payment route ID. The description adds no format, constraint, or example beyond that, so the baseline 3 applies.

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

Purpose4/5

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

The description gives a specific verb and resource ('List the bank accounts whitelisted to pay into an AUD payment route') and the second sentence scopes it to Australian routes. It is clearly distinguishable from list_whitelisted_wallets and from the mutation siblings add_route_whitelist_account/update_route_whitelist_account, though it never names them explicitly.

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

Usage Guidelines3/5

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

The note that 'some Australian routes only accept deposits from whitelisted source accounts' implies when an agent would care about this list, but there is no explicit when-to-use, no exclusions, and no pointer to the add/update whitelist siblings for the write path.

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

list_transfersC

List transfers with optional filters for status, type, or customer

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNoFilter by transfer type
statusNoFilter by transfer status
pageSizeNoNumber of transfers per page (default: 20)
pageTokenNoToken for the next page of results
customerIdNoFilter by customer ID

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations, the description carries the full behavioral burden. It does not state that this is a read-only operation, does not mention pagination behavior (despite pageSize/pageToken params), sorting, or default result ordering.

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

Conciseness4/5

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

A single efficient sentence with the resource front-loaded and the filter scope attached. No waste, though it leans toward under-specification rather than tight completeness.

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

Completeness3/5

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

For a 5-parameter list tool with no output schema and no annotations, the description is minimally adequate but omits read-only semantics and pagination behavior. The schema covers the parameters, so the remaining gap is behavioral context.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all five parameters including enums and the pagination token. The description only echoes the filter dimensions and adds no syntax or format detail beyond the schema. Baseline 3 applies.

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

Purpose4/5

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

The description states a specific verb ('List') and resource ('transfers') and names the filter dimensions. It implicitly distinguishes from get_transfer (single) and create_transfer, but never names or contrasts with those siblings explicitly.

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

Usage Guidelines2/5

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

It notes the filters are optional but gives no guidance on when to use this versus get_transfer for a single record or create_transfer. No prerequisites, no exclusions, no routing cues are provided.

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

list_virtual_accountsA

List payment routes (virtual accounts) for one customer, or across every customer when customerId is omitted

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of accounts to return
statusNoFilter by account status
customerIdNoOnly this customer's routes; omit to list routes across all customers
startingAfterNoReturn routes after this route ID (the last ID of the previous page)

TDQS

A3.5/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It discloses one behavioral trait, the default cross-customer scope when customerId is omitted, but says nothing about read-only nature, result volume, pagination behavior, or authorization requirements. For a mutation-free listing tool this is thin but not misleading.

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

Conciseness5/5

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

A single, well-formed sentence with no filler. The scope-defining condition is placed at the end where it reads naturally, and nothing is repeated.

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

Completeness3/5

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

With no annotations and no output schema, the description is the only place for behavioral context, and it covers just the scope default. Pagination expectations (how limit and startingAfter interact), return shape, and whether an unbounded all-customer listing is safe to call are left unaddressed. Adequate but with clear gaps for a 4-parameter listing tool.

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

Parameters3/5

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

Schema description coverage is 100%, so all four parameters (limit, status, customerId, startingAfter) are already documented in the schema. The description's customerId clause restates what the schema property already says, adding no new syntax, format, or constraint detail. Baseline 3 applies when the schema does the heavy lifting.

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

Purpose4/5

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

States a specific verb (List) and resource (payment routes / virtual accounts), including the useful synonym mapping that ties 'payment routes' to 'virtual accounts'. The scope distinction (one customer vs. all customers) is stated. It stops short of naming a sibling like get_virtual_account_history to disambiguate further, but the purpose itself is unambiguous.

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

Usage Guidelines3/5

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

The description implies usage by describing the two modes: pass customerId for one customer, omit it to list across all. There is no explicit when-not guidance or pointer to alternatives such as get_virtual_account_history for a single account's events. Usage is inferable but not routed.

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

list_webhook_deliveriesA

List recent webhook delivery attempts with their HTTP status and retry state. This is the first place to look when an integration is not receiving events: it shows whether Stables sent them and what the endpoint answered.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusNoFilter by delivery status
pageSizeNoHow many attempts to return (default 10, max 50)
eventTypeNoFilter by event type (e.g. 'transfer.created')

TDQS

A3.8/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full behavioral burden. It usefully discloses the semantics of the returned data ('whether Stables sent them and what the endpoint answered') and implies a read-only, recent-first listing, but says nothing about auth requirements, ordering guarantees, or pagination beyond what the schema's pageSize already states.

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

Conciseness5/5

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

Two sentences, zero waste. The core action is front-loaded and the diagnostic use case follows immediately; every clause earns its place.

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

Completeness4/5

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

With no output schema and a read-only list tool, the description adequately previews what records contain (status, retry state). It omits ordering/pagination behavior and any note about what happens when no deliveries exist, but nothing essential for invoking the tool correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, with each of the three filters documented including the status enum values, so the schema does the heavy lifting. The description mentions status and retry state conceptually but adds no filter syntax or combination guidance beyond the schema, so baseline 3 applies.

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

Purpose4/5

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

States a specific verb and resource — listing webhook delivery attempts — and adds what each record contains (HTTP status, retry state). It is distinguishable from the sibling list_webhooks (which manages webhook configurations) by the word 'deliveries', though it never names that sibling to make the distinction explicit.

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

Usage Guidelines4/5

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

Gives an explicit triggering scenario: 'the first place to look when an integration is not receiving events.' That is clear usage context, but it stops short of naming alternatives (e.g. list_webhooks for configuration problems) or stating exclusions.

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

list_webhooksA

List all webhook subscriptions for the current account

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

The description discloses the read-only nature of the tool by using 'list'. However, it does not mention potential behavioral details such as pagination or rate limits. Given no annotations are provided, the description carries the full burden, and mentioning that it lists 'all' subscriptions is helpful.

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

Conciseness5/5

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

The description is a single sentence with no wasted words, effectively communicating the tool's purpose.

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

Completeness5/5

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

Given the tool has no parameters and no output schema, the description is complete. It unambiguously states what the tool does without requiring additional detail.

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

Parameters4/5

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

The input schema has zero parameters, so the baseline is 4. The description does not need to add parameter information, and it correctly implies no additional configuration is needed.

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

Purpose5/5

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

The description clearly states the verb 'list' and the resource 'webhook subscriptions', and specifies the scope 'for the current account'. It effectively distinguishes from sibling tools like create_webhook and delete_webhook which have different actions.

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

Usage Guidelines4/5

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

The description clearly indicates when to use this tool (to list all webhook subscriptions). While it does not explicitly mention when not to use it or provide alternatives, the context of a simple list operation with no parameters makes this omission acceptable.

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

list_whitelisted_walletsA

List the wallets whitelisted to deposit into and receive withdrawals from your balance. Only 'active' wallets can. Whitelisting a wallet is done in the dashboard; there is no API for it.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusNoOnly this status. Archived wallets appear only when asked for
networkNoOnly this network
pageSizeNoResults per page (default 20)
pageTokenNonext_page_token from the previous page

TDQS

A3.6/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It adds the domain fact that only 'active' wallets can actually deposit/withdraw, but says nothing about authorization requirements, the default status filtering behavior when 'status' is omitted, or pagination semantics (the archived-wallets note is already in the schema).

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

Conciseness4/5

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

Three short sentences, front-loaded with the core purpose and free of filler. The middle fragment ('Only active wallets can.') is truncated and slightly ambiguous about what active wallets can do, which costs a point.

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

Completeness4/5

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

For a read-only list tool with full schema coverage and no output schema, the description covers what is listed, the active-wallet constraint, and how whitelisting is created. It omits the default return set and result fields, which is a modest gap given no output schema exists.

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

Parameters3/5

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

Schema description coverage is 100%, so all four parameters (status, network, pageSize, pageToken) are already documented with enums and defaults. The description adds no parameter-level detail beyond the schema, so the baseline 3 applies.

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

Purpose4/5

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

States a specific verb+resource (list wallets whitelisted for balance deposits/withdrawals) and scopes it to the balance domain rather than routes. It does not explicitly distinguish itself from the sibling list_route_whitelist, which covers the analogous route-side concept, so sibling differentiation is only implicit.

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

Usage Guidelines4/5

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

Provides real routing context: whitelisting is configured in the dashboard and 'there is no API for it,' which stops an agent from hunting for a create-whitelist tool. It does not, however, name alternative list tools (e.g. list_route_whitelist) or state when to prefer this list over them.

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

register_route_payidA

Register a PayID for an activated AUD payment route, so payers can send to an email-style alias instead of a BSB and account number. Calling it again on a route that already has one returns the existing PayID.

ParametersJSON Schema
NameRequiredDescriptionDefault
customerIdYesThe customer ID
virtualAccountIdYesThe AUD payment route (virtual account) ID

TDQS

A4/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden. It usefully discloses idempotent-style behavior (re-calling returns the existing PayID) and the activation prerequisite, but omits permission/auth requirements, failure modes for inactive routes, and any rate or format details.

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

Conciseness5/5

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

Two sentences, no filler, with the core action and its benefit front-loaded and the idempotency caveat second. Every clause earns its place.

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

Completeness4/5

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

For a two-parameter mutation with no output schema, the description covers the action, the prerequisite state, and the repeat-call return behavior. It could say more about the resulting PayID's form or error conditions, but nothing essential to invoking it is missing.

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

Parameters3/5

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

Schema description coverage is 100% and both parameters already documented, so the baseline is 3. The description adds mild meaning by characterizing virtualAccountId as an activated AUD payment route, but does not clarify format or relationships beyond that.

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

Purpose5/5

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

States a specific verb (register), resource (PayID), and the exact target (an activated AUD payment route/virtual account), and explains the user-visible outcome (payers can send to an email-style alias instead of BSB/account). No sibling tool touches PayID, so there is no ambiguity to resolve.

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

Usage Guidelines4/5

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

Gives a clear precondition — the route must already be activated — and clarifies the repeat-call case. It does not name alternative tools or state when not to use it, so it falls short of explicit when/when-not routing, but the context is unambiguous.

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

request_entitlementsA

Apply for one or more entitlements for an existing customer, e.g. to add a payment rail. Check list_available_entitlements first. If Stables needs more verification, the response lists what is missing; send it with submit_entitlement_requirements.

ParametersJSON Schema
NameRequiredDescriptionDefault
customerIdYesThe customer ID
entitlementsYesEntitlement names, e.g. ['aed_local']

TDQS

A4/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It usefully discloses a failure mode ('the response lists what is missing') and its remediation, but says nothing about authorization requirements, whether the request is applied immediately or requires approval, or reversibility/idempotency for what is clearly a mutation.

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

Conciseness5/5

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

Three short sentences, zero filler, and the core action is front-loaded ahead of the prerequisite and the follow-up branch. Every sentence carries routing or behavioral information.

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

Completeness4/5

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

No output schema and no annotations, so the description must carry return-value and behavior context; it does mention what the response can contain (missing verification items) and the next step. It is close to complete, but omits the outcome semantics (does the entitlement become active immediately?) that an agent would want before applying.

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

Parameters3/5

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

Schema description coverage is 100%, so both parameters are already documented in the schema (customerId, entitlements with enum values). The description adds no syntax or format detail beyond the example phrasing, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource ('Apply for one or more entitlements for an existing customer') plus a concrete example use case ('to add a payment rail'). It names two sibling tools, list_available_entitlements and submit_entitlement_requirements, so an agent can place it in the workflow without opening the schema.

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

Usage Guidelines4/5

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

Gives a clear prerequisite ('Check list_available_entitlements first') and a conditional follow-up path when verification is incomplete, naming the alternative tool explicitly. It stops short of stating when NOT to use this tool, so it is strong but not exhaustive.

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

revoke_api_keyA

Revoke an API key. This permanently disables the key and cannot be undone.

ParametersJSON Schema
NameRequiredDescriptionDefault
apiKeyIdYesThe API key ID to revoke

TDQS

A4.1/5.0
Behavior4/5

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

The description transparently states that revocation is permanent and irreversible, which is critical for an agent to understand. However, it omits details about potential side effects (e.g., immediate termination of active sessions) or required permissions, which would be beneficial given the absence of annotations.

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

Conciseness5/5

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

The description is extremely concise with two sentences, each carrying essential information. The first sentence front-loads the action, and the second adds irreversibility without redundancy.

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

Completeness5/5

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

For a simple, one-parameter destructive tool with no output schema, the description covers the essential behavioral information (permanent revocation) and the parameter is fully described in the schema. No obvious gaps remain.

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

Parameters3/5

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

The schema provides 100% coverage with a description for the sole parameter, and the tool description adds no additional meaning beyond what the schema already states. Per guidelines, baseline 3 is appropriate.

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

Purpose5/5

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

The description clearly states the action 'Revoke' and the resource 'API key', and distinguishes it from related operations like create_api_key or list_api_keys by emphasizing permanence and irreversibility.

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

Usage Guidelines3/5

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

The description implies that the tool should only be used when the key is to be permanently disabled, but it does not explicitly state when to use it versus alternatives, such as deactivating a virtual account instead, nor does it provide prerequisites like having the correct API key ID.

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

simulate_route_depositA

SANDBOX ONLY. Simulate a fiat deposit into a payment route so you can watch the conversion and payout complete without a real bank transfer. Fails on production.

ParametersJSON Schema
NameRequiredDescriptionDefault
amountYesDeposit amount in major units (e.g. '500.00')
scenarioNo'completed' runs the deposit through to payout, 'failed' exercises the failure path, 'create_only' stops at the deposit
customerIdYesThe customer ID
senderNameNoName to attribute the deposit to
senderReferenceNoPayment reference on the deposit
virtualAccountIdYesThe payment route (virtual account) ID
externalDepositIdNoYour own reference for this deposit

TDQS

A4/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full burden, and it does disclose the most important trait: this only works in the sandbox and fails on production. It omits other behaviors an agent would want, such as whether a simulated deposit record persists or what permissions are required.

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

Conciseness5/5

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

Two sentences with zero waste, and the most decision-critical fact ('SANDBOX ONLY') is front-loaded before the explanation. Every clause earns its place.

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

Completeness4/5

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

With no output schema and no annotations, the description covers environment, purpose, and the effect of the call, which is enough to invoke it correctly. Missing side-effect and permission details keep it short of fully complete for a 7-parameter mutation-style tool.

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

Parameters3/5

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

Schema description coverage is 100%, including the enum semantics for 'scenario', so the schema already does the heavy lifting. The description adds no parameter-level meaning beyond that, making the baseline 3 correct.

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

Purpose4/5

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

States a specific verb and resource ('Simulate a fiat deposit into a payment route') and adds the observable outcome ('watch the conversion and payout complete'). The route-versus-transfer distinction is implicit rather than stated, so it does not explicitly separate itself from the sibling simulate_transfer_deposit.

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

Usage Guidelines4/5

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

Gives a clear environment condition — sandbox use with 'Fails on production' as an explicit exclusion. It does not name an alternative tool or say what to use for real deposits, so the routing guidance is contextual rather than explicit.

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

simulate_transfer_depositA

SANDBOX ONLY. Simulate the customer sending the crypto an off-ramp transfer is waiting on, so the transfer can progress to payout without an on-chain payment. Fails on production.

ParametersJSON Schema
NameRequiredDescriptionDefault
transferIdYesThe transfer awaiting funds

TDQS

A4/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and discloses important behavior: sandbox-only execution, production failure, and that the call causes a transfer to progress to payout without an actual on-chain payment. It does not mention idempotency, side effects on other objects, or response behavior, but the core behavioral constraints are present.

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

Conciseness5/5

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

Two short sentences, front-loaded with the most critical constraint ('SANDBOX ONLY'), and every clause adds useful information without repetition.

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

Completeness4/5

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

For a simple single-parameter sandbox simulation with no output schema, the description supplies the essential operational constraint and the intended effect. It could be stronger by noting the expected return or error semantics, but it is sufficient for correct invocation.

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

Parameters3/5

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

The sole parameter, transferId, is fully documented in the schema ('The transfer awaiting funds'), so the baseline is 3. The description does not add additional format, constraint, or selection guidance beyond what the schema already says.

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

Purpose4/5

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

The description uses a specific verb ('Simulate') and resource ('transfer deposit'), and explains the effect: progressing an off-ramp transfer to payout without an on-chain payment. It does not distinguish this tool from the similar sibling 'simulate_route_deposit', so an agent must infer the difference.

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

Usage Guidelines4/5

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

It clearly states the operating context ('SANDBOX ONLY') and the exclusion ('Fails on production'), which tells an agent when not to use it. However, it does not explicitly compare against the sibling simulation tool or explain when one should be chosen over the other.

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

submit_entitlement_requirementsA

Send further verification data Stables asked for on a requested entitlement. The fields are those of the customer record in snake_case (e.g. tax_id_number, address, financial_profile, id_documents, proof_of_address_documents); send only what is missing. Documents are base64 data.

ParametersJSON Schema
NameRequiredDescriptionDefault
customerIdYesThe customer ID
entitlementYesThe entitlement name, e.g. 'aed_local'
requirementsYesThe missing fields, snake_case as in the Update Customer reference

TDQS

A3.5/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It usefully discloses that documents must be base64-encoded and that submission is partial (only missing fields), which is genuinely behavioral. It omits idempotency (can it be re-called?), permission/auth requirements, whether resubmitted fields overwrite prior data, and what happens on an incomplete submission.

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

Conciseness4/5

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

Three tight sentences, front-loaded with the action and followed by field-format and encoding rules; nothing is wasted. The parenthetical example list is long but each example earns its place by disambiguating the free-form requirements object.

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

Completeness3/5

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

The requirements parameter is an open free-form object (additionalProperties: {}), yet the description only gives 'e.g.' examples rather than the full set of accepted keys, leaving the agent uncertain about valid field names. With no annotations and no output schema, there is also no signal about auth needs or the response on success/failure, though the base64 and partial-submission notes do cover the most critical call-shaping details.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description goes modestly beyond the schema by giving concrete requirement key examples (tax_id_number, financial_profile, id_documents, proof_of_address_documents) and the base64 encoding rule for document fields, which the schema does not state. It restates the snake_case convention already present in the schema, so the gain is incremental rather than substantial.

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

Purpose4/5

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

The description states a specific verb and resource: sending further verification data for a requested entitlement, with a nod to the entitlement-request flow ('Stables asked for'). It distinguishes from generic siblings like update_customer, though it never explicitly names which sibling (request_entitlements, submit_rfi_evidence) precedes it or how it differs from submit_rfi_evidence.

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

Usage Guidelines3/5

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

'Send only what is missing' is a real usage constraint and implies this follows an entitlement request that came back with outstanding requirements. However, it never states when to use this versus submit_rfi_evidence or update_customer, nor any prerequisite (e.g. that a request_entitlements call must have flagged missing fields).

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

submit_rfi_evidenceA

Submit the answers and documents an evidence requirement asks for, in one request, keyed as get_rfi_evidence_form lists them. Files are base64 data URLs ('data:application/pdf;base64,...'). The requirement moves to 'submitted' for Stables compliance to review; approving it releases the held payment once nothing else is outstanding. Confirm the content with a human before sending: it goes to compliance as the customer's answer.

ParametersJSON Schema
NameRequiredDescriptionDefault
rfiIdYesThe RFI ID
answersYesAnswers keyed by the form's field keys and document wire_field names, e.g. { funds_origin, funds_origin_explanation, supporting_documents: ['data:application/pdf;base64,...'] }
customerIdYesThe customer ID
requirementIdYesThe requirement ID (type 'evidence')

TDQS

A4.2/5.0
Behavior4/5

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

No annotations are present, so the description carries the burden and does well: it discloses the state transition to 'submitted', that compliance review follows, and that approval releases the held payment. It also specifies the file encoding format. It omits failure/validation behavior and required permissions.

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

Conciseness5/5

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

Three tight sentences, front-loaded with the action and format, followed by the downstream consequence and the safety caveat. No filler; every sentence earns its place.

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

Completeness4/5

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

For a mutation with nested objects, no annotations, and no output schema, the description covers the format, the workflow dependency, the post-submit state, and the payment-release consequence. It leaves out error handling and anything about the returned response, but nothing critical to correct invocation is missing.

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

Parameters3/5

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

Schema coverage is 100% and the schema already documents each parameter, including the answers object and its base64 example. The description adds only the pointer that keys must match get_rfi_evidence_form's listing, so the schema does the heavy lifting and baseline 3 applies.

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

Purpose5/5

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

States a specific verb+resource: submitting answers and documents for an `evidence` requirement in a single request. It differentiates from siblings by naming get_rfi_evidence_form as the source of the keying scheme, so an agent can distinguish it from the read-side RFI tools.

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

Usage Guidelines4/5

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

Implies the correct workflow ('keyed as get_rfi_evidence_form lists them', 'in one request') and adds an explicit human-confirmation gate before sending. It does not spell out when NOT to use it (e.g. other requirement types), so it stops short of full guidance.

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

update_customerC

Update customer details, entitlements, or verification information

ParametersJSON Schema
NameRequiredDescriptionDefault
dobNoUpdated date of birth (YYYY-MM-DD)
emailNoUpdated email address
phoneNoUpdated phone number
lastNameNoUpdated last name
firstNameNoUpdated first name
customerIdYesThe customer ID to update
middleNameNoUpdated middle name
companyNameNoUpdated company name (for businesses)
nationalityNoUpdated nationality (two-letter country code)
entitlementsNoUpdated entitlements

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden. It never states whether updates are partial or full-replacement (do omitted fields get cleared?), whether entitlements changes trigger separate approval flows, what permissions are required, or that the operation is destructive to existing values.

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

Conciseness4/5

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

A single front-loaded sentence with no filler or redundancy. It is terse but not padded, though the brevity trades away the behavioral detail a 10-parameter mutation tool warrants.

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

Completeness2/5

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

For a 10-parameter mutation tool with no annotations and no output schema, the description omits the most decision-relevant facts: partial vs. full update semantics, permission requirements, and how it relates to the entitlement-request siblings. The schema covers field names but not update behavior.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all 10 parameters adequately, and the description adds only a loose grouping of them. It contributes no semantics beyond the schema, so the baseline 3 is appropriate.

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

Purpose4/5

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

States a clear verb+resource ("Update customer") and scopes it to three areas: details, entitlements, and verification information. It does not differentiate itself from close siblings such as update_customer_metadata or request_entitlements, and "verification information" has no corresponding parameter in the schema, which slightly muddies the claimed scope.

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

Usage Guidelines2/5

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

There is no when-to-use guidance, no prerequisites, and no mention of alternatives. With siblings like update_customer_metadata, request_entitlements, and submit_entitlement_requirements present, an agent has no basis in the description for choosing this tool over them.

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

update_customer_metadataC

Update customer metadata key-value pairs

ParametersJSON Schema
NameRequiredDescriptionDefault
metadataYesMetadata key-value pairs to set
customerIdYesThe customer ID to update metadata for

TDQS

C2.8/5.0
Behavior2/5

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

With no annotations provided, the description carries full burden for behavioral disclosure. It only states 'Update' but does not describe whether existing metadata is merged or replaced, whether the operation is idempotent, or any constraints on keys/values. This is insufficient for a mutating tool.

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

Conciseness3/5

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

The description is a single sentence, which is concise but too minimal. It lacks critical details about behavior and usage, making it under-specified rather than efficiently brief.

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

Completeness2/5

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

Given the tool has 2 parameters (one nested object) and no output schema or annotations, the description is incomplete. It fails to explain merge behavior, response format, or error conditions, leaving significant gaps for an agent.

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

Parameters3/5

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

Schema description coverage is 100% – both parameters have descriptions. The tool description ('metadata key-value pairs') adds no additional meaning beyond the schema's 'Metadata key-value pairs to set'. Baseline score of 3 is appropriate as no extra value is provided.

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

Purpose4/5

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

The description 'Update customer metadata key-value pairs' clearly states the action (update) and the resource (customer metadata). It distinguishes this tool from the sibling 'update_customer' which likely updates other customer fields. However, it could be more explicit about the scope.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives like 'update_customer'. There is no mention of prerequisites, when-not to use, or context for appropriate use.

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

update_route_destinationA

Change the payout wallet on an existing payment route. Deposits after this point are paid out to the new address; use it when a customer rotates wallets rather than creating a second route.

ParametersJSON Schema
NameRequiredDescriptionDefault
customerIdYesThe customer ID
virtualAccountIdYesThe payment route (virtual account) ID
destinationAddressYesNew payout wallet address
destinationCurrencyNoStablecoin to receiveusdt
destinationPaymentRailYesBlockchain network the new address belongs to

TDQS

A4/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden. It usefully discloses the timing semantics ('Deposits after this point are paid out to the new address'), which is real value beyond the schema, but omits permission/whitelist prerequisites, whether the new address must be pre-registered, irreversibility, and error behavior for an operation with direct payout impact.

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

Conciseness5/5

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

Two tight sentences with zero filler. The core action is front-loaded and the behavioral timing note follows immediately, so nothing is buried.

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

Completeness4/5

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

For a 5-parameter mutation with full schema coverage, no nested objects, and no output schema, the description covers what the tool does and the key post-change effect. The gap is the absence of any prerequisite or safety context (e.g., address/rail validation or whitelisting) given there are no annotations to carry it.

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

Parameters3/5

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

Schema description coverage is 100% and both enums (currency, payment rail) are documented in the schema, so the baseline is 3. The description adds no syntax, format, or constraint detail beyond what the schema already provides.

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

Purpose5/5

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

The description states a specific verb and resource in the first clause ('Change the payout wallet on an existing payment route'), leaving no ambiguity about the operation. It also scopes it to existing routes, distinguishing it from route-creation flows ('rather than creating a second route').

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

Usage Guidelines4/5

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

It gives a clear triggering condition ('use it when a customer rotates wallets') and explicitly contrasts it with the alternative of creating a second route. It stops short of naming a specific sibling tool or stating exclusions/prerequisites, 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.

update_route_whitelist_accountA

Change or disable a whitelisted source account on an AUD payment route. Send the full record: BSB, account number and status.

ParametersJSON Schema
NameRequiredDescriptionDefault
enabledYesfalse to stop accepting deposits from it
bsbNumberYesSource account BSB
customerIdYesThe customer ID
accountNumberYesSource account number
sourceAccountIdYesThe whitelist entry ID (from list_route_whitelist)
virtualAccountIdYesThe AUD payment route (virtual account) ID

TDQS

A3.6/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It does disclose a meaningful behavioral trait – that the full record must be sent rather than a partial patch – and that disabling stops the account being used. It omits permissions required, whether the change is reversible, and what happens to in-flight deposits.

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

Conciseness5/5

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

Two short sentences, front-loaded with the action and resource, followed by the one operational instruction that matters (send the full record). No filler.

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

Completeness4/5

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

For a six-parameter mutation with no annotations and no output schema, the description covers the core action, the disable semantics, and the full-record requirement, with the schema filling in field-level detail. It stops short of stating side effects or error behavior, but nothing critical to invoking it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all six parameters including the enabled flag's effect. The description echoes three of them (BSB, account number, status) but adds no syntax, format, or ID-provenance detail beyond the schema, so the baseline of 3 applies.

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

Purpose4/5

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

States a specific verb (change/disable) and resource (whitelisted source account on an AUD payment route), which clearly distinguishes it from add_route_whitelist_account and list_route_whitelist by implication. It does not explicitly name the sibling it is not, so it falls short of a 5.

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

Usage Guidelines3/5

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

"Change or disable a whitelisted source account" implies this operates on an entry that already exists, and "Send the full record" signals a full-replace call. However, there is no explicit when-to-use guidance, no mention of prerequisites (e.g. that sourceAccountId comes from list_route_whitelist), and no exclusion against the add/create sibling.

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

update_virtual_accountC

Update virtual account settings (e.g., deposit handling mode)

ParametersJSON Schema
NameRequiredDescriptionDefault
customerIdYesThe customer ID
virtualAccountIdYesThe virtual account ID to update
depositHandlingModeYesNew deposit handling mode

TDQS

C2.9/5.0
Behavior2/5

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

No annotations provided, and the description only says 'update' with no details on idempotency, required permissions, or side effects, leaving the agent underinformed about behavioral traits.

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

Conciseness4/5

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

Single sentence is concise and front-loaded with the essential action and example, but could be slightly more informative without losing conciseness.

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

Completeness2/5

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

Given no output schema and the presence of related sibling tools, the description omits return behavior, error conditions, and prerequisites, making it incomplete for an update operation.

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

Parameters3/5

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

Schema coverage is 100%, so parameters are already documented. The description adds marginal value by mentioning 'deposit handling mode' as an example, but does not elaborate on other potential settings.

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

Purpose4/5

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

The description clearly states the tool updates virtual account settings with an example (deposit handling mode), distinguishing it from create, deactivate, and other sibling tools.

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

Usage Guidelines2/5

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

No guidance on when to use this tool versus alternatives like create_virtual_account or deactivate_virtual_account; lacks context for appropriate usage.

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

validate_payment_methodA

Check bank payout details against the corridor's rules without creating anything. Use it before create_transfer to find out which fields a currency needs (beneficiary address, date of birth, bank codes), instead of spending a short-lived quote on a rejected transfer.

ParametersJSON Schema
NameRequiredDescriptionDefault
ibanNoIBAN (EU/international)
cnapsNoCNAPS (China)
payIdNoPayID alias (AUD only). Requires payIdType
bicCodeNoBIC (EUR/GBP international)
bsbCodeNoBSB code (Australia)
networkYesPayout network: local bank rails, SWIFT, or PayID (AUD)
quoteIdNoValidate against this quote's corridor
bankCodeNoBank code / institution number (CAD)
bankNameNoName of the destination bank
ifscCodeNoIFSC code (India)
sortCodeNoSort code (UK)
payIdTypeNoPayID alias type. Required when payId is given
swiftCodeNoSWIFT code
branchCodeNoBranch code / transit number (CAD)
accountTypeNoAccount type. Required for CAD and USD bank payouts
addressCityNoBeneficiary city
bankCountryNoBank country, ISO 2-letter (e.g. 'AU', 'US')
dateOfBirthNoBeneficiary date of birth, YYYY-MM-DD. Required when recipientType is individual for AED, CAD, EUR, GBP, MXN, USD
addressStateNoBeneficiary state or region
bankCurrencyNoPayout currency, ISO 3-letter (e.g. 'EUR')
accountNumberNoBank account number, if not using IBAN
addressStreetNoBeneficiary street address
recipientTypeNoBeneficiary type. Required for AED, CAD, EUR, GBP, MXN, USD
routingNumberNoABA routing number (US)
addressCountryNoBeneficiary country, ISO 2-letter. The complete address is required for AED, CAD, EUR, GBP, MXN, USD
accountHolderNameNoAccount holder's full name, or the company name when recipientType is business
addressPostalCodeNoBeneficiary postal code

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations present, the description carries the behavioral burden and does disclose the key trait: this is a non-mutating dry-run check ('without creating anything'). It also conveys the cost/latency motivation around short-lived quotes. It does not say whether failures return a missing-field list versus an error, nor anything about auth or rate limits, so it is good but not complete.

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

Conciseness5/5

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

Two sentences, zero filler, with the no-side-effect constraint front-loaded and the create_transfer routing following immediately. Every clause earns its place.

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

Completeness4/5

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

For a 27-parameter tool with no annotations and no output schema, the description covers the workflow purpose and the non-mutating behavior, and implies the useful return ('find out which fields a currency needs'). It stops short of describing the actual response shape or error semantics, which is the main remaining gap given the absent output schema.

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

Parameters3/5

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

Schema description coverage is 100% across all 27 parameters, so the schema already documents each field's meaning and conditional requirements (e.g. dateOfBirth, accountType). The description adds only a light hint that required fields vary by currency/corridor and that validation can target a quote's corridor, which is marginal added meaning over the schema.

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

Purpose5/5

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

The description states a specific verb and resource ('Check bank payout details'), names the scope of validation ('against the corridor's rules'), and explicitly disclaims a side effect ('without creating anything'). An agent can distinguish it from create_transfer and create_quote without opening either schema.

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

Usage Guidelines5/5

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

It gives an explicit trigger ('Use it before create_transfer') and the reason to prefer it ('instead of spending a short-lived quote on a rejected transfer'), effectively naming the alternative tool and the condition that selects this one.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 44 tool updatesv2.4.0
    • Addedadd_document
    • Addedadd_route_whitelist_account
    • Addedcreate_balance_wallet
    • Changedcreate_customer5 fields changed
      • changedInput schema / properties / entitlements / items / enum
        Previous value: -[
        -  "base_payout",
        -  "virtual_account"
        -]New value: +[
        +  "base_payout",
        +  "virtual_account",
        +  "eur_virtual_account",
        +  "gbp_virtual_account",
        +  "usd_virtual_account",
        +  "aed_local"
        +]
      • removedInput schema / properties / howDidYouComeAcrossStables
        Removed value: -{
        -  "description": "How did you come across Stables?",
        -  "type": "string"
        -}
      • removedInput schema / properties / industrySelection
        Removed value: -{
        -  "description": "NAICS industry code (e.g., '5415')",
        -  "type": "string"
        -}
      • removedInput schema / properties / isYourBusinessADao
        Removed value: -{
        -  "description": "Is your business a DAO?",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / mainSourceOfFunds
        Removed value: -{
        -  "description": "Main source of funds",
        -  "enum": [
        -    "BUSINESS_LOANS",
        -    "GRANTS",
        -    "INTER_COMPANY_FUNDS",
        -    "INVESTMENT_PROCEEDS",
        -    "LEGAL_SETTLEMENT",
        -    "OWNERS_CAPITAL",
        -    "PENSION_RETIREMENT",
        -    "SALE_OF_ASSETS",
        -    "SALES_OF_GOODS_AND_SERVICES",
        -    "THIRD_PARTY_FUNDS",
        -    "TREASURY_RESERVES"
        -  ],
        -  "type": "string"
        -}
    • Addedcreate_customer_onboarding_link
    • Changedcreate_quote17 fields changed
      • removedInput schema / properties / customerId
        Removed value: -{
        -  "description": "The customer ID to associate this quote with. Required if the quote will be used to create a transfer.",
        -  "type": "string"
        -}
      • addedInput schema / properties / destinationAddress
        Added value: +{
        +  "description": "Destination wallet address. Required for on-ramp",
        +  "type": "string"
        +}
      • addedInput schema / properties / destinationCountry
        Added value: +{
        +  "description": "Destination country, ISO 2-letter. Required for off-ramp",
        +  "type": "string"
        +}
      • addedInput schema / properties / destinationCurrency
        Added value: +{
        +  "description": "Destination currency: fiat for off-ramp (e.g. 'EUR'), a stablecoin for on-ramp",
        +  "type": "string"
        +}
      • addedInput schema / properties / destinationNetwork
        Added value: +{
        +  "description": "Off-ramp: payment network, 'swift' or 'bank'. On-ramp: blockchain network. Replaces the old paymentMethodType",
        +  "type": "string"
        +}
      • removedInput schema / properties / fromAmount
        Removed value: -{
        -  "description": "Amount to convert (e.g., '125.75')",
        -  "type": "string"
        -}
      • removedInput schema / properties / fromCurrency
        Removed value: -{
        -  "description": "Source cryptocurrency (USDC or USDT)",
        -  "enum": [
        -    "USDC",
        -    "USDT"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / fromNetwork
        Removed value: -{
        -  "description": "Blockchain network for the source crypto",
        -  "enum": [
        -    "ethereum",
        -    "polygon"
        -  ],
        -  "type": "string"
        -}
      • addedInput schema / properties / metadata
        Added value: +{
        +  "additionalProperties": {
        +    "type": "string"
        +  },
        +  "description": "Optional metadata",
        +  "type": "object"
        +}
      • removedInput schema / properties / paymentMethodType
        Removed value: -{
        -  "description": "Payment method for fiat payouts - 'SWIFT' for international, 'LOCAL' for domestic rails",
        -  "enum": [
        -    "SWIFT",
        -    "LOCAL"
        -  ],
        -  "type": "string"
        -}
      • addedInput schema / properties / preview
        Added value: +{
        +  "description": "Price the quote without persisting it, to show an estimate",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / sourceAmount
        Added value: +{
        +  "description": "Amount to convert, in major units (e.g. '125.75')",
        +  "type": "string"
        +}
      • addedInput schema / properties / sourceCurrency
        Added value: +{
        +  "description": "Source currency: a stablecoin for off-ramp (e.g. 'USDT'), fiat for on-ramp",
        +  "type": "string"
        +}
      • addedInput schema / properties / sourceNetwork
        Added value: +{
        +  "description": "Blockchain network of the source. Required for off-ramp, omitted for on-ramp",
        +  "enum": [
        +    "arbitrum",
        +    "avalanche",
        +    "base",
        +    "ethereum",
        +    "optimism",
        +    "polygon",
        +    "solana",
        +    "tron"
        +  ],
        +  "type": "string"
        +}
      • removedInput schema / properties / toCountry
        Removed value: -{
        -  "description": "Destination country code (e.g., 'GR', 'US', 'GB')",
        -  "type": "string"
        -}
      • removedInput schema / properties / toCurrency
        Removed value: -{
        -  "description": "Destination currency code (e.g., 'EUR', 'USD', 'GBP')",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "fromCurrency",
        -  "fromAmount",
        -  "fromNetwork",
        -  "toCurrency",
        -  "toCountry",
        -  "paymentMethodType"
        -]New value: +[
        +  "sourceCurrency",
        +  "sourceAmount",
        +  "destinationCurrency"
        +]
    • Changedcreate_transfer28 fields changed
      • changedInput schema / properties / accountHolderName / description
        Previous value: -"Bank account holder's full name (required for off-ramp)"New value: +"Account holder's full name, or the company name when recipientType is business"
      • changedInput schema / properties / accountNumber / description
        Previous value: -"Bank account number (if not using IBAN)"New value: +"Bank account number, if not using IBAN"
      • changedInput schema / properties / accountType / description
        Previous value: -"Type of bank account"New value: +"Account type. Required for CAD and USD bank payouts"
      • addedInput schema / properties / addressCity
        Added value: +{
        +  "description": "Beneficiary city",
        +  "type": "string"
        +}
      • addedInput schema / properties / addressCountry
        Added value: +{
        +  "description": "Beneficiary country, ISO 2-letter. The complete address is required for AED, CAD, EUR, GBP, MXN, USD",
        +  "type": "string"
        +}
      • addedInput schema / properties / addressPostalCode
        Added value: +{
        +  "description": "Beneficiary postal code",
        +  "type": "string"
        +}
      • addedInput schema / properties / addressState
        Added value: +{
        +  "description": "Beneficiary state or region",
        +  "type": "string"
        +}
      • addedInput schema / properties / addressStreet
        Added value: +{
        +  "description": "Beneficiary street address",
        +  "type": "string"
        +}
      • addedInput schema / properties / bankCode
        Added value: +{
        +  "description": "Bank code / institution number (CAD)",
        +  "type": "string"
        +}
      • changedInput schema / properties / bankCountry / description
        Previous value: -"Two-letter country code of the bank (e.g., 'AU', 'US')"New value: +"Bank country, ISO 2-letter (e.g. 'AU', 'US')"
      • changedInput schema / properties / bankCurrency / description
        Previous value: -"Currency for the bank payout (e.g., 'EUR', 'USD', 'AUD')"New value: +"Payout currency, ISO 3-letter (e.g. 'EUR')"
      • changedInput schema / properties / bankName / description
        Previous value: -"Name of the destination bank (required for off-ramp)"New value: +"Name of the destination bank"
      • addedInput schema / properties / bicCode
        Added value: +{
        +  "description": "BIC (EUR/GBP international)",
        +  "type": "string"
        +}
      • addedInput schema / properties / branchCode
        Added value: +{
        +  "description": "Branch code / transit number (CAD)",
        +  "type": "string"
        +}
      • addedInput schema / properties / cnaps
        Added value: +{
        +  "description": "CNAPS (China)",
        +  "type": "string"
        +}
      • addedInput schema / properties / dateOfBirth
        Added value: +{
        +  "description": "Beneficiary date of birth, YYYY-MM-DD. Required when recipientType is individual for AED, CAD, EUR, GBP, MXN, USD",
        +  "type": "string"
        +}
      • addedInput schema / properties / destinationAddress
        Added value: +{
        +  "description": "Wallet address when destinationType is crypto",
        +  "type": "string"
        +}
      • addedInput schema / properties / destinationCurrency
        Added value: +{
        +  "description": "Stablecoin to deliver when destinationType is crypto (e.g. 'USDT')",
        +  "type": "string"
        +}
      • addedInput schema / properties / destinationNetwork
        Added value: +{
        +  "description": "Blockchain network when destinationType is crypto (e.g. 'polygon')",
        +  "type": "string"
        +}
      • addedInput schema / properties / destinationType
        Added value: +{
        +  "default": "bank",
        +  "description": "Payout target: a bank account (off-ramp) or a wallet address",
        +  "enum": [
        +    "bank",
        +    "crypto"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / fundingSource
        Added value: +{
        +  "description": "fund_transfer (default) returns deposit instructions for the customer; prefund_balance pays from your organisation's balance and starts immediately. Check get_balance first: transfers_enabled must be true and the quote's source asset must be held on its network",
        +  "enum": [
        +    "fund_transfer",
        +    "prefund_balance"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / iban / description
        Previous value: -"IBAN for the destination bank account (EU/international)"New value: +"IBAN (EU/international)"
      • changedInput schema / properties / metadata / description
        Previous value: -"Optional metadata to attach to the transfer"New value: +"Optional metadata"
      • addedInput schema / properties / payId
        Added value: +{
        +  "description": "PayID alias (AUD only). Requires payIdType",
        +  "type": "string"
        +}
      • addedInput schema / properties / payIdType
        Added value: +{
        +  "description": "PayID alias type. Required when payId is given",
        +  "enum": [
        +    "email",
        +    "phone_number",
        +    "abn",
        +    "acn",
        +    "organisation_id"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / purposeCode
        Added value: +{
        +  "description": "Purpose of the transfer (e.g. 'SALARY'). Required on some corridors",
        +  "enum": [
        +    "PAYMENT_FOR_SERVICES",
        +    "PAYMENT_FOR_SOFTWARE",
        +    "PAYMENT_FOR_IMPORTED_GOODS",
        +    "TRAVEL_SERVICES",
        +    "VENDOR_CONTRACTOR_PAYOUTS",
        +    "TRANSFER_TO_OWN_ACCOUNT",
        +    "INVESTMENT_IN_SHARES",
        +    "PURCHASE_OF_PROPERTY",
        +    "REPAYMENT_OF_LOANS",
        +    "SALARY",
        +    "PAYMENT_OF_PROPERTY_RENTAL",
        +    "INFORMATION_SERVICE_CHARGES",
        +    "ADVERTISING_PR_EXPENSES",
        +    "ROYALTY_FEES",
        +    "BROKER_COMMITMENT_FEES",
        +    "ADVISOR_TECHNICAL_FEES",
        +    "REPRESENTATIVE_OFFICE_EXPENSES",
        +    "TAX_PAYMENT",
        +    "TRANSPORTATION_FEES_FOR_GOODS",
        +    "CONSTRUCTION_COSTS",
        +    "INSURANCE_PREMIUM",
        +    "GENERAL_GOODS_TRADES",
        +    "INSURANCE_CLAIMS_PAYMENT",
        +    "FAMILY_MAINTENANCE",
        +    "EDUCATION_EXPENSES",
        +    "MEDICAL_TREATMENT",
        +    "DONATIONS",
        +    "MUTUAL_FUND_INVESTMENT",
        +    "CURRENCY_EXCHANGE",
        +    "USER_WITHDRAWAL",
        +    "ADVANCE_PAYMENTS_FOR_GOODS",
        +    "VENDOR_CONTRACTOR_SOFTWARE_PAYOUTS",
        +    "MERCHANT_SETTLEMENT",
        +    "REPATRIATION_FUND_SETTLEMENT",
        +    "PERSONAL_REMITTANCE",
        +    "RETURN_OF_FUNDS"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / recipientType
        Added value: +{
        +  "description": "Beneficiary type. Required for AED, CAD, EUR, GBP, MXN, USD",
        +  "enum": [
        +    "individual",
        +    "business"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / swiftCode / description
        Previous value: -"SWIFT/BIC code for international transfers"New value: +"SWIFT code"
    • Changedcreate_virtual_account8 fields changed
      • changedInput schema / properties / customerId / description
        Previous value: -"The customer ID to create the virtual account for"New value: +"The customer ID to create the payment route for"
      • removedInput schema / properties / depositHandlingMode
        Removed value: -{
        -  "description": "How to handle deposits: 'auto_payout' converts and sends to wallet, 'hold' keeps as fiat, 'manual' requires approval",
        -  "enum": [
        -    "auto_payout",
        -    "hold",
        -    "manual"
        -  ],
        -  "type": "string"
        -}
      • changedInput schema / properties / destinationAddress / description
        Previous value: -"Crypto wallet address for payouts"New value: +"Wallet address deposits are paid out to. Validated against the chosen network"
      • addedInput schema / properties / destinationCurrency / default
        Added value: +"usdt"
      • changedInput schema / properties / destinationCurrency / description
        Previous value: -"Stablecoin to receive (default: usdc)"New value: +"Stablecoin to receive"
      • changedInput schema / properties / destinationPaymentRail / description
        Previous value: -"Blockchain network for the destination wallet"New value: +"Blockchain network the payout address belongs to"
      • changedInput schema / properties / sourceCurrency / description
        Previous value: -"Currency for the virtual account (e.g., 'USD', 'EUR', 'GBP')"New value: +"Fiat currency the route collects in (e.g. 'AUD', 'USD', 'EUR')"
      • changedInput schema / required
        Previous value: -[
        -  "customerId",
        -  "sourceCurrency"
        -]New value: +[
        +  "customerId",
        +  "sourceCurrency",
        +  "destinationAddress",
        +  "destinationPaymentRail"
        +]
    • Changedcreate_webhook3 fields changed
      • changedInput schema / properties / eventTypes / description
        Previous value: -"List of event types to subscribe to (e.g., ['WEBHOOK_EVENT_TYPE_PAYMENT_STATUS_CHANGED'])"New value: +"Event types to subscribe to (e.g. ['transfer.updated.status_transitioned']), or ['all']"
      • addedInput schema / properties / eventTypes / items / enum
        Added value: +[
        +  "customer.created",
        +  "customer.updated",
        +  "kyc_link.updated.status_transitioned",
        +  "transfer.created",
        +  "transfer.updated.status_transitioned",
        +  "quote.created",
        +  "quote.updated.status_transitioned",
        +  "virtual_account.created",
        +  "virtual_account.activity.created",
        +  "virtual_account.activity.updated.status_transitioned",
        +  "travel_rule.wallet_verification_required",
        +  "rfi.created",
        +  "rfi.updated",
        +  "rfi.resolved",
        +  "all"
        +]
      • changedInput schema / properties / name / description
        Previous value: -"A descriptive name for this webhook (e.g., 'Payment Status Notifications')"New value: +"A descriptive name for this webhook (e.g., 'Transfer status notifications')"
    • Removeddeactivate_virtual_account
    • Addeddelete_document
    • Addedget_balance
    • Addedget_balance_wallet
    • Changedget_customer1 field changed
      • addedInput schema / properties / include
        Added value: +{
        +  "description": "Also return the normalized KYC/KYB data ('verification-profile') or submitted document images ('doc-images'). Slower; only to sync verification data",
        +  "items": {
        +    "enum": [
        +      "verification-profile",
        +      "doc-images",
        +      "all"
        +    ],
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
    • Addedget_document_download_url
    • Addedget_kyc_capabilities
    • Addedget_rfi
    • Addedget_rfi_evidence_form
    • Changedget_verification_link1 field changed
      • addedInput schema / properties / verificationType
        Added value: +{
        +  "description": "Run one verification step instead of the full flow, e.g. 'proof_of_address' when an RFI asks for it",
        +  "enum": [
        +    "liveness",
        +    "passport",
        +    "source_of_wealth",
        +    "proof_of_address",
        +    "business_edd"
        +  ],
        +  "type": "string"
        +}
    • Changedget_virtual_account_history1 field changed
      • removedInput schema / properties / eventType
        Removed value: -{
        -  "description": "Filter by event type",
        -  "enum": [
        -    "funds_scheduled",
        -    "funds_received",
        -    "payment_submitted",
        -    "payment_processed",
        -    "in_review",
        -    "refund",
        -    "microdeposit",
        -    "account_update",
        -    "deactivation",
        -    "activation"
        -  ],
        -  "type": "string"
        -}
    • Addedlist_available_entitlements
    • Addedlist_balance_activity
    • Addedlist_customer_rfis
    • Changedlist_customers3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / pageSize
        Added value: +{
        +  "description": "Customers per page",
        +  "maximum": 100,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / pageToken
        Added value: +{
        +  "description": "next_page_token from the previous page",
        +  "type": "string"
        +}
    • Addedlist_documents
    • Addedlist_pending_balance_deposits
    • Addedlist_rfis
    • Addedlist_route_whitelist
    • Changedlist_transfers2 fields changed
      • changedInput schema / properties / status / enum
        Previous value: -[
        -  "CREATED",
        -  "COMPLIANCE_HOLD",
        -  "AWAITING_FUNDS_COLLECTION",
        -  "FUNDS_COLLECTED",
        -  "PAYMENT_SUBMITTED",
        -  "PAYMENT_PROCESSED",
        -  "COMPLETED",
        -  "FAILED",
        -  "CANCELLED",
        -  "EXPIRED"
        -]New value: +[
        +  "created",
        +  "compliance_hold",
        +  "awaiting_funds_collection",
        +  "funds_collected",
        +  "in_progress",
        +  "payment_submitted",
        +  "payment_processed",
        +  "completed",
        +  "failed",
        +  "cancelled",
        +  "expired"
        +]
      • changedInput schema / properties / type / enum
        Previous value: -[
        -  "TRANSFER_TYPE_ONRAMP",
        -  "TRANSFER_TYPE_OFFRAMP"
        -]New value: +[
        +  "onramp",
        +  "offramp"
        +]
    • Changedlist_virtual_accounts3 fields changed
      • changedInput schema / properties / customerId / description
        Previous value: -"The customer ID to list virtual accounts for"New value: +"Only this customer's routes; omit to list routes across all customers"
      • addedInput schema / properties / startingAfter
        Added value: +{
        +  "description": "Return routes after this route ID (the last ID of the previous page)",
        +  "type": "string"
        +}
      • removedInput schema / required
        Removed value: -[
        -  "customerId"
        -]
    • Addedlist_webhook_deliveries
    • Addedlist_whitelisted_wallets
    • Removedreactivate_virtual_account
    • Addedregister_route_payid
    • Addedrequest_entitlements
    • Removedsend_verification_sms
    • Addedsimulate_route_deposit
    • Addedsimulate_transfer_deposit
    • Addedsubmit_entitlement_requirements
    • Addedsubmit_rfi_evidence
    • Changedupdate_customer1 field changed
      • changedInput schema / properties / entitlements / items / enum
        Previous value: -[
        -  "base_payout",
        -  "virtual_account"
        -]New value: +[
        +  "base_payout",
        +  "virtual_account",
        +  "eur_virtual_account",
        +  "gbp_virtual_account",
        +  "usd_virtual_account",
        +  "aed_local"
        +]
    • Addedupdate_route_destination
    • Addedupdate_route_whitelist_account
    • Addedvalidate_payment_method
  2. 25 tool updatesv1.4.0
    • First observedcreate_api_key
    • First observedcreate_customer
    • First observedcreate_quote
    • First observedcreate_transfer
    • First observedcreate_virtual_account
    • First observedcreate_webhook
    • First observeddeactivate_virtual_account
    • First observeddelete_webhook
    • First observedget_api_key
    • First observedget_customer
    • First observedget_quote
    • First observedget_transfer
    • First observedget_verification_link
    • First observedget_virtual_account_history
    • First observedlist_api_keys
    • First observedlist_customers
    • First observedlist_transfers
    • First observedlist_virtual_accounts
    • First observedlist_webhooks
    • First observedreactivate_virtual_account
    • First observedrevoke_api_key
    • First observedsend_verification_sms
    • First observedupdate_customer
    • First observedupdate_customer_metadata
    • First observedupdate_virtual_account

TDQS

B3.3/5.0

Scored across 51 tools

Disambiguation3/5

Most tools target distinct resources and actions, but several pairs overlap in purpose: create_customer vs create_customer_onboarding_link, get_verification_link vs onboarding-link creation, and list_rfis vs list_customer_rfis can require careful selection. Descriptions usually clarify the boundaries, but the set is large enough that misselection remains plausible.

Naming Consistency4/5

Tool names consistently use snake_case verb_noun patterns such as create_customer, get_quote, list_transfers, and delete_webhook. Minor terminology drift exists between virtual_account and route for the same concept, but the naming convention itself is predictable.

Tool Count2/5

At 51 tools, the surface is very large for a single MCP server and exceeds typical well-scoped ranges. The domain is broad, but the count will make discovery and correct tool selection difficult for an agent.

Completeness4/5

The set covers major lifecycle areas: KYC customers, transfers and quotes, virtual accounts/payment routes, RFIs, documents, webhooks, API keys, and balances. Some operations appear absent, such as customer deletion or webhook updates, but core workflows are well represented.

Maintenance

ActivityMaintained
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    A
    maintenance
    Enables AI coding agents to add stablecoin checkout, payment links, payment status checks, webhook verification, and webhook-based entitlement logic to applications. It also provides tools for workspace registration, settlement and webhook configuration, paylink creation, and crypto payment status checks.
    -
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables AI coding agents to integrate stablecoin checkout, payment links, payment status checks, webhook verification, and webhook-based access logic into applications.
    MIT