This is the shortest way to see your own books in Ekwo: a free database of your own, one command to install, and then Claude — the desktop application or Claude Code — doing the rest in plain sentences. You bring an export of your books from wherever they are kept today; Claude takes them over, answers questions about them and prepares your next VAT return. The web application, Ekwo Cloud, opens this same instance whenever you would rather click than type.
It takes about twenty minutes, most of it in the Supabase dashboard. You do not need to be a developer, but you will paste a few lines into a terminal and one block into a settings file.
Before you start, know what is not there yet (the full list is at the end): Ekwo prepares a declaration and you file it; imported history carries no VAT; the reconciliation marks of your old books are not re-applied.
What you need
- A Supabase account. The free plan is enough. Ekwo never sees the project: it is yours from the first row.
- Node.js 20 or later, from nodejs.org. Type
node --versionin a terminal to check. - Claude Desktop (claude.ai/download) or Claude Code.
- An export of your books. The simplest is a trial balance as a CSV file —
account, debit, credit — which every ledger can produce. A full export from
another ledger works too.
compatibility.mdlists every export Ekwo reads, with the official page that says how to produce each one.
Try it on a copy first: nothing here touches the software your books come from.
1. Create a free Supabase project
- Sign in at supabase.com and create a new project. Pick a name, a region near you, and a database password — write it down, you need it once, in the next step.
- When the project is ready, collect three things from the dashboard:
- Connect → Session pooler → the connection string, with your
database password where it says
[YOUR-PASSWORD]. Take the session pooler line rather than the direct one, which many networks cannot reach. - Project Settings → API Keys: the publishable key
(
sb_publishable_…, or the olderanonkey). This is the key Claude will use. - On the same page, the secret key (
sb_secret_…, or the legacyservice_rolekey). The installer uses it once, to create your user, and writes it nowhere.
- Connect → Session pooler → the connection string, with your
database password where it says
The Project URL is https://<ref>.supabase.co, where <ref> is the part
after postgres. in the connection string.
2. Install Ekwo into it
In a terminal:
npx -y ekwo-os@latest init
The installer asks its questions one by one:
| It asks | What to answer |
|---|---|
| The connection string | The session pooler line from step 1, with your password in it |
| The country | The country whose rules your books follow. Nothing is preselected |
| Your organisation, then the first company | Names. The company is the one whose books you are bringing |
| The first day of the financial year | Only where the country does not fix one |
| The chart of accounts and the language of the books | Only where the country publishes more than one |
| How often the company files its VAT return | Only where that depends on the company |
| Your main bank account | Optional, written the way your country's banks write it. Enter skips it |
| The administrator's e-mail address, the secret key and a password | This is you: the user Claude will sign in as. Choose a real password and keep it |
It takes a few seconds and ends with a summary, then lists four things to do on your project — among them, switching off public sign-up. Do them while the dashboard is open; they are explained in the installation guide. At the very end it offers to register the installation with Ekwo for security advisories and release notes; it is optional, and the installation guide lists what it sends.
3. Connect Ekwo to Claude
The connection is the Ekwo MCP server, @ekwo-ai/mcp,
published on npm and listed in the official MCP registry as ai.ekwo/mcp.
Claude starts it on your computer. It signs in to your project as the user you
just created, and can do exactly what that user can do and nothing more.
It needs four values:
| Variable | Value |
|---|---|
SUPABASE_URL |
https://<ref>.supabase.co |
SUPABASE_ANON_KEY |
The publishable key, or the legacy anon key |
EKWO_EMAIL |
The administrator's address you gave the installer |
EKWO_PASSWORD |
Its password |
In Claude Desktop
Open Settings from the Claude menu of your computer's menu bar, then Developer → Edit Config. That opens
claude_desktop_config.json.Put this in it — or, if the file already has an
mcpServerssection, add the"ekwo"entry inside it:{ "mcpServers": { "ekwo": { "command": "npx", "args": ["-y", "@ekwo-ai/mcp@latest"], "env": { "SUPABASE_URL": "https://YOURREF.supabase.co", "SUPABASE_ANON_KEY": "sb_publishable_…", "EKWO_EMAIL": "you@example.com", "EKWO_PASSWORD": "the password you chose" } } } }Quit Claude Desktop completely and open it again. In a new conversation, the + button → Connectors lists
ekwo.
If it does not appear, the server's log is mcp-server-ekwo.log, in
~/Library/Logs/Claude on macOS or %APPDATA%\Claude\logs on Windows.
In Claude Code
claude mcp add --scope user \
--env SUPABASE_URL=https://YOURREF.supabase.co \
--env SUPABASE_ANON_KEY=sb_publishable_… \
--env EKWO_EMAIL=you@example.com \
--env EKWO_PASSWORD='the password you chose' \
--transport stdio ekwo -- npx -y @ekwo-ai/mcp@latest
--scope user keeps the entry in your own ~/.claude.json. Do not use
--scope project: it would write the password into a file meant to be
committed. Then run /mcp inside Claude Code: ekwo should read
connected.
The password sits in plain text in either file, like any value in a client's configuration; keep the file to yourself.
With an Ekwo Cloud account, there is a shorter way with nothing in a file:
add https://mcp.ekwo.ai/mcp as a custom connector and approve it in your
browser. packages/mcp explains both routes.
4. Several companies, several countries
Start a conversation. Claude reads the description of every tool, so you speak about your books, not about tools.
"Is Ekwo connected? List my companies." Claude calls status and
list_companies: the schema version, and the company the installer created,
with you as its owner.
One installation keeps the books of as many companies as you like, in as many countries: the installer loads the rules of every country Ekwo has a pack for.
"Create a second company, Harbourlight Ledger Ltd, in the United Kingdom,
its financial year starting on 1 January 2026." Claude calls
create_company. The company gets its country's chart of accounts, journals,
taxes and VAT return, in its own currency, with you as its owner:
| Company | Country | Currency | Your role |
|---|---|---|---|
| Põhjatuul OÜ | EE | EUR | owner |
| Harbourlight Ledger Ltd | GB | GBP | owner |
Every tool that reads or writes the books names its company, so tell Claude which one you mean whenever it could be either. Where a country leaves a choice open — the first day of the year, a chart, a language — the tool refuses to guess, and Claude asks you.
The command line does the same: ekwo company new creates a company, and
ekwo use picks the one the next commands run on. An installation with no
single first company — a group, a firm — can start with
ekwo init --no-company; see the
installation guide.
5. Ask Claude to take over your books
"Here is the trial balance of Põhjatuul OÜ at 1 January 2026. Import it —
show me first what you would do." Attach the CSV (in Claude Code, give its
path). Claude calls import_books with dry_run on, which writes nothing. The
answer is the correspondence: for every account of your old books, the
account of the new chart it would go to, and why. A few lines of it, from the
two companies above:
| Old account | Proposed | Basis, and why |
|---|---|---|
| 101000 Bank current account | 1010 | suggested, same digits — its name is the one 1010 has in the chart |
| 120000 Customers | 1200 | suggested, same digits — its name says a receivable, and 1200 is one |
| 610 Accounts receivable | 1100 | suggested, kind — 6100 has the same digits but is an expense account, so the chart's receivable is proposed instead |
| 090 Business current account | — | none — the chart has neither the code nor its digits |
Read every line before you agree. Only the same code, confirmed by what
the file says of the account, is exact; everything else is suggested and
waits for you, or none. Two charts can use the same digits for different
things, so a suggestion can be wrong. Nothing is posted while a line is only
suggested.
"610 is 1100, as you suggest. 090 is the bank current account, 1300." Claude runs the rehearsal again with your answers. When nothing is left open, the database runs the whole import and takes it back, so what you see is what would happen, and any refusal is the real one. When every suggestion is right: "Every suggestion is right, accept them."
"That's right. Import it for real." The opening entry is posted, all of it or none of it. The same file a second time is refused rather than counted twice.
For a larger history — the entries of a whole year — the steps are the same.
A file that does not balance, or a date it does not make unambiguous, is
refused by name rather than guessed. The tool takes up to 256 KiB of text;
beyond that it answers with the ekwo import command that reads the files
from your disk and runs the same import (import.md). Claude Code
can run it for you.
Bank statements are not books: say "import this bank statement" and Claude
uses import_bank_statement, which records the lines to be matched and books
nothing.
6. Ask questions, prepare a return
Now it is your books. Sentences that work, and what answers them:
| You say | Claude uses |
|---|---|
| "Show me the trial balance for 2026." | trial_balance |
| "Every movement on the customers account." | general_ledger |
| "Who owes me money, and since when?" | aged_balance |
| "Everything that went through with this customer this year." | search_contacts, contact_statement |
| "Invoice Lõuna Pagarid 1 000 for consulting at the standard rate, and post it." | search_contacts, create_document, post_document |
| "Send them a link to the invoice." | share_document |
| "Prepare my VAT return for January." | vat_return |
The return is computed from what was booked in Ekwo during the period, box by box, in the form the country's administration uses.
Claude finds its way on its own: the server tells it, at the handshake, what to
call first and how to correct what is posted. The same first session, tool by
tool, is in agents.md.
Filing is yours. Ekwo prepares the figures; you send them on your tax
administration's portal, or give them to whoever files for you. What a
declaration goes through after it is computed — freezing it, keeping what was
sent, noticing a period that changed afterwards — is in filing.md.
What this does not do yet
- No filing. Ekwo prepares a declaration and does not transmit it to an administration. Sending it, and answering for it, is yours.
- No VAT on imported history. An imported line feeds the ledger, the balances and the financial statements, and no box of a VAT return: a period kept elsewhere was declared from where it was kept.
- No reconciliation marks. Open items are matched again in Ekwo, with
reconcile("match this payment with that invoice"). - No new accounts. An old account the new chart does not have is pointed at one that exists, or added first.
- No documents. Old invoices arrive as the entries they were posted as.
Before you rely on anything Ekwo prepares, read DISCLAIMER.md: a country pack is a reading of the rules at the date of its version, and the books are yours.
Checked for real
Every step above runs end to end against throwaway Supabase projects with the
published packages, from a script that can be repeated on any release:
docs/demo/start-with-claude/walkthrough.mjs.
The trial balances it imports are beside it; the data is invented.