qontoctl
qontoctl is a CLI and MCP server for the Qonto banking API, enabling AI assistants and users to manage nearly all aspects of a Qonto business account.
Accounts: List, create, update, close bank accounts; download IBAN certificates and bank statements.
Transactions: List, search, filter transactions; manage attachments (list, add, remove).
Cards: List, create (individual or bulk up to 50), lock/unlock, report lost/stolen, discard; update limits, nickname, options (ATM, NFC, online, foreign), and restrictions; get secure iframe URL for card details (PAN, CVV, expiry); list available designs.
SEPA Transfers: List, create, cancel transfers; download proof PDFs; verify payees (single and bulk).
Internal & Bulk Transfers: Create internal transfers between accounts; list, view, and create bulk transfers.
Recurring Transfers: Create, cancel, list, and view recurring transfers.
International Transfers: Check eligibility, list supported currencies, create quotes, manage international beneficiaries (list, add, update, remove), and create international transfers.
SEPA Beneficiaries: List, add, update, trust/untrust beneficiaries.
Clients & Invoicing: Full lifecycle for client invoices (create, update, finalize, send, mark paid, cancel); manage quotes (create, update, delete, send); list credit notes; manage clients (list, create, update, delete).
Supplier Invoices & E-Invoicing: List, view, bulk-create supplier invoices; retrieve e-invoicing settings.
Payment Links: List, create, deactivate payment links; list payments and available methods; manage provider connection.
Memberships & Organization: List memberships, show current user, invite members; retrieve organization details.
Requests: List, approve, decline organization requests; create flash card and virtual card requests.
Insurance: Show, create, update insurance contracts; upload/remove documents.
Attachments & Labels: Upload/show attachments; list/show labels.
SCA Sessions: View session status; mock SCA decisions (sandbox only).
Authentication: Configure OAuth2 and API key profiles; manage login, refresh, revoke, and profile lifecycle.
MCP Integration: Exposes all operations as MCP tools for AI assistants (Claude, Cursor, Windsurf) with natural language interaction.
Allows for the management of SEPA beneficiaries and transfers, enabling actions such as listing, adding, and trusting beneficiaries, as well as creating, canceling, and downloading proofs for SEPA transfers.

CLI and MCP server for the Qonto banking API.
This project is brought to you by Alexey Pelykh.
What It Does
QontoCtl lets AI assistants (Claude, etc.) interact with Qonto through the Model Context Protocol. It can:
Organizations — retrieve organization details and settings
Accounts — list, create, update, close bank accounts; download IBAN certificates
Transactions — list, search, filter bank transactions; manage transaction attachments
Bank Statements — list, view, and download bank statements
Labels — manage transaction labels and categories
Memberships — view team members, show current membership, invite new members
SEPA Beneficiaries — list, add, update, trust/untrust SEPA beneficiaries
SEPA Transfers — list, create, cancel transfers; download proofs; verify payees
Internal Transfers — create transfers between accounts in the same organization
Bulk Transfers — list and view bulk transfer batches
Recurring Transfers — list and view recurring transfers
Clients — list, create, update, delete clients
Client Invoices — full lifecycle: create, update, finalize, send, mark paid, cancel, upload files
Quotes — create, update, delete, send quotes
Credit Notes — list and view credit notes
Supplier Invoices — list, view, and bulk-create supplier invoices
Requests — list organization requests
Attachments — upload and view attachments
E-Invoicing — retrieve e-invoicing settings
Prerequisites
Node.js >= 24
A Qonto business account with API access
Installation
npm install -g qontoctlOr run directly with npx:
npx qontoctl --helpOr install via Homebrew:
brew install qontoctl/tap/qontoctlQuick Start
# 1. Install
npm install -g qontoctl
# 2. Create a profile with your Qonto API credentials
qontoctl profile add mycompany
# 3. Test the connection
qontoctl profile test --profile mycompany
# 4. List your accounts
qontoctl account list --profile mycompanyMCP Integration
QontoCtl implements the Model Context Protocol (MCP), letting AI assistants interact with your Qonto account through natural language.
MCP Client Configuration
Add to your Claude Desktop configuration (claude_desktop_config.json):
{
"mcpServers": {
"qontoctl": {
"command": "npx",
"args": ["qontoctl", "mcp"]
}
}
}claude mcp add qontoctl -- npx qontoctl mcpAdd to .cursor/mcp.json in your project root:
{
"mcpServers": {
"qontoctl": {
"command": "npx",
"args": ["qontoctl", "mcp"]
}
}
}Add to ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"qontoctl": {
"command": "npx",
"args": ["qontoctl", "mcp"]
}
}
}Available MCP Tools
Tool | Description |
Organization | |
| Show organization details including name, slug, and bank accounts |
Accounts | |
| List all bank accounts for the organization |
| Show details of a specific bank account |
| Download IBAN certificate PDF for a bank account |
| Create a new bank account |
| Update an existing bank account |
| Close a bank account |
Transactions | |
| List transactions for a bank account with optional filters |
| Show details of a specific transaction |
| List attachments for a transaction |
| Attach a file to a transaction |
| Remove attachment(s) from a transaction |
Statements | |
| List bank statements with optional filters |
| Show details of a specific bank statement |
Labels | |
| List all labels in the organization |
| Show details of a specific label |
Memberships | |
| List all memberships in the organization |
| Show the current authenticated user's membership |
| Invite a new member to the organization |
SEPA Beneficiaries | |
| List SEPA beneficiaries in the organization |
| Show details of a specific SEPA beneficiary |
| Create a new SEPA beneficiary |
| Update an existing SEPA beneficiary |
| Trust one or more SEPA beneficiaries |
| Untrust one or more SEPA beneficiaries |
SEPA Transfers | |
| List SEPA transfers with optional filters |
| Show details of a specific SEPA transfer |
| Create a SEPA transfer |
| Cancel a pending SEPA transfer |
| Download SEPA transfer proof PDF |
| Verify a payee (Verification of Payee / VoP) |
| Bulk verify payees (VoP) |
Internal Transfers | |
| Create an internal transfer between two bank accounts |
Bulk Transfers | |
| List bulk transfers |
| Show details of a specific bulk transfer |
Recurring Transfers | |
| List recurring transfers |
| Show details of a specific recurring transfer |
Clients | |
| List clients with optional pagination |
| Show details of a specific client |
| Create a new client |
| Update an existing client |
| Delete a client |
Client Invoices | |
| List client invoices with optional filters |
| Show details of a specific client invoice |
| Create a draft client invoice with client and line items |
| Update a draft client invoice |
| Delete a draft client invoice |
| Finalize a client invoice (assign number) |
| Send a client invoice to the client via email |
| Mark a client invoice as paid |
| Unmark a client invoice paid status |
| Cancel a finalized client invoice |
| Upload a file to a client invoice |
| Show upload details for a client invoice |
Quotes | |
| List quotes with optional filters |
| Show details of a specific quote |
| Create a new quote with client and line items |
| Update an existing quote |
| Delete a quote |
| Send a quote to the client via email |
Credit Notes | |
| List credit notes in the organization |
| Show details of a specific credit note |
Supplier Invoices | |
| List supplier invoices with optional filters |
| Show details of a specific supplier invoice |
| Create supplier invoices by uploading files |
Requests | |
| List all requests in the organization |
SCA Sessions | |
| Show the status of an SCA session ( |
| Simulate an SCA decision in the Qonto sandbox (sandbox-only) |
Attachments | |
| Upload an attachment file (PDF, JPEG, PNG) |
| Show details of a specific attachment |
E-Invoicing | |
| Retrieve e-invoicing settings for the organization |
Example Prompts
Once configured, you can ask your AI assistant things like:
"Show my Qonto account balances"
"List recent transactions over 1000 EUR"
"What were last month's card payments?"
"Show all team members in my organization"
"List bank statements for January 2026"
"Create a summary of this week's debits"
SCA Continuation
Some Qonto write operations — creating a transfer, modifying a card, approving a request — require Strong Customer Authentication (SCA): the user has to approve the request in the Qonto mobile app before it executes. QontoCtl wraps every SCA-gated MCP write tool with a continuation flow so the LLM client never has to reimplement polling.
How a wrapped write tool behaves
When an SCA-gated tool (e.g. transfer_create, card_create, beneficiary_trust, request_approve) hits a 428 SCA challenge, the wrapper polls the SCA session inline. If the user approves within the polling window, the tool returns the operation's success result transparently — the LLM never sees the SCA round-trip. If polling times out (or polling is disabled), the tool returns a structured SCA-pending response carrying the session token and instructions to continue.
Every wrapped tool exposes two optional input fields for this flow:
wait— maximum seconds to poll inline before falling back to the pending response.sca_session_token— bind a previously approved SCA challenge to a retry.
The wait knob
Value | Behavior |
| Poll for up to 30 seconds, then fall back to the structured pending response. |
| Poll for the specified number of seconds (capped at 120). |
| Skip polling entirely. Return the SCA-pending response immediately on the first 428. |
The 120 upper bound is the hard ceiling enforced via Zod at the input boundary. The practical ceiling is your MCP host's request timeout — Claude Desktop hardcodes ≈ 60 s and Cursor's effective limit is ≈ 30 s, so values above those will surface as host-side timeouts before the wrapper resolves. Use a small wait (e.g. 5-10) when the LLM expects the user to be present and willing to approve immediately. Use wait: false (or wait: 0) for pure two-step flows where the LLM and the user converse out-of-band between the SCA challenge and the retry.
Two-step fallback (out-of-band continuation)
When polling does not resolve, the SCA-pending response carries:
A user-facing message:
"SCA required. The user must approve this operation on their Qonto mobile app."A
Session token: <token>line (token validity: 15 minutes from issuance).Step-by-step instructions to continue.
The LLM (or the user) can then:
Poll session status with the
sca_session_showtool, passing the captured token. It returnswaiting,allow, ordeny.Retry the original tool once the status is
allow, passing the same parameters plussca_session_token: "<token>". The wrapper invokes the operation exactly once with the token bound — no second poll happens.
PSD2 dynamic linking. The SCA session token is bound to the original request parameters (amount, payee). Reusing a token against a different operation is rejected by Qonto. Reissue an SCA challenge by calling the original tool again whenever the parameters need to change.
Caller-supplied retry (sca_session_token)
When sca_session_token is set on a wrapped write tool, the wrapper:
Invokes the operation exactly once.
Skips polling entirely.
Forwards the token via the
X-Qonto-Sca-Session-Tokenheader.
This is the path used by step (2) of the two-step fallback. It is also useful when the LLM client implements its own polling cadence and only needs the wrapper to retry with an already-captured approval.
Sandbox testing
Sandbox accounts cannot enroll a real paired device, so SCA challenges in sandbox use a mock flow. After receiving a pending response, simulate the user's decision with the sca_session_mock_decision tool (sandbox-only — refuses to run when no staging token is configured). See docs/sandbox-testing.md for the full sandbox setup.
Migration note
Earlier QontoCtl builds (pre-@qontoctl/mcp SCA continuation) returned a free-form text response on 428 with no continuation hooks. Callers parsing that response should adopt the structured flow:
Before | After |
Free-form text mentioned the SCA endpoint but offered no MCP-exposed way to continue. | The SCA-pending response is still text content but its shape is stable: |
Polling required driving the Qonto HTTP API directly. | Use the |
Re-running the operation orphaned the prior approval. | Retry the original tool with the captured |
No way to opt-in to inline polling — every 428 was a dead end. | Pass |
The pending response's textual format is stable, so callers that need to extract the token programmatically can match against the Session token: line — but using sca_session_show directly avoids relying on the response prose.
CLI Usage
Commands
Command | Description |
| Show organization details |
| List bank accounts |
| Show bank account details |
| Download IBAN certificate PDF |
| Create a new bank account |
| Update a bank account |
| Close a bank account |
| List transactions with filters |
| Show transaction details |
| List attachments for a transaction |
| Attach a file to a transaction |
| Remove attachment(s) from a transaction |
| List bank statements |
| Show statement details |
| Download statement PDF |
| List all labels |
| Show label details |
| List organization memberships |
| Show current user's membership |
| Invite a new member |
| List SEPA beneficiaries |
| Show beneficiary details |
| Create a new beneficiary |
| Update a beneficiary |
| Trust one or more beneficiaries |
| Untrust one or more beneficiaries |
| List SEPA transfers |
| Show SEPA transfer details |
| Create a SEPA transfer |
| Cancel a pending SEPA transfer |
| Download SEPA transfer proof PDF |
| Verify a payee (VoP) |
| Bulk verify payees from CSV |
| Create an internal transfer |
| List bulk transfers |
| Show bulk transfer details |
| List recurring transfers |
| Show recurring transfer details |
| List clients |
| Show client details |
| Create a new client |
| Update a client |
| Delete a client |
| List client invoices |
| Show client invoice details |
| Create a draft client invoice |
| Update a draft client invoice |
| Delete a draft client invoice |
| Finalize client invoice and assign number |
| Send client invoice to client via email |
| Mark client invoice as paid |
| Unmark client invoice paid status |
| Cancel a finalized client invoice |
| Upload a file to a client invoice |
| Show upload details for a client invoice |
| List quotes |
| Show quote details |
| Create a new quote |
| Update a quote |
| Delete a quote |
| Send quote to client via email |
| List credit notes |
| Show credit note details |
| List supplier invoices |
| Show supplier invoice details |
| Create supplier invoices from files |
| Show e-invoicing settings |
| List all requests |
| Upload an attachment file |
| Show attachment details |
| Configure OAuth client credentials |
| Start OAuth login flow |
| Display OAuth token status |
| Refresh the OAuth access token |
| Revoke OAuth consent and clear tokens |
| Create a named profile |
| List all profiles |
| Show profile details (secrets redacted) |
| Remove a named profile |
| Test credentials |
| Generate bash completions |
| Generate zsh completions |
| Generate fish completions |
| Start MCP server on stdio |
Global Options
Option | Description |
| Configuration profile to use |
| Output format: |
| Fetch a specific page of results |
| Results per page |
| Disable auto-pagination |
| Enable verbose output |
| Enable debug output (implies |
Configuration
QontoCtl supports two authentication methods:
API Key — read-only access using your organization slug and secret key
OAuth 2.0 — full access including write operations and SCA; see the OAuth App Setup Guide
Profile Format
All configuration files use the same YAML format:
# API Key authentication
api-key:
organization-slug: acme-corp-4821
secret-key: your-secret-key
# OAuth 2.0 authentication (see docs/oauth-setup.md)
oauth:
client-id: your-client-id
client-secret: your-client-secretResolution Order
Without --profile:
QONTOCTL_*environment variables (highest priority).qontoctl.yamlin current directory~/.qontoctl.yaml(home default)
With --profile acme:
QONTOCTL_ACME_*environment variables (highest priority)~/.qontoctl/acme.yaml
Environment Variables
Environment variables override file values. Without --profile:
Variable | Description |
| Organization slug |
| API secret key |
| OAuth client ID |
| OAuth client secret |
| OAuth access token |
| OAuth refresh token |
| Custom API endpoint |
| Staging token (activates sandbox URLs) |
With --profile <name>, prefix becomes QONTOCTL_{NAME}_ (uppercased, hyphens replaced with underscores). For example, --profile acme reads QONTOCTL_ACME_ORGANIZATION_SLUG.
Debug Mode
The --verbose and --debug flags enable wire-level logging to stderr:
qontoctl --verbose transaction list # request/response summaries
qontoctl --debug transaction list # full headers and response bodiesSecurity note:
--debuglogs full API response bodies. Known sensitive fields (IBAN, BIC, balance) are automatically redacted, but responses may still contain other financial data. Do not use--debugin shared environments or pipe debug output to files accessible by others.
Disclaimer
qontoctl is an independent project not affiliated with, endorsed by, or officially connected to Qonto or Qonto SAS.
Qonto is a trademark of Qonto SAS.
License
What AGPL means for you
Using qontoctl as a CLI tool or MCP server does not make your code AGPL-licensed. Running the tool, scripting around it, or connecting it to your applications is normal use — no license obligations arise.
Using
@qontoctl/coreas a library (importing it into your code) means your combined work is covered by AGPL-3.0. If you distribute that combined work, you must make its source available under AGPL-compatible terms.Modifying and distributing qontoctl itself requires you to share your changes under AGPL-3.0.
Commercial licensing is available if AGPL does not fit your use case — contact the maintainer.
Maintenance
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/alexey-pelykh/qontoctl'
If you have feedback or need assistance with the MCP directory API, please join our Discord server