Skip to main content
Glama
Stables MCP Server

Stables MCP Server

Official

Stables MCP Server

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

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

What is MCP?

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

Related MCP server: Yolfi MCP Server

Features

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

Customer Management

  • create_customer - Create individual or business customers

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

  • get_customer - Get customer details and verification status

  • list_customers - List all customers

  • get_verification_link - Generate KYC verification links

  • update_customer - Update customer details and entitlements

  • update_customer_metadata - Update customer metadata key-value pairs

Entitlements

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

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

  • submit_entitlement_requirements - Send the extra verification Stables asks for

Compliance requests (RFIs)

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

  • list_customer_rfis - One customer's RFIs

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

  • get_rfi_evidence_form - The form an evidence requirement asks for

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

  • get_kyc_capabilities - Verification capabilities a customer holds

Documents

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

  • list_documents - Documents on a transfer or a deposit

  • get_document_download_url - Short-lived download link for a document

  • delete_document - Remove a document

Quotes

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

  • get_quote - Check quote status and details

Transfers

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

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

  • get_transfer - Check transfer status

  • list_transfers - List transfers with filters

Saved Beneficiaries

  • list_beneficiaries - Saved recipients and bank accounts, to pay by id with create_transfer

  • get_beneficiary - One beneficiary's details and whether it still passes today's payout rules

  • create_beneficiary - Save a recipient and bank account (validated like a transfer)

  • archive_beneficiary - Archive a beneficiary so it can no longer be paid

Virtual Accounts

  • create_virtual_account - Create virtual bank accounts for fiat deposits

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

  • update_virtual_account - Update virtual account settings

  • register_route_payid - Register a PayID on an AUD payment route

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

  • update_route_destination - Change the payout wallet on an existing route

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

Balances

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

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

  • list_balance_activity - Deposits credited to the balance

  • list_pending_balance_deposits - Deposits held before crediting, and why

  • list_whitelisted_wallets - Wallets allowed to fund the balance

Sandbox

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

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

API Keys

  • create_api_key - Create a new API key

  • list_api_keys - List all API keys

  • get_api_key - Get API key details

  • revoke_api_key - Revoke an API key

Webhooks

  • create_webhook - Subscribe to events via webhook

  • list_webhooks - List all webhook subscriptions

  • delete_webhook - Delete a webhook subscription

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

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

https://mcp.stables.money/mcp

and either send your Stables API key as a bearer token or sign in with OAuth. The key you get during onboarding is all you need: a sti_test_… key reaches sandbox, a sti_live_… key reaches production and moves real money. Clients that can't hold a key (Claude.ai, ChatGPT) sign in instead; see below.

Claude Code

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

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

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

Codex

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

Claude.ai, ChatGPT and other clients that sign in with OAuth

Add https://mcp.stables.money/mcp as a custom connector with no key. The client discovers the server's OAuth endpoints, registers itself, and sends you to a Stables page that asks two things: whether to connect sandbox or production, and permission for that client. You then sign in with your Stables dashboard account (and pick an organisation if you belong to several).

You choose Read only (the default) or Read and make changes; with read only, the agent can look but every tool that changes something is refused until you reconnect and allow changes. Agents connected this way can never create or revoke API keys. Every tool is labelled read-only or destructive, so clients such as Claude ask you before each change. Auth0 asks for your credentials (and a second factor) every time (an existing browser session is never reused for an agent connection) and, when you belong to several organisations, which one to use. On success the server creates an API key in that organisation, named after the client and the account that signed in (for example Claude via MCP (you@company.com)), and uses it for every call the client makes. Revoke it any time under Developer → API keys in the dashboard, which disconnects the client. Nothing else is stored: the sign-in token is used once to create the key and then dropped.

  • Claude.ai / Claude Desktop: Settings → Connectors → Add custom connector, URL https://mcp.stables.money/mcp, leave the OAuth client fields on their defaults.

  • ChatGPT: Settings → Connectors → Create (developer mode), MCP server URL https://mcp.stables.money/mcp, authentication OAuth.

  • Claude Code without a key: claude mcp add --transport http stables https://mcp.stables.money/mcp, then /mcp to sign in.

The OAuth endpoints are standard: /.well-known/oauth-protected-resource/mcp, /.well-known/oauth-authorization-server, /authorize, /oauth/token, /oauth/register. Client ID Metadata Documents and dynamic registration are both accepted; PKCE (S256) is required.

Running locally

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

Installation

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

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

Configuration

The server requires the following environment variables:

Variable

Required

Description

STABLES_API_KEY

Yes

Your Stables API key

STABLES_API_URL

No

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

Which environment you're talking to

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

Your key

Where requests go

sti_test_…

https://api.sandbox.stables.money

sti_live_…

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

sti_local_… or anything else

production, unless you set STABLES_API_URL

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

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

Usage

With Claude Desktop

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

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

Then restart Claude Desktop.

With Cursor, Codex, ChatGPT, or another MCP client

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

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

Agent safety

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

With MCP Inspector (for testing)

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

# Run the inspector
npm run inspect

Direct Execution

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

Example Conversations

Creating a customer and getting a quote

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

AI (using MCP tools):

  1. Calls create_customer with email and type

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

  3. Returns customer details and quote information

Checking transfer status

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

AI (using MCP tools):

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

  2. Returns a formatted list of in-flight transfers

Setting up auto-payout

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

AI (using MCP tools):

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

  2. Returns the deposit instructions to share with the customer

Paying out to a European beneficiary

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

AI (using MCP tools):

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

  2. Calls create_quote, then create_transfer once a human approves

Operating the hosted server

The hosted server is the Cloudflare Worker in src/worker.ts (wrangler.toml). It needs:

  • OAUTH_KV: a KV namespace for OAuth clients, grants and tokens. Tokens and secrets are stored as hashes; a grant's API key is encrypted with a key only that grant's token can unwrap.

  • Vars MCP_PUBLIC_URL, AUTH0_DOMAIN, AUTH0_CLIENT_ID: the public origin, the Auth0 custom domain, and the "Stables MCP" regular-web application (callback https://mcp.stables.money/callback).

  • Secret AUTH0_CLIENT_SECRET: that application's secret.

  • Secret MCP_GATEWAY_SIGNING_SECRET: shared with the API gateway's IP authoriser. The Worker has no fixed egress IP, so it signs each forwarded request (X-Stables-Mcp-Signature), and production accepts the signature in place of the source-IP check. Without it, production calls through the hosted server are rejected by the gateway; sandbox is unaffected.

wrangler secret put AUTH0_CLIENT_SECRET
wrangler secret put MCP_GATEWAY_SIGNING_SECRET

Without OAUTH_KV the Worker runs bearer-key only, which is how the unit tests exercise it.

Development

# Watch mode for development
npm run dev

# Build for production
npm run build

# Run tests
npm test

# Run linter
npm run lint

# Format code
npm run format

# Test with MCP Inspector
npm run inspect

Project Structure

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

API Reference

Customer Tools

create_customer

Create a new customer for KYC and transfers.

Parameter

Type

Required

Description

email

string

Yes

Customer's email

customerType

"individual" | "business"

Yes

Type of customer

firstName

string

No

First name (for individuals)

lastName

string

No

Last name (for individuals)

companyName

string

No

Company name (for businesses)

entitlements

string[]

No

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

get_customer

Get customer details.

Parameter

Type

Required

Description

customerId

string

Yes

Customer ID

list_customers

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

Generate a KYC verification link.

Parameter

Type

Required

Description

customerId

string

Yes

Customer ID

ttlInSecs

number

No

Link expiry in seconds (default: 1800)

successUrl

string

No

Redirect URL after successful verification

rejectUrl

string

No

Redirect URL after rejected verification

update_customer

Update customer details or entitlements.

Parameter

Type

Required

Description

customerId

string

Yes

Customer ID

email

string

No

Updated email

phone

string

No

Updated phone

firstName

string

No

Updated first name

lastName

string

No

Updated last name

entitlements

string[]

No

Updated entitlements

update_customer_metadata

Update customer metadata key-value pairs.

Parameter

Type

Required

Description

customerId

string

Yes

Customer ID

metadata

object

Yes

Key-value pairs to set

Quote Tools

create_quote

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

Parameter

Type

Required

Description

fromCurrency

"USDC" | "USDT"

Yes

Source cryptocurrency

fromAmount

string

Yes

Amount to convert

fromNetwork

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

Yes

Blockchain network

toCurrency

string

Yes

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

toCountry

string

Yes

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

paymentMethodType

"SWIFT" | "LOCAL"

Yes

Payment method for payout

get_quote

Get quote details.

Parameter

Type

Required

Description

quoteId

string

Yes

Quote ID

Transfer Tools

create_transfer

Execute a transfer from a quote.

Parameter

Type

Required

Description

customerId

string

Yes

Customer ID

quoteId

string

Yes

Quote ID to execute

accountHolderName

string

No

Bank account holder name

iban

string

No

IBAN

accountNumber

string

No

Bank account number

bankName

string

No

Bank name

bankCountry

string

No

Bank country code

bankCurrency

string

No

Payout currency

accountType

"savings" | "checking" | "payment"

No

Account type

swiftCode

string

No

SWIFT/BIC code

routingNumber

string

No

ABA routing number (US)

sortCode

string

No

Sort code (UK)

ifscCode

string

No

IFSC code (India)

bsbCode

string

No

BSB code (Australia)

get_transfer

Get transfer status.

Parameter

Type

Required

Description

transferId

string

Yes

Transfer ID

list_transfers

List transfers with filters.

Parameter

Type

Required

Description

status

string

No

Filter by status

type

string

No

Filter by type

customerId

string

No

Filter by customer

pageSize

number

No

Results per page

pageToken

string

No

Pagination token

Virtual Account Tools

create_virtual_account

Create a virtual bank account.

Parameter

Type

Required

Description

customerId

string

Yes

Customer ID

sourceCurrency

string

Yes

Currency (e.g., "USD")

depositHandlingMode

string

No

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

destinationAddress

string

No

Crypto wallet address

destinationPaymentRail

string

No

Blockchain network

destinationCurrency

string

No

Stablecoin (default: "usdc")

list_virtual_accounts

List virtual accounts for a customer.

Parameter

Type

Required

Description

customerId

string

Yes

Customer ID

status

string

No

Filter by status

limit

number

No

Max results

update_virtual_account

Update virtual account settings.

Parameter

Type

Required

Description

customerId

string

Yes

Customer ID

virtualAccountId

string

Yes

Virtual account ID

depositHandlingMode

string

Yes

New deposit handling mode

get_virtual_account_history

Get activity history for a virtual account.

Parameter

Type

Required

Description

customerId

string

Yes

Customer ID

virtualAccountId

string

Yes

Virtual account ID

limit

number

No

Max events to return

eventType

string

No

Filter by event type

API Key Tools

create_api_key

Create a new API key.

Parameter

Type

Required

Description

name

string

Yes

Descriptive name for the key

metadata

object

No

Optional metadata

list_api_keys

List all API keys.

Parameter

Type

Required

Description

pageSize

number

No

Results per page

pageToken

string

No

Pagination token

get_api_key

Get API key details.

Parameter

Type

Required

Description

apiKeyId

string

Yes

API key ID

revoke_api_key

Revoke an API key (permanent).

Parameter

Type

Required

Description

apiKeyId

string

Yes

API key ID

Webhook Tools

create_webhook

Subscribe to events via webhook.

Parameter

Type

Required

Description

name

string

Yes

Webhook name

url

string

Yes

HTTPS endpoint URL

eventTypes

string[]

Yes

Events to subscribe to

secret

string

No

HMAC-SHA256 signing secret

Available event types:

  • WEBHOOK_EVENT_TYPE_CUSTOMER_CREATED

  • WEBHOOK_EVENT_TYPE_CUSTOMER_UPDATED

  • WEBHOOK_EVENT_TYPE_KYC_STATUS_CHANGED

  • WEBHOOK_EVENT_TYPE_PAYMENT_CREATED

  • WEBHOOK_EVENT_TYPE_PAYMENT_STATUS_CHANGED

  • WEBHOOK_EVENT_TYPE_QUOTE_CREATED

  • WEBHOOK_EVENT_TYPE_QUOTE_EXPIRED

  • WEBHOOK_EVENT_TYPE_VA_DEPOSIT_RECEIVED

  • WEBHOOK_EVENT_TYPE_VA_PAYOUT_COMPLETED

  • WEBHOOK_EVENT_TYPE_VA_PAYOUT_FAILED

  • WEBHOOK_EVENT_TYPE_ALL

list_webhooks

List all webhook subscriptions. No parameters required.

delete_webhook

Delete a webhook subscription.

Parameter

Type

Required

Description

webhookId

string

Yes

Webhook subscription ID

Security

  • API keys are only read from environment variables

  • HTTPS required for API URL (enforced at startup)

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

  • All inputs are validated with Zod schemas

  • Request timeouts (30s) prevent hung connections

  • Automatic retries with exponential backoff for transient failures

License

MIT

Available Tools

55 tools
add_documentAdd documentA
Destructive
Inspect

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

Inputs: on (required), fileName (required), base64Url (required), transactionId (required), +1 more.

add_route_whitelist_accountAdd payment route allowed senderB
Destructive
Inspect

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

Inputs: bsbNumber (required), customerId (required), accountNumber (required), virtualAccountId (required), +1 more.

archive_beneficiaryArchive saved beneficiaryA
DestructiveIdempotent
Inspect

Archive a saved beneficiary. It leaves active listings and is refused as a transfer destination; transfers already made to it are unaffected. Saving the same account again revives it.

Inputs: beneficiaryId (required).

create_api_keyCreate API keyA
Destructive
Inspect

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

Inputs: name (required), metadata.

create_balance_walletCreate balance walletA
Destructive
Inspect

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

Inputs: network (required).

create_beneficiarySave beneficiaryA
DestructiveIdempotent
Inspect

Save a recipient and their bank account for a currency and network, so later transfers can pay it by id. The details are validated exactly as a transfer on that network would be. Saving an account that is already saved returns the existing beneficiary with its details refreshed, and revives it if archived.

Inputs: network (required), iban, cnaps, label, +23 more.

create_customerCreate customerB
Destructive
Inspect

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.

Inputs: customerType (required), dob, type, email, +39 more.

create_quoteCreate quoteA
Destructive
Inspect

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

Inputs: sourceAmount (required), sourceCurrency (required), destinationCurrency (required), preview, +5 more.

create_transferCreate transfer (moves money)A
Destructive
Inspect

Create a transfer from an active quote. The quote must not be expired. With fundingSource fund_transfer (the default) this only creates the transfer and returns deposit instructions; no money moves until someone deposits the funds. With prefund_balance it debits your organisation's balance and starts the payout immediately, so this moves real money: get explicit human approval first. For payouts in AED, CAD, EUR, GBP, MXN, USD you must also supply recipientType, the full beneficiary address, and dateOfBirth when the recipient is an individual. To pay one of the organisation's saved beneficiaries, set destinationType to beneficiary and pass its beneficiaryId instead of bank details.

Inputs: quoteId (required), customerId (required), iban, cnaps, +31 more.

create_virtual_accountCreate payment routeA
Destructive
Inspect

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

Inputs: customerId (required), sourceCurrency (required), destinationAddress (required), destinationPaymentRail (required), +1 more.

create_webhookCreate webhookA
Destructive
Inspect

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

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

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

Inputs: url (required), name (required), eventTypes (required), secret.

delete_documentDelete documentA
DestructiveIdempotent
Inspect

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

Inputs: on (required), documentId (required), transactionId (required).

delete_webhookDelete webhookA
DestructiveIdempotent
Inspect

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

Inputs: webhookId (required).

get_api_keyGet API keyB
Read-onlyIdempotent
Inspect

Get details about a specific API key

Inputs: apiKeyId (required).

get_balanceGet balanceA
Read-onlyIdempotent
Inspect

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

Inputs: no named parameters.

get_balance_walletGet balance walletA
Read-onlyIdempotent
Inspect

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

Inputs: network.

get_beneficiaryGet saved beneficiaryA
Read-onlyIdempotent
Inspect

Get a saved beneficiary's recipient and bank details, and whether it still passes today's payout rules. Rules tighten over time, so an older beneficiary can need more fields before it can be paid.

Inputs: beneficiaryId (required).

get_customerGet customerA
Read-onlyIdempotent
Inspect

Get details about a specific customer including their verification status

Inputs: customerId (required), include.

get_document_download_urlGet document download linkA
Read-onlyIdempotent
Inspect

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

Inputs: on (required), documentId (required), transactionId (required).

get_kyc_capabilitiesGet KYC capabilitiesA
Read-onlyIdempotent
Inspect

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

Inputs: customerId (required).

get_quoteGet quoteB
Read-onlyIdempotent
Inspect

Get details about an existing quote including its current status

Inputs: quoteId (required).

get_rfiGet information requestA
Read-onlyIdempotent
Inspect

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

Inputs: rfiId (required).

get_rfi_evidence_formGet information request formA
Read-onlyIdempotent
Inspect

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

Inputs: rfiId (required), customerId (required), requirementId (required).

get_transferGet transferA
Read-onlyIdempotent
Inspect

Get the current status and details of a transfer

Inputs: transferId (required).

get_virtual_account_historyGet payment route historyB
Read-onlyIdempotent
Inspect

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

Inputs: customerId (required), virtualAccountId (required), limit.

list_api_keysList API keysB
Read-onlyIdempotent
Inspect

List all API keys for the current account

Inputs: pageSize, pageToken.

list_available_entitlementsList available entitlementsA
Read-onlyIdempotent
Inspect

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

Inputs: customerId (required).

list_balance_activityList balance activityA
Read-onlyIdempotent
Inspect

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

Inputs: network, pageSize, pageToken.

list_beneficiariesList saved beneficiariesA
Read-onlyIdempotent
Inspect

List the organisation's saved beneficiaries, most recently paid first. Use it to find the beneficiaryId that create_transfer takes with destinationType 'beneficiary'.

Inputs: search, status, network, currency, +2 more.

list_customer_rfisList customer information requestsB
Read-onlyIdempotent
Inspect

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

Inputs: customerId (required), status.

list_customersList customersA
Read-onlyIdempotent
Inspect

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

Inputs: pageSize, pageToken.

list_documentsList documentsA
Read-onlyIdempotent
Inspect

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

Inputs: on (required), transactionId (required).

list_pending_balance_depositsList pending balance depositsA
Read-onlyIdempotent
Inspect

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

Inputs: no named parameters.

list_rfisList information requestsA
Read-onlyIdempotent
Inspect

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

Inputs: type, limit, cursor, status, +2 more.

list_route_whitelistList payment route allowed sendersA
Read-onlyIdempotent
Inspect

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

Inputs: customerId (required), virtualAccountId (required).

list_transfersList transfersA
Read-onlyIdempotent
Inspect

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

Inputs: type, status, pageSize, pageToken, +1 more.

list_virtual_accountsList payment routesA
Read-onlyIdempotent
Inspect

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

Inputs: limit, status, customerId, startingAfter.

list_webhook_deliveriesList webhook deliveriesA
Read-onlyIdempotent
Inspect

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

Inputs: status, pageSize, eventType.

list_webhooksList webhooksA
Read-onlyIdempotent
Inspect

List all webhook subscriptions for the current account

Inputs: no named parameters.

list_whitelisted_walletsList allowed walletsA
Read-onlyIdempotent
Inspect

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

Inputs: status, network, pageSize, pageToken.

register_route_payidRegister PayID on payment routeB
Destructive
Inspect

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

Inputs: customerId (required), virtualAccountId (required).

request_entitlementsRequest entitlementsA
Destructive
Inspect

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

Inputs: customerId (required), entitlements (required).

revoke_api_keyRevoke API keyA
Destructive
Inspect

Revoke an API key. This permanently disables the key and cannot be undone.

Inputs: apiKeyId (required).

simulate_route_depositSimulate payment route deposit (sandbox)A
Destructive
Inspect

SANDBOX ONLY. Simulate a fiat deposit into a payment route so you can watch the conversion and payout complete without a real bank transfer. Fails on production.

Inputs: amount (required), customerId (required), virtualAccountId (required), scenario, +3 more.

simulate_transfer_depositSimulate transfer deposit (sandbox)A
Destructive
Inspect

SANDBOX ONLY. Simulate the customer sending the crypto an off-ramp transfer is waiting on, so the transfer can progress to payout without an on-chain payment. Fails on production.

Inputs: transferId (required).

submit_entitlement_requirementsSubmit entitlement requirementsA
Destructive
Inspect

Send further verification data Stables asked for on a requested entitlement. The fields are those of the customer record in snake_case (e.g. tax_id_number, address, financial_profile, id_documents, proof_of_address_documents); send only what is missing. Documents are base64 data.

Inputs: customerId (required), entitlement (required), requirements (required).

submit_rfi_evidenceSubmit information request evidenceA
Destructive
Inspect

Submit the answers and documents an evidence requirement asks for, in one request, keyed as get_rfi_evidence_form lists them. Files are base64 data URLs ('data:application/pdf;base64,...'). The requirement moves to 'submitted' for Stables compliance to review; approving it releases the held payment once nothing else is outstanding. Confirm the content with a human before sending: it goes to compliance as the customer's answer.

Inputs: rfiId (required), answers (required), customerId (required), requirementId (required).

update_customerUpdate customerC
DestructiveIdempotent
Inspect

Update customer details, entitlements, or verification information

Inputs: customerId (required), dob, email, phone, +6 more.

update_customer_metadataUpdate customer metadataC
DestructiveIdempotent
Inspect

Update customer metadata key-value pairs

Inputs: metadata (required), customerId (required).

update_route_destinationChange payment route destinationA
DestructiveIdempotent
Inspect

Change the payout wallet on an existing payment route. Deposits after this point are paid out to the new address; use it when a customer rotates wallets rather than creating a second route.

Inputs: customerId (required), virtualAccountId (required), destinationAddress (required), destinationPaymentRail (required), +1 more.

update_route_whitelist_accountUpdate payment route allowed senderA
DestructiveIdempotent
Inspect

Change or disable a whitelisted source account on an AUD payment route. Send the full record: BSB, account number and status.

Inputs: enabled (required), bsbNumber (required), customerId (required), accountNumber (required), +2 more.

update_virtual_accountUpdate payment routeB
DestructiveIdempotent
Inspect

Update virtual account settings (e.g., deposit handling mode)

Inputs: customerId (required), virtualAccountId (required), depositHandlingMode (required).

validate_payment_methodValidate payment methodA
Read-onlyIdempotent
Inspect

Check bank payout details against the corridor's rules without creating anything. Use it before create_transfer to find out which fields a currency needs (beneficiary address, date of birth, bank codes), instead of spending a short-lived quote on a rejected transfer.

Inputs: network (required), iban, cnaps, payId, +23 more.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.4/5.0

    Scored across 55 tools

    Disambiguation4/5

    Most tools target a distinct resource+action, and descriptions actively clarify boundaries (e.g. create_customer vs create_customer_onboarding_link, get_balance vs get_balance_wallet vs create_balance_wallet). A few pairs overlap enough to risk misselection: get_verification_link vs create_customer_onboarding_link both produce KYC links, and the many whitelist tools (list_route_whitelist, add/update_route_whitelist_account) sit close to the general beneficiary tools.

    Naming Consistency5/5

    All 55 tools use snake_case with a leading verb (get_, list_, create_, update_, delete_, submit_, simulate_). Different verbs for different removal semantics (archive_beneficiary, revoke_api_key, delete_webhook) are intentional rather than inconsistent.

    Tool Count2/5

    55 tools is very heavy. Although the payment platform legitimately spans customers, quotes, transfers, beneficiaries, virtual accounts, balance, webhooks, API keys, entitlements, RFIs and documents, the surface is large enough that an agent must navigate many sub-domains to complete a single workflow.

    Completeness4/5

    Coverage is broad and mostly full-lifecycle: CRUD on customers, transfers, beneficiaries (archive), virtual accounts, API keys, webhooks and documents, plus RFI and simulation tooling. Minor gaps remain, such as no cancel/delete transfer, no update_webhook, and no list_quotes, but core workflows are reachable.

    Maintenance

    ActivityMaintained
    ResponsivenessLimited data

    Related MCP Connectors

    Related MCP Servers

    • F
      license
      Not graded
      quality
      A
      maintenance
      Enables AI coding agents to add stablecoin checkout, payment links, payment status checks, webhook verification, and webhook-based entitlement logic to applications. It also provides tools for workspace registration, settlement and webhook configuration, paylink creation, and crypto payment status checks.
      -
    • A
      license
      Not graded
      quality
      A
      maintenance
      Enables AI coding agents to add stablecoin checkout, payment links, payment status checks, webhook verification, and webhook-based access logic to applications.
      MIT