Stables MCP Server
OfficialThis server provides an MCP interface for the Stables fiat-to-crypto API, allowing AI agents to manage customers, create crypto-to-fiat quotes, execute transfers, set up virtual accounts, simulate sandbox deposits, and handle API keys and webhooks.
Customer Management: Create, retrieve, list, and update customers (individual/business); generate KYC verification links with configurable TTL and redirect URLs; send KYC links via SMS (requires Twilio); manage entitlements and metadata.
Quotes: Generate exchange rate quotes for USDC/USDT to fiat across networks (Ethereum, Polygon) and payment methods (SWIFT/LOCAL); quotes expire after 30 seconds.
Transfers: Execute off-ramp transfers using an active quote; support various bank account formats (IBAN, routing number, sort code, IFSC, BSB, SWIFT); check status and list transfers with filters (status, type, customer ID).
Virtual Accounts: Create and manage virtual bank accounts for fiat deposits with auto-payout, hold, or manual modes; list, update, deactivate/reactivate; view account activity history (deposits, payouts, reviews).
API Keys: Create, list, get details, and revoke API keys with optional metadata.
Webhooks: Create, list, and delete webhook subscriptions for event notifications (payment status, KYC updates, VA deposits/payouts).
Sandbox: Simulate fiat deposits into virtual accounts and inbound crypto for transfer testing (sandbox only).
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: Fin-MCP Payment Server
Features
This MCP server provides 26 tools across 7 categories:
Customer Management
create_customer- Create individual or business customersget_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
Quotes
create_quote- Get exchange rate quotes (USDC/USDT to fiat)get_quote- Check quote status and details
Transfers
create_transfer- Execute a transfer using an active quoteget_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 customerupdate_virtual_account- Update virtual account settingsget_virtual_account_history- Get deposits and their payouts for a payment routeupdate_route_destination- Change the payout wallet on an existing route
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
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 (6)
│ ├── quotes.ts # Quote tools (2)
│ ├── transfers.ts # Transfer tools (3)
│ ├── virtual-accounts.ts # Virtual account 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
25 toolscreate_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_customerA
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 | |
| industrySelection | No | NAICS industry code (e.g., '5415') | |
| legalAddressLine1 | No | Legal address line 1 (for businesses) | |
| legalAddressLine2 | No | Legal address line 2 (for businesses) | |
| legalAddressState | No | Legal address state (for businesses) | |
| mainSourceOfFunds | No | Main source of funds | |
| externalCustomerId | No | Your own reference ID for this customer | |
| isYourBusinessADao | No | Is your business a DAO? | |
| 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 | |
| howDidYouComeAcrossStables | No | How did you come across Stables? | |
| 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, and the description only states that the tool creates a customer for KYC and transfers. It does not disclose behavioral traits such as required permissions, side effects, or return value structure. Given the absence of annotations, the description should compensate but does not.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loaded with the core purpose, followed by type guidance and entitlement example. Every sentence adds value and there is no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 47 parameters with conditional dependencies (e.g., different required fields for individuals vs businesses). The description touches on the two types but does not provide a high-level guide for conditional requirements. No output schema exists. The description is adequate but not complete given the 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?
The input schema has 100% coverage with descriptions for all 47 parameters. The description adds minor value by summarizing customerType options and entitlements, but most parameter meaning is already in 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?
The description clearly states the tool creates a new customer in Stables for KYC verification and transfers, and distinguishes between individual and business types. This provides a specific verb-resource-action with clear purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description says to use 'individual' for personal accounts or 'business' for company accounts, and mentions including entitlements like 'base_payout'. However, it does not explicitly address when not to use this tool or contrast with sibling tools like create_api_key or create_quote.
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 currency exchange. Quotes show the exchange rate, fees, and amount the customer will receive. Quotes expire after 30 seconds. Currently supports crypto → fiat (off-ramp) with more types coming soon.
| Name | Required | Description | Default |
|---|---|---|---|
| toCountry | Yes | Destination country code (e.g., 'GR', 'US', 'GB') | |
| customerId | No | The customer ID to associate this quote with. Required if the quote will be used to create a transfer. | |
| fromAmount | Yes | Amount to convert (e.g., '125.75') | |
| toCurrency | Yes | Destination currency code (e.g., 'EUR', 'USD', 'GBP') | |
| fromNetwork | Yes | Blockchain network for the source crypto | |
| fromCurrency | Yes | Source cryptocurrency (USDC or USDT) | |
| paymentMethodType | Yes | Payment method for fiat payouts - 'SWIFT' for international, 'LOCAL' for domestic rails |
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 mentions the temporary nature (expires in 30 seconds) and supported types. However, it does not disclose whether the tool is read-only (likely) or has side effects, nor any required permissions or auth details. Acceptable but not thorough.
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: first defines purpose, second adds critical context (expiry and supported type). No redundant information; every sentence earns its place. Front-loaded for quick scanning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 7 parameters and no output schema, the description covers key aspects (purpose, scope, expiry, customer association). However, it lacks information about the response format (e.g., rate, fees breakdown) or error handling, which are important for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with clear parameter descriptions. The tool description adds value by explaining expiry and scope but does not enhance parameter understanding beyond the schema. Baseline score 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?
Description clearly states the verb 'Get a quote for currency exchange' and specifies the resource (quote) and output (exchange rate, fees, amount). It distinguishes from sibling tools like create_transfer and get_quote, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Description provides context on expiry (30 seconds) and current scope (crypto to fiat off-ramp), guiding when to use. It implies alternatives like create_transfer (for execution) but does not explicitly state when not to use. Still, it offers useful contextual guidance.
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 the actual money movement. Bank/payment details are required for off-ramp (crypto to fiat) transfers.
| Name | Required | Description | Default |
|---|---|---|---|
| iban | No | IBAN for the destination bank account (EU/international) | |
| bsbCode | No | BSB code (Australia) | |
| quoteId | Yes | The quote ID to execute | |
| bankName | No | Name of the destination bank (required for off-ramp) | |
| ifscCode | No | IFSC code (India) | |
| metadata | No | Optional metadata to attach to the transfer | |
| sortCode | No | Sort code (UK) | |
| swiftCode | No | SWIFT/BIC code for international transfers | |
| customerId | Yes | The customer ID for this transfer | |
| accountType | No | Type of bank account | |
| bankCountry | No | Two-letter country code of the bank (e.g., 'AU', 'US') | |
| bankCurrency | No | Currency for the bank payout (e.g., 'EUR', 'USD', 'AUD') | |
| accountNumber | No | Bank account number (if not using IBAN) | |
| routingNumber | No | ABA routing number (US) | |
| accountHolderName | No | Bank account holder's full name (required for off-ramp) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It discloses that the tool initiates actual money movement (a write operation) and requires an active quote, but does not detail error handling, rate limits, or permissions. Adequate but not thorough.
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, front-loaded with the core action. Every sentence adds value. No fluff or redundant 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?
Given the tool complexity (15 parameters, no output schema), the description covers the main action and a key condition (quote expiration) and off-ramp requirement. However, it lacks detail on the return value or behavior when parameters are missing, which could be improved.
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. The description adds context about off-ramp requiring bank details, but otherwise repeats information already in the schema. No significant additional meaning.
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 executes a transfer using an active quote and initiates money movement. It distinguishes from sibling tools like create_quote by specifying it's the execution step.
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 includes the condition that the quote must not be expired and notes that bank details are required for off-ramp transfers. It provides context for when to use the tool but does not explicitly mention when not to use it or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_virtual_accountB
Create a virtual bank account for a customer to receive fiat deposits. Deposits can automatically convert to crypto and payout to a wallet.
| Name | Required | Description | Default |
|---|---|---|---|
| customerId | Yes | The customer ID to create the virtual account for | |
| sourceCurrency | Yes | Currency for the virtual account (e.g., 'USD', 'EUR', 'GBP') | |
| destinationAddress | No | Crypto wallet address for payouts | |
| depositHandlingMode | No | How to handle deposits: 'auto_payout' converts and sends to wallet, 'hold' keeps as fiat, 'manual' requires approval | |
| destinationCurrency | No | Stablecoin to receive (default: usdc) | |
| destinationPaymentRail | No | Blockchain network for the destination wallet |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description partially discloses behavior: it mentions the automatic conversion and payout capability, which is a key behavioral trait. However, it does not cover other important aspects like permissions required, rate limits, irreversibility, or error states. The description adds some value beyond the schema but 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 extremely concise: two sentences that cover the main action and a key feature (conversion/payout). It is front-loaded with the primary purpose, making it easy to scan. 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?
Despite having 6 parameters and no output schema, the description is too brief. It does not explain what the tool returns (e.g., an account ID or status), does not detail the behavior of the deposit handling modes beyond the auto_payout cases, and does not mention any prerequisites (e.g., customer must exist). Significant context is missing for an agent to use this tool confidently.
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 each parameter is described in the schema. The description provides additional context (e.g., 'receive fiat deposits' and 'convert to crypto') that contextualizes parameters like 'sourceCurrency' and 'destinationAddress', but does not elaborate on individual parameters beyond what the schema already states. 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 specifies the tool's purpose: creating a virtual bank account for receiving fiat deposits with optional automatic conversion and payout. It uses a specific verb ('create') and resource ('virtual bank account'), and implicitly distinguishes from sibling tools like 'update_virtual_account' and 'deactivate_virtual_account'.
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 explicit guidance on when to use this tool versus alternatives (e.g., when to use 'create_virtual_account' vs 'update_virtual_account'). It does not mention prerequisites, such as whether a customer must already exist, or when not to use it (e.g., if a virtual account already exists for the customer).
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.
Available event types:
WEBHOOK_EVENT_TYPE_CUSTOMER_CREATED
WEBHOOK_EVENT_TYPE_CUSTOMER_UPDATED
WEBHOOK_EVENT_TYPE_KYC_STATUS_CHANGED
WEBHOOK_EVENT_TYPE_PAYMENT_CREATED
WEBHOOK_EVENT_TYPE_PAYMENT_STATUS_CHANGED
WEBHOOK_EVENT_TYPE_QUOTE_CREATED
WEBHOOK_EVENT_TYPE_QUOTE_EXPIRED
WEBHOOK_EVENT_TYPE_VA_DEPOSIT_RECEIVED
WEBHOOK_EVENT_TYPE_VA_PAYOUT_COMPLETED
WEBHOOK_EVENT_TYPE_VA_PAYOUT_FAILED
WEBHOOK_EVENT_TYPE_MONOOVA_NPP_RECEIVE_PAYMENT
WEBHOOK_EVENT_TYPE_MONOOVA_INBOUND_DIRECT_CREDIT
WEBHOOK_EVENT_TYPE_ALL
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., 'Payment Status Notifications') | |
| secret | No | Optional signing secret for HMAC-SHA256 webhook signature verification | |
| eventTypes | Yes | List of event types to subscribe to (e.g., ['WEBHOOK_EVENT_TYPE_PAYMENT_STATUS_CHANGED']) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description should disclose behavioral traits. It mentions security (HMAC secret) and that POST requests will be sent, but does not describe the response format, rate limits, or any destructive implications. Basic transparency but lacks detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded with the main purpose. It efficiently presents event types as a list and adds a security note. Every sentence is informative with no waste.
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 creation tool without an output schema, the description covers the core functionality, event types, and security. However, it lacks information about the response (e.g., webhook ID) and any idempotency or error scenarios, which would enhance completeness.
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 100% coverage, but the description adds value by listing all available event types (enum values) and explaining the security use of the secret parameter. This goes beyond the schema's descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: subscribing to Stables events via webhook, with specific verb 'Subscribe' and resource 'webhook'. It distinguishes from sibling tools like delete_webhook and list_webhooks by focusing on creation.
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 does not provide guidance on when to use this tool versus alternatives (e.g., when to create vs list webhooks). No exclusion criteria or context for choosing this tool among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deactivate_virtual_accountB
Deactivate a virtual account to prevent new incoming transactions
| Name | Required | Description | Default |
|---|---|---|---|
| customerId | Yes | The customer ID | |
| virtualAccountId | Yes | The virtual account ID to deactivate |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description must disclose all behavioral traits. It only mentions preventing new incoming transactions but does not specify if existing transactions are affected, if the action is reversible (though sibling suggests it is), or any permission requirements. This is insufficient for safe usage.
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. It is front-loaded and to the point. However, for a mutation tool, it could benefit from a brief note on reversibility or side effects.
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 lacks information about the return value or confirmation of success. With no output schema, the agent does not know what to expect. Additionally, it does not mention any restrictions or prerequisites.
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 parameters are well-documented in the schema. The tool description does not add additional semantic meaning beyond what is already 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 uses a specific verb 'Deactivate' and resource 'virtual account', clearly stating the action and its purpose 'to prevent new incoming transactions'. It differentiates from sibling tools like reactivate_virtual_account and update_virtual_account.
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 lacks guidance on when to use this tool versus alternatives. It does not mention prerequisites, conditions, or situations to avoid, such as requiring the account to be active before deactivation.
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_customerA
Get details about a specific customer including their verification status
| Name | Required | Description | Default |
|---|---|---|---|
| customerId | Yes | The customer ID to look up |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden but only states the operation without disclosing side effects, authentication needs, or rate limits. As a read operation, it likely has no side effects, but this is implied rather than explicit.
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 unnecessary 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?
For a simple one-parameter tool without output schema, the description is fairly complete, though it could elaborate on the full set of returned details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers 100% of the single parameter with a clear description. The tool description does not add extra meaning beyond the schema, but the mention of 'verification status' hints at expected output rather than parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves details about a specific customer, including verification status, distinguishing it from sibling tools like list_customers or update_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?
The description implies usage for fetching a single customer's details but provides no explicit guidance on when to use it versus alternatives (e.g., list_customers) or any prerequisites.
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_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 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. Only mentions verification requirement for transfers, but omits behavioral traits such as side effects, idempotency, or whether the link is permanent. Insufficient for safe invocation.
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 concise sentences, front-loaded with action. Every sentence adds value with no 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?
Tool has 4 parameters and no output schema. Description lacks information about return value (expected link), error cases, or link format. Not complete for a developer to reliably use.
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% coverage with descriptions for all 4 parameters. Description adds no extra meaning beyond schema, so baseline score 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?
Clearly states verb 'Generate' and resource 'KYC verification link for a customer'. Distinguishes from sibling 'send_verification_sms' by focusing on link generation. Provides context that verification is needed before 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?
Implies usage when customer needs to verify before transfers, but no explicit guidance on when to choose this over alternatives like 'send_verification_sms' or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_virtual_account_historyB
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) | |
| eventType | No | Filter by event type | |
| 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 provided, the description carries full burden for behavioral disclosure. It only states the function without addressing side effects, authentication needs, rate limits, or data freshness. The read-only nature is implied but not explicit.
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 that is concise and front-loaded with the key information. However, it is too brief and could benefit from additional structure, such as separating purpose from usage notes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the absence of an output schema and the tool's role as a history endpoint, the description should explain the response format (e.g., array of events, ordering, pagination). It fails to do so, leaving the agent without critical 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 baseline is 3. The description adds no extra meaning beyond the schema; all parameter details are already in the schema's descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Get' and the resource 'activity history for a virtual account', with concrete examples like 'deposits, payouts'. This distinguishes it from sibling tools that manage accounts (e.g., create_virtual_account) or list accounts (list_virtual_accounts).
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, no mention of prerequisites or common use cases. The description does not clarify that this is for retrieving history, not for querying current account state.
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_customersA
List all customers for the authenticated tenant
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description carries full burden. It does not disclose behavioral traits such as pagination, rate limits, ordering, or what happens with empty results. A simple list tool still benefits from mentioning output format or potential 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?
A single, clear sentence with no wasted words. Front-loaded with the core 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?
With no output schema and no behavioral details, the tool is incomplete for an agent. The description should at least indicate what is returned (e.g., an array of customers) to provide full 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?
No parameters exist, and schema coverage is 100%. Per rubric, baseline is 4 for zero parameters. The description does not need to add parameter info.
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 (list) and resource (customers) with the scope (for authenticated tenant). It effectively distinguishes from sibling tools like get_customer (single) and create_customer (create).
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 from the description but no explicit guidance on when to use vs alternatives or when not to use. The simple nature of the tool partially excuses the lack of detailed guidelines.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_transfersB
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?
No annotations provided. Description fails to disclose pagination (pageSize, pageToken), ordering, or read-only nature. Lacks details on potential side effects 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?
Single concise sentence, front-loaded. Slight deduction for omitting pagination mention which would improve usability.
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; description should hint at return structure or pagination behavior. Missing guidance on 2 of 5 parameters (pageSize, pageToken) critical for list operations.
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. Description adds 'optional' but doesn't enhance meaning beyond schema; omits pageSize and pageToken details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states verb 'list' and resource 'transfers', and specifies optional filters. Distinguishes from sibling tools like list_customers or list_api_keys.
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?
Mentions optional filters but provides no guidance on when to use this tool vs alternatives (e.g., get_transfer for single transfer). No explicit when-not-to-use or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_virtual_accountsB
List all virtual accounts for a customer
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of accounts to return | |
| status | No | Filter by account status | |
| customerId | Yes | The customer ID to list virtual accounts for |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description must disclose behavior. However, it omits details such as whether pagination is supported (despite a limit parameter), read-only nature, authorization requirements, or response structure. Only the basic action is 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?
Single sentence is concise and front-loaded with the key action. Could potentially include more structure, but length is appropriate for a simple listing 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?
Lacks information about the response format (no output schema). Agent is left to infer that the output is a list of virtual accounts, but details like returned fields or default behavior are missing. Incomplete for a tool with no output schema and no annotations.
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 parameter having a clear description in the schema. The tool description does not add additional meaning beyond the schema, but baseline score is 3 given high coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'List all virtual accounts for a customer', which is a specific verb+resource combination. It distinguishes from sibling tools like create_virtual_account, deactivate_virtual_account, etc., by focusing on listing rather than mutation.
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_virtual_account_history or filtering options. No explicit when-to-use or when-not-to-use information is provided.
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.
reactivate_virtual_accountB
Reactivate a previously deactivated virtual account
| Name | Required | Description | Default |
|---|---|---|---|
| customerId | Yes | The customer ID | |
| virtualAccountId | Yes | The virtual account ID to reactivate |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description must disclose behavioral traits. It only states the action ('reactivate'), without mentioning authorization needs, side effects, or state changes beyond the obvious.
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, concise sentence with no unnecessary words. It effectively communicates 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 simplicity of the tool (2 params, no output schema), the description is minimally adequate but lacks additional context such as prerequisites or effects. It does not fully compensate for missing annotations.
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 clear parameter descriptions. The tool description adds no extra meaning beyond what the schema provides, so baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Reactivate') and resource ('previously deactivated virtual account'), clearly distinguishing it from sibling tools like 'deactivate_virtual_account' and 'create_virtual_account'.
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. It implies it is the reverse of 'deactivate_virtual_account', but provides no when-to-use or when-not-to-use instructions.
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.
send_verification_smsA
Send a KYC verification link to a customer via SMS. Automatically fetches the customer's phone number and generates a fresh verification link. Requires TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN, and TWILIO_PHONE_NUMBER environment variables.
| Name | Required | Description | Default |
|---|---|---|---|
| phone | No | Override phone number (with country code, e.g., '+14155552671'). If not provided, uses the customer's phone on file. | |
| botName | No | Name of the bot/assistant sending the message (default: 'your assistant') | |
| customerId | Yes | The customer ID to send the verification SMS to | |
| verificationLinkTtlSecs | No | TTL for the verification link in seconds (default: 1800) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description bears full responsibility. It discloses that it sends an SMS, fetches phone automatically, generates a link, and requires env vars. However, it does not cover error scenarios (e.g., missing phone number) or side effects beyond the SMS send.
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 efficiently convey purpose, automation, and requirements. Minor redundancy: 'fresh verification link' could be simplified, but overall concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers main purpose and requirements but lacks mention of return value (e.g., success indication) or error handling. For a tool with no output schema, this is a moderate gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds context by explaining that the phone parameter is optional (auto-fetched) and that a fresh link is generated (relating to TTL). This adds meaning beyond the schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Send a KYC verification link'), the channel ('via SMS'), and the target ('to a customer'). It differentiates from sibling tools like get_verification_link, which retrieves rather than sends.
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 mentions required environment variables but lacks explicit guidance on when to use this tool versus alternatives (e.g., get_verification_link). It implies usage for sending, but no exclusions or context for choosing this tool.
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 present, so the description must carry the burden. It only says 'Update' without disclosing whether it's a partial or full update, idempotency, authorization requirements, or side effects. The description is insufficient for a mutation 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 concise sentence, front-loaded with the action and resource. While efficient, it lacks structure such as bullet points or examples that could improve readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 10 parameters and no output schema or annotations. The description fails to explain return values, error states, or whether updating omitted fields clears them. It is incomplete for a tool of 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?
Schema coverage is 100%, so the schema already describes all parameters. The description adds no additional meaning beyond grouping into categories. Baseline 3 is appropriate as 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 clearly states the tool updates customer details, entitlements, or verification information, with a clear verb and resource. However, it does not differentiate from sibling tool 'update_customer_metadata' which likely covers a subset.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives like 'update_customer_metadata' or 'create_customer'. The description lacks context about prerequisites or typical use cases.
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_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.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
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 25 tools
Each tool targets a distinct resource and action, with no overlapping purposes. For example, customer operations are clearly separated: create, get, list, update, and update_metadata. Even related tools like get_verification_link and send_verification_sms have distinct functions.
All tool names follow a consistent verb_noun pattern in snake_case (e.g., create_customer, list_api_keys, deactivate_virtual_account). There are no deviations or mixed conventions, ensuring predictability.
With 25 tools, the server covers a broad domain including customers, API keys, transfers, quotes, virtual accounts, webhooks, and KYC verification. While this is on the higher end of the acceptable range, each tool serves a clear purpose and seems necessary for the API's functionality.
The tool set covers most core workflows: customer management, KYC verification, quoting, transfer execution, virtual account lifecycle, and webhook management. However, there are minor gaps such as missing delete operations for customers and API key updates, and no transfer cancellation tool.
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 gradedqualityDmaintenanceEnables AI agents to programmatically purchase physical and virtual goods from platforms like Amazon and Shopify using stablecoins, without the need for virtual debit cards or browser automation.1-
- FlicenseNot gradedqualityNot gradedmaintenanceEnables AI agents to interact with multiple payment providers (Stripe, Paystack) through a unified API. Supports payment initialization, verification, refunds, customer management, and invoicing without requiring knowledge of specific provider implementations.2-
- AlicenseNot gradedqualityAmaintenanceEnables AI assistants to interact with BlindPay's stablecoin payment infrastructure, allowing users to create receivers, process payouts and payins across multiple blockchains, manage virtual accounts and wallets, and configure payment operations through natural language.55 npm10MIT
- FlicenseAqualityDmaintenanceEnables AI agents to make payments and manage subscriptions by converting USDC stablecoin balances into virtual cards for online checkouts. It provides tools for wallet management, card issuance, and secure transaction handling through the Clawallex payment API.1871 npm-