The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Manager.io MCP listing page.
MCP server for self-hosted Manager.io: ask your AI about invoices, balances, and books.
Manager.io is free, self-hosted accounting software for Windows, macOS, and Linux (also available as Cloud Edition). It covers sales, purchases, banking, payroll, and the full ledger, with an HTTP API (/api2) for automation.
This project wires that API into the Model Context Protocol so Cursor, Claude, VS Code Copilot, and other MCP hosts can query your live books in natural language.
Useful Manager.io links:
Default is read-only. You get:
record_customer_payment, issue_sales_invoice, record_customer_deposit (register when matching write scopes are set)create_* / update_* / delete_* still register under scopes until 0.3.0; prefer task toolsraw escape hatch - restores the full CRUD set for advanced useTransport is stdio. No HTTP server. No global install required if you use uv / uvx.
mcp.json): the server advertises Manager branding in MCP serverInfo.icons (embedded PNG data URI, plus a GitHub raw HTTPS fallback)..cursor-plugin/plugin.json uses docs/manager-icon.svg.mcpb/ (includes icon.png). See Installation → Claude Desktop below.serverInfo.icons and uses the root-domain favicon of the connector URL. If you host a remote MCP later, serve docs/favicon.ico at the registrable domain root (e.g. https://acme.com/favicon.ico for https://mcp.acme.com/...).uvx)uvx)MANAGER_API_URL + MANAGER_API_KEYMANAGER_API_KEY.MANAGER_API_URL to your API base (desktop often http://127.0.0.1:55667/api2).manager-mcp sends the token as the X-API-KEY header. Full walkthrough: Access Tokens.
Run the PyPI package with uvx:
Paste a client config below, set MANAGER_API_URL / MANAGER_API_KEY, restart the host, then ask: “Who owes me money?” or “Show bank balances.”
From a git clone (dev): uvx --from git+https://github.com/flumpiey/manager-mcp manager-mcp or uv run --directory /path/to/manager-mcp manager-mcp.
Configs below pull manager-mcp from PyPI. Leave write-scope env vars unset for read-only.
Plugin (Configure UI for URL, key, and scopes): this repo is a Cursor plugin via .cursor-plugin/plugin.json + root mcp.json.
~/.cursor/plugins/local/manager-mcp (Windows: %USERPROFILE%\.cursor\plugins\local\manager-mcp).manager-mcp. Set Manager API URL and Manager API key. Leave Write scopes / Delete scopes empty for read-only, or paste a CSV such as quotes or quotes,orders.manager MCP server is enabled under Customize / MCP.Marketplace listing is a separate submit at cursor.com/marketplace/publish.
Manual mcp.json: project .cursor/mcp.json or user-wide ~/.cursor/mcp.json.
From PyPI:
Local editable (dev):
Optional scoped writes in the env block:
Restart Cursor after saving. Confirm manager under MCP settings.
Desktop Extension (.mcpb): download mcpb.mcpb from GitHub Releases. Use v0.2.6 or later.
mcpb.mcpb. Review permissions, enter Manager API URL and Manager API key, then click Install.Build your own bundle from a clone:
On Windows, double-click often does nothing and dragging the file into chat attaches it to the conversation instead of installing it. Use Install Extension… in Settings.
Manual mcp.json config: edit the Claude Desktop config, then restart the app.
| OS | Path |
|---|---|
| macOS | ~/Library/Application Support/Claude/claude_desktop_config.json |
| Windows | %APPDATA%\Claude\claude_desktop_config.json |
Local clone:
Add via CLI:
Or edit ~/.claude.json / project MCP config:
Create .vscode/mcp.json in the project root:
Local editable:
Reload the window. Open Copilot Chat and confirm the manager tools are available.
Edit ~/.codeium/windsurf/mcp_config.json (macOS/Linux) or the Windsurf MCP settings UI:
Restart Windsurf after saving.
Add under context_servers in Zed settings.json (Agent Panel → settings also works):
Edit the Cline MCP settings file (cline_mcp_settings.json via the Cline MCP UI):
In .continue/config.yaml:
Any host that can spawn a stdio MCP server:
| Field | Value |
|---|---|
| Command | uvx |
| Args | manager-mcp |
| Env | MANAGER_API_URL, MANAGER_API_KEY (+ optional write scopes) |
Dev from a clone: uv run --directory /path/to/manager-mcp manager-mcp.
npx only runs npm packages. This is a Python package; use uvx.
| Variable | Required | Notes |
|---|---|---|
MANAGER_API_URL | yes | Opaque base URL (include /api2 when needed) |
MANAGER_API_KEY | yes | Sent as X-API-KEY; never logged |
MANAGER_MCP_WRITE_SCOPES | no | Comma-separated domains for create/update. Empty = no writes. |
MANAGER_MCP_DELETE_SCOPES | no | Comma-separated domains for delete only. Never implied by WRITE_SCOPES. |
Valid scopes: quotes, orders, parties, items, sales, purchases, banking, payroll, ledger, raw. No wildcards (*, all).
Recommended (covers most bookkeeping without 82 tools):
Default with no scopes: 10 tools. All nine domain scopes plus every CRUD verb: up to 82 tools. Use raw only when you need the full CRUD escape hatch.
Legacy MANAGER_MCP_ALLOW_WRITES / ALLOW_WRITES / MANAGER_MCP_WRITES hard-fail if set. Use the scoped vars instead.
See .env.example. Prefer a secret manager for the API key in production configs.
When a scope is listed in MANAGER_MCP_WRITE_SCOPES, the server registers task tools for that domain plus deprecated CRUD twins. MANAGER_MCP_DELETE_SCOPES enables void_document and delete_* per domain.
| Tool | Scopes | Purpose |
|---|---|---|
create_customer, create_supplier | parties | Single-resource party setup |
issue_sales_invoice | sales | Issue invoice with inline lines |
issue_purchase_invoice | purchases | Issue purchase invoice |
issue_quote | quotes | Issue sales or purchase quote |
convert_quote_to_invoice | quotes + sales | Convert quote to invoice |
record_customer_payment | banking | Receipt + invoice allocation |
record_supplier_payment | banking | Payment + invoice allocation |
record_expense | payroll and/or purchases | Expense claim or purchase invoice |
transfer_between_accounts | banking | Inter-account transfer |
post_journal_entry | ledger | Generic journal entry |
void_document | matching delete scope | Void by resource name + key |
record_customer_deposit | banking | Deposit before invoice exists |
issue_deposit_invoice | quotes | Deposit document (quote) |
apply_deposit_to_invoice | ledger | Apply deposit via journal |
Bodies for composite tools use Manager-native JSON where noted. Clone get_record templates; do not invent field names.
Per-resource create_* / update_* / delete_* still register when their domain scope is enabled. Descriptions are prefixed [DEPRECATED in 0.2.0; use task tools] except create_customer / create_supplier. Set raw in MANAGER_MCP_WRITE_SCOPES to register CRUD without deprecation prefixes.
| Scope | Resources (CRUD when enabled) |
|---|---|
quotes | sales_quotes, purchase_quotes |
orders | sales_orders, purchase_orders |
parties | customers, suppliers |
items | inventory_items, non_inventory_items |
sales | sales_invoices, credit_notes, delivery_notes |
purchases | purchase_invoices, debit_notes, goods_receipts |
banking | receipts, payments, inter_account_transfers, bank_accounts |
payroll | employees, payslips, expense_claims |
ledger | journal_entries, depreciation_entries, amortization_entries |
Example with recommended scopes only:
Denylist (always blocked): access-token forms, chart-of-accounts / *-account-form (except bank-or-cash), bank reconciliation, customer portal, starting balances, tax codes, exchange rates, currencies, custom fields/buttons, themes, email templates/settings.
A deposit is not revenue. Money received before delivery must not be booked to an income account. Confirm tax/VAT treatment with your accountant.
record_customer_deposit - posts cash to that account. If the account is missing, the tool returns precondition_failed with exact setup steps (Option A: guide only, no auto-create).issue_deposit_invoice (optional) - quote styled as a deposit document for the customer.issue_sales_invoice when the real invoice is raised.apply_deposit_to_invoice - journal entry moving deposit balance to the invoice (clone an existing journal via get_record).Required scopes: banking, quotes (deposit doc), ledger (apply), sales (final invoice via MCP).
create_customer / create_supplier). Use task tools or raw scope.MANAGER_MCP_WRITE_SCOPES to the recommended narrow set above instead of enabling all domains.| Tool | Purpose | Period (from_date / to_date) |
|---|---|---|
list_resources | Discovery; reports read_only + live write/delete scopes | n/a |
list_records | Search/page a curated collection | n/a |
get_record | Fetch one record via {path}-form/{key} | n/a |
aged_receivables | Outstanding / aging customers | Accepted; may be unsupported on this view |
aged_payables | Aging suppliers | Accepted; may be unsupported on this view |
bank_balances | Bank/cash balances snapshot | Accepted; may be unsupported on this view |
trial_balance | Trial balance | Forwarded as fromDate / toDate |
profit_and_loss | P&L | Forwarded as fromDate / toDate |
balance_sheet | Balance sheet | Forwarded as fromDate / toDate |
tax_summary | Tax summary | Accepted; may be unsupported on this view |
Collections for list_records / get_record: customers, suppliers, sales_invoices, purchase_invoices, chart_of_accounts, bank_accounts.
chart_of_accounts is list/search only (no single-form GET).
Bank dual path (intentional): bank_balances answers “what are my balances?”; list_records / get_record on bank_accounts answers “find account X and show detail.”
Registered only for resources in enabled scopes. Prefer task tools above.
| Pattern | Requires | Notes |
|---|---|---|
create_{stem} | write scope | Deprecated in 0.2.0 |
update_{stem} | write scope | Deprecated in 0.2.0 |
delete_{stem} | delete scope | Deprecated in 0.2.0; use void_document |
Companion skill: skills/manager-accounting/SKILL.md.
The Cursor plugin discovers this skill from skills/. Without the plugin, copy or symlink that folder into your agent skills path. It tells the model to call list_resources first, verify after writes, and which report tools to prefer.
Offline tests only (respx). No live Manager required:
GitHub Actions matrix: Python 3.10 and 3.12.
MANAGER_API_URL. Multi-instance routing is out of scope.src/manager_mcp/spec/api2.json is provenance only; runtime always hits the live URL.MIT. See LICENSE.