wint-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@wint-mcp show me my open bookkeeping to-dos"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
wint-mcp
An MCP server that lets an AI assistant handle the day-to-day of your Wint bookkeeping. It reads to-dos, receipts, supplier invoices, ledger transactions, reports and bank balances. It can finish and submit receipts, send in new receipts and documents, approve supplier invoices, and attach documents to payments that are missing one. You log in with BankID through a small login panel shown right in the chat.
It covers the everyday work of a small company owner, not all of Wint. Customer invoicing, salaries, annual accounts and settings are not included. Contributions that add them are welcome.
Unofficial. This is not affiliated with Wint or BankID. Wint publishes an OpenAPI description of its API, but the BankID login and the to-do list used here come from Wint's own web app and are not documented. Either can change or break at any time. Automated use may be against Wint's terms. Use at your own risk.
What it can do
Tool | What it does |
| Shows the BankID login panel |
| Shows whether you're logged in / deletes the stored session |
| Lists every company your Wint user can access |
| Lists open to-dos: missing documents, supplier invoices to approve, receipts, messages… |
| Lists payments that are missing a receipt or invoice |
| Lists receipts, or shows one in detail |
| Lists supplier invoices, or shows one in detail |
| Lists ledger transactions by date, account or text, or shows one voucher |
| Shows the chart of accounts |
| Shows a result report (P&L) or balance report over whole months |
| Shows bank balances and the date bookkeeping is done until |
| Searches suppliers, customers, invoices and receipts |
| Shows an upload panel for a receipt or invoice file, or lists uploaded files |
| Shows receipt categories, your payment methods, and whether you can approve invoices |
Tools that change things (marked ✎):
Tool | What it does |
✎ | Edits a receipt (category, purpose, files, …) and optionally submits it, e.g. a Wint card draft |
✎ | Sends in a new receipt, e.g. something you paid with your own money |
✎ | Sends a supplier invoice file to Wint, which then reads it |
✎ | Sends any other document (contract, statement…) to Wint |
✎ | Approves a supplier invoice. Wint then pays it on the due date |
✎ | Attaches documents to a payment that is missing one |
Every change takes two steps. Without confirm the tool only returns a preview of what would be sent.
With confirm=true it is sent to Wint, and that changes the company's bookkeeping. Nothing can be paid
with BankID, sent to customers or deleted, except attachments on a receipt you are editing. The file can
come from:
the upload panel (
upload_document), which gives each file anupload_idfile_url, anhttps://link the server downloads (public addresses only)file_base64, the file content itself
Files are PDFs or images, up to 10 MB each. Uploaded files are kept for one hour.
Related MCP server: billy-mcp
The login panel
connect_wint returns an interactive MCP Apps
panel instead of a link:
On a computer it shows a live BankID QR code. Scan it with the BankID app.
On a phone it shows an Open BankID button that opens the BankID app on the same device.
The login only starts when the panel asks for it, because BankID cancels a login the app hasn't picked up within about 30 seconds. A new QR code is started automatically if nobody scans in time.
After the login, the server keeps Wint's refresh token and gets a new access token when the old one
expires (about every 10 minutes). You stay logged in for as long as Wint keeps accepting the refresh
token, or until --max-session-hours has passed.
You need a client that renders MCP Apps panels, such as ChatGPT. In other clients you can log in by running the server locally once in a client that has panels. The session is stored in the data directory, so other clients that use the same directory get the same session.
Install
Requires Python 3.12+ and uv.
git clone https://github.com/truls27a/wint-mcp.git
cd wint-mcp
uv sync
uv run wint-mcp --helpLocal clients (stdio)
For a client that starts the server itself, add something like this to its MCP config:
{
"mcpServers": {
"wint": {
"command": "uv",
"args": ["run", "--directory", "/path/to/wint-mcp", "wint-mcp"]
}
}
}Remote clients (HTTP)
WINT_MCP_TOKEN="$(openssl rand -hex 32)" uv run wint-mcp --transport http --port 8000The MCP endpoint is http://127.0.0.1:8000/mcp, and /healthz is a health check.
By default it listens on
127.0.0.1only.If
WINT_MCP_TOKENis set, every request must sendAuthorization: Bearer <token>.It refuses to listen on a non-loopback address without a token. The exception is
--allow-unauthenticated, meant for a private container network where the only way in is a tunnel you control.
ChatGPT needs to reach the server over the internet. Put it behind a tunnel or reverse proxy that handles authentication, and never expose an unauthenticated port.
Docker
docker build -t wint-mcp .
docker run -d --name wint-mcp -p 127.0.0.1:8000:8000 \
-e WINT_MCP_TOKEN=change-me -v wint-mcp-data:/data wint-mcpConfiguration
Setting | Default | Meaning |
|
|
|
|
| HTTP only |
|
| Where the session and uploads are stored |
| no limit | Forget the session this long after login |
| unset | Bearer token required on HTTP |
| off | Allows a non-loopback HTTP address without a token |
Security
Read this before you run it.
One user per server. The server stores one Wint session. Anyone who can call the server can read that person's bookkeeping for every company they have in Wint, and can attach documents to missing documents, submit receipts and approve supplier invoices. Run your own instance and keep it private.
The stored session can do more than this server does. The refresh token belongs to a normal Wint web session, which can also approve invoices and change bookkeeping data. In Wint, payouts and salaries need a separate BankID signature. Anyone who gets hold of the data directory can use the session until Wint stops accepting it. The directory is created
0700and the database0600. Usedisconnect_wint, and consider--max-session-hours.No credentials are stored. Login is BankID only. The server never sees a password, and it does not store your personal identity number.
Prompt injection. Supplier names, receipt texts and file names come from Wint and from documents. The server tells the model to treat them as data, and every change needs an explicit confirmation.
Limitations
Endpoints and response shapes are reverse-engineered and may change without notice.
Dimensions (cost centres, projects) and invoice periodisation can't be set. If Wint requires them for a company, finish that item in Wint.
Supplier invoices can be approved, not rejected or sent back.
Wint has no logout endpoint for this kind of session.
disconnect_wintdeletes the stored tokens, and Wint expires them on its own.
License
Available Tools
28 toolsapprove_supplier_invoiceApprove Supplier InvoiceA
Approve (attestera) a supplier invoice, as the Godkänn button does. Approved invoices are paid by Wint on the due date. Without confirm it only returns a preview.
Inputs: invoice_id (required), company, confirm. Returns: object
attach_missing_documentAttach Missing DocumentA
Attach a receipt, invoice or other document to a payment that Wint marked as missing a document. Without confirm it only returns a preview. With confirm=true it submits to Wint; this changes the company's bookkeeping and cannot be undone from here.
Inputs: explanation (required), document_type (required), missing_document_id (required), intent, +8 more. Returns: object
bankid_login_pollBankid Login PollBRead-onlyIdempotent
Login panel only: current login status and QR code.
Inputs: no named parameters. Returns: object
bankid_login_startBankid Login StartA
Login panel only: start a BankID login, 'qr' to scan from another device or 'app' for this device.
Inputs: mode. Returns: object
connect_wintConnect WintARead-only
Show the BankID login panel (live QR code, or a button that opens BankID on this device). The login happens in the panel; this call does not start BankID by itself.
Inputs: no named parameters. Returns: object
create_receiptCreate ReceiptA
Send in a new receipt, as "Lägg till dokument" → Kvitto does, e.g. for something paid with your own money (paid back to you by Wint). Wint card purchases already have a draft: use update_receipt for those. Without confirm it only returns a preview.
Inputs: amount (required), category (required), purchase_date (required), comment, +11 more. Returns: object
disconnect_wintDisconnect WintA
Delete the stored Wint session. The next Wint call needs a new BankID login.
Inputs: no named parameters. Returns: object
get_accountsGet AccountsBRead-onlyIdempotent
Chart of accounts (kontoplan): active account numbers and names.
Inputs: query, company. Returns: object
get_bank_balancesGet Bank BalancesCRead-onlyIdempotent
Bank account balances as imported by Wint, and the date bookkeeping is done until.
Inputs: company. Returns: object
get_financial_reportGet Financial ReportARead-onlyIdempotent
Result report (resultatrapport, profit and loss) or balance report (balansrapport) over whole months, with account rows. Swedish bookkeeping signs: income and liabilities are negative (credit), costs and assets positive (debit).
Inputs: report (required), end_month (required), start_month (required), company. Returns: object
get_receiptGet ReceiptCRead-onlyIdempotent
One receipt with all its details and attachment names.
Inputs: receipt_id (required), company. Returns: object
get_receipt_optionsGet Receipt OptionsARead-onlyIdempotent
Receipt categories of the company (for update_receipt / create_receipt), your payment methods, and whether you may approve supplier invoices.
Inputs: company. Returns: object
get_receiptsGet ReceiptsCRead-onlyIdempotent
Receipts (kvitton) in Wint, newest first.
Inputs: limit, company, date_to, date_from. Returns: object
get_supplier_invoiceGet Supplier InvoiceCRead-onlyIdempotent
One supplier invoice with all its details.
Inputs: invoice_id (required), company. Returns: object
get_supplier_invoicesGet Supplier InvoicesCRead-onlyIdempotent
Supplier invoices (leverantörsfakturor), newest first.
Inputs: limit, company. Returns: object
get_transactionsGet TransactionsARead-onlyIdempotent
Ledger transactions (verifikationsrader), newest first. Amounts: debit positive, credit negative.
Inputs: text, limit, company, date_to, +3 more. Returns: object
get_voucherGet VoucherARead-onlyIdempotent
One voucher (verifikation) with its transactions. voucher_id comes from get_transactions.
Inputs: voucher_id (required), company. Returns: object
list_companiesList CompaniesARead-onlyIdempotent
Companies this Wint user can access, with company_id and org number.
Inputs: no named parameters. Returns: object
list_missing_documentsList Missing DocumentsARead-onlyIdempotent
Payments that Wint has marked as missing a receipt or invoice. Each has a missing_document_id for attach_missing_document.
Inputs: company. Returns: object
list_todosList TodosARead-onlyIdempotent
Open (not snoozed) to-dos in Wint: payments missing a document, supplier invoices to approve, receipts to handle, messages from the accountant and more.
Inputs: limit, types, company. Returns: object
list_uploadsList UploadsARead-onlyIdempotent
Files uploaded through the upload panel in the last hour, with their upload_id.
Inputs: no named parameters. Returns: object
search_wintSearch WintARead-onlyIdempotent
Search suppliers, customers, employees, articles, invoices and receipts by name or number.
Inputs: query (required), company. Returns: object
update_receiptUpdate ReceiptA
Edit a receipt and optionally submit it, e.g. to finish a Wint card receipt draft: set category and purpose, add the receipt file, then submit. Without confirm it only returns a preview.
Inputs: receipt_id (required), amount, submit, comment, +13 more. Returns: object
upload_documentUpload DocumentARead-only
Show a panel where the user picks a receipt or invoice file (PDF or image, max 10 MB). Each file gets an upload_id for attach_missing_document. Nothing is sent to Wint until then.
Inputs: no named parameters. Returns: object
upload_other_documentUpload Other DocumentB
Send any other bookkeeping document (contract, statement, letter) to Wint, as "Lägg till dokument" → Övrigt does. Without confirm it only returns a preview.
Inputs: subject (required), company, confirm, file_url, +4 more. Returns: object
upload_stageUpload StageC
Upload panel only: keep one file on the server for up to an hour.
Inputs: file_name (required), data_base64 (required), content_type. Returns: object
upload_supplier_invoiceUpload Supplier InvoiceB
Send a supplier invoice (leverantörsfaktura) file to Wint, as "Lägg till dokument" → Leverantörsfaktura does. Wint reads the invoice and it then shows up for approval. Without confirm it only returns a preview.
Inputs: company, confirm, file_url, file_name, +2 more. Returns: object
wint_statusWint StatusARead-onlyIdempotent
Whether a Wint session is stored and the latest login attempt's status. Makes no Wint call.
Inputs: no named parameters. Returns: object
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 28 tools
Most tools target clearly distinct resources and actions, especially receipts, supplier invoices, ledger data, reports, and uploads. Minor ambiguity remains among the BankID/login-panel tools and the upload-panel tools, though the descriptions usually clarify when to use each.
Tool names are consistently snake_case and mostly follow an action_resource pattern such as list_todos, get_receipt, and approve_supplier_invoice. A few names, like wint_status and bankid_login_start, deviate from the verb_noun pattern but remain readable.
The server exposes 28 tools, which is on the heavy side, but the underlying Wint accounting domain is broad and includes auth, uploads, receipts, invoices, ledger, reports, and search. Several low-level panel/auth tools could potentially be consolidated, making the count borderline rather than clearly well-scoped.
Core workflows are covered: session handling, missing-document attachment, receipt creation/update, supplier invoice upload/approval, and financial reporting. However, notable lifecycle gaps remain, such as todo completion/snoozing, supplier invoice rejection/editing, and richer entity lookup beyond broad search.
Maintenance
Related MCP Connectors
Connect ChatGPT and Claude to Fortnox: read your books and propose changes you approve before anything is written.
Connect ChatGPT and Claude to Fortnox: invoices, customers, reports. Every write needs your OK.
Query your books, company data, business health, and ship invoices from your AI assistant.
Read Bokio accounts, invoices and customers; create drafts and journal entries.
Related MCP Servers
- AlicenseBqualityDmaintenanceEnables AI agents to manage invoices, customers, suppliers, accounting entries, orders, and more through Fortnox's cloud accounting platform via natural language.2068 npm1MIT
- AlicenseAqualityDmaintenanceConnects AI assistants to the Danish accounting platform Billy (billy.dk) for managing invoices, journal entries, balances, and receipts, with built-in human approval for all write operations.4051 npm1MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI assistants to read and write accounting data in PowerOffice Go, including bookkeeping, sales, purchases, payroll, time tracking, and read-only bank access, with support for multiple companies and strict isolation.MIT
- AlicenseNot gradedqualityBmaintenanceEnables users to work with Fortnox from an AI assistant to understand financial results, costs and liquidity, manage receipts and bookkeeping proposals, prepare invoices, track payments, and handle multiple companies with self-hosting. Manual verifications require approval before bookkeeping, with Fortnox as the persistent source of financial data.AGPL 3.0