Skip to main content
Glama
manager-mcp

manager-mcp

manager-mcp

MCP server for self-hosted Manager.io: ask your AI about invoices, balances, and books.

License: MIT Python MCP CI PyPI

What is Manager.io?

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:

Related MCP server: fiken-mcp

What this server does

Default is read-only. You get:

  • 10 read tools - discovery, six searchable collections, seven report shortcuts

  • Task tools (opt-in) - intent-shaped writes such as record_customer_payment, issue_sales_invoice, record_customer_deposit (register when matching write scopes are set)

  • Deprecated CRUD tools - per-resource create_* / update_* / delete_* still register under scopes until 0.3.0; prefer task tools

  • raw escape hatch - restores the full CRUD set for advanced use

  • Hard denylist - access tokens, chart of accounts forms, tax/currency, email templates, and similar high-risk paths stay blocked even when writes are on

Transport is stdio. No HTTP server. No global install required if you use uv / uvx.

Branding / icons

  • stdio hosts (Cursor, Claude Desktop via mcp.json): the server advertises Manager branding in MCP serverInfo.icons (embedded PNG data URI, plus a GitHub raw HTTPS fallback).

  • Cursor plugin: .cursor-plugin/plugin.json uses docs/manager-icon.svg.

  • Claude Desktop Extension: pack mcpb/ (includes icon.png). See Installation → Claude Desktop below.

  • Claude.ai remote connectors: Claude.ai ignores 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/...).

Requirements

  • Python ≥ 3.10 (pulled in automatically by uvx)

  • uv (provides uvx)

  • A reachable Manager.io API: MANAGER_API_URL + MANAGER_API_KEY

Access token

  1. In Manager, open Settings → Access Tokens.

  2. Create a token and copy the value into MANAGER_API_KEY.

  3. Set 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.

Quick start

Run the PyPI package with uvx:

uvx manager-mcp

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.

Installation

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.

  1. Symlink or copy the clone to ~/.cursor/plugins/local/manager-mcp (Windows: %USERPROFILE%\.cursor\plugins\local\manager-mcp).

  2. Reload the window.

  3. Open Plugins → Configure on 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.

  4. Confirm the 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:

{
  "mcpServers": {
    "manager": {
      "type": "stdio",
      "command": "uvx",
      "args": ["manager-mcp"],
      "env": {
        "MANAGER_API_URL": "http://127.0.0.1:55667/api2",
        "MANAGER_API_KEY": "your-token"
      }
    }
  }
}

Local editable (dev):

{
  "mcpServers": {
    "manager": {
      "type": "stdio",
      "command": "uv",
      "args": ["run", "--directory", "/path/to/manager-mcp", "manager-mcp"],
      "env": {
        "MANAGER_API_URL": "http://127.0.0.1:55667/api2",
        "MANAGER_API_KEY": "your-token"
      }
    }
  }
}

Optional scoped writes in the env block:

"MANAGER_MCP_WRITE_SCOPES": "quotes",
"MANAGER_MCP_DELETE_SCOPES": "quotes"

Restart Cursor after saving. Confirm manager under MCP settings.

Desktop Extension (.mcpb): download mcpb.mcpb from GitHub Releases. Use v0.2.6 or later.

  1. Open Claude Desktop → Settings → Extensions.

  2. Open Advanced settings → Install Extension…

  3. Select mcpb.mcpb. Review permissions, enter Manager API URL and Manager API key, then click Install.

  4. Leave Write scopes and Delete scopes empty for read-only.

  5. Restart Claude Desktop if tools do not appear.

Build your own bundle from a clone:

npx @anthropic-ai/mcpb pack mcpb

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

{
  "mcpServers": {
    "manager": {
      "command": "uvx",
      "args": ["manager-mcp"],
      "env": {
        "MANAGER_API_URL": "http://127.0.0.1:55667/api2",
        "MANAGER_API_KEY": "your-token"
      }
    }
  }
}

Local clone:

{
  "mcpServers": {
    "manager": {
      "command": "uv",
      "args": ["run", "--directory", "/path/to/manager-mcp", "manager-mcp"],
      "env": {
        "MANAGER_API_URL": "http://127.0.0.1:55667/api2",
        "MANAGER_API_KEY": "your-token"
      }
    }
  }
}

Add via CLI:

claude mcp add manager --env MANAGER_API_URL=http://127.0.0.1:55667/api2 --env MANAGER_API_KEY=your-token -- uvx manager-mcp

Or edit ~/.claude.json / project MCP config:

{
  "mcpServers": {
    "manager": {
      "command": "uvx",
      "args": ["manager-mcp"],
      "env": {
        "MANAGER_API_URL": "http://127.0.0.1:55667/api2",
        "MANAGER_API_KEY": "your-token"
      }
    }
  }
}

Create .vscode/mcp.json in the project root:

{
  "servers": {
    "manager": {
      "type": "stdio",
      "command": "uvx",
      "args": ["manager-mcp"],
      "env": {
        "MANAGER_API_URL": "http://127.0.0.1:55667/api2",
        "MANAGER_API_KEY": "your-token"
      }
    }
  }
}

Local editable:

{
  "servers": {
    "manager": {
      "type": "stdio",
      "command": "uv",
      "args": ["run", "--directory", "/path/to/manager-mcp", "manager-mcp"],
      "env": {
        "MANAGER_API_URL": "http://127.0.0.1:55667/api2",
        "MANAGER_API_KEY": "your-token"
      }
    }
  }
}

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:

{
  "mcpServers": {
    "manager": {
      "command": "uvx",
      "args": ["manager-mcp"],
      "env": {
        "MANAGER_API_URL": "http://127.0.0.1:55667/api2",
        "MANAGER_API_KEY": "your-token"
      }
    }
  }
}

Restart Windsurf after saving.

Add under context_servers in Zed settings.json (Agent Panel → settings also works):

{
  "context_servers": {
    "manager": {
      "command": "uvx",
      "args": ["manager-mcp"],
      "env": {
        "MANAGER_API_URL": "http://127.0.0.1:55667/api2",
        "MANAGER_API_KEY": "your-token"
      }
    }
  }
}

Edit the Cline MCP settings file (cline_mcp_settings.json via the Cline MCP UI):

{
  "mcpServers": {
    "manager": {
      "command": "uvx",
      "args": ["manager-mcp"],
      "env": {
        "MANAGER_API_URL": "http://127.0.0.1:55667/api2",
        "MANAGER_API_KEY": "your-token"
      }
    }
  }
}

In .continue/config.yaml:

mcpServers:
  - name: manager
    command: uvx
    args:
      - manager-mcp
    env:
      MANAGER_API_URL: http://127.0.0.1:55667/api2
      MANAGER_API_KEY: your-token

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)

uvx manager-mcp

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.

Environment

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):

"MANAGER_MCP_WRITE_SCOPES": "banking,sales,parties",
"MANAGER_MCP_DELETE_SCOPES": "sales,banking"

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.

Write scopes and task tools

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.

Task tools (preferred)

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.

Deprecated CRUD (0.2.0, removed 0.3.0)

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:

"MANAGER_MCP_WRITE_SCOPES": "banking,sales,parties",
"MANAGER_MCP_DELETE_SCOPES": "sales"

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.

Customer deposit workflow

A deposit is not revenue. Money received before delivery must not be booked to an income account. Confirm tax/VAT treatment with your accountant.

  1. Ensure a Customer deposits bank/cash account exists in Manager (Settings → Bank and Cash Accounts).

  2. 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).

  3. issue_deposit_invoice (optional) - quote styled as a deposit document for the customer.

  4. issue_sales_invoice when the real invoice is raised.

  5. 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).

Migration from 0.1.x

  • 0.2.0: Task tools added; CRUD tools deprecated but still present under scopes.

  • 0.3.0: CRUD tools removed (except create_customer / create_supplier). Use task tools or raw scope.

  • Update MANAGER_MCP_WRITE_SCOPES to the recommended narrow set above instead of enabling all domains.

Tools

Read tools

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.”

Write tools (deprecated)

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

Agent Skill

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.

Development

uv sync --extra dev
uv run manager-mcp

Offline tests only (respx). No live Manager required:

uv run ruff check src tests
uv run pytest

GitHub Actions matrix: Python 3.10 and 3.12.

Caveats

  • One process ↔ one MANAGER_API_URL. Multi-instance routing is out of scope.

  • Multi-business disambiguation on a shared host is unverified. Do not claim multi-business support until validated against a live multi-business setup.

  • Vendored src/manager_mcp/spec/api2.json is provenance only; runtime always hits the live URL.

  • ChatGPT Apps need a hosted HTTP MCP endpoint. This package is stdio-only.

License

MIT. See LICENSE.

Available Tools

10 tools
aged_payablesC

Aged payables snapshot (read-only).

Inputs: to_date, from_date. Returns: object

aged_receivablesB

Aged receivables / outstanding customer balances (read-only snapshot).

Inputs: to_date, from_date. Returns: object

balance_sheetC

Balance sheet snapshot (read-only).

Inputs: to_date, from_date. Returns: object

bank_balancesB

Bank/cash balances snapshot (read-only). For search/drill-in of individual accounts use list_records/get_record on bank_accounts.

Inputs: to_date, from_date. Returns: object

get_recordA

Fetch one collection record by GUID via Manager form endpoint (e.g. /customer-form/{key}). chart_of_accounts has no single form. For bank/cash account detail use resource=bank_accounts (not bank_balances).

Inputs: key (required), resource (required). Returns: object

list_recordsA

Search/page a curated collection. Core: customers, suppliers, sales_invoices, purchase_invoices, chart_of_accounts, bank_accounts. Also writable domains when present in discovery (e.g. receipts, payments, sales_quotes). bank_accounts is the searchable collection; use bank_balances for snapshot balances.

Inputs: resource (required), skip, term, sort_by, +2 more. Returns: object

list_resourcesA

List curated Manager.io capabilities. Default is read-only (10 tools). Task tools register when write scopes match; CRUD tools are deprecated unless raw scope is set.

Inputs: no named parameters. Returns: object

profit_and_lossB

Profit and loss snapshot (read-only).

Inputs: to_date, from_date. Returns: object

tax_summaryC

Tax summary snapshot (read-only).

Inputs: to_date, from_date. Returns: object

trial_balanceC

Trial balance snapshot (read-only).

Inputs: to_date, from_date. Returns: object

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.2/5.0

    Scored across 10 tools

    Disambiguation5/5

    Each tool has a clearly distinct purpose: listing/searching resources and records, fetching a single record, and specific financial report snapshots. There is no ambiguity between tools like list_records and get_record, as one is for searching and the other for retrieving by ID.

    Naming Consistency4/5

    The tools follow two clear naming patterns: verb_noun for list and get operations (list_resources, list_records, get_record) and noun_phrases for financial reports (aged_receivables, trial_balance, etc.). While the shift between patterns is noticeable, it is predictable and domain-appropriate.

    Tool Count5/5

    With 10 tools, the server covers a reasonable set of operations for an accounting system: resource introspection, data retrieval, and key financial reports. The count is well-scoped, neither too sparse nor too heavy.

    Completeness3/5

    The tool set is read-only, providing search, retrieval, and report snapshots but lacking any create, update, or delete operations. For a management tool, this is a notable gap that limits agent functionality for common tasks like entering invoices or managing customers.

    Maintenance

    ActivityInactive
    ResponsivenessLimited data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      D
      maintenance
      Read-only MCP server for reconciling SimpleFIN bank data against Firefly III ledger, enabling audit and review workflows without mutation.
      19
      10 npm
      1
      MIT
    • A
      license
      B
      quality
      F
      maintenance
      A read-only MCP server that exposes Fiken accounting API's 61 GET endpoints as tools for AI assistants to query accounting data.
      61
      22 npm
      3
      MIT
    • A
      license
      Not graded
      quality
      C
      maintenance
      Read-only MCP server for Omie ERP, enabling AI assistants to query financial data, accounts payable/receivable, bank reconciliation, invoices, and movements via natural language.
      8
      MIT
    • A
      license
      Not graded
      quality
      C
      maintenance
      A read-only MCP server for the NuMetric.work accounting/POS/ERP platform, exposing 38 tools to query live business data such as financial statements, invoices, taxes, projects, inventory, and documents. It enables AI assistants to answer from real accounting data without any create, edit, or delete capabilities.
      MIT