manager-mcp
Read-only MCP server for self-hosted Manager.io bookkeeping, providing curated GET tools to access accounting data like invoices, balances, and reports.
README
<p align="center"> <a href="https://www.manager.io/"> <img src="docs/manager-icon.svg" alt="Manager.io" width="72" height="72"> </a> </p>
manager-mcp
MCP server for self-hosted Manager.io — ask your AI about invoices, balances, and books.
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:
What this server does
Default is read-only. You get:
- 10 read tools — discovery, six searchable collections, seven report shortcuts
- Optional scoped writes — 23 resource types across 9 domains (
quotes,orders,parties, …), enabled only when you set env scopes - 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 MCPserverInfo.icons(embedded PNG data URI, plus a GitHub raw HTTPS fallback). - Cursor plugin:
.cursor-plugin/plugin.jsonusesdocs/manager-icon.svg. - Claude Desktop Extension: pack
mcpb/(includesicon.png) — see Installation → Claude Desktop below. - Claude.ai remote connectors: Claude.ai ignores
serverInfo.iconsand uses the root-domain favicon of the connector URL. If you host a remote MCP later, servedocs/favicon.icoat the registrable domain root (e.g.https://acme.com/favicon.icoforhttps://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
Create an access token in Manager under Settings → Access Tokens. The server sends it as X-API-KEY. Set MANAGER_API_URL to your instance root and include /api2 when required (desktop often looks like http://127.0.0.1:55667/api2).
Quick start
uvx manager-mcp
From source (GitHub):
uvx --from git+https://github.com/flumpiey/manager-mcp manager-mcp
Or from a local clone:
uvx --from /path/to/manager-mcp manager-mcp
Paste one of the client configs below, set MANAGER_API_URL / MANAGER_API_KEY, restart the host, then ask: “Who owes me money?” or “Show bank balances.”
Installation
Replace /path/to/manager-mcp with your clone path (or use the git+https://… form). Leave write-scope env vars unset for read-only.
<details> <summary><strong>Cursor</strong></summary>
Plugin (Configure UI for URL, key, and scopes): this repo is a Cursor plugin via .cursor-plugin/plugin.json + root mcp.json.
- Symlink or copy the clone to
~/.cursor/plugins/local/manager-mcp(Windows:%USERPROFILE%\.cursor\plugins\local\manager-mcp). - Reload the window.
- 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 asquotesorquotes,orders. - Confirm the
managerMCP 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.
Zero-install:
{
"mcpServers": {
"manager": {
"type": "stdio",
"command": "uvx",
"args": ["--from", "git+https://github.com/flumpiey/manager-mcp", "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.
</details>
<details> <summary><strong>Claude Desktop</strong></summary>
Desktop Extension (.mcpb, shows branded icon): from a clone:
npx @anthropic-ai/mcpb pack mcpb
Install the resulting .mcpb (double-click, drag onto Claude Desktop, or Settings → Extensions → Install Extension). Enter API URL and key when prompted; leave write/delete scopes empty for read-only. Requires uv on PATH (mcp_config runs uvx).
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": ["--from", "git+https://github.com/flumpiey/manager-mcp", "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"
}
}
}
}
</details>
<details> <summary><strong>Claude Code</strong></summary>
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 --from git+https://github.com/flumpiey/manager-mcp manager-mcp
Or edit ~/.claude.json / project MCP config:
{
"mcpServers": {
"manager": {
"command": "uvx",
"args": ["--from", "git+https://github.com/flumpiey/manager-mcp", "manager-mcp"],
"env": {
"MANAGER_API_URL": "http://127.0.0.1:55667/api2",
"MANAGER_API_KEY": "your-token"
}
}
}
}
</details>
<details> <summary><strong>VS Code / GitHub Copilot</strong></summary>
Create .vscode/mcp.json in the project root:
{
"servers": {
"manager": {
"type": "stdio",
"command": "uvx",
"args": ["--from", "git+https://github.com/flumpiey/manager-mcp", "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.
</details>
<details> <summary><strong>Windsurf</strong></summary>
Edit ~/.codeium/windsurf/mcp_config.json (macOS/Linux) or the Windsurf MCP settings UI:
{
"mcpServers": {
"manager": {
"command": "uvx",
"args": ["--from", "git+https://github.com/flumpiey/manager-mcp", "manager-mcp"],
"env": {
"MANAGER_API_URL": "http://127.0.0.1:55667/api2",
"MANAGER_API_KEY": "your-token"
}
}
}
}
Restart Windsurf after saving.
</details>
<details> <summary><strong>Zed</strong></summary>
Add under context_servers in Zed settings.json (Agent Panel → settings also works):
{
"context_servers": {
"manager": {
"command": "uvx",
"args": ["--from", "git+https://github.com/flumpiey/manager-mcp", "manager-mcp"],
"env": {
"MANAGER_API_URL": "http://127.0.0.1:55667/api2",
"MANAGER_API_KEY": "your-token"
}
}
}
}
</details>
<details> <summary><strong>Cline</strong></summary>
Edit the Cline MCP settings file (cline_mcp_settings.json via the Cline MCP UI):
{
"mcpServers": {
"manager": {
"command": "uvx",
"args": ["--from", "git+https://github.com/flumpiey/manager-mcp", "manager-mcp"],
"env": {
"MANAGER_API_URL": "http://127.0.0.1:55667/api2",
"MANAGER_API_KEY": "your-token"
}
}
}
}
</details>
<details> <summary><strong>Continue</strong></summary>
In .continue/config.yaml:
mcpServers:
- name: manager
command: uvx
args:
- --from
- git+https://github.com/flumpiey/manager-mcp
- manager-mcp
env:
MANAGER_API_URL: http://127.0.0.1:55667/api2
MANAGER_API_KEY: your-token
</details>
<details> <summary><strong>Generic / any stdio MCP host</strong></summary>
Any host that can spawn a stdio MCP server:
| Field | Value |
|---|---|
| Command | uvx |
| Args | --from git+https://github.com/flumpiey/manager-mcp manager-mcp |
| Env | MANAGER_API_URL, MANAGER_API_KEY (+ optional write scopes) |
Recommended install (PyPI):
uvx manager-mcp
From source: uvx --from git+https://github.com/flumpiey/manager-mcp manager-mcp.
Dev variant: uv run --directory /path/to/manager-mcp manager-mcp.
npx only runs npm packages — this is a Python package; use uvx.
</details>
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. No wildcards (*, all).
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
When a scope is listed in MANAGER_MCP_WRITE_SCOPES, the server registers create_* and update_* for every implemented resource in that domain. MANAGER_MCP_DELETE_SCOPES registers delete_* separately.
| Scope | Resources | Tools (when enabled) |
|---|---|---|
quotes |
sales_quotes, purchase_quotes | create/update/delete_sales_quote, …_purchase_quote |
orders |
sales_orders, purchase_orders | create/update/delete_sales_order, …_purchase_order |
parties |
customers, suppliers | create/update/delete_customer, …_supplier |
items |
inventory_items, non_inventory_items | create/update/delete_inventory_item, …_non_inventory_item |
sales |
sales_invoices, credit_notes, delivery_notes | create/update/delete_sales_invoice, …_credit_note, …_delivery_note |
purchases |
purchase_invoices, debit_notes, goods_receipts | create/update/delete_purchase_invoice, …_debit_note, …_goods_receipt |
banking |
receipts, payments, inter_account_transfers | create/update/delete_receipt, …_payment, …_inter_account_transfer |
payroll |
employees, payslips, expense_claims | create/update/delete_employee, …_payslip, …_expense_claim |
ledger |
journal_entries, depreciation_entries, amortization_entries | create/update/delete_journal_entry, …_depreciation_entry, …_amortization_entry |
Bodies are opaque Manager-native JSON. Prefer GET form → modify → PUT (full-document replace). Example with only quotes enabled:
"MANAGER_MCP_WRITE_SCOPES": "quotes",
"MANAGER_MCP_DELETE_SCOPES": "quotes"
→ create_sales_quote, update_sales_quote, delete_sales_quote, plus purchase twins.
Denylist (always blocked): access-token forms, chart-of-accounts / *-account-form, bank reconciliation, customer portal, starting balances, tax codes, exchange rates, currencies, custom fields/buttons, themes, email templates/settings.
Tools
Read tools
| Tool | Purpose | Period (from_date / to_date) |
|---|---|---|
list_resources |
Discovery; reports read_only + live write/delete scopes |
— |
list_records |
Search/page a curated collection | — |
get_record |
Fetch one record via {path}-form/{key} |
— |
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 (opt-in)
Registered only for resources in enabled scopes. Pattern:
| Pattern | Requires | Notes |
|---|---|---|
create_{stem} |
write scope | POST form path; 201 includes Key |
update_{stem} |
write scope | PUT {form}/{key}; full document replace |
delete_{stem} |
delete scope | DELETE {form}/{key}; write scope alone is not enough |
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.jsonis 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.
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。