Authorization header, and it’s ready.
New to Cleo Pay? Read the Quickstart first — the MCP tools operate on the same payables, payments, contacts, and bank accounts as the REST API.
Environments
Both environments also accept an explicit path form:
https://api.stg.cleo-pay.com/v1/mcp (Sandbox) and https://api.cleo-pay.com/v1/mcp (Live).
API keys are environment-bound: a cleo_test_ key only authenticates against Sandbox, and a cleo_live_ key only against Live. Sandbox is a fully separate environment with its own data — nothing you create there appears in Live, and payments run against a simulated banking network.
Start in Sandbox. Wire up your agent with a
cleo_test_ key, rehearse your flows end to end, then switch the endpoint and key to go live.Get an API key
1
Create a key in the dashboard
In the Cleo Pay dashboard, go to Settings → Developers and click Create API key. You need admin access on the business. Give the key a name, select the scopes it should have (see Scopes and tool visibility below), and optionally set an expiration date.
2
Copy the secret
The full key (for example
cleo_test_a1b2c3d4e5f6g7h8_...) is shown once, at creation time. Store it in a secrets manager or environment variable — it cannot be retrieved again. If you lose it, rotate the key to mint a new secret.401 Unauthorized.
Connect your client
The examples below use the Sandbox endpoint and acleo_test_ key. For Live, swap in https://mcp.cleo-pay.com and a cleo_live_ key.
- Claude Code
- Cursor
- VS Code
- curl
Scopes and tool visibility
Each tool requires a scope. The server only advertises the tools your key is allowed to call —tools/list omits everything else, so your agent never sees a tool it can’t use. Calling an out-of-scope tool directly returns a JSON-RPC Access denied error.
Grant the minimum scopes your integration needs. A read-only agent (reporting, reconciliation) needs only the
:read scopes; keep payments:initiate on a separate, tightly-held key.
Requests are rate-limited to 100 requests per minute per API key. Exceeding the limit returns HTTP 429.
Tools
All tools return JSON. Amounts are integers in cents; dates useYYYY-MM-DD.
Payables
list_payables — parameters
list_payables — parameters
Returns
items (without line items) and totalCount.get_payable — parameters
get_payable — parameters
Returns the payable with its full line items.
create_payable — parameters
create_payable — parameters
Not idempotent — a retry creates a second draft. See Idempotency and retries.
Payments
create_payment — parameters
create_payment — parameters
Returns the affected
payableId and a payments array — large amounts may split into multiple ACH transfers. Payment statuses: pending, scheduled, processing, held, completed, failed, cancelled, refunded.Payments to a payee without a linked bank account are held until the payee provides their details; scheduling is not supported for held payments.Bank accounts
add_bank_account — parameters
add_bank_account — parameters
The account starts in
pending_verification; it becomes usable after verify_micro_deposits succeeds. Not idempotent — do not auto-retry on timeout.verify_micro_deposits — parameters
verify_micro_deposits — parameters
Maximum 3 attempts — a wrong pair consumes one. After 3 failures the account becomes permanently
unverified.list_bank_accounts / get_bank_account / remove_bank_account — parameters
list_bank_accounts / get_bank_account / remove_bank_account — parameters
list_bank_accounts takes no parameters and returns all linked accounts.get_bank_account and remove_bank_account take a single required bankAccountId (string).The business’s default verified account cannot be removed — set another account as default in the Cleo Pay dashboard first. Account statuses: pending_verification, verified, unverified, removed.Contacts
list_contacts — parameters
list_contacts — parameters
create_contact — parameters
create_contact — parameters
Not idempotent — do not auto-retry on timeout.
update_contact / archive_contact / unarchive_contact — parameters
update_contact / archive_contact / unarchive_contact — parameters
All three take a required
contactId (string).update_contact additionally accepts: displayName, emails (replaces all emails, max 5), phone, address — these apply to payee-type contacts only — and netTerms (integer ≥ 0), which applies to any contact.archive_contact and unarchive_contact are idempotent — safe to call on an already-archived or already-active contact. Revoked contacts cannot be unarchived.Idempotency and retries
Agents retry things. Here is what is safe:Errors
Remember that tools outside your key’s scopes don’t appear in
tools/list at all — if a tool seems missing, check the key’s scopes.
Data protection
- Bank account and routing numbers are write-only: responses only ever include the last 4 digits.
- Tax IDs are write-only: responses include a mask (for example
***6789). - Responses are explicit allowlists — internal fields are never serialized.
- Every write is recorded in an append-only action log attributed to your API key, with request ID and IP address.
Next steps
- Rehearse a full flow in Sandbox: link a bank account, create a contact, then send a payment.
- Subscribe to webhooks to track payment and verification events your agent kicks off.
- Prefer raw REST? The same capabilities are in the API Reference.