
Qontoctl
io.github.alexey-pelykh由 GitHub 帳號 alexey-pelykh 發布v3.0.1更新於 Nov 3, 2026
CLI and MCP server for the Qonto banking API
概覽
本機 MCP 伺服器兼命令列工具,讓 AI 助理讀取並操作 Qonto 企業銀行帳戶:帳戶、交易、轉帳、卡片、發票與客戶。
- 可以做什麼
- 讀取組織、帳戶、交易、對帳單、標籤與成員資訊
- 建立、更新與關閉銀行帳戶,下載 IBAN 證明
- 建立、取消並核驗 SEPA、內部、批次、定期與 SWIFT 轉帳,管理收款人
- 管理卡片、團隊、Webhook、付款連結、保險、POS 終端機與商品
- 建立、寄送、定稿與取消客戶發票、報價單、貸項通知單與供應商發票
- 透過輪詢或工作階段權杖處理寫入操作的強客戶認證(SCA)
- 適用情境
- 適合希望助理在自己電腦或無介面腳本中自動處理 Qonto 銀行與開票事務,而不只是查詢餘額聊天的情境。也適合需要較完整 API 涵蓋範圍、以自有憑證執行腳本化轉帳或發票流程的團隊。
- 執行需求
- 透過 npm 套件 qontoctl 以 stdio 在本機執行,需要 Node.js 24 或更新版本。需要一個已開通 API 存取的 Qonto 企業帳戶。憑證來自 YAML 設定檔或環境變數:API 金鑰方式需 QONTOCTL_ORGANIZATION_SLUG 與 QONTOCTL_SECRET_KEY,OAuth 方式需用戶端 ID 與密鑰。需要連線至 Qonto API 的網路。
安裝
在 SourceWeft 中
- 開啟 儀表板中的 Qontoctl,將其新增到工作區。
- 為需要使用其工具的對話啟用該服務。
Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。
其他 MCP 客戶端
參照 儲存庫 中的啟動說明。
README
[QontoCtl: The Complete CLI & MCP for Qonto]
[CI] [Codecov] [npm version] [npm downloads] [GitHub Repo stars] [License]
CLI and MCP server for the Qonto banking API.
This project is brought to you by Alexey Pelykh.
Unofficial project. QontoCtl is independent and not affiliated with, endorsed by, or supported by Qonto. See the Disclaimer.
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, view, and create bulk SEPA transfer batches
- Recurring Transfers — list, view, create, cancel recurring transfers
- International Transfers (SWIFT) — create SWIFT transfers and manage international beneficiaries
- Cards — list, create, update, lock/unlock, report lost/stolen, discard cards
- Teams — list and create teams
- Webhooks — create and manage webhook subscriptions
- Payment Links — create, deactivate, and manage Stripe-backed payment links
- Insurance — show, create, update insurance contracts and manage documents
- Terminals (POS) — list Qonto Terminals and initiate terminal payments
- Products — list catalogue products
- 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
QontoCtl and Qonto's official MCP
QontoCtl is an independent, unofficial project — not affiliated with or endorsed by Qonto.
Qonto ships its own official MCP server — hosted, free on every plan, and installable in a tap from Claude, ChatGPT, Cursor, and more. If you want to talk to your finances — "show my balances", "chart last month's spending", "draft an invoice" — it's an excellent, well-made option.
QontoCtl is built for a different job: automating Qonto, not just chatting with it.
The official MCP is a hosted assistant you log into as a user. QontoCtl is a local, open-source toolkit — a CLI, an MCP server, and a library — that runs on your own machine with your own credentials, including as a headless service account.
Comparison based on Qonto's public MCP documentation as of July 2026.
* Transfers to untrusted payees still require your Strong Customer Authentication approval, as they must. QontoCtl handles the SCA continuation so scripted flows — to trusted beneficiaries and between your own accounts — complete without a human at the terminal.
QontoCtl also supports multiple Qonto organizations from one setup via named profiles — handy for accountants, holding companies, and anyone running the books for several entities.
The official MCP talks to Qonto. QontoCtl automates it. Many people will use both — the official MCP in a chat window, QontoCtl in a pipeline.
Prerequisites
- Node.js >= 24
- A Qonto business account with API access
Installation
Or run directly with npx:
Or install via Homebrew:
Quick Start
MCP Integration
QontoCtl implements the Model Context Protocol (MCP), letting AI assistants interact with your Qonto account through natural language.
MCP Client Configuration
Claude Desktop
Add to your Claude Desktop configuration (claude_desktop_config.json):
Claude Code
Cursor
Add to .cursor/mcp.json in your project root:
Windsurf
Add to ~/.codeium/windsurf/mcp_config.json:
Pointing MCP at a non-default config file
The MCP server has no CLI flags. To load credentials from a config file other than ~/.qontoctl.yaml, set QONTOCTL_CONFIG_FILE in the host's env block:
The path is captured at server startup. See docs/configuration.md for the full resolution chain.
Available MCP Tools
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
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:
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
First command to try when something doesn't work:
qontoctl diagnose— a read-only healthcheck across config, credentials, scopes, organization metadata, and host routing.
Commands
Global Options
Configuration
QontoCtl supports two authentication methods:
- API Key — production-only access using your organization slug and secret key. Supports the endpoints listed as "API key ✔" in the Qonto auth table (most reads plus many writes — internal transfers, clients, attachments, …). Cannot be used against the Qonto sandbox.
- OAuth 2.0 — full access including OAuth-only endpoints (cards, teams, webhooks, e-invoicing, payment links, insurance, international transfers, recurring transfers, SCA flows) and the Qonto sandbox via staging-token; see the OAuth App Setup Guide.
Profile Format
All configuration files use the same YAML format:
Resolution Order
The CLI resolves the config file in this order (highest priority first):
--config <path>flagQONTOCTL_CONFIG_FILEenv var~/.qontoctl/{name}.yaml(when--profile <name>is given)~/.qontoctl.yaml(home default)
When --config is supplied alongside QONTOCTL_CONFIG_FILE or --profile and the resolved paths disagree, --config wins and a warning is emitted on stderr so the override is visible.
No current-directory discovery. The CLI does not scan the working directory for
.qontoctl.yaml. For repo-local config, use adirenvshim that exportsQONTOCTL_CONFIG_FILE="$PWD/.qontoctl.yaml", or pass--config ./.qontoctl.yamlexplicitly per invocation.
Per-field overrides apply on top of the loaded file:
- Without
--profile:QONTOCTL_*env vars override file values - With
--profile acme:QONTOCTL_ACME_*env vars override file values
For the full reference (precedence rules per entry point, profile semantics, migration from CWD discovery), see docs/configuration.md.
Environment Variables
Environment variables override file values. They carry inputs (static configuration) the tool reads but never writes back; runtime-mutable state (refresh tokens, token expiry, granted scopes) lives in the file only. See the note on QONTOCTL_ACCESS_TOKEN below.
Without --profile:
With --profile <name>, prefix becomes QONTOCTL_{NAME}_ (uppercased, hyphens replaced with underscores). For example, --profile acme reads QONTOCTL_ACME_ORGANIZATION_SLUG.
QONTOCTL_ACCESS_TOKENsemantics: when set, the env-supplied bearer is used for the current invocation only. Proactive token refresh is not attempted, and refreshed tokens are not persisted to disk (mirrorsAWS_SESSION_TOKEN). If the token has expired the API surfaces a401; re-issue the token externally.
QONTOCTL_REFRESH_TOKENis intentionally not supported. Refresh tokens are runtime-mutable state — every refresh produces a new value the tool must write back somewhere — and env vars carry inputs, not state. Use file-based credentials (~/.qontoctl.yamlor a profile) for OAuth flows that need refresh, or stick with API-key env vars in CI.
Debug Mode
The --verbose and --debug flags enable wire-level logging to stderr:
Security 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. It runs on your own machine with your own credentials.
"Qonto" and the Qonto logo are trademarks of Olinda SAS (the company operating Qonto); qontoctl uses the name only to describe the service it interoperates with.
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.
來源:README.md,提交 b7b3c8a
工具
0版本歷史
1- v3.0.1最新Sep 16, 2026
評分
已滿足適用檢查項的 50%
該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。
- 近 30 天內可連通25 分
請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。
- 已宣告認證方式10 分
請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。
- 已列出工具15 分
請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。
- 描述必需15 分
- 圖示10 分
- 文件15 分
- 授權條款10 分