bexio-mcp
OfficialThis server provides comprehensive access to the bexio Swiss business software API, enabling full management of contacts, sales documents, purchasing, accounting, banking, projects, time tracking, payroll, and more.
Contact Management: Create, update, delete, search, and bulk-manage contacts (companies and persons), contact relations, groups, sectors, and additional addresses.
Sales Documents: Full lifecycle management for quotes, orders, deliveries, and invoices — create, issue, accept/cancel, send via email, copy, convert (e.g., quote to order/invoice), and generate PDFs. Manage line items (custom, article, text, subtotal, discount, pagebreak, subposition), comments, and document settings.
Invoice Payments & Reminders: Record payments on invoices, and create/send payment reminders with PDF generation.
Purchasing: Manage supplier bills, expenses, and purchase orders including status changes, duplication, and outgoing payments (IBAN, QR, manual, cash discount).
Accounting: Access and manage chart of accounts, account groups, business/calendar years, VAT periods, taxes, accounting journal, currencies, exchange rates, and manual accounting entries (with file attachments).
Banking: Read configured bank accounts and manage outgoing bank payments.
Items & Stock: Create, update, delete, and search products/services; read stock locations and areas.
Projects & Time Tracking: Create, update, archive, and search projects; manage planning milestones and work packages; track time entries by project, user, or service.
Files: Upload, download, preview, search, update, and delete files; check where files are attached within bexio.
Payroll: Manage employees and absences; download paystub PDFs.
Master Data: Manage lookup tables — salutations, titles, countries, languages, units, payment types, business activities, and communication types.
Notes & Tasks: Create, read, update, delete, and search notes and tasks/todos linked to contacts or projects.
Users & Permissions: List regular users, manage fictional users, and check permissions.
Company Profile: Read company profile information.
Configuration: Supports OAuth2 and personal access tokens, read-only mode, tool group filtering, language settings, rate limit retries, and streamable HTTP transport for server-side deployment.
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., "@bexio-mcp list my recent contacts"
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.
bexio-mcp
MCP server and typed TypeScript client for the bexio API — the Swiss business software for contacts, quotes, orders, invoicing, purchasing, accounting, banking, projects, time tracking and payroll.
Complete: covers all 310 documented operations of the bexio API through 35 well-described MCP tools (enforced by a coverage test against the official OpenAPI spec).
Reusable: the typed API client is a standalone entry point (
bexio-mcp/client) with zero MCP dependencies — use it in any Node.js project.Safe: read-only and conservative draft-only write modes, destructive-action annotations, tool-group filtering, and API errors mapped to actionable messages (expired token, missing scope, rate limit) instead of crashes.
Robust: automatic retry on rate limits (honouring
RateLimit-Reset), retries for transient GET failures, request timeouts, typed error hierarchy.
Get started in two minutes
You need:
Node.js 18 or newer — check with
node --versionClaude Code — or choose another MCP client
A bexio Personal Access Token (PAT) from developer.bexio.com/pat
Add the server to Claude Code, replacing YOUR_BEXIO_TOKEN with your PAT:
claude mcp add --env BEXIO_API_TOKEN=YOUR_BEXIO_TOKEN \
--transport stdio bexio -- npx -y github:nolen-ai/bexio-mcpVerify the connection:
claude mcp listThe result should include:
bexio: npx -y github:nolen-ai/bexio-mcp - ✔ ConnectedThe first start downloads and builds the server and can take a few seconds. After that, open Claude Code and try:
List my 10 most recent open invoices in bexio.
No clone or global install is required. Claude Code stores the token in its local MCP configuration and passes it only to the local server process. Do not commit the token to a repository or paste it into prompts.
Start in read-only mode
For a safer first look, use this command instead of the one above. It disables all create, update, send, and delete actions:
claude mcp add \
--env BEXIO_API_TOKEN=YOUR_BEXIO_TOKEN BEXIO_READ_ONLY=true \
--transport stdio bexio -- npx -y github:nolen-ai/bexio-mcpClaude Desktop and other clients
For Claude Desktop, Cursor, VS Code, Windsurf, Gemini CLI, Codex CLI, Pi, n8n, and agent SDKs, use the matching copy-paste integration guide. Every guide uses an installation method that works today.
Related MCP server: mcp-server-smallinvoice
Authentication
Personal Access Token
A Personal Access Token is the fastest option
for personal use. It has the same access as your bexio user and expires after
six months. Configure it as BEXIO_API_TOKEN.
OAuth app workflow
Use OAuth when you need scoped permissions, automatic token refresh, or a long-running deployment:
Create an app at developer.bexio.com and add
http://127.0.0.1:33771/callbackto its Allowed redirect URLs.Reveal the Client ID and Client Secret under App Details.
Authorize once:
BEXIO_CLIENT_ID=YOUR_CLIENT_ID \ BEXIO_CLIENT_SECRET=YOUR_CLIENT_SECRET \ npx -y github:nolen-ai/bexio-mcp loginA browser opens for consent. Tokens are stored in
~/.bexio-mcp/tokens.json; treat this file like a password.Add the server to your MCP client with
BEXIO_CLIENT_IDandBEXIO_CLIENT_SECRETinstead ofBEXIO_API_TOKEN. The server loads the stored token and refreshes it automatically.
Requested scopes are derived from the enabled tool groups and write mode.
Read-only omits separate write scopes; drafts requests only the edit scopes
needed for its allowlist. Override them with BEXIO_SCOPES or --scopes.
Use the full GitHub command with whoami to verify the authenticated bexio
user, or logout to revoke and remove the stored tokens:
BEXIO_CLIENT_ID=YOUR_CLIENT_ID BEXIO_CLIENT_SECRET=YOUR_CLIENT_SECRET \
npx -y github:nolen-ai/bexio-mcp whoamiTroubleshooting
Claude reports Failed to reconnect … -32000
Make sure the configured command includes the GitHub package specifier. The
short form npx -y bexio-mcp does not work until this project is published on
the npm registry.
Reset an incorrect Claude Code entry with:
claude mcp remove bexio
claude mcp add --env BEXIO_API_TOKEN=YOUR_BEXIO_TOKEN \
--transport stdio bexio -- npx -y github:nolen-ai/bexio-mcp
claude mcp listCheck the server outside your MCP client
This command should print 35 tools and exit:
BEXIO_API_TOKEN=YOUR_BEXIO_TOKEN \
npx -y github:nolen-ai/bexio-mcp --list-toolsThen verify that bexio accepts the token:
BEXIO_API_TOKEN=YOUR_BEXIO_TOKEN \
npx -y github:nolen-ai/bexio-mcp whoamiIf tool listing fails, check node --version is 18 or newer and read the error
printed by npx. If whoami returns 401, create a new PAT and update the token
in your MCP client.
Configuration
Environment variable | CLI flag | Description |
|
| Static token (PAT or OAuth access token). Wins over the app workflow. |
|
| OAuth app client id (app workflow). |
|
| OAuth app client secret (app workflow). |
|
| Scopes for |
|
| Loopback redirect URI (default |
|
| OAuth token file (default |
|
|
|
|
| Comma-separated groups to enable (default: all). See groups below. |
|
| Write policy: |
|
| Compatibility alias that forces |
|
|
|
|
| API host override (default |
|
| Per-request timeout in milliseconds (default 30000). |
Add these variables to your MCP client's env block or --env options. Run
npx -y github:nolen-ai/bexio-mcp --help for every CLI option.
Write modes
Use BEXIO_WRITE_MODE to choose the server-side write policy:
read-onlydisables every write.draftspermits contact create/update, contact-relation create/delete, draft-quote create/update, and custom-position changes on unissued draft quotes. Inline quote positions must also be custom positions. It blocks contact/quote deletion, issue/send/accept/decline, all order/invoice writes, and every other business mutation.fullexposes every operation allowed by the token (the default for backward compatibility).
BEXIO_API_TOKEN=YOUR_BEXIO_TOKEN BEXIO_WRITE_MODE=drafts \
npx -y github:nolen-ai/bexio-mcp --list-toolsPolicy-disabled actions are removed from the advertised action enums and are
also rejected server-side without touching the API. In read-only and
drafts, save_path is blocked because it writes to the server filesystem;
omit it to return a PDF inline.
BEXIO_READ_ONLY=true and --read-only remain supported as aliases for
read-only.
Tool groups
contacts, sales, purchase, accounting, banking, items, projects, files, payroll, misc
BEXIO_API_TOKEN=YOUR_BEXIO_TOKEN BEXIO_TOOL_GROUPS=contacts,sales,items \
npx -y github:nolen-ai/bexio-mcp --list-toolsTools
Tools are grouped per resource with an action argument; each tool's description documents every action and its required arguments.
Group | Tools |
contacts |
|
sales |
|
purchase |
|
accounting |
|
banking |
|
items |
|
projects |
|
files |
|
payroll |
|
misc |
|
Highlights:
Full document lifecycle: create → issue → send/mark-as-sent → payments/reminders → PDF, for quotes, orders, deliveries and invoices — including converting quotes to orders/invoices and orders to deliveries/invoices.
All seven position types (item, custom, text, subtotal, discount, pagebreak, sub-position) on quotes, orders and invoices via one generic
bexio_document_positionstool.PDF and file downloads accept a
save_pathargument so large documents go to disk instead of the context window.Legacy search endpoints take
search_criteria:[{ "field": "name_1", "value": "Muster", "criteria": "like" }], combined with AND.
Server-side & Docker
Use the published Docker image when your MCP client cannot start a local stdio server, or when several clients need the same deployment.
Start the server:
docker run -d --name bexio-mcp -p 8722:8722 \
ghcr.io/nolen-ai/bexio-mcp:latestCheck it:
curl http://127.0.0.1:8722/healthzThe MCP endpoint is http://127.0.0.1:8722/mcp. In this default multi-user
mode, each client sends its own bexio token as
Authorization: Bearer YOUR_BEXIO_TOKEN. Follow the relevant
integration guide for the exact client config.
HTTP authentication modes
Multi-user (pass-through): don't configure any server credentials. Every client sends its own
Authorization: Bearer <bexio PAT or OAuth access token>header; each MCP session acts as that user against bexio, and nothing is stored server-side. Sessions without a token are rejected with 401.Shared identity (single-tenant): configure
BEXIO_API_TOKENor the app credentials — then sessions without their own bearer use the server's identity. This grants unauthenticated, full access to that bexio account to anyone who can reach the port. On non-loopback binds (including Docker) it therefore stays off until you explicitly setBEXIO_HTTP_SHARED_IDENTITY=true; publish the port to loopback or a private network only (-p 127.0.0.1:8722:8722).
For a local, single-account deployment with a PAT:
docker run -d --name bexio-mcp \
-p 127.0.0.1:8722:8722 \
-e BEXIO_API_TOKEN=YOUR_BEXIO_TOKEN \
-e BEXIO_HTTP_SHARED_IDENTITY=true \
ghcr.io/nolen-ai/bexio-mcp:latestDo not expose shared-identity mode to an untrusted network: anyone who can reach it can use the configured bexio account.
Long-running OAuth deployment
Obtain a refresh token once with the OAuth app workflow, then seed the container. The server refreshes and persists rotated tokens in the named volume:
docker run -d --name bexio-mcp \
-p 127.0.0.1:8722:8722 \
-v bexio-tokens:/data \
-e BEXIO_CLIENT_ID=YOUR_CLIENT_ID \
-e BEXIO_CLIENT_SECRET=YOUR_CLIENT_SECRET \
-e BEXIO_REFRESH_TOKEN=YOUR_REFRESH_TOKEN \
-e BEXIO_HTTP_SHARED_IDENTITY=true \
ghcr.io/nolen-ai/bexio-mcp:latestFor remote deployments, terminate TLS in a reverse proxy: bearer tokens must
not cross networks over plain HTTP. Behind a proxy, list its public hostname in
BEXIO_HTTP_ALLOWED_HOSTS. Environment variables are visible through
docker inspect; use your platform's secret mechanism in production.
Environment variable | CLI flag | Description |
|
| Bind address (default |
|
| Port (default |
|
| Endpoint path (default |
|
| Opt-in: anonymous sessions may use the server identity on non-loopback binds (unauthenticated account access — see above). |
|
| Max concurrent MCP sessions (default 64). |
|
| Accepted |
|
| Headless bootstrap: seed the token store from a refresh token. |
Using the client without MCP
Install directly from GitHub:
npm install github:nolen-ai/bexio-mcpThe typed client is dependency-free (uses global fetch) and importable on its
own:
import { BexioClient } from 'bexio-mcp/client';
const bexio = new BexioClient({
token: process.env.BEXIO_API_TOKEN!, // string or async () => string
language: 'de',
});The OAuth building blocks are exported too — BexioOAuth (authorization URL with PKCE, code exchange, refresh with rotation) and OAuthTokenProvider (auto-refreshing token source) from bexio-mcp/client, plus FileTokenStore and runLoginFlow from bexio-mcp:
import { BexioClient, BexioOAuth, OAuthTokenProvider } from 'bexio-mcp/client';
import { FileTokenStore } from 'bexio-mcp';
const oauth = new BexioOAuth({ clientId, clientSecret });
const provider = new OAuthTokenProvider(oauth, new FileTokenStore());
const bexio = new BexioClient({ token: provider.accessTokenProvider() });
// Typed resource APIs mirroring the bexio docs
const contacts = await bexio.contacts.search([{ field: 'name_1', value: 'Muster' }]);
const invoice = await bexio.invoices.createInvoice({ contact_id: contacts[0]!.id, positions: [/* … */] });
await bexio.invoices.issueInvoice(invoice.id);
// Escape hatch for anything else
const me = await bexio.http.get('/3.0/users/me');Errors are typed: BexioApiError (with status, errorCode, body, plus isAuthError/isPermissionError/isNotFound/isRateLimit), BexioRateLimitError, BexioNetworkError, BexioConfigError.
Embedding the server in your own process:
import { BexioClient, createBexioMcpServer } from 'bexio-mcp';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
const server = createBexioMcpServer({
client: new BexioClient({ token: myToken }),
groups: ['contacts', 'sales'],
writeMode: 'drafts',
});
await server.connect(new StdioServerTransport());Development
npm install
npm run typecheck # tsc --noEmit
npm test # vitest (includes the API coverage gate)
npm run build # tsup → dist/ (ESM + CJS + d.ts)With just: just check runs the full gate, just docker-build builds the image.
Releasing
Releases are tag-driven: pushing vX.Y.Z triggers the release workflow, which verifies the tag against package.json, runs the full gate, pushes the multi-arch Docker image to ghcr.io/nolen-ai/bexio-mcp (latest, X.Y, X.Y.Z), creates the GitHub release with generated notes, and publishes to npm when the NPM_TOKEN secret is configured.
just bump minor # bump package.json + src/version.ts, commit "Release vX.Y.Z"
git push # let CI pass on main
just tag # tag vX.Y.Z (verifies clean tree, main, pushed, version sync) and push itSee docs/ARCHITECTURE.md for the layering and module conventions. The API surface is pinned in tests/fixtures/operations.json (extracted from the official docs); tests/coverage.test.ts fails when bexio documents operations this package does not cover.
Notes & limitations
The bexio API rate limit is per company; heavy parallel use of tools can hit 429s — the client waits and retries automatically.
bexio deletes are permanent (no trash). Destructive tool actions are annotated and blocked in read-only mode, but be deliberate.
Credit notes and a handful of business processes are not exposed by the bexio API itself (see their FAQ).
This is an unofficial project; not affiliated with bexio AG.
License
MIT
Available Tools
35 toolsbexio_accountingbexio AccountingADestructive
Access the bexio accounting foundation: chart of accounts, account groups, calendar/business years, VAT periods, taxes and the accounting journal. Select a "resource" and an "action". Valid combinations: accounts: "list", "search" (search_criteria required; searchable fields: account_no, name, account_type, fibu_account_group_id); account_groups: "list"; calendar_years: "list", "search" (searchable fields: start, end, is_vat_subject, vat_accounting_method, vat_accounting_type), "get" (id), "create" (payload; useful fields: year, is_vat_subject, is_annual_reporting, vat_accounting_method, vat_accounting_type, default_tax_income_id, default_tax_expense_id — creating a future year generates all years in between and returns them as an array); business_years: "list", "get" (id); vat_periods: "list", "get" (id); taxes: "list" (optional filters scope=active|inactive, date=validity date, types=sales_tax|pre_tax), "get" (id), "delete" (id — permanently deletes the tax, cannot be undone); journal: "list" (optional from/to date range and account_uuid filters; requires the "accounting" API scope). All "list" and "search" actions accept limit/offset pagination.
Inputs: action (required), resource (required), id, to, +9 more.
bexio_additional_addressesbexio Additional AddressesADestructive
Manage additional addresses of a contact (e.g. delivery addresses). Every action requires contact_id (the parent contact). Actions: "list" (contact_id; optional limit/offset/order_by [id|name|postcode|country_id, append "_desc"]), "search" (contact_id + search_criteria; useful searchable fields: name, postcode, city, country_id), "get" (contact_id + id), "create" (contact_id + payload; provide at least name), "update" (contact_id + id + payload of fields to change), "delete" (contact_id + id — destructive, cannot be undone).
Inputs: action (required), contact_id (required), id, limit, +4 more.
bexio_bank_accountsbexio Bank AccountsARead-onlyIdempotent
Read bank accounts configured in bexio (name, owner, IBAN, QR-IBAN, currency, linked accounting account). Actions: "list" (all bank accounts, optional limit/offset), "get" (single account by numeric id). Read-only.
Inputs: action (required), id, limit, offset.
bexio_banking_paymentsbexio Bank PaymentsADestructive
Manage outgoing bank payments (bexio banking 4.0 API). Actions: "list" (optional filter_by expression, page/per_page), "get" (payment by id/uuid), "create" (payload required: account_id, amount, currency, execution_date, is_salary, recipient, type), "update" (id + payload of fields to change; only open payments; account_id, type and purchase_reference cannot be changed), "cancel" (cancel a transmitted/downloaded payment by id — cannot be undone), "delete" (permanently delete a payment by id — cannot be undone). Payment ids are strings (uuid or numeric id).
Inputs: action (required), id, page, payload, +2 more.
bexio_billsbexio BillsADestructive
Manage purchase bills / supplier invoices (accounts payable, bexio purchase 4.0 API). Bill ids are UUID strings. Actions: "list" (paginated via limit/page/order/sort; optional full-text search_term of 3-255 chars with search_fields, and filters: status DRAFTS|TODO|PAID|OVERDUE, bill_date_start/end, due_date_start/end, vendor_ref, title, currency_code, pending_amount_min/max, vendor, gross_min/max, net_min/max, document_no, supplier_id, average_exchange_rate_enabled), "get" (bill by id), "create" (payload required: supplier_id, contact_partner_id, bill_date, due_date, manual_amount, currency_code, item_net, attachment_ids, address, line_items, discounts; provide amount_man when manual_amount=true, amount_calc otherwise), "update" (id + full payload; additionally requires split_into_line_items; line item/discount ids must already exist on the bill or be omitted for new ones), "delete" (id; permanently deletes the bill — cannot be undone), "execute_action" (id + bill_action "DUPLICATE": copies the bill into a new draft), "update_status" (id + status: "BOOKED" books the bill, "DRAFT" reverts it to draft), "validate_document_number" (document_no; reports whether it is available and the next free number).
Inputs: action (required), id, page, sort, +9 more.
bexio_company_profilebexio Company ProfileARead-onlyIdempotent
Read the company profile of the bexio company (name, legal form, address, contact details, VAT/trade-register numbers, public-profile flags, base64 logo). Actions: "list" (all company profiles), "get" (single profile by numeric id). Read-only.
Inputs: action (required), id.
bexio_contact_groupsbexio Contact GroupsADestructive
Manage contact groups (categories assigned to contacts via their contact_group_ids field). Actions: "list" (optional limit/offset/order_by [id|name, append "_desc"]), "search" (search_criteria required; searchable fields: name), "get" (group by id), "create" (payload required: name), "update" (id + payload), "delete" (delete the group by id — destructive, cannot be undone).
Inputs: action (required), id, limit, offset, +3 more.
bexio_contact_relationsbexio Contact RelationsADestructive
Manage relations between two contacts (e.g. link a person to their company: contact_id = company, contact_sub_id = person). Actions: "list" (optional limit/offset/order_by [id|contact_id|contact_sub_id|updated_at, append "_desc"]), "search" (search_criteria required; useful searchable fields: contact_id, contact_sub_id, updated_at), "get" (relation by id), "create" (payload required: contact_id, contact_sub_id; optional description), "update" (id + payload of fields to change), "delete" (delete the relation by id — destructive, cannot be undone).
Inputs: action (required), id, limit, offset, +3 more.
bexio_contactsbexio ContactsADestructive
Manage bexio contacts (companies and persons; the central address book referenced by quotes, orders, invoices, projects). Actions: "list" (all contacts; optional limit/offset/order_by [id|nr|name_1|updated_at, append "_desc"], show_archived), "search" (search_criteria required; useful searchable fields: id, nr, name_1, name_2, mail, postcode, city, country_id, contact_type_id, contact_group_ids, user_id, updated_at; optional list params and show_archived), "get" (contact by id; optional show_archived; includes base64 profile_image), "create" (payload required: contact_type_id [1=company, 2=person], name_1, user_id, owner_id), "update" (id + payload of fields to change), "delete" (permanently deletes the contact — cannot be undone; a deleted contact can only be restored shortly afterwards via the restore action), "bulk_create" (contacts array of contact payloads, same required fields as create), "restore" (restore a deleted contact by id).
Inputs: action (required), id, limit, offset, +5 more.
bexio_contact_sectorsbexio Contact SectorsARead-onlyIdempotent
Read contact sectors ("Branchen"; referenced by contacts via their contact_branch_ids field). Read-only. Actions: "list" (optional limit/offset/order_by [id|name, append "_desc"]), "search" (search_criteria required; searchable fields: name).
Inputs: action (required), limit, offset, order_by, +1 more.
bexio_currenciesbexio CurrenciesADestructive
Manage currencies and read their exchange rates (bexio 3.0 API). Actions: "list" (all currencies; optional limit/offset, embed — e.g. "exchange_rate" to include rate fields — and date for the rate validity date), "get" (currency by numeric id), "create" (payload required: name in ISO 4217 format like "CHF", round_factor), "update" (id + payload; PATCH — only round_factor can be changed), "delete" (permanently delete a currency by id — cannot be undone), "list_codes" (all available currency codes such as CHF, EUR), "list_exchange_rates" (configured exchange rates of a currency by id; optional date for the validity date).
Inputs: action (required), id, date, embed, +3 more.
bexio_deliveriesbexio DeliveriesA
Read and issue delivery notes (kb_delivery). Deliveries are created from orders (use bexio_orders action "create_delivery"). Actions: "list" (all deliveries, optional limit/offset/order_by: id, total, total_net, total_gross, updated_at), "get" (delivery by id, includes positions), "issue" (issue a draft delivery by id — moves it from Draft (status 10) to Done (18); this finalizes the delivery note and adjusts stock when stock management is active).
Inputs: action (required), id, limit, offset, +1 more.
bexio_document_commentsbexio Document CommentsA
Comments on sales documents (quotes/kb_offer, orders/kb_order, invoices/kb_invoice). Actions: "list" (all comments of a document; optional limit/offset), "get" (single comment, requires comment_id), "create" (payload required: text, user_id, user_name; optional user_email, is_public — is_public makes the comment visible to the document recipient). All actions require document_type and document_id. Comments cannot be edited or deleted via the API.
Inputs: action (required), document_id (required), document_type (required), limit, +3 more.
bexio_document_positionsbexio Document PositionsADestructive
Manage line-item positions on sales documents (quotes/kb_offer, orders/kb_order, invoices/kb_invoice). position_type selects the kind of position: "custom" (free position: amount, unit_id, account_id, tax_id, text, unit_price, discount_in_percent), "article" (item position: same fields plus article_id referencing an item), "text" (text block: text, show_pos_nr), "subtotal" (text), "discount" (text, is_percentual, value), "pagebreak" (pagebreak flag) and "subposition" (grouping position: text, show_pos_nr). Actions: "list" (all positions of that kind on the document; optional limit/offset), "get" (single position, requires position_id), "create" (payload with the fields of the chosen position_type), "update" (requires position_id + payload; partial updates allowed), "delete" (requires position_id — permanently removes the position, cannot be undone). All actions require document_type, document_id and position_type. is_optional is writable only on custom/article positions and only honored on quotes and orders. Amounts/prices are strings with max. 6 decimals.
Inputs: action (required), document_id (required), document_type (required), position_type (required), +4 more.
bexio_document_settingsbexio Document SettingsARead-onlyIdempotent
Read sales-document configuration. Actions: "list_settings" (per-document-class settings: numbering format, next number, default title, default currency/language/payment type, decimal precision; optional order_by "id" or "text", append "_desc" for descending), "list_templates" (document print templates with slug, name and the document types they are the default for). Read-only.
Inputs: action (required), order_by.
bexio_expensesbexio ExpensesADestructive
Manage expenses (bexio 4.0 API). Expense ids are UUID strings. Actions: "list" (paginated via limit/page/order/sort; filters: vendor, gross_min/max, net_min/max, paid_on_start/end, created_at_start/end, title, currency_code, document_no, supplier_id, project_id), "get" (expense by id), "create" (payload required: paid_on, currency_code, amount, attachment_ids; optional supplier, bank/booking account, tax and address fields), "update" (id + full payload; same required fields as create), "delete" (id; permanently deletes the expense — cannot be undone), "execute_action" (id + expense_action "DUPLICATE": copies the expense into a new draft), "update_status" (id + status: "DONE" completes the expense, "DRAFT" reverts it to draft), "validate_document_number" (document_no; reports whether it is available and the next free number).
Inputs: action (required), id, page, sort, +7 more.
bexio_filesbexio FilesADestructive
Manage files stored in bexio (uploads, attachments; 3.0 API). Actions: "list" (all files; optional archived_state, offset, order_by — order_by fields: id, created_at, source_id, uuid, name, size_in_bytes, comma-combinable with "_asc"/"_desc" suffix), "search" (search_criteria required; searchable fields: id, uuid, created_at, name, extension, size_in_bytes, mime_type, user_id, is_archived, source_id; optional archived_state, limit, offset), "get" (file metadata by id), "download" (file content by id; returns base64 or writes to optional save_path), "preview" (preview image of the file by id; returns base64 or writes to optional save_path), "usage" (where the file is attached: reference class, title, document number; by id), "upload" (create a new file from file_path on disk OR content_base64 + file_name; file_name overrides the file_path basename), "update" (id + payload: name, is_archived, source_type), "delete" (marks the file as deleted by id — cannot be undone).
Inputs: action (required), id, limit, offset, +8 more.
bexio_invoice_paymentsbexio Invoice PaymentsADestructive
Manage payments recorded on a bexio invoice. All actions require invoice_id. Actions: "list" (payments of the invoice; optional limit/offset), "get" (payment_id), "create" (payload; required: value — the amount; set either bank_account_id or payment_service_id (1 = PayPal, 2 = Stripe, 3 = SIX Payments); optional date, is_cash_discount, is_client_account_redemption), "delete" (payment_id; permanently deletes the payment — cannot be undone).
Inputs: action (required), invoice_id (required), limit, offset, +2 more.
bexio_invoice_remindersbexio Invoice RemindersADestructive
Manage payment reminders of a bexio invoice. All actions require invoice_id. Actions: "list" (all reminders of the invoice), "search" (search_criteria required; searchable fields: title, reminder_level, is_sent, is_valid_from, is_valid_to), "get" (reminder_id), "create" (no payload; bexio creates the next reminder level for the overdue invoice), "delete" (reminder_id; permanently deletes the reminder — cannot be undone), "send" (reminder_id + email with recipient_email/subject/message; message must contain "[Network Link]"), "mark_as_sent" (reminder_id), "mark_as_unsent" (reminder_id), "pdf" (reminder_id; optional logopaper for letterhead and save_path to write the PDF to disk instead of returning base64).
Inputs: action (required), invoice_id (required), email, logopaper, +3 more.
bexio_invoicesbexio InvoicesADestructive
Manage bexio invoices (kb_invoice). Status ids: 7 Draft, 8 Pending, 9 Paid, 16 Partial, 19 Canceled, 31 Unpaid. Actions: "list" (all invoices; optional limit/offset/order_by — orderable by id, total, total_net, total_gross, updated_at), "search" (search_criteria required; searchable fields: id, document_nr, title, contact_id, contact_sub_id, user_id, kb_item_status_id, currency_id, total, total_gross, total_net, is_valid_from, is_valid_to, api_reference, updated_at; optional limit/offset/order_by), "get" (id; returns the invoice including positions), "create" (payload; polymorphic positions array supported — custom, article, text, subtotal, pagebreak, discount), "update" (id + payload of fields to change; positions cannot be updated here), "delete" (id; permanently deletes the invoice — cannot be undone), "issue" (id; draft -> pending), "revert_issue" (id; sets an issued invoice back to draft), "cancel" (id; cancels the invoice — there is no API to un-cancel), "mark_as_sent" (id), "send" (id + email with recipient_email/subject/message, optional mark_as_open/attach_pdf; message must contain "[Network Link]"), "copy" (id + copy with contact_id required; creates a new invoice as a copy), "pdf" (id; optional logopaper for letterhead and save_path to write the PDF to disk instead of returning base64).
Inputs: action (required), id, copy, email, +7 more.
bexio_itemsbexio ItemsADestructive
Manage items/products (called "articles" in the bexio API): physical products and services with internal code/name, purchase & sale prices, taxes, units and stock information. Actions: "list" (all items, optional limit/offset/order_by; order by "id" or "intern_name"), "search" (search_criteria required; searchable fields include intern_name, intern_code, id — conditions are AND-combined, default operator "like"), "get" (single item by numeric id), "create" (payload required; intern_name is mandatory, set article_type_id 1 for products / 2 for services), "update" (id + payload with the fields to change), "delete" (permanently delete an item by id — cannot be undone).
Inputs: action (required), id, limit, offset, +3 more.
bexio_manual_entriesbexio Manual EntriesADestructive
Manage manual accounting entries (bookings) and their attached files (bexio accounting 3.0 API). Actions: "list" (all manual entries; optional limit/offset), "create" (payload required: type — manual_single_entry/manual_compound_entry/manual_group_entry —, date, entries array with debit_account_id, credit_account_id, tax_id, tax_account_id, description, amount, currency_id, currency_factor), "update" (id + payload; PUT replaces the entry, so send type, date and the full entries array; locked entries — is_locked=true — cannot be edited), "delete" (permanently delete a manual entry by id — cannot be undone), "next_reference_number" (reference number suggested for the next manual entry). File actions cover BOTH scopes: with entry_id they target a single entry LINE (types manual_single_entry/manual_group_entry); without entry_id they target the COMPOUND entry itself (type manual_compound_entry). "list_files" (id, optional entry_id, optional limit/offset), "get_file" (id + file_id, optional entry_id; returns the file content — pass save_path to write it to disk instead of returning base64 inline), "add_file" (id, optional entry_id, plus file_path OR content_base64 + file_name; uploads multipart/form-data, max 12MB, formats PNG/JPG/JPEG/GIF/DOC/DOCX/XLS/XLSX/PPT/PPTX/PDF), "delete_file" (id + file_id, optional entry_id; removes the connection between file and entry — cannot be undone).
Inputs: action (required), id, limit, offset, +7 more.
bexio_master_databexio Master DataADestructive
Manage small bexio master-data lookup resources. Choose a "resource" and an "action". Resources and their supported actions: salutations, titles, units — list, search, get, create, update, delete (payload: {name}); countries — list, search, get, create, update, delete (payload: {name, name_short, iso3166_alpha2}); languages, payment_types, communication_types — list, search only (read-only); business_activities — list, search, create (payload: {name, default_is_billable?, default_price_per_hour?, account_id?}). Actions: "list" (optional limit/offset; order_by fields "id"/"name" for titles, countries, languages, payment_types, business_activities and communication_types — countries and payment_types also "name_short"; salutations and units do not support order_by), "search" (search_criteria required; searchable fields: "name" everywhere, countries also "name_short"/"iso3166_alpha2", languages also "iso_639_1"), "get" (id required), "create" (payload required; see per-resource shapes above), "update" (id + payload of fields to change), "delete" (id required — permanently deletes the entry, cannot be undone).
Inputs: action (required), resource (required), id, limit, +4 more.
bexio_notesbexio NotesADestructive
Manage notes in bexio (short annotations linked to a user and optionally a contact, project or module entry). Actions: "list" (all notes, optional limit/offset), "search" (search_criteria required; searchable fields: event_start, contact_id, user_id, subject, module_id, entry_id), "get" (note by id), "create" (payload required: user_id, event_start, subject; optional info, contact_id, project_id, pr_project_id, entry_id, module_id), "update" (id + payload of fields to change), "delete" (permanently delete a note by id — cannot be undone).
Inputs: action (required), id, limit, offset, +2 more.
bexio_ordersbexio OrdersADestructive
Manage sales orders (kb_order) including recurring-order repetitions and documents derived from an order. Actions: "list" (all orders, optional limit/offset/order_by: id, total, total_net, total_gross, updated_at), "search" (search_criteria required; supported fields: id, kb_item_status_id (5 Pending, 6 Done, 15 Partial, 21 Canceled), document_nr, title, contact_id, contact_sub_id, user_id, currency_id, total_gross, total_net, total, is_valid_from, is_valid_to, updated_at), "get" (order by id, includes positions), "create" (payload; no field is formally required but usually at least contact_id and user_id; positions may be included), "update" (id + payload of fields to change; positions cannot be updated here), "delete" (permanently delete the order by id — cannot be undone), "pdf" (render the order as PDF; optional logopaper for letterhead, optional save_path to write to disk), "get_repetition" (show the recurring-order configuration), "edit_repetition" (id + repetition payload: start, optional end, repetition rule of type daily/weekly/monthly/yearly), "delete_repetition" (stop the recurring order — cannot be undone), "create_delivery" (create a delivery note from the order; optional positions array, omit to copy all positions), "create_invoice" (create an invoice from the order; optional positions array, omit to copy all positions).
Inputs: action (required), id, limit, offset, +7 more.
bexio_outgoing_paymentsbexio Outgoing PaymentsADestructive
Manage outgoing payments for purchase bills (bexio purchase 4.0 API). Payment ids are UUID strings. Actions: "list" (bill_id required — lists the payments of one bill; optional limit/page/order asc|desc/sort), "get" (payment by id), "create" (payload required: bill_id, payment_type IBAN|MANUAL|CASH_DISCOUNT|QR, execution_date, amount, currency_code, exchange_rate, is_salary_payment; IBAN/MANUAL/QR also need sender_bank_account_id and IBAN/QR need sender/receiver bank details; the bill must not be a draft and amount must not exceed its pending_amount), "update" (id or payload.payment_id + payload; note the API takes the payment id in the request body, not the URL; editable fields: execution_date, amount, is_salary_payment, fee_type, reference_no, message and receiver address fields), "delete" (id; permanently deletes the payment — cannot be undone).
Inputs: action (required), id, page, sort, +4 more.
bexio_payrollbexio PayrollADestructive
Manage bexio payroll (4.0 API): employees, their absences and paystub PDFs. Employee and absence ids are UUID strings. Select a "resource" and an "action". Resource "employees": "list" (all active employees, no arguments), "get" (employee_id + date — the employee's state on that ISO date, includes vacation days used/left), "create" (payload; required: ahv_number; useful fields: first_name, last_name, email, nationality, marital_status, gender, date_of_birth, address, language, iban, annual_vacation_days), "update" (employee_id + payload; PATCH — send only the fields to change; the API spec also marks ahv_number required here, so include it if a partial update is rejected). Resource "absences": "list" (employee_id + year — absences of the employee in that business year), "get" (employee_id + absence_id), "create" (employee_id + payload; required: reason, start_date; reasons: Injury, Sickness, MaternityLeave, MilitaryLeave, Vacation, InterruptionOfWork), "update" (employee_id + absence_id + payload; PUT — the API requires the full absence object), "delete" (employee_id + absence_id — permanently deletes the absence, cannot be undone). Resource "paystubs": "download_pdf" (employee_id + year + month — downloads the paystub PDF; use save_path to write it to disk), "get" (employee_id + year + month — DEPRECATED endpoint returning the URI of the generated PDF; prefer "download_pdf").
Inputs: action (required), resource (required), date, year, +5 more.
bexio_project_planningbexio Project PlanningADestructive
Manage milestones and work packages of a project (bexio 3.0 API). Set "resource" to "milestones" or "work_packages"; project_id is always required. A milestone has a name, end date, comment and optional parent milestone; a work package has a name, spent/estimated time in hours, comment and optional milestone link. Actions: "list" (all milestones/work packages of the project; optional limit/offset), "get" (id required), "create" (payload required; name is the only required field), "update" (id + payload of fields to change; work package updates are partial PATCHes, milestone updates are POSTs), "delete" (id required — permanently deletes the milestone/work package, cannot be undone).
Inputs: action (required), resource (required), project_id (required), id, +3 more.
bexio_projectsbexio ProjectsADestructive
Manage projects (bexio 2.0 API). A project has a name, status, type, customer contact, responsible user, optional dates, and optional invoice/budget settings. Actions: "list" (all projects; optional limit/offset/order_by, order_by supports "id"/"name" plus "_desc"), "search" (search_criteria required, AND-combined; searchable fields include name, contact_id, pr_state_id, pr_project_type_id, start_date, end_date, user_id; optional limit/offset/order_by), "get" (id required), "create" (payload required with name, pr_state_id, pr_project_type_id, contact_id, user_id), "update" (id + payload of fields to change), "delete" (id required — permanently deletes the project, cannot be undone), "archive" / "unarchive" (id required; archiving hides the project without deleting it), "list_statuses" (all project statuses, for pr_state_id), "list_types" (all project types, for pr_project_type_id; optional order_by).
Inputs: action (required), id, limit, offset, +3 more.
bexio_purchase_ordersbexio Purchase OrdersADestructive
Manage purchase orders (bexio 3.0 API; numeric ids). Status (kb_item_status_id) is read-only: 22 Draft, 23 Open, 24 Partly, 25 Done, 26 Canceled. Actions: "list" (optional limit/offset and order_by: id, total, total_net, total_gross or updated_at; append "_desc" for descending), "get" (purchase order by numeric id), "create" (payload; all fields optional but typically contact_id, user_id and positions grouped as required/optional/discount arrays), "update" (id + payload of fields to change; positions are create-only — the update endpoint does not accept them and they are not sent), "delete" (id; permanently deletes the purchase order — cannot be undone).
Inputs: action (required), id, limit, offset, +2 more.
bexio_quotesbexio QuotesADestructive
Manage quotes/offers (bexio 2.0 kb_offer API). Status flow: 1 Draft -> 2 Pending (issued) -> 3 Confirmed / 4 Declined. Actions: "list" (all quotes; optional limit/offset/order_by — order_by one of id, total, total_net, total_gross, updated_at), "search" (search_criteria required, AND-combined; useful fields: id, kb_item_status_id, document_nr, title, contact_id, user_id, currency_id, total, is_valid_from, is_valid_until, updated_at), "get" (id), "create" (payload; typically contact_id, user_id, positions; document_nr only if automatic numbering is off), "update" (id + payload with fields to change), "delete" (id — permanently deletes the quote, cannot be undone), "issue" (id — moves a draft to pending and makes it visible to workflows), "revert_issue" (id — back to draft), "accept" (id), "decline" (id), "reissue" (id), "mark_as_sent" (id — flags as sent without emailing), "send" (id + email with recipient_email/subject/message, optional mark_as_open/attach_pdf; message must contain "[Network Link]"; emails the quote to the customer), "copy" (id + copy with contact_id required, optional contact_sub_id, is_valid_from, pr_project_id, title — returns the new quote), "pdf" (id; optional logopaper for letterhead and save_path to write the PDF to disk), "create_invoice" (id; optional positions to take over a subset — omit for all; returns the new invoice), "create_order" (id; optional positions — omit for all; returns the new order).
Inputs: action (required), id, copy, email, +8 more.
bexio_stockbexio Stock Locations & AreasARead-onlyIdempotent
Read stock locations and stock areas (both are simple id/name records; items reference them via stock_id and stock_place_id). All actions require the stock_edit scope. Actions: "list_locations" (all stock locations, optional limit/offset/order_by; order by "id" or "name"), "search_locations" (search_criteria required; searchable fields: name, id), "list_areas" (all stock areas, optional limit/offset/order_by; order by "id" or "name"), "search_areas" (search_criteria required; searchable fields: name, id). Read-only.
Inputs: action (required), limit, offset, order_by, +1 more.
bexio_tasksbexio TasksADestructive
Manage tasks/todos in bexio (assigned to a user, with status, priority, due date and optional contact/project links). Actions: "list" (all tasks, optional limit/offset/order_by with order_by "id" or "finish_date"), "search" (search_criteria required; searchable fields: subject, updated_at, user_id, contact_id, todo_status_id, module_id, entry_id), "get" (task by id), "create" (payload required: user_id, subject; use todo_status_id/todo_priority_id from list_statuses/list_priorities), "update" (id + payload of fields to change), "delete" (permanently delete a task by id — cannot be undone), "list_priorities" (all task priorities, order_by "id" or "name"), "list_statuses" (all task statuses, order_by "id" or "name").
Inputs: action (required), id, limit, offset, +3 more.
bexio_timesheetsbexio TimesheetsADestructive
Manage timesheets (time tracking entries) in bexio. Actions: "list" (all timesheets, optional limit/offset/order_by; order_by supports id, date), "search" (search_criteria required; searchable fields: id, client_service_id, contact_id, user_id, pr_project_id, status_id), "get" (timesheet by numeric id), "create" (payload required: user_id, client_service_id, allowable_bill, tracking; tracking is either { type: "duration", date, duration } or { type: "range", start, end }), "update" (id + payload of fields to change), "delete" (permanently delete a timesheet by id — cannot be undone), "list_statuses" (all timesheet statuses, e.g. "In Progress"; optional limit/offset/order_by with id, name). Read timesheets may also contain a tracking of type "stopwatch" (created via the bexio UI).
Inputs: action (required), id, limit, offset, +3 more.
bexio_usersbexio UsersADestructive
Read bexio users and manage fictional users (fictional users appear in dropdowns but cannot log in). Actions: "list" (all users, optional limit/offset), "get" (user by id), "me" (the user authenticated by the current token), "list_fictional" (all fictional users, optional limit/offset), "get_fictional" (fictional user by id), "create_fictional" (payload required: salutation_type, firstname, lastname, email; optional title_id), "update_fictional" (id + payload of fields to change), "delete_fictional" (permanently delete a fictional user by id — cannot be undone), "permissions" (activated components and the full permission map of the logged-in user). Regular users are read-only via the API; only fictional users can be created, updated or deleted. is_superadmin/is_accountant are only included when the authenticated user is a superadmin.
Inputs: action (required), id, limit, offset, +1 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 35 tools
Each tool is focused on a distinct subdomain (e.g., contacts, invoices, projects) with clear descriptions of their actions and resources. There is minimal overlap, and potential confusion between similar tools like outgoing_payments and banking_payments is resolved by explicit explanations in the descriptions.
All tool names follow a consistent pattern of 'bexio_<domain>' using snake_case. There is no mixing of conventions, and the domain names are descriptive and uniform, making the tool set predictable and easy to navigate.
With 35 tools, the server is on the larger side, but given the comprehensive nature of the bexio ERP (covering accounting, sales, purchasing, projects, payroll, etc.), the number is justified. Each tool corresponds to a meaningful functional area, and the count does not feel excessive.
The tool surface covers the major aspects of bexio, including core business processes and master data. Minor gaps exist (e.g., no dedicated tool for discounts or tax rates beyond accounting), but the overall coverage is thorough and supports most common workflows.
Maintenance
Related MCP Connectors
MCP server for MOCO business software: time tracking, projects, budgets, and invoicing via API
Unofficial remote MCP server for Less Annoying CRM: OAuth 2.1, read-only grants, 10 tools.
One OAuth connector for your team's remote MCP servers, with Tool Packs, guardrails and logs.
MCP server for the PDFGate API. Generate PDFs, manage documents and handle e-signatures.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceComplete Swiss accounting integration for Bexio via MCP. Works with Claude Desktop, n8n, and any MCP client. 221 tools for invoices, contacts, projects & more. Created by Lukas Hertig.41MIT
- AlicenseCqualityCmaintenanceMCP server for smallinvoice.ch — Swiss SME invoicing and accounting with 146 tools and OAuth2 BYOC authentication.1009 npmMIT

freelo-mcp-serverofficial
AlicenseAqualityDmaintenanceMCP server for Freelo project management API, enabling task, project, and time tracking management. Features 33 curated tools, readonly mode, and audit logging.33MIT- AlicenseAqualityDmaintenanceA standalone MCP server for the bexio REST API, enabling interaction with bexio resources like contacts, invoices, and projects through natural language from any MCP client.2123 npmMIT