Stables MCP Server
OfficialStables MCP Server exposes Stables' fiat-to-crypto API to AI agents via 51 tools, enabling customer management, quotes, transfers, virtual accounts, compliance, balances, API keys, and webhooks.
Create, update, list, and verify customers (individual/business), including KYC links and SMS verification.
Request and manage entitlements and compliance RFIs, submit evidence, and check KYC capabilities.
Attach, list, download, and delete documents for transfers/deposits.
Create and retrieve USDC/USDT-to-fiat quotes.
Validate payout methods, create/get/list transfers, and execute money movement with human approval.
Create, list, update, deactivate/reactivate virtual accounts and view deposit/payout history; manage AUD PayID routes and whitelists.
Check balances, balance wallets, activity, pending deposits, and whitelisted wallets.
Create/list/get/revoke API keys.
Create/list/delete webhooks and inspect delivery attempts.
Simulate sandbox route/transfer deposits for testing.
Allows sending KYC verification links to customers via SMS using Twilio.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Stables MCP ServerCreate a customer for alice@example.com and get a quote to convert 500 USDC to USD."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 customerscreate_customer_onboarding_link- Create a customer and a hosted verification link in one callget_customer- Get customer details and verification statuslist_customers- List all customersget_verification_link- Generate KYC verification linksupdate_customer- Update customer details and entitlementsupdate_customer_metadata- Update customer metadata key-value pairs
Entitlements
list_available_entitlements- Products and rails a customer can still apply forrequest_entitlements- Apply for entitlements (e.g.aed_local) for an existing customersubmit_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 verificationlist_customer_rfis- One customer's RFIsget_rfi- One RFI, its requirements and how to answer eachget_rfi_evidence_form- The form anevidencerequirement asks forsubmit_rfi_evidence- Send the answers and documents for anevidencerequirementget_kyc_capabilities- Verification capabilities a customer holds
Documents
add_document- Attach an invoice, contract or other document to a transfer or a depositlist_documents- Documents on a transfer or a depositget_document_download_url- Short-lived download link for a documentdelete_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 transferringcreate_transfer- Execute a transfer using an active quote, paid by deposit or from your balanceget_transfer- Check transfer statuslist_transfers- List transfers with filters
Virtual Accounts
create_virtual_account- Create virtual bank accounts for fiat depositslist_virtual_accounts- List virtual accounts for a customer, or across all customersupdate_virtual_account- Update virtual account settingsregister_route_payid- Register a PayID on an AUD payment routeget_virtual_account_history- Get deposits and their payouts for a payment routeupdate_route_destination- Change the payout wallet on an existing routelist_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 networkget_balance_wallet/create_balance_wallet- The deposit wallet that tops up the balancelist_balance_activity- Deposits credited to the balancelist_pending_balance_deposits- Deposits held before crediting, and whylist_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 keylist_api_keys- List all API keysget_api_key- Get API key detailsrevoke_api_key- Revoke an API key
Webhooks
create_webhook- Subscribe to events via webhooklist_webhooks- List all webhook subscriptionsdelete_webhook- Delete a webhook subscriptionlist_webhook_deliveries- Recent delivery attempts, status codes and retry state
Hosted server (recommended)
The server runs as a hosted service, so there is nothing to install. Point your MCP client at:
https://mcp.stables.money/mcpand 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 buildConfiguration
The server requires the following environment variables:
Variable | Required | Description |
| Yes | Your Stables API key |
| 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 |
|
|
|
|
| production, unless you set |
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 inspectDirect Execution
STABLES_API_KEY=your-api-key node build/index.jsExample 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):
Calls
create_customerwith email and typeCalls
create_quotewith source USDT + network, destination EUR + country, anddestinationNetwork(swiftorbank)Returns customer details and quote information
Checking transfer status
User: "What's the status of all my pending transfers?"
AI (using MCP tools):
Calls
list_transferswithstatus=createdorstatus=in_progress(statuses are lowercase)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):
Calls
create_virtual_accountwith the customer ID, AUD source currency, and the Polygon destination (the payout address is mandatory)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):
Collects the extra beneficiary details EUR requires —
recipientType, a full address, anddateOfBirthfor individuals — before doing anything elseCalls
create_quote, thencreate_transferonce 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 inspectProject 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.mdAPI Reference
Customer Tools
create_customer
Create a new customer for KYC and transfers.
Parameter | Type | Required | Description |
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.
get_verification_link
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 |
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_CREATEDWEBHOOK_EVENT_TYPE_CUSTOMER_UPDATEDWEBHOOK_EVENT_TYPE_KYC_STATUS_CHANGEDWEBHOOK_EVENT_TYPE_PAYMENT_CREATEDWEBHOOK_EVENT_TYPE_PAYMENT_STATUS_CHANGEDWEBHOOK_EVENT_TYPE_QUOTE_CREATEDWEBHOOK_EVENT_TYPE_QUOTE_EXPIREDWEBHOOK_EVENT_TYPE_VA_DEPOSIT_RECEIVEDWEBHOOK_EVENT_TYPE_VA_PAYOUT_COMPLETEDWEBHOOK_EVENT_TYPE_VA_PAYOUT_FAILEDWEBHOOK_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
Links
Available Tools
51 toolsadd_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,...').
| Name | Required | Description | Default |
|---|---|---|---|
| on | Yes | What the document belongs to: a transfer, or a deposit on a payment route | |
| type | No | What the document is (default other) | |
| fileName | Yes | File name shown to Stables, e.g. 'invoice-2041.pdf' | |
| base64Url | Yes | The file as a data URL: 'data:<mime>;base64,<data>' | |
| transactionId | Yes | The transfer ID, or the deposit ID from get_virtual_account_history |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| enabled | No | Whether deposits from it are accepted now | |
| bsbNumber | Yes | Source account BSB | |
| customerId | Yes | The customer ID | |
| accountNumber | Yes | Source account number | |
| virtualAccountId | Yes | The AUD payment route (virtual account) ID |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | A descriptive name for this API key (e.g., 'Production Bot', 'Agent Smith') | |
| metadata | No | Optional metadata to attach to the key |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| network | Yes | Network for the wallet |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| dob | No | Date of birth in YYYY-MM-DD format (e.g., '1990-01-15') | |
| type | No | Company type (e.g., 'Private Company Limited by Shares') | |
| No | Customer's email address | ||
| phone | No | Phone number with country code (e.g., '+14155552671') | |
| taxId | No | Tax ID (e.g., '12-3456789') | |
| country | No | Country code ISO 3166-1 alpha-2 (required for businesses, e.g., 'US') | |
| website | No | Website URL | |
| lastName | No | Last name (required for individuals) | |
| firstName | No | First name (required for individuals) | |
| middleName | No | Middle name | |
| acceptTerms | No | Accept Stables' terms of service and privacy policy | |
| addressCity | No | City | |
| companyName | No | Company name (required for businesses) | |
| nationality | No | Two-letter country code (e.g., 'US', 'GB') | |
| addressLine1 | No | Street address line 1 | |
| addressLine2 | No | Street address line 2 | |
| addressState | No | State or region | |
| customerType | Yes | Type of customer - 'individual' for personal, 'business' for companies | |
| entitlements | No | List of entitlements to request | |
| sourceOfFunds | No | Source of funds | |
| accountPurpose | No | What will you use Stables for? | |
| addressCountry | No | Two-letter country code (e.g., 'US') | |
| incorporatedOn | No | Date of incorporation in YYYY-MM-DD format | |
| describeBusiness | No | Description of the business | |
| legalAddressCity | No | Legal address city (for businesses) | |
| addressPostalCode | No | Postal/ZIP code | |
| legalAddressLine1 | No | Legal address line 1 (for businesses) | |
| legalAddressLine2 | No | Legal address line 2 (for businesses) | |
| legalAddressState | No | Legal address state (for businesses) | |
| externalCustomerId | No | Your own reference ID for this customer | |
| registrationNumber | No | Business registration number | |
| accountPurposeOther | No | Explain purpose (required if accountPurpose is OTHER) | |
| legalAddressCountry | No | Legal address country code (for businesses) | |
| conductMoneyServices | No | Whether the company conducts money services | |
| registrationLocation | No | Registration location (e.g., state for USA) | |
| describeMoneyServices | No | Describe money services (required if conductMoneyServices is true) | |
| expectedAnnualRevenue | No | Estimated annual revenue in USD | |
| legalAddressPostalCode | No | Legal address postal code (for businesses) | |
| expectedMonthlyPayments | No | Expected monthly payments in USD | |
| sourceOfFundsDescription | No | Describe where your business funds come from | |
| describeComplianceControls | No | Description of compliance controls | |
| operateInProhibitedCountry | No | Does your business operate in any prohibited countries? | |
| doesYourBusinessEngageInHighRiskActivities | No | Does your business engage in high risk activities? |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It 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.
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.
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.
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.
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.
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_customer_onboarding_linkA
Create a customer and get a hosted verification link for them in one call, so the customer enters their own KYC/KYB details. An existing customer with the same email is reused (customer_created is false) and the fields sent are ignored. Takes the same fields as create_customer; send what you already know.
| Name | Required | Description | Default |
|---|---|---|---|
| dob | No | Date of birth in YYYY-MM-DD format (e.g., '1990-01-15') | |
| type | No | Company type (e.g., 'Private Company Limited by Shares') | |
| No | Customer's email address | ||
| phone | No | Phone number with country code (e.g., '+14155552671') | |
| taxId | No | Tax ID (e.g., '12-3456789') | |
| country | No | Country code ISO 3166-1 alpha-2 (required for businesses, e.g., 'US') | |
| website | No | Website URL | |
| lastName | No | Last name (required for individuals) | |
| firstName | No | First name (required for individuals) | |
| rejectUrl | No | Where to send the customer if verification is rejected | |
| ttlInSecs | No | Link lifetime in seconds (default 1800) | |
| middleName | No | Middle name | |
| successUrl | No | Where to send the customer after verification succeeds | |
| acceptTerms | No | Accept Stables' terms of service and privacy policy | |
| addressCity | No | City | |
| companyName | No | Company name (required for businesses) | |
| nationality | No | Two-letter country code (e.g., 'US', 'GB') | |
| addressLine1 | No | Street address line 1 | |
| addressLine2 | No | Street address line 2 | |
| addressState | No | State or region | |
| customerType | Yes | Type of customer - 'individual' for personal, 'business' for companies | |
| entitlements | No | List of entitlements to request | |
| sourceOfFunds | No | Source of funds | |
| accountPurpose | No | What will you use Stables for? | |
| addressCountry | No | Two-letter country code (e.g., 'US') | |
| incorporatedOn | No | Date of incorporation in YYYY-MM-DD format | |
| describeBusiness | No | Description of the business | |
| legalAddressCity | No | Legal address city (for businesses) | |
| verificationType | No | Run one verification step instead of the full flow | |
| addressPostalCode | No | Postal/ZIP code | |
| legalAddressLine1 | No | Legal address line 1 (for businesses) | |
| legalAddressLine2 | No | Legal address line 2 (for businesses) | |
| legalAddressState | No | Legal address state (for businesses) | |
| externalCustomerId | No | Your own reference ID for this customer | |
| registrationNumber | No | Business registration number | |
| accountPurposeOther | No | Explain purpose (required if accountPurpose is OTHER) | |
| legalAddressCountry | No | Legal address country code (for businesses) | |
| conductMoneyServices | No | Whether the company conducts money services | |
| registrationLocation | No | Registration location (e.g., state for USA) | |
| describeMoneyServices | No | Describe money services (required if conductMoneyServices is true) | |
| expectedAnnualRevenue | No | Estimated annual revenue in USD | |
| legalAddressPostalCode | No | Legal address postal code (for businesses) | |
| expectedMonthlyPayments | No | Expected monthly payments in USD | |
| sourceOfFundsDescription | No | Describe where your business funds come from | |
| describeComplianceControls | No | Description of compliance controls | |
| operateInProhibitedCountry | No | Does your business operate in any prohibited countries? | |
| doesYourBusinessEngageInHighRiskActivities | No | Does your business engage in high risk activities? |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose genuinely non-obvious behavior: an existing customer with the same email is reused, customer_created is false, and the submitted fields are ignored. It still omits permission/auth requirements and what happens to the link on expiry beyond the schema's ttlInSecs default.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the outcome, then the reuse caveat, then the field guidance. Every sentence carries distinct information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 47-parameter, no-output-schema tool with no annotations, the description covers the key decision points (link generation, customer reuse, field delegation) and names the returned customer_created flag. It is somewhat thin on the returned link payload and expiry semantics, but the schema documents ttlInSecs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3, and the description adds real meaning on top: it delegates the field set to create_customer and advises sending only what is already known, which tells the agent most fields are optional despite the 47-property schema. It does not clarify the interaction between the two APIs' field sets beyond that.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific compound action ('create a customer and get a hosted verification link ... in one call') with the resource and the rationale (customer self-enters KYC/KYB). This clearly distinguishes it from the sibling create_customer, which does not return a link.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear usage context ('so the customer enters their own KYC/KYB details') and an explicit relationship to the sibling ('Takes the same fields as create_customer; send what you already know'). It stops short of stating when to prefer plain create_customer or get_verification_link instead, so it is not a full when/when-not rule.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| preview | No | Price the quote without persisting it, to show an estimate | |
| metadata | No | Optional metadata | |
| sourceAmount | Yes | Amount to convert, in major units (e.g. '125.75') | |
| sourceNetwork | No | Blockchain network of the source. Required for off-ramp, omitted for on-ramp | |
| sourceCurrency | Yes | Source currency: a stablecoin for off-ramp (e.g. 'USDT'), fiat for on-ramp | |
| destinationAddress | No | Destination wallet address. Required for on-ramp | |
| destinationCountry | No | Destination country, ISO 2-letter. Required for off-ramp | |
| destinationNetwork | No | Off-ramp: payment network, 'swift' or 'bank'. On-ramp: blockchain network. Replaces the old paymentMethodType | |
| destinationCurrency | Yes | Destination currency: fiat for off-ramp (e.g. 'EUR'), a stablecoin for on-ramp |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| iban | No | IBAN (EU/international) | |
| cnaps | No | CNAPS (China) | |
| payId | No | PayID alias (AUD only). Requires payIdType | |
| bicCode | No | BIC (EUR/GBP international) | |
| bsbCode | No | BSB code (Australia) | |
| quoteId | Yes | The quote ID to execute | |
| bankCode | No | Bank code / institution number (CAD) | |
| bankName | No | Name of the destination bank | |
| ifscCode | No | IFSC code (India) | |
| metadata | No | Optional metadata | |
| sortCode | No | Sort code (UK) | |
| payIdType | No | PayID alias type. Required when payId is given | |
| swiftCode | No | SWIFT code | |
| branchCode | No | Branch code / transit number (CAD) | |
| customerId | Yes | The customer ID for this transfer | |
| accountType | No | Account type. Required for CAD and USD bank payouts | |
| addressCity | No | Beneficiary city | |
| bankCountry | No | Bank country, ISO 2-letter (e.g. 'AU', 'US') | |
| dateOfBirth | No | Beneficiary date of birth, YYYY-MM-DD. Required when recipientType is individual for AED, CAD, EUR, GBP, MXN, USD | |
| purposeCode | No | Purpose of the transfer (e.g. 'SALARY'). Required on some corridors | |
| addressState | No | Beneficiary state or region | |
| bankCurrency | No | Payout currency, ISO 3-letter (e.g. 'EUR') | |
| accountNumber | No | Bank account number, if not using IBAN | |
| addressStreet | No | Beneficiary street address | |
| fundingSource | No | 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 | |
| recipientType | No | Beneficiary type. Required for AED, CAD, EUR, GBP, MXN, USD | |
| routingNumber | No | ABA routing number (US) | |
| addressCountry | No | Beneficiary country, ISO 2-letter. The complete address is required for AED, CAD, EUR, GBP, MXN, USD | |
| destinationType | No | Payout target: a bank account (off-ramp) or a wallet address | bank |
| accountHolderName | No | Account holder's full name, or the company name when recipientType is business | |
| addressPostalCode | No | Beneficiary postal code | |
| destinationAddress | No | Wallet address when destinationType is crypto | |
| destinationNetwork | No | Blockchain network when destinationType is crypto (e.g. 'polygon') | |
| destinationCurrency | No | Stablecoin to deliver when destinationType is crypto (e.g. 'USDT') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| customerId | Yes | The customer ID to create the payment route for | |
| sourceCurrency | Yes | Fiat currency the route collects in (e.g. 'AUD', 'USD', 'EUR') | |
| destinationAddress | Yes | Wallet address deposits are paid out to. Validated against the chosen network | |
| destinationCurrency | No | Stablecoin to receive | usdt |
| destinationPaymentRail | Yes | Blockchain network the payout address belongs to |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The HTTPS URL to receive webhook POST requests | |
| name | Yes | A descriptive name for this webhook (e.g., 'Transfer status notifications') | |
| secret | No | Optional signing secret for HMAC-SHA256 webhook signature verification | |
| eventTypes | Yes | Event types to subscribe to (e.g. ['transfer.updated.status_transitioned']), or ['all'] |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| on | Yes | What the document belongs to: a transfer, or a deposit on a payment route | |
| documentId | Yes | The document ID from list_documents | |
| transactionId | Yes | The transfer ID, or the deposit ID from get_virtual_account_history |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden, and 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| webhookId | Yes | The webhook subscription ID to delete |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| apiKeyId | Yes | The API key ID to look up |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full 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.
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.
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.
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.
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.
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'.
| Name | Required | Description | Default |
|---|---|---|---|
| network | No | Network (default polygon) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden 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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| include | No | Also return the normalized KYC/KYB data ('verification-profile') or submitted document images ('doc-images'). Slower; only to sync verification data | |
| customerId | Yes | The customer ID to look up |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| on | Yes | What the document belongs to: a transfer, or a deposit on a payment route | |
| documentId | Yes | The document ID from list_documents | |
| transactionId | Yes | The transfer ID, or the deposit ID from get_virtual_account_history |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| customerId | Yes | The customer ID |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| quoteId | Yes | The quote ID to look up |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| rfiId | Yes | The RFI ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. '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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| rfiId | Yes | The RFI ID | |
| customerId | Yes | The customer ID | |
| requirementId | Yes | The requirement ID (type 'evidence') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. 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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| transferId | Yes | The transfer ID to look up |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It 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.
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.
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.
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.
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.
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_verification_linkB
Generate a KYC verification link for a customer. The customer must complete verification before they can make transfers.
| Name | Required | Description | Default |
|---|---|---|---|
| rejectUrl | No | URL to redirect to after rejected verification | |
| ttlInSecs | No | Time-to-live for the KYC link in seconds (default: 1800) | |
| customerId | Yes | The customer ID to generate verification link for | |
| successUrl | No | URL to redirect to after successful verification | |
| verificationType | No | Run one verification step instead of the full flow, e.g. 'proof_of_address' when an RFI asks for it |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It only states that a link is generated and a precondition for transfers, but does not disclose side effects, required permissions, rate limits, link expiration behavior (despite the ttlInSecs parameter), or what happens if verification is already complete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core action and followed by a key contextual constraint. Every sentence earns its place with no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the basic purpose and a usage constraint, but for a tool with 5 parameters and no output schema, it omits important context such as what the returned link looks like, how long it is valid, and how the optional URLs and verificationType affect behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters. The description adds no additional meaning beyond what is in the schema (e.g., it does not explain the verificationType options or the default TTL).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (Generate) and resource (KYC verification link) for a customer, making the purpose clear. However, it does not differentiate from the sibling tool create_customer_onboarding_link, which likely has overlapping functionality.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the statement that the customer must complete verification before making transfers, but there is no explicit guidance on when to use this tool versus alternatives like create_customer_onboarding_link or get_kyc_capabilities, nor any exclusions.
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.)
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of events to return (default: 10) | |
| customerId | Yes | The customer ID | |
| virtualAccountId | Yes | The virtual account ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and 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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| pageSize | No | Number of keys per page | |
| pageToken | No | Token for the next page |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| customerId | Yes | The customer ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| network | No | Only this network | |
| pageSize | No | Results per page (default 20) | |
| pageToken | No | next_page_token from the previous page |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Only this status | |
| customerId | Yes | The customer ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. '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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| pageSize | No | Customers per page | |
| pageToken | No | next_page_token from the previous page |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| on | Yes | What the document belongs to: a transfer, or a deposit on a payment route | |
| transactionId | Yes | The transfer ID, or the deposit ID from get_virtual_account_history |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden, 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Only these RFI types | |
| limit | No | Results per page | |
| cursor | No | next_cursor from the previous page | |
| status | No | Only these statuses (default: open and submitted) | |
| customerId | No | Only this customer's RFIs | |
| transactionReferenceId | No | Only RFIs about this transfer or deposit |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It discloses 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| customerId | Yes | The customer ID | |
| virtualAccountId | Yes | The AUD payment route (virtual account) ID |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Filter by transfer type | |
| status | No | Filter by transfer status | |
| pageSize | No | Number of transfers per page (default: 20) | |
| pageToken | No | Token for the next page of results | |
| customerId | No | Filter by customer ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It 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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of accounts to return | |
| status | No | Filter by account status | |
| customerId | No | Only this customer's routes; omit to list routes across all customers | |
| startingAfter | No | Return routes after this route ID (the last ID of the previous page) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Filter by delivery status | |
| pageSize | No | How many attempts to return (default 10, max 50) | |
| eventType | No | Filter by event type (e.g. 'transfer.created') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It 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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Only this status. Archived wallets appear only when asked for | |
| network | No | Only this network | |
| pageSize | No | Results per page (default 20) | |
| pageToken | No | next_page_token from the previous page |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| customerId | Yes | The customer ID | |
| virtualAccountId | Yes | The AUD payment route (virtual account) ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| customerId | Yes | The customer ID | |
| entitlements | Yes | Entitlement names, e.g. ['aed_local'] |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| apiKeyId | Yes | The API key ID to revoke |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| amount | Yes | Deposit amount in major units (e.g. '500.00') | |
| scenario | No | 'completed' runs the deposit through to payout, 'failed' exercises the failure path, 'create_only' stops at the deposit | |
| customerId | Yes | The customer ID | |
| senderName | No | Name to attribute the deposit to | |
| senderReference | No | Payment reference on the deposit | |
| virtualAccountId | Yes | The payment route (virtual account) ID | |
| externalDepositId | No | Your own reference for this deposit |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden, 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| transferId | Yes | The transfer awaiting funds |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| customerId | Yes | The customer ID | |
| entitlement | Yes | The entitlement name, e.g. 'aed_local' | |
| requirements | Yes | The missing fields, snake_case as in the Update Customer reference |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| rfiId | Yes | The RFI ID | |
| answers | Yes | Answers 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,...'] } | |
| customerId | Yes | The customer ID | |
| requirementId | Yes | The requirement ID (type 'evidence') |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| dob | No | Updated date of birth (YYYY-MM-DD) | |
| No | Updated email address | ||
| phone | No | Updated phone number | |
| lastName | No | Updated last name | |
| firstName | No | Updated first name | |
| customerId | Yes | The customer ID to update | |
| middleName | No | Updated middle name | |
| companyName | No | Updated company name (for businesses) | |
| nationality | No | Updated nationality (two-letter country code) | |
| entitlements | No | Updated entitlements |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. 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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| metadata | Yes | Metadata key-value pairs to set | |
| customerId | Yes | The customer ID to update metadata for |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| customerId | Yes | The customer ID | |
| virtualAccountId | Yes | The payment route (virtual account) ID | |
| destinationAddress | Yes | New payout wallet address | |
| destinationCurrency | No | Stablecoin to receive | usdt |
| destinationPaymentRail | Yes | Blockchain network the new address belongs to |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| enabled | Yes | false to stop accepting deposits from it | |
| bsbNumber | Yes | Source account BSB | |
| customerId | Yes | The customer ID | |
| accountNumber | Yes | Source account number | |
| sourceAccountId | Yes | The whitelist entry ID (from list_route_whitelist) | |
| virtualAccountId | Yes | The AUD payment route (virtual account) ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. 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.
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.
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.
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.
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.
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)
| Name | Required | Description | Default |
|---|---|---|---|
| customerId | Yes | The customer ID | |
| virtualAccountId | Yes | The virtual account ID to update | |
| depositHandlingMode | Yes | New deposit handling mode |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| iban | No | IBAN (EU/international) | |
| cnaps | No | CNAPS (China) | |
| payId | No | PayID alias (AUD only). Requires payIdType | |
| bicCode | No | BIC (EUR/GBP international) | |
| bsbCode | No | BSB code (Australia) | |
| network | Yes | Payout network: local bank rails, SWIFT, or PayID (AUD) | |
| quoteId | No | Validate against this quote's corridor | |
| bankCode | No | Bank code / institution number (CAD) | |
| bankName | No | Name of the destination bank | |
| ifscCode | No | IFSC code (India) | |
| sortCode | No | Sort code (UK) | |
| payIdType | No | PayID alias type. Required when payId is given | |
| swiftCode | No | SWIFT code | |
| branchCode | No | Branch code / transit number (CAD) | |
| accountType | No | Account type. Required for CAD and USD bank payouts | |
| addressCity | No | Beneficiary city | |
| bankCountry | No | Bank country, ISO 2-letter (e.g. 'AU', 'US') | |
| dateOfBirth | No | Beneficiary date of birth, YYYY-MM-DD. Required when recipientType is individual for AED, CAD, EUR, GBP, MXN, USD | |
| addressState | No | Beneficiary state or region | |
| bankCurrency | No | Payout currency, ISO 3-letter (e.g. 'EUR') | |
| accountNumber | No | Bank account number, if not using IBAN | |
| addressStreet | No | Beneficiary street address | |
| recipientType | No | Beneficiary type. Required for AED, CAD, EUR, GBP, MXN, USD | |
| routingNumber | No | ABA routing number (US) | |
| addressCountry | No | Beneficiary country, ISO 2-letter. The complete address is required for AED, CAD, EUR, GBP, MXN, USD | |
| accountHolderName | No | Account holder's full name, or the company name when recipientType is business | |
| addressPostalCode | No | Beneficiary postal code |
TDQS
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.
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.
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.
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.
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.
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.
44 tool updates
v2.4.0- Added
add_document - Added
add_route_whitelist_account - Added
create_balance_wallet - Changed
create_customer5 fields changed- changed
Input schema / properties / entitlements / items / enumPrevious value: -[ - "base_payout", - "virtual_account" -]New value: +[ + "base_payout", + "virtual_account", + "eur_virtual_account", + "gbp_virtual_account", + "usd_virtual_account", + "aed_local" +] - removed
Input schema / properties / howDidYouComeAcrossStablesRemoved value: -{ - "description": "How did you come across Stables?", - "type": "string" -} - removed
Input schema / properties / industrySelectionRemoved value: -{ - "description": "NAICS industry code (e.g., '5415')", - "type": "string" -} - removed
Input schema / properties / isYourBusinessADaoRemoved value: -{ - "description": "Is your business a DAO?", - "type": "boolean" -} - removed
Input schema / properties / mainSourceOfFundsRemoved 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" -}
- Added
create_customer_onboarding_link - Changed
create_quote17 fields changed- removed
Input schema / properties / customerIdRemoved value: -{ - "description": "The customer ID to associate this quote with. Required if the quote will be used to create a transfer.", - "type": "string" -} - added
Input schema / properties / destinationAddressAdded value: +{ + "description": "Destination wallet address. Required for on-ramp", + "type": "string" +} - added
Input schema / properties / destinationCountryAdded value: +{ + "description": "Destination country, ISO 2-letter. Required for off-ramp", + "type": "string" +} - added
Input schema / properties / destinationCurrencyAdded value: +{ + "description": "Destination currency: fiat for off-ramp (e.g. 'EUR'), a stablecoin for on-ramp", + "type": "string" +} - added
Input schema / properties / destinationNetworkAdded value: +{ + "description": "Off-ramp: payment network, 'swift' or 'bank'. On-ramp: blockchain network. Replaces the old paymentMethodType", + "type": "string" +} - removed
Input schema / properties / fromAmountRemoved value: -{ - "description": "Amount to convert (e.g., '125.75')", - "type": "string" -} - removed
Input schema / properties / fromCurrencyRemoved value: -{ - "description": "Source cryptocurrency (USDC or USDT)", - "enum": [ - "USDC", - "USDT" - ], - "type": "string" -} - removed
Input schema / properties / fromNetworkRemoved value: -{ - "description": "Blockchain network for the source crypto", - "enum": [ - "ethereum", - "polygon" - ], - "type": "string" -} - added
Input schema / properties / metadataAdded value: +{ + "additionalProperties": { + "type": "string" + }, + "description": "Optional metadata", + "type": "object" +} - removed
Input schema / properties / paymentMethodTypeRemoved value: -{ - "description": "Payment method for fiat payouts - 'SWIFT' for international, 'LOCAL' for domestic rails", - "enum": [ - "SWIFT", - "LOCAL" - ], - "type": "string" -} - added
Input schema / properties / previewAdded value: +{ + "description": "Price the quote without persisting it, to show an estimate", + "type": "boolean" +} - added
Input schema / properties / sourceAmountAdded value: +{ + "description": "Amount to convert, in major units (e.g. '125.75')", + "type": "string" +} - added
Input schema / properties / sourceCurrencyAdded value: +{ + "description": "Source currency: a stablecoin for off-ramp (e.g. 'USDT'), fiat for on-ramp", + "type": "string" +} - added
Input schema / properties / sourceNetworkAdded 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" +} - removed
Input schema / properties / toCountryRemoved value: -{ - "description": "Destination country code (e.g., 'GR', 'US', 'GB')", - "type": "string" -} - removed
Input schema / properties / toCurrencyRemoved value: -{ - "description": "Destination currency code (e.g., 'EUR', 'USD', 'GBP')", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "fromCurrency", - "fromAmount", - "fromNetwork", - "toCurrency", - "toCountry", - "paymentMethodType" -]New value: +[ + "sourceCurrency", + "sourceAmount", + "destinationCurrency" +]
- Changed
create_transfer28 fields changed- changed
Input schema / properties / accountHolderName / descriptionPrevious 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" - changed
Input schema / properties / accountNumber / descriptionPrevious value: -"Bank account number (if not using IBAN)"New value: +"Bank account number, if not using IBAN" - changed
Input schema / properties / accountType / descriptionPrevious value: -"Type of bank account"New value: +"Account type. Required for CAD and USD bank payouts" - added
Input schema / properties / addressCityAdded value: +{ + "description": "Beneficiary city", + "type": "string" +} - added
Input schema / properties / addressCountryAdded value: +{ + "description": "Beneficiary country, ISO 2-letter. The complete address is required for AED, CAD, EUR, GBP, MXN, USD", + "type": "string" +} - added
Input schema / properties / addressPostalCodeAdded value: +{ + "description": "Beneficiary postal code", + "type": "string" +} - added
Input schema / properties / addressStateAdded value: +{ + "description": "Beneficiary state or region", + "type": "string" +} - added
Input schema / properties / addressStreetAdded value: +{ + "description": "Beneficiary street address", + "type": "string" +} - added
Input schema / properties / bankCodeAdded value: +{ + "description": "Bank code / institution number (CAD)", + "type": "string" +} - changed
Input schema / properties / bankCountry / descriptionPrevious value: -"Two-letter country code of the bank (e.g., 'AU', 'US')"New value: +"Bank country, ISO 2-letter (e.g. 'AU', 'US')" - changed
Input schema / properties / bankCurrency / descriptionPrevious value: -"Currency for the bank payout (e.g., 'EUR', 'USD', 'AUD')"New value: +"Payout currency, ISO 3-letter (e.g. 'EUR')" - changed
Input schema / properties / bankName / descriptionPrevious value: -"Name of the destination bank (required for off-ramp)"New value: +"Name of the destination bank" - added
Input schema / properties / bicCodeAdded value: +{ + "description": "BIC (EUR/GBP international)", + "type": "string" +} - added
Input schema / properties / branchCodeAdded value: +{ + "description": "Branch code / transit number (CAD)", + "type": "string" +} - added
Input schema / properties / cnapsAdded value: +{ + "description": "CNAPS (China)", + "type": "string" +} - added
Input schema / properties / dateOfBirthAdded value: +{ + "description": "Beneficiary date of birth, YYYY-MM-DD. Required when recipientType is individual for AED, CAD, EUR, GBP, MXN, USD", + "type": "string" +} - added
Input schema / properties / destinationAddressAdded value: +{ + "description": "Wallet address when destinationType is crypto", + "type": "string" +} - added
Input schema / properties / destinationCurrencyAdded value: +{ + "description": "Stablecoin to deliver when destinationType is crypto (e.g. 'USDT')", + "type": "string" +} - added
Input schema / properties / destinationNetworkAdded value: +{ + "description": "Blockchain network when destinationType is crypto (e.g. 'polygon')", + "type": "string" +} - added
Input schema / properties / destinationTypeAdded value: +{ + "default": "bank", + "description": "Payout target: a bank account (off-ramp) or a wallet address", + "enum": [ + "bank", + "crypto" + ], + "type": "string" +} - added
Input schema / properties / fundingSourceAdded 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" +} - changed
Input schema / properties / iban / descriptionPrevious value: -"IBAN for the destination bank account (EU/international)"New value: +"IBAN (EU/international)" - changed
Input schema / properties / metadata / descriptionPrevious value: -"Optional metadata to attach to the transfer"New value: +"Optional metadata" - added
Input schema / properties / payIdAdded value: +{ + "description": "PayID alias (AUD only). Requires payIdType", + "type": "string" +} - added
Input schema / properties / payIdTypeAdded value: +{ + "description": "PayID alias type. Required when payId is given", + "enum": [ + "email", + "phone_number", + "abn", + "acn", + "organisation_id" + ], + "type": "string" +} - added
Input schema / properties / purposeCodeAdded 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" +} - added
Input schema / properties / recipientTypeAdded value: +{ + "description": "Beneficiary type. Required for AED, CAD, EUR, GBP, MXN, USD", + "enum": [ + "individual", + "business" + ], + "type": "string" +} - changed
Input schema / properties / swiftCode / descriptionPrevious value: -"SWIFT/BIC code for international transfers"New value: +"SWIFT code"
- Changed
create_virtual_account8 fields changed- changed
Input schema / properties / customerId / descriptionPrevious value: -"The customer ID to create the virtual account for"New value: +"The customer ID to create the payment route for" - removed
Input schema / properties / depositHandlingModeRemoved 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" -} - changed
Input schema / properties / destinationAddress / descriptionPrevious value: -"Crypto wallet address for payouts"New value: +"Wallet address deposits are paid out to. Validated against the chosen network" - added
Input schema / properties / destinationCurrency / defaultAdded value: +"usdt" - changed
Input schema / properties / destinationCurrency / descriptionPrevious value: -"Stablecoin to receive (default: usdc)"New value: +"Stablecoin to receive" - changed
Input schema / properties / destinationPaymentRail / descriptionPrevious value: -"Blockchain network for the destination wallet"New value: +"Blockchain network the payout address belongs to" - changed
Input schema / properties / sourceCurrency / descriptionPrevious value: -"Currency for the virtual account (e.g., 'USD', 'EUR', 'GBP')"New value: +"Fiat currency the route collects in (e.g. 'AUD', 'USD', 'EUR')" - changed
Input schema / requiredPrevious value: -[ - "customerId", - "sourceCurrency" -]New value: +[ + "customerId", + "sourceCurrency", + "destinationAddress", + "destinationPaymentRail" +]
- Changed
create_webhook3 fields changed- changed
Input schema / properties / eventTypes / descriptionPrevious 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']" - added
Input schema / properties / eventTypes / items / enumAdded 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" +] - changed
Input schema / properties / name / descriptionPrevious 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')"
- Removed
deactivate_virtual_account - Added
delete_document - Added
get_balance - Added
get_balance_wallet - Changed
get_customer1 field changed- added
Input schema / properties / includeAdded 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" +}
- Added
get_document_download_url - Added
get_kyc_capabilities - Added
get_rfi - Added
get_rfi_evidence_form - Changed
get_verification_link1 field changed- added
Input schema / properties / verificationTypeAdded 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" +}
- Changed
get_virtual_account_history1 field changed- removed
Input schema / properties / eventTypeRemoved 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" -}
- Added
list_available_entitlements - Added
list_balance_activity - Added
list_customer_rfis - Changed
list_customers3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / pageSizeAdded value: +{ + "description": "Customers per page", + "maximum": 100, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / pageTokenAdded value: +{ + "description": "next_page_token from the previous page", + "type": "string" +}
- Added
list_documents - Added
list_pending_balance_deposits - Added
list_rfis - Added
list_route_whitelist - Changed
list_transfers2 fields changed- changed
Input schema / properties / status / enumPrevious 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" +] - changed
Input schema / properties / type / enumPrevious value: -[ - "TRANSFER_TYPE_ONRAMP", - "TRANSFER_TYPE_OFFRAMP" -]New value: +[ + "onramp", + "offramp" +]
- Changed
list_virtual_accounts3 fields changed- changed
Input schema / properties / customerId / descriptionPrevious value: -"The customer ID to list virtual accounts for"New value: +"Only this customer's routes; omit to list routes across all customers" - added
Input schema / properties / startingAfterAdded value: +{ + "description": "Return routes after this route ID (the last ID of the previous page)", + "type": "string" +} - removed
Input schema / requiredRemoved value: -[ - "customerId" -]
- Added
list_webhook_deliveries - Added
list_whitelisted_wallets - Removed
reactivate_virtual_account - Added
register_route_payid - Added
request_entitlements - Removed
send_verification_sms - Added
simulate_route_deposit - Added
simulate_transfer_deposit - Added
submit_entitlement_requirements - Added
submit_rfi_evidence - Changed
update_customer1 field changed- changed
Input schema / properties / entitlements / items / enumPrevious value: -[ - "base_payout", - "virtual_account" -]New value: +[ + "base_payout", + "virtual_account", + "eur_virtual_account", + "gbp_virtual_account", + "usd_virtual_account", + "aed_local" +]
- Added
update_route_destination - Added
update_route_whitelist_account - Added
validate_payment_method
25 tool updates
v1.4.0- First observed
create_api_key - First observed
create_customer - First observed
create_quote - First observed
create_transfer - First observed
create_virtual_account - First observed
create_webhook - First observed
deactivate_virtual_account - First observed
delete_webhook - First observed
get_api_key - First observed
get_customer - First observed
get_quote - First observed
get_transfer - First observed
get_verification_link - First observed
get_virtual_account_history - First observed
list_api_keys - First observed
list_customers - First observed
list_transfers - First observed
list_virtual_accounts - First observed
list_webhooks - First observed
reactivate_virtual_account - First observed
revoke_api_key - First observed
send_verification_sms - First observed
update_customer - First observed
update_customer_metadata - First observed
update_virtual_account
TDQS
Scored across 51 tools
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.
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.
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.
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
Related MCP Connectors
Stripe payments for AI agents. Create links, verify, manage customers.
Complete financial infrastructure for AI agents — payments, lending, escrow & more.
United States payments for AI agents — Stripe checkout via Stripe. Never holds funds.
Pakistan payments for AI agents — Safepay checkout via Safepay. Never holds funds.
Related MCP Servers
- FlicenseNot gradedqualityAmaintenanceEnables 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.-

Yolfi MCP Serverofficial
AlicenseNot gradedqualityAmaintenanceEnables AI coding agents to add stablecoin checkout, payment links, payment status checks, webhook verification, and webhook-based access logic to applications through an API-first payment workflow.MIT- AlicenseNot gradedqualityAmaintenanceEnables AI coding agents to add stablecoin checkout, create payment links and invoices, configure webhooks, verify payment signatures, and gate access based on confirmed payment events.MIT
- AlicenseNot gradedqualityAmaintenanceEnables AI coding agents to integrate stablecoin checkout, payment links, payment status checks, webhook verification, and webhook-based access logic into applications.MIT