Run your accounting by talking to an AI
The Qontab MCP connector exposes 126 tools over your double-entry books. Connect Claude, Cursor, or any MCP client and record transactions, send invoices, reconcile your bank, run payroll and pull live reports — in plain language, with full accounting integrity preserved server-side.
In one paragraph
Qontab is an AI-native, double-entry accounting platform. Its MCP connector is a Model Context Protocol server that any AI assistant can connect to using a Qontab API key or OAuth. It offers 126 tools across accounts, transactions, invoicing, expense reports, travel, contacts, banking, documents, recurring entries, projects, assets, budgets and payroll. Read tools work on any plan; write tools need a paid plan; every call is scoped, role-checked and counted against a monthly allowance.
Your connection
Sign in to manage your API keys
Create, reveal once and revoke your MCP keys right here, once you’re signed in.
How the connector works
Crucially, the AI never touches your database directly. It calls named, typed tools over JSON-RPC; all the accounting rules — balanced entries, sequential numbering, immutable posting semantics, multi-tenant isolation — are enforced by Qontab, not the model. The assistant is a natural-language front-end; Qontab remains the system of record.
Compatible AI clients
Qontab exposes a remote MCP server with OAuth 2.1 (Dynamic Client Registration + PKCE) and Bearer keys, so any AI agent that supports custom MCP connectors can drive your books — no plugin to build.
| Client / agent | Auth | How to connect |
|---|---|---|
| ChatGPT (OpenAI) | OAuth 2.1 | Settings → Connectors → Create (or Developer mode) → add a custom connector with the MCP server URL. ChatGPT runs the OAuth 2.1 flow; available on Plus, Pro, Business, Enterprise and Edu. |
| Claude.ai (Anthropic) | OAuth 2.1 | Settings → Connectors → Add custom connector → paste the server URL. One-click OAuth login, with a company picker for multi-tenant accountants. |
| Claude Desktop | OAuth 2.1 + Bearer | Add a custom connector by URL (OAuth), or use the mcp-remote bridge in claude_desktop_config.json with a Bearer key. |
| Claude Code (CLI) | OAuth 2.1 + Bearer | claude mcp add --transport http with a Bearer header, or let it complete the OAuth flow on first connect. |
| Cursor | OAuth 2.1 + Bearer | Settings → MCP → Add server (URL). Cursor handles the OAuth handshake, or you can pass an Authorization header. |
| VS Code — GitHub Copilot (agent mode) | OAuth 2.1 + Bearer | Add the server in mcp.json (or the MCP: Add Server command). Copilot agent mode supports remote MCP with OAuth. |
| Windsurf (Codeium) | OAuth 2.1 + Bearer | Cascade → MCP servers → add the URL; remote MCP with OAuth or Bearer. |
| Goose · Cline · Zed · other MCP clients | OAuth 2.1 + Bearer | Any client implementing the MCP remote/streamable-HTTP transport can connect with OAuth 2.1 or a Bearer key. |
Quick start
Claude Code (CLI)
Claude Code speaks streamable-HTTP MCP natively — one line registers the server.
claude mcp add --transport http qontab https://api.qontab.com/mcp \
--header "Authorization: Bearer YOUR_KEY"Claude Desktop
Add this to claude_desktop_config.json. mcp-remote bridge injects the auth header and works on every Claude Desktop build.
{
"mcpServers": {
"qontab": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://api.qontab.com/mcp",
"--header",
"Authorization:Bearer YOUR_KEY"
]
}
}
}Claude.ai (OAuth — no key to paste)
In Claude.ai → Settings → Connectors → Add custom connector, paste the server URL. Claude discovers the OAuth endpoints, you log in to Qontab, pick the company, and you’re connected. Tokens are short-lived and refreshed automatically.
https://api.qontab.com/mcpGenerate your key under Settings → API keys. read to let the AI look but not touch, or read_write to let the AI record.
Authentication & scopes
Bearer API key — Authorization: Bearer qk_live_… into any MCP client. Works everywhere.
OAuth 2.1 — for Claude.ai / Claude Desktop custom connectors. PKCE, dynamic client registration, short-lived JWTs, and a consent screen that lets multi-company accountants pick a tenant.
read every list_* / get_* tool.
write every mutating tool. A write call without a read_write key is refused with JSON-RPC -32604.
delete irreversible / destructive tools — your MCP client confirms before calling them.
The 126-tool catalogue
Grouped by domain. Read tools work on any plan; write tools need a paid plan; domains tagged Enterpriseor Pro require that tier.
Inspect and maintain the general-ledger account tree and the trial balance.
| read | list_accounts | List the chart of accounts, filterable by type and active status. |
| read | get_account | Fetch one account with its current balance. |
| read | get_trial_balance | Trial balance as of any date. |
| write | create_account | Add a GL account. |
| write | update_account | Rename or re-type an account. |
| delete | delete_account | Soft-delete an account. |
| delete | hard_delete_account | Permanently remove an unused account. |
The double-entry core: record journal entries and pull the three primary statements.
| read | list_transactions | Browse journal entries by type, status, date or text. |
| read | get_transaction | One entry with every line. |
| read | get_profit_loss | P&L for any date range. |
| read | get_balance_sheet | Balance sheet as of a date. |
| write | create_expense | Record a cash outflow (DR category, CR bank). |
| write | create_income | Record a cash inflow (CR revenue, DR bank). |
| write | create_transfer | Move money between accounts, cross-currency with auto-FX. |
| write | create_capital_contribution | Owner injects funds (CR equity). |
| write | create_opening_balance | Seed migration opening balances. |
| write | create_employee_advance | Company advances money to an employee. |
| write | create_employee_repayment | Employee repays the company. |
| write | record_director_reimbursement | Settle a director’s loan (1126). |
| write | edit_transaction | Edit in place, draft or posted, keeping the sequential number. |
| write | recompute_fx_rates | Re-resolve historical FX on every line (dry-run option). |
| delete | post_transaction | Commit a draft to the GL (irreversible state change). |
| delete | delete_transaction | Delete a draft, or hard-delete a posted entry. |
| delete | bulk_post_transactions | Post up to 500 drafts at once. |
| delete | bulk_delete_transactions | Hard-delete up to 500 entries. |
Sales & purchase invoices, credit/debit notes, payments and FX gain/loss.
| read | list_invoices | List invoices with base-currency totals. |
| read | get_invoice | One invoice with lines, payments and GL postings. |
| read | list_tax_rates | Configured VAT / tax rates. |
| read | list_invoices_missing_issuance | Integrity check for invoices missing their issuance entry. |
| write | create_invoice | Draft an invoice. |
| write | update_invoice | Edit a draft or posted invoice. |
| write | send_invoice | Post the invoice to the GL. |
| write | record_invoice_payment | Record a payment, cross-currency aware. |
| write | edit_invoice_payment | Correct a payment in place. |
| write | repost_invoice | Regenerate a missing issuance entry. |
| delete | cancel_invoice | Hard-delete an invoice and its postings. |
Notes de frais: the full submit → approve → pay lifecycle with receipts and duplicate auditing.
| read | list_expense_reports | Reports by status, employee, date. |
| read | get_expense_report | One report with lines and receipts. |
| read | find_expense_duplicates | Audit for duplicate claims vs bank / journal. |
| write | create_expense_report | Draft a report. |
| write | update_expense_report | Edit fields or the full line set. |
| write | submit_expense_report | Submit for approval. |
| write | approve_expense_report | Approve (auto-posts for director reports). |
| write | resubmit_expense_report | Resubmit a rejected report. |
| write | attach_expense_report_line_document | Attach, replace or detach a receipt. |
| write | review_expense_report_duplicate | Record a duplicate verdict. |
| write | repoint_expense_report_payable | Move a director payable leg to 1126. |
| write | mark_expense_report_reimbursed | Flag reimbursed without posting. |
| write | bulk_expense_report_action | Bulk submit / approve / delete (up to 200). |
| delete | reject_expense_report | Reject a submitted report. |
| delete | pay_expense_report | Pay and post the reimbursement entry. |
| delete | delete_expense_report | Hard-delete a report. |
Multi-leg travel & per-diem declarations linked to their real transport/lodging expenses.
| read | list_travel_declarations | Declarations by status or text. |
| read | get_travel_declaration | One declaration with legs and linked transactions. |
| write | create_travel_declaration | Draft a multi-leg per-diem claim. |
| write | update_travel_declaration | Edit a draft declaration. |
| write | submit_travel_declaration | Submit for approval. |
| write | approve_travel_declaration | Approve a submitted declaration. |
| write | link_travel_transaction | Attach a transport/lodging expense to a trip. |
| delete | pay_travel_declaration | Pay and post at the trip end-date FX rate. |
| delete | unlink_travel_transaction | Remove a transaction link. |
| delete | delete_travel_declaration | Hard-delete a draft declaration. |
Customers, suppliers and employees.
| read | list_contacts | Contacts by type, active flag or text. |
| read | get_contact | One contact. |
| write | create_contact | Add a customer / supplier / employee. |
| write | update_contact | Edit contact fields. |
| delete | delete_contact | Hard-delete a contact. |
Bank/cash accounts, balances and statement-to-ledger reconciliation.
| read | list_bank_accounts | All bank / cash accounts. |
| read | get_bank_account | One account. |
| read | get_bank_account_balance | Current balance. |
| read | get_bank_reconciliation | Unmatched statement vs journal lines. |
| write | create_bank_account | Create an account. |
| write | update_bank_account | Edit account details. |
| write | match_bank_transaction | Pair a statement line to an entry. |
| write | auto_match_bank_transactions | Auto-match by amount and date. |
| write | complete_bank_reconciliation | Finalise a reconciliation. |
| delete | delete_bank_account | Delete an empty account. |
| delete | unmatch_bank_transaction | Undo a match. |
Receipts and attachments linked to journal entries (export & bulk download).
| read | get_document | Document metadata. |
| read | list_transaction_documents | Documents linked to an entry. |
| read | export_documents | List / ZIP-export attachments with download URLs. |
| write | attach_document_to_transaction | Link a document to an entry. |
| delete | delete_document | Hard-delete a document. |
Templates that generate repeating entries on a schedule.
| read | list_recurring | Recurring templates. |
| read | get_recurring | One template. |
| read | list_upcoming_recurring | Templates due within N days. |
| write | create_recurring | Create a template. |
| write | update_recurring | Edit a template. |
| write | generate_recurring | Generate the next entry now. |
| delete | delete_recurring | Delete a template. |
Cost & revenue tracking and profitability per project.
| read | list_projects | Projects by status. |
| read | get_project | One project. |
| read | get_project_profitability | Revenue, cost and margin. |
| write | create_project | Create a project. |
| write | update_project | Edit a project. |
| delete | delete_project | Delete a project. |
Asset register, depreciation booking and disposals.
| read | list_assets | Assets by category / status. |
| read | get_asset | One asset with its depreciation schedule. |
| write | create_asset | Register an asset. |
| write | update_asset | Edit an asset. |
| delete | book_asset_depreciation | Post a month’s depreciation. |
| delete | dispose_asset | Sell or scrap an asset. |
| delete | delete_asset | Delete an asset. |
Budgets and budget-vs-actual analysis.
| read | list_budgets | All budgets. |
| read | get_budget | One budget with monthly lines. |
| read | get_budget_vs_actual | Budget vs actual for a range. |
| write | create_budget | Create a budget. |
| write | update_budget | Edit a budget. |
| write | upsert_budget_lines | Insert / update monthly lines. |
| delete | delete_budget | Delete a budget. |
Employees, monthly payroll runs and payslips with Mauritius statutory (PAYE / CSG / NSF) and MRA remittance.
| read | list_employees | Employees, optionally with balance. |
| read | get_employee | One employee with salary structure. |
| read | get_employee_balance | Net owed to / by an employee. |
| read | list_employee_ledger | Journal lines posted to an employee. |
| read | list_payroll_runs | Monthly runs. |
| read | get_payroll_run | One run with payslips + MRA summary. |
| read | list_payslips | Payslips by month / status / employee. |
| read | get_payslip | One payslip with all lines. |
| read | get_payslip_pdf | Signed download of the official PDF. |
| write | create_employee | Hire an employee. |
| write | update_employee | Change role / salary. |
| write | create_payroll_run | Draft a monthly run (auto-generates slips). |
| write | create_payslip | Free-form payslip (auto-posts the entry). |
| delete | process_payroll_run | Post the consolidated payroll entry. |
| delete | delete_employee | Soft-delete an employee. |
| delete | delete_payslip | Delete a standalone payslip + its entry. |
For accountants connected to several tenants — switch which company the other tools operate on.
| read | list_companies | Companies the connected user can access. |
| read | set_active_company | Switch the active company for subsequent calls. |
Composite tools (recipes)
Four tools collapse a common multi-step flow into one call, with compensation semantics so a half-finished workflow never corrupts your books. Prefer them over manual sequences.
Plans & quotas
Every tools/call — read or write — consumes one unit of the monthly MCP allowance. A tier-gated or exhausted call returns -32603 with the tier that unlocks it.
| Plan | MCP calls | Access |
|---|---|---|
| Free | 100 / month | Read tools only |
| Basic | 2,000 / month | Read + standard write |
| Pro | 20,000 / month | Basic + recurring templates |
| Enterprise | Unlimited | Everything (+ assets, budgets, projects, payroll) |
Case studies — doing real accounting with AI
Six concrete ways people run and pilot their company with Qontab + an AI assistant. Each shows what you say, and which tools fire behind the scenes.
“It’s the end of June. Reconcile my main EUR account against the statement I just uploaded, then give me the P&L and balance sheet for the fiscal year.”
import_bank_and_reconcile auto-matches the statement; anything left over comes back for you to confirm with match_bank_transaction. Then get_profit_loss and get_balance_sheet render the two statements — already in your base currency, FX resolved at each entry’s date.
import_bank_and_reconcileget_profit_lossget_balance_sheet“Invoice Acme Corp €4,500 for May consulting, VAT 15%, then mark it paid into my Revolut account on the 3rd.”
The composite record_paid_invoice drafts the invoice, posts it to the GL with the right VAT, and records the payment to the chosen bank — with compensation semantics so you never end up with a paid invoice that has no issuance entry.
record_paid_invoicelist_tax_rateslist_bank_accounts“Here are 8 receipts from the team. Create the expense reports, attach each receipt, approve them and pay them from petty cash.”
process_expense_report runs create → attach → submit → approve → pay for each one, and find_expense_duplicates flags anything that looks like it was already claimed or already on the bank feed (same amount ±2%, within 14 days).
process_expense_reportfind_expense_duplicatespay_expense_report“Draft the June payroll run for all active employees, then tell me the PAYE, CSG and NSF I have to remit this month.”
create_payroll_run generates each payslip from the salary structure and Mauritius statutory rules; get_payroll_run returns the consolidated MRA summary (PAYE / CSG / NSF) so you know the remittance before you process_payroll_run.
create_payroll_runget_payroll_runprocess_payroll_run“Compare this quarter’s revenue and margin to budget, show me the three projects eating the most cost, and which customers still owe me money.”
get_budget_vs_actual, get_project_profitability and list_invoices (filtered to unpaid) turn the ledger into a management dashboard you can interrogate conversationally — no report builder, no spreadsheet export.
get_budget_vs_actualget_project_profitabilitylist_invoices“Switch to Beta Ltd, post the supplier invoices I’m pasting, then switch back to Acme and pull its trial balance.”
list_companies and set_active_company let one connected user move between every tenant they’re a member of, so an accountant runs all their clients’ books from a single AI session over OAuth.
list_companiesset_active_companyget_trial_balanceError handling
| JSON-RPC code | Meaning |
|---|---|
| -32602 | Validation failed — the payload didn’t match the tool’s schema (data.issues lists why). |
| -32604 | Insufficient scope — a write tool was called with a read-only key. |
| -32605 | Role denied — your RBAC role can’t perform this action. |
| -32603 | Plan/quota/feature — tier too low or monthly allowance exhausted (data.upgradeRequired names the tier). Surface it as an upgrade prompt; don’t retry. |
Frequently asked questions
Point your AI at your books
Create a free Qontab account, generate a key, and connect in under five minutes.