invoiceninja-mcp-server
by NightSquawk
README.md
# Invoice Ninja MCP Server
[](https://www.npmjs.com/package/@nightsquawktech/invoiceninja-mcp-server)
[](https://www.npmjs.com/package/@nightsquawktech/invoiceninja-mcp-server)
[](https://scorecard.dev/viewer/?uri=github.com/NightSquawk/invoiceninja-mcp-server)
[](https://github.com/NightSquawk/invoiceninja-mcp-server/blob/v1.0.0/LICENSE)
[](https://nodejs.org)
An MCP (Model Context Protocol) server for **Invoice Ninja v5**, connecting your self-hosted invoicing data to AI tools.
## Quick start
### Claude
[](https://github.com/NightSquawk/invoiceninja-mcp-server/releases/download/mcpb-v0.1.0/invoiceninja-mcp-server-0.1.0.mcpb)
**bash (macOS/Linux):**
```bash
INVOICENINJA_BASE_URL="https://invoicing.yourdomain.com"
INVOICENINJA_API_TOKEN="your-api-token"
claude mcp add invoiceninja \
--env INVOICENINJA_BASE_URL="$INVOICENINJA_BASE_URL" \
--env INVOICENINJA_API_TOKEN="$INVOICENINJA_API_TOKEN" \
-- npx -y @nightsquawktech/invoiceninja-mcp-server
```
**PowerShell (Windows):**
```powershell
$INVOICENINJA_BASE_URL = "https://invoicing.yourdomain.com"
$INVOICENINJA_API_TOKEN = "your-api-token"
claude mcp add invoiceninja `
--env "INVOICENINJA_BASE_URL=$INVOICENINJA_BASE_URL" `
--env "INVOICENINJA_API_TOKEN=$INVOICENINJA_API_TOKEN" `
-- npx -y @nightsquawktech/invoiceninja-mcp-server
```
### Cursor
[](https://cursor.com/en/install-mcp?name=invoiceninja&config=eyJjb21tYW5kIjogIm5weCIsICJhcmdzIjogWyIteSIsICJAbmlnaHRzcXVhd2t0ZWNoL2ludm9pY2VuaW5qYS1tY3Atc2VydmVyIl0sICJlbnYiOiB7IklOVk9JQ0VOSU5KQV9CQVNFX1VSTCI6ICJodHRwczovL2ludm9pY2luZy55b3VyZG9tYWluLmNvbSIsICJJTlZPSUNFTklOSkFfQVBJX1RPS0VOIjogInlvdXItYXBpLXRva2VuIiwgIklOVk9JQ0VOSU5KQV9USU1FT1VUX01TIjogIjMwMDAwIn19)
Or put the [mcp.json](#mcpjson) block in `.cursor/mcp.json`, then verify with:
```bash
agent mcp list
```
(The Cursor CLI manages configured servers but has no `mcp add`; install is via the button or `mcp.json`.)
### VS Code
[](https://insiders.vscode.dev/redirect/mcp/install?name=invoiceninja&config=%7B%22command%22%3A%20%22npx%22%2C%20%22args%22%3A%20%5B%22-y%22%2C%20%22%40nightsquawktech/invoiceninja-mcp-server%22%5D%2C%20%22env%22%3A%20%7B%22INVOICENINJA_BASE_URL%22%3A%20%22https%3A//invoicing.yourdomain.com%22%2C%20%22INVOICENINJA_API_TOKEN%22%3A%20%22your-api-token%22%2C%20%22INVOICENINJA_TIMEOUT_MS%22%3A%20%2230000%22%7D%7D)
**bash (macOS/Linux):**
```bash
INVOICENINJA_BASE_URL="https://invoicing.yourdomain.com"
INVOICENINJA_API_TOKEN="your-api-token"
code --add-mcp '{"name":"invoiceninja","command":"npx","args":["-y","@nightsquawktech/invoiceninja-mcp-server"],"env":{"INVOICENINJA_BASE_URL":"'"$INVOICENINJA_BASE_URL"'","INVOICENINJA_API_TOKEN":"'"$INVOICENINJA_API_TOKEN"'"}}'
```
**PowerShell (Windows):**
```powershell
$INVOICENINJA_BASE_URL = "https://invoicing.yourdomain.com"
$INVOICENINJA_API_TOKEN = "your-api-token"
$config = @{
name = "invoiceninja"
command = "npx"
args = @("-y", "@nightsquawktech/invoiceninja-mcp-server")
env = @{
INVOICENINJA_BASE_URL = $INVOICENINJA_BASE_URL
INVOICENINJA_API_TOKEN = $INVOICENINJA_API_TOKEN
}
} | ConvertTo-Json -Compress
code --add-mcp $config
```
### Codex
**bash (macOS/Linux):**
```bash
INVOICENINJA_BASE_URL="https://invoicing.yourdomain.com"
INVOICENINJA_API_TOKEN="your-api-token"
codex mcp add invoiceninja \
--env INVOICENINJA_BASE_URL="$INVOICENINJA_BASE_URL" \
--env INVOICENINJA_API_TOKEN="$INVOICENINJA_API_TOKEN" \
-- npx -y @nightsquawktech/invoiceninja-mcp-server
```
**PowerShell (Windows):**
```powershell
$INVOICENINJA_BASE_URL = "https://invoicing.yourdomain.com"
$INVOICENINJA_API_TOKEN = "your-api-token"
codex mcp add invoiceninja `
--env "INVOICENINJA_BASE_URL=$INVOICENINJA_BASE_URL" `
--env "INVOICENINJA_API_TOKEN=$INVOICENINJA_API_TOKEN" `
-- npx -y @nightsquawktech/invoiceninja-mcp-server
```
Or add it to `~/.codex/config.toml` under `[mcp_servers.invoiceninja]`.
### mcp.json
Every environment variable the server reads, with recommended values:
```json
{
"mcpServers": {
"invoiceninja": {
"command": "npx",
"args": ["-y", "@nightsquawktech/invoiceninja-mcp-server"],
"env": {
"INVOICENINJA_BASE_URL": "https://invoicing.yourdomain.com",
"INVOICENINJA_API_TOKEN": "your-api-token",
"INVOICENINJA_TIMEOUT_MS": "30000"
}
}
}
}
```
File locations: `.mcp.json` in your project root (Claude Code), `claude_desktop_config.json` (Claude Desktop), `.cursor/mcp.json` (Cursor).
## Configuration
| Variable | Required | Default | Purpose |
|---|---|---|---|
| `INVOICENINJA_BASE_URL` | yes | | Your Invoice Ninja v5 instance URL, no trailing slash, no `/api/v1`, e.g. `https://invoicing.yourdomain.com` |
| `INVOICENINJA_API_TOKEN` | yes | | API token from Settings > Account Management > Integrations > API tokens, sent as `X-Api-Token` |
| `INVOICENINJA_TIMEOUT_MS` | no | `30000` | HTTP timeout for API requests, minimum 1000 |
## Security & write safety
Invoice Ninja credentials: create a dedicated API token under a restricted user (Settings > User Management) and grant that user only the permissions the assistant needs; the token inherits the user's permissions.
- Read-only endpoints (**186** GETs) execute freely.
- Mutating endpoints (**193** POST/PUT/DELETE operations) are refused unless the call carries `authorization_confirmed: true` **and** a non-empty `authorization_note` describing the user's explicit approval. There is no blanket write mode: authorization is per call.
- Before every mutating call, the server writes a JSON backup of the full request to a local temp directory. For updates and deletes it also fetches the current record first (best-effort) and stores it in the backup, so the change is reversible. The backup file path is returned in the tool response.
- Any `{action}` route (email, mark_paid, archive, restore, delete, clone) is treated as mutating even when registered as a GET, so destructive actions can never slip past the guard.
- All requests go directly from your machine to your Invoice Ninja instance; nothing passes through third parties.
> [!IMPORTANT]
> The authorization gate is a guardrail, not a security boundary. `INVOICENINJA_API_TOKEN` in your MCP config is a real Invoice Ninja API token, and an AI agent with shell access can bypass the MCP tools and call the Invoice Ninja API directly with it. If you need hard read-only, enforce it at the source: issue the token under a user whose permissions are scoped down in Invoice Ninja itself.
## Tools
Instead of one tool per endpoint (379 tools would drown any model's tool selection), this server ships a generated endpoint catalog behind three generic tools: `list_endpoints` to discover operations, `describe_endpoint` for the exact parameter spec of one operation, and `call_endpoint` to execute it. The pattern comes from [mcp-core](https://github.com/NightSquawk/mcp-core), the shared catalog runtime used across NightSquawk MCP servers.
```
list_endpoints List/filter all 379 endpoints by category, read-vs-mutating, or search term
describe_endpoint Full spec for one endpoint: method, path, params, body fields, mutating flag
call_endpoint Execute an endpoint; mutating calls need per-call authorization and are backed up first
```
## API coverage
<!-- GENERATED SECTION: do not edit by hand. Regenerate from the catalog with scripts/generate-api-coverage.mjs whenever the catalog changes. -->
379 operations covered: 186 read-only, 193 mutating.
| Category | Operations |
|---|---|
| reports | 27 |
| clients | 14 |
| invoices | 12 |
| quotes | 12 |
| bank_integrations | 11 |
| payments | 11 |
| purchase_orders | 11 |
| recurring_invoices | 11 |
| users | 11 |
| companies | 10 |
| tasks | 10 |
| bank_transactions | 9 |
| credits | 9 |
| expenses | 9 |
| group_settings | 9 |
| products | 9 |
| projects | 9 |
| recurring_expenses | 9 |
| recurring_quotes | 9 |
| vendors | 9 |
| bank_transaction_rules | 8 |
| company_gateways | 8 |
| designs | 8 |
| expense_categories | 8 |
| payment_terms | 8 |
| subscriptions | 8 |
| tags | 8 |
| task_status | 8 |
| tokens | 8 |
| webhooks | 8 |
| client_gateway_tokens | 7 |
| locations | 7 |
| task_schedulers | 7 |
| tax_rates | 7 |
| auth | 6 |
| activities | 4 |
| charts | 4 |
| imports | 3 |
| migration | 3 |
| postmark | 3 |
| ping | 2 |
| preview | 2 |
| system_logs | 2 |
| templates | 2 |
| update | 2 |
| claim_license | 1 |
| company_ledger | 1 |
| company_user | 1 |
| connected_account | 1 |
| documents | 1 |
| emails | 1 |
| export | 1 |
| health_check | 1 |
| logout | 1 |
| one_time_token | 1 |
| refresh | 1 |
| scheduler | 1 |
| search | 1 |
| statics | 1 |
| support | 1 |
| webcron | 1 |
| yodlee | 1 |
<details>
<summary><strong>reports</strong> (27 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| POST | `/api/v1/exports/preview/{hash}` | `get_export_preview` |
| POST | `/api/v1/reports/activities` | `get_activity_report` |
| POST | `/api/v1/reports/ar_detail_report` | `get_ardetail_report` |
| POST | `/api/v1/reports/ar_summary_report` | `get_arsummary_report` |
| POST | `/api/v1/reports/client_balance_report` | `get_client_balance_report` |
| POST | `/api/v1/reports/client_contacts` | `get_client_contact_report` |
| POST | `/api/v1/reports/client_sales_report` | `get_client_sales_report` |
| POST | `/api/v1/reports/clients` | `get_client_report` |
| POST | `/api/v1/reports/contacts` | `get_contact_report` |
| POST | `/api/v1/reports/credits` | `get_credit_report` |
| POST | `/api/v1/reports/documents` | `get_document_report` |
| POST | `/api/v1/reports/expenses` | `get_expense_report` |
| POST | `/api/v1/reports/invoice_items` | `get_invoice_item_report` |
| POST | `/api/v1/reports/invoices` | `get_invoice_report` |
| POST | `/api/v1/reports/payments` | `get_payment_report` |
| POST | `/api/v1/reports/preview/{hash}` | `get_report_preview` |
| POST | `/api/v1/reports/product_sales` | `get_product_sales_report` |
| POST | `/api/v1/reports/products` | `get_product_report` |
| POST | `/api/v1/reports/profitloss` | `get_profit_loss_report` |
| POST | `/api/v1/reports/projects` | `get_project_report` |
| POST | `/api/v1/reports/quote_items` | `get_quote_item_report` |
| POST | `/api/v1/reports/quotes` | `get_quote_report` |
| POST | `/api/v1/reports/recurring_invoices` | `get_recurring_invoice_report` |
| POST | `/api/v1/reports/tasks` | `get_task_report` |
| POST | `/api/v1/reports/tax_period_report` | `get_tax_period_report` |
| POST | `/api/v1/reports/tax_summary_report` | `get_tax_summary_report` |
| POST | `/api/v1/reports/user_sales_report` | `get_user_sales_report` |
</details>
<details>
<summary><strong>clients</strong> (14 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| POST | `/api/v1/client_statement` | `client_statement` |
| GET | `/api/v1/clients` | `get_clients` |
| POST | `/api/v1/clients` | `store_client` |
| POST | `/api/v1/clients/{client}/updateTaxData` | `update_client_tax_data` |
| DELETE | `/api/v1/clients/{id}` | `delete_client` |
| GET | `/api/v1/clients/{id}` | `show_client` |
| PUT | `/api/v1/clients/{id}` | `update_client` |
| POST | `/api/v1/clients/{id}/{mergeable_client_hashed_id}/merge` | `merge_client` |
| GET | `/api/v1/clients/{id}/edit` | `edit_client` |
| POST | `/api/v1/clients/{id}/purge` | `purge_client` |
| POST | `/api/v1/clients/{id}/upload` | `upload_client` |
| POST | `/api/v1/clients/bulk` | `bulk_clients` |
| GET | `/api/v1/clients/create` | `get_clients_create` |
| POST | `/api/v1/reactivate_email/{bounce_id}` | `reactivate_email` |
</details>
<details>
<summary><strong>invoices</strong> (12 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| GET | `/api/v1/invoice/{invitation_key}/download` | `download_invoice_by_invitation` |
| GET | `/api/v1/invoices` | `get_invoices` |
| POST | `/api/v1/invoices` | `store_invoice` |
| DELETE | `/api/v1/invoices/{id}` | `delete_invoice` |
| GET | `/api/v1/invoices/{id}` | `show_invoice` |
| PUT | `/api/v1/invoices/{id}` | `update_invoice` |
| GET | `/api/v1/invoices/{id}/{action}` | `action_invoice` |
| GET | `/api/v1/invoices/{id}/delivery_note` | `get_invoice_delivery_note` |
| GET | `/api/v1/invoices/{id}/edit` | `edit_invoice` |
| POST | `/api/v1/invoices/{id}/upload` | `upload_invoice_document` |
| POST | `/api/v1/invoices/bulk` | `bulk_invoices` |
| GET | `/api/v1/invoices/create` | `get_invoice_create` |
</details>
<details>
<summary><strong>quotes</strong> (12 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| GET | `/api/v1/credit/{invitation_key}/download` | `download_credit` |
| GET | `/api/v1/quote/{invitation_key}/download` | `download_quote` |
| GET | `/api/v1/quotes` | `get_quotes` |
| POST | `/api/v1/quotes` | `store_quote` |
| DELETE | `/api/v1/quotes/{id}` | `delete_quote` |
| GET | `/api/v1/quotes/{id}` | `show_quote` |
| PUT | `/api/v1/quotes/{id}` | `update_quote` |
| GET | `/api/v1/quotes/{id}/{action}` | `action_quote` |
| GET | `/api/v1/quotes/{id}/edit` | `edit_quote` |
| POST | `/api/v1/quotes/{id}/upload` | `upload_quote` |
| POST | `/api/v1/quotes/bulk` | `bulk_quotes` |
| GET | `/api/v1/quotes/create` | `get_quotes_create` |
</details>
<details>
<summary><strong>bank_integrations</strong> (11 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| GET | `/api/v1/bank_integrations` | `get_bank_integrations` |
| POST | `/api/v1/bank_integrations` | `store_bank_integration` |
| DELETE | `/api/v1/bank_integrations/{id}` | `delete_bank_integration` |
| GET | `/api/v1/bank_integrations/{id}` | `show_bank_integration` |
| PUT | `/api/v1/bank_integrations/{id}` | `update_bank_integration` |
| GET | `/api/v1/bank_integrations/{id}/edit` | `edit_bank_integration` |
| POST | `/api/v1/bank_integrations/bulk` | `bulk_bank_integrations` |
| GET | `/api/v1/bank_integrations/create` | `get_bank_integrations_create` |
| POST | `/api/v1/bank_integrations/get_transactions/account_id` | `get_account_transactions` |
| POST | `/api/v1/bank_integrations/refresh_accounts` | `get_refresh_accounts` |
| POST | `/api/v1/bank_integrations/remove_account/account_id` | `get_remove_account` |
</details>
<details>
<summary><strong>payments</strong> (11 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| GET | `/api/v1/payments` | `get_payments` |
| POST | `/api/v1/payments` | `store_payment` |
| DELETE | `/api/v1/payments/{id}` | `delete_payment` |
| GET | `/api/v1/payments/{id}` | `show_payment` |
| PUT | `/api/v1/payments/{id}` | `update_payment` |
| GET | `/api/v1/payments/{id}/{action}` | `action_payment` |
| GET | `/api/v1/payments/{id}/edit` | `edit_payment` |
| POST | `/api/v1/payments/{id}/upload` | `upload_payment` |
| POST | `/api/v1/payments/bulk` | `bulk_payments` |
| GET | `/api/v1/payments/create` | `get_payments_create` |
| POST | `/api/v1/payments/refund` | `store_refund` |
</details>
<details>
<summary><strong>purchase_orders</strong> (11 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| GET | `/api/v1/purchase_order/{invitation_key}/download` | `download_purchase_order` |
| GET | `/api/v1/purchase_orders` | `get_purchase_orders` |
| POST | `/api/v1/purchase_orders` | `store_purchase_order` |
| DELETE | `/api/v1/purchase_orders/{id}` | `delete_purchase_order` |
| GET | `/api/v1/purchase_orders/{id}` | `show_purchase_order` |
| PUT | `/api/v1/purchase_orders/{id}` | `update_purchase_order` |
| GET | `/api/v1/purchase_orders/{id}/{action}` | `action_purchase_order` |
| GET | `/api/v1/purchase_orders/{id}/edit` | `edit_purchase_order` |
| POST | `/api/v1/purchase_orders/{id}/upload` | `upload_purchase_order` |
| POST | `/api/v1/purchase_orders/bulk` | `bulk_purchase_orderss` |
| GET | `/api/v1/purchase_orders/create` | `get_purchase_order_create` |
</details>
<details>
<summary><strong>recurring_invoices</strong> (11 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| GET | `/api/v1/recurring_invoice/{invitation_key}/download` | `download_recurring_invoice` |
| GET | `/api/v1/recurring_invoices` | `get_recurring_invoices` |
| POST | `/api/v1/recurring_invoices` | `store_recurring_invoice` |
| DELETE | `/api/v1/recurring_invoices/{id}` | `delete_recurring_invoice` |
| GET | `/api/v1/recurring_invoices/{id}` | `show_recurring_invoice` |
| PUT | `/api/v1/recurring_invoices/{id}` | `update_recurring_invoice` |
| GET | `/api/v1/recurring_invoices/{id}/{action}` | `action_recurring_invoice` |
| GET | `/api/v1/recurring_invoices/{id}/edit` | `edit_recurring_invoice` |
| POST | `/api/v1/recurring_invoices/{id}/upload` | `upload_recurring_invoice` |
| POST | `/api/v1/recurring_invoices/bulk` | `bulk_recurring_invoices` |
| GET | `/api/v1/recurring_invoices/create` | `get_recurring_invoices_create` |
</details>
<details>
<summary><strong>users</strong> (11 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| GET | `/api/v1/users` | `get_users` |
| POST | `/api/v1/users` | `store_user` |
| DELETE | `/api/v1/users/{id}` | `delete_user` |
| GET | `/api/v1/users/{id}` | `show_user` |
| PUT | `/api/v1/users/{id}` | `update_user` |
| GET | `/api/v1/users/{id}/edit` | `edit_user` |
| DELETE | `/api/v1/users/{user}/detach_from_company` | `detach_user` |
| POST | `/api/v1/users/{user}/invite` | `invite_user` |
| POST | `/api/v1/users/{user}/reconfirm` | `invite_user_reconfirm` |
| POST | `/api/v1/users/bulk` | `bulk_users` |
| GET | `/api/v1/users/create` | `get_users_create` |
</details>
<details>
<summary><strong>companies</strong> (10 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| GET | `/api/v1/companies` | `get_companies` |
| POST | `/api/v1/companies` | `store_company` |
| POST | `/api/v1/companies/{company}/default` | `set_default_company` |
| DELETE | `/api/v1/companies/{id}` | `delete_company` |
| GET | `/api/v1/companies/{id}` | `show_company` |
| PUT | `/api/v1/companies/{id}` | `update_company` |
| GET | `/api/v1/companies/{id}/edit` | `edit_company` |
| POST | `/api/v1/companies/{id}/upload` | `upload_companies` |
| GET | `/api/v1/companies/create` | `get_companies_create` |
| POST | `/api/v1/companies/current` | `show_current_company` |
</details>
<details>
<summary><strong>tasks</strong> (10 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| GET | `/api/v1/tasks` | `get_tasks` |
| POST | `/api/v1/tasks` | `store_task` |
| DELETE | `/api/v1/tasks/{id}` | `delete_task` |
| GET | `/api/v1/tasks/{id}` | `show_task` |
| PUT | `/api/v1/tasks/{id}` | `update_task` |
| GET | `/api/v1/tasks/{id}/edit` | `edit_task` |
| POST | `/api/v1/tasks/{id}/upload` | `upload_task` |
| POST | `/api/v1/tasks/bulk` | `bulk_tasks` |
| GET | `/api/v1/tasks/create` | `get_tasks_create` |
| POST | `/api/v1/tasks/sort` | `sort_tasks` |
</details>
<details>
<summary><strong>bank_transactions</strong> (9 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| GET | `/api/v1/bank_transactions` | `get_bank_transactions` |
| POST | `/api/v1/bank_transactions` | `store_bank_transaction` |
| DELETE | `/api/v1/bank_transactions/{id}` | `delete_bank_transaction` |
| GET | `/api/v1/bank_transactions/{id}` | `show_bank_transaction` |
| PUT | `/api/v1/bank_transactions/{id}` | `update_bank_transaction` |
| GET | `/api/v1/bank_transactions/{id}/edit` | `edit_bank_transaction` |
| POST | `/api/v1/bank_transactions/bulk` | `bulk_bank_transactions` |
| GET | `/api/v1/bank_transactions/create` | `get_bank_transactions_create` |
| POST | `/api/v1/bank_transactions/match` | `match_bank_transactions` |
</details>
<details>
<summary><strong>credits</strong> (9 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| GET | `/api/v1/credits` | `get_credits` |
| POST | `/api/v1/credits` | `store_credit` |
| DELETE | `/api/v1/credits/{id}` | `delete_credit` |
| GET | `/api/v1/credits/{id}` | `show_credit` |
| PUT | `/api/v1/credits/{id}` | `update_credit` |
| GET | `/api/v1/credits/{id}/edit` | `edit_credit` |
| POST | `/api/v1/credits/{id}/upload` | `upload_credits` |
| POST | `/api/v1/credits/bulk` | `bulk_credits` |
| GET | `/api/v1/credits/create` | `get_credits_create` |
</details>
<details>
<summary><strong>expenses</strong> (9 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| GET | `/api/v1/expenses` | `get_expenses` |
| POST | `/api/v1/expenses` | `store_expense` |
| DELETE | `/api/v1/expenses/{id}` | `delete_expense` |
| GET | `/api/v1/expenses/{id}` | `show_expense` |
| PUT | `/api/v1/expenses/{id}` | `update_expense` |
| GET | `/api/v1/expenses/{id}/edit` | `edit_expense` |
| POST | `/api/v1/expenses/{id}/upload` | `upload_expense` |
| POST | `/api/v1/expenses/bulk` | `bulk_expenses` |
| GET | `/api/v1/expenses/create` | `get_expenses_create` |
</details>
<details>
<summary><strong>group_settings</strong> (9 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| GET | `/api/v1/group_settings` | `get_group_settings` |
| POST | `/api/v1/group_settings` | `store_group_setting` |
| DELETE | `/api/v1/group_settings/{id}` | `delete_group_setting` |
| GET | `/api/v1/group_settings/{id}` | `show_group_setting` |
| PUT | `/api/v1/group_settings/{id}` | `update_group_setting` |
| GET | `/api/v1/group_settings/{id}/edit` | `edit_group_setting` |
| POST | `/api/v1/group_settings/{id}/upload` | `upload_group_setting` |
| POST | `/api/v1/group_settings/bulk` | `bulk_group_settings` |
| GET | `/api/v1/group_settings/create` | `get_group_settings_create` |
</details>
<details>
<summary><strong>products</strong> (9 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| GET | `/api/v1/products` | `get_products` |
| POST | `/api/v1/products` | `store_product` |
| DELETE | `/api/v1/products/{id}` | `delete_product` |
| GET | `/api/v1/products/{id}` | `show_product` |
| PUT | `/api/v1/products/{id}` | `update_product` |
| GET | `/api/v1/products/{id}/edit` | `edit_product` |
| POST | `/api/v1/products/{id}/upload` | `upload_product` |
| POST | `/api/v1/products/bulk` | `bulk_products` |
| GET | `/api/v1/products/create` | `get_products_create` |
</details>
<details>
<summary><strong>projects</strong> (9 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| GET | `/api/v1/projects` | `get_projects` |
| POST | `/api/v1/projects` | `store_project` |
| DELETE | `/api/v1/projects/{id}` | `delete_project` |
| GET | `/api/v1/projects/{id}` | `show_project` |
| PUT | `/api/v1/projects/{id}` | `update_project` |
| GET | `/api/v1/projects/{id}/edit` | `edit_project` |
| POST | `/api/v1/projects/{id}/upload` | `upload_project` |
| POST | `/api/v1/projects/bulk` | `bulk_projects` |
| GET | `/api/v1/projects/create` | `get_projects_create` |
</details>
<details>
<summary><strong>recurring_expenses</strong> (9 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| GET | `/api/v1/recurring_expenses` | `get_recurring_expenses` |
| POST | `/api/v1/recurring_expenses` | `store_recurring_expense` |
| DELETE | `/api/v1/recurring_expenses/{id}` | `delete_recurring_expense` |
| GET | `/api/v1/recurring_expenses/{id}` | `show_recurring_expense` |
| PUT | `/api/v1/recurring_expenses/{id}` | `update_recurring_expense` |
| GET | `/api/v1/recurring_expenses/{id}/edit` | `edit_recurring_expense` |
| POST | `/api/v1/recurring_expenses/{id}/upload` | `upload_recurring_expense` |
| POST | `/api/v1/recurring_expenses/bulk` | `bulk_recurring_expenses` |
| GET | `/api/v1/recurring_expenses/create` | `get_recurring_expenses_create` |
</details>
<details>
<summary><strong>recurring_quotes</strong> (9 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| GET | `/api/v1/recurring_quotes` | `get_recurring_quotes` |
| POST | `/api/v1/recurring_quotes` | `store_recurring_quote` |
| DELETE | `/api/v1/recurring_quotes/{id}` | `delete_recurring_quote` |
| GET | `/api/v1/recurring_quotes/{id}` | `show_recurring_quote` |
| PUT | `/api/v1/recurring_quotes/{id}` | `update_recurring_quote` |
| GET | `/api/v1/recurring_quotes/{id}/{action}` | `action_recurring_quote` |
| GET | `/api/v1/recurring_quotes/{id}/edit` | `edit_recurring_quote` |
| POST | `/api/v1/recurring_quotes/bulk` | `bulk_recurring_quotes` |
| GET | `/api/v1/recurring_quotes/create` | `get_recurring_quotes_create` |
</details>
<details>
<summary><strong>vendors</strong> (9 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| GET | `/api/v1/vendors` | `get_vendors` |
| POST | `/api/v1/vendors` | `store_vendor` |
| DELETE | `/api/v1/vendors/{id}` | `delete_vendor` |
| GET | `/api/v1/vendors/{id}` | `show_vendor` |
| PUT | `/api/v1/vendors/{id}` | `update_vendor` |
| GET | `/api/v1/vendors/{id}/edit` | `edit_vendor` |
| POST | `/api/v1/vendors/{id}/upload` | `upload_vendor` |
| POST | `/api/v1/vendors/bulk` | `bulk_vendors` |
| GET | `/api/v1/vendors/create` | `get_vendors_create` |
</details>
<details>
<summary><strong>bank_transaction_rules</strong> (8 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| GET | `/api/v1/bank_transaction_rules` | `get_bank_transaction_rules` |
| POST | `/api/v1/bank_transaction_rules` | `store_bank_transaction_rule` |
| DELETE | `/api/v1/bank_transaction_rules/{id}` | `delete_bank_transaction_rule` |
| GET | `/api/v1/bank_transaction_rules/{id}` | `show_bank_transaction_rule` |
| PUT | `/api/v1/bank_transaction_rules/{id}` | `update_bank_transaction_rule` |
| GET | `/api/v1/bank_transaction_rules/{id}/edit` | `edit_bank_transaction_rule` |
| POST | `/api/v1/bank_transaction_rules/bulk` | `bulk_bank_transaction_rules` |
| GET | `/api/v1/bank_transaction_rules/create` | `get_bank_transaction_rules_create` |
</details>
<details>
<summary><strong>company_gateways</strong> (8 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| GET | `/api/v1/company_gateways` | `get_company_gateways` |
| POST | `/api/v1/company_gateways` | `store_company_gateway` |
| DELETE | `/api/v1/company_gateways/{id}` | `delete_company_gateway` |
| GET | `/api/v1/company_gateways/{id}` | `show_company_gateway` |
| PUT | `/api/v1/company_gateways/{id}` | `update_company_gateway` |
| GET | `/api/v1/company_gateways/{id}/edit` | `edit_company_gateway` |
| POST | `/api/v1/company_gateways/bulk` | `bulk_company_gateways` |
| GET | `/api/v1/company_gateways/create` | `get_company_gateways_create` |
</details>
<details>
<summary><strong>designs</strong> (8 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| GET | `/api/v1/designs` | `get_designs` |
| POST | `/api/v1/designs` | `store_design` |
| DELETE | `/api/v1/designs/{id}` | `delete_design` |
| GET | `/api/v1/designs/{id}` | `show_design` |
| PUT | `/api/v1/designs/{id}` | `update_design` |
| GET | `/api/v1/designs/{id}/edit` | `edit_design` |
| POST | `/api/v1/designs/bulk` | `bulk_designs` |
| GET | `/api/v1/designs/create` | `get_designs_create` |
</details>
<details>
<summary><strong>expense_categories</strong> (8 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| GET | `/api/v1/expense_categories` | `get_expense_categorys` |
| POST | `/api/v1/expense_categories` | `store_expense_category` |
| DELETE | `/api/v1/expense_categories/{id}` | `delete_expense_category` |
| GET | `/api/v1/expense_categories/{id}` | `show_expense_category` |
| PUT | `/api/v1/expense_categories/{id}` | `update_expense_category` |
| GET | `/api/v1/expense_categories/{id}/edit` | `edit_expense_category` |
| POST | `/api/v1/expense_categories/bulk` | `bulk_expense_categorys` |
| GET | `/api/v1/expense_categories/create` | `get_expense_category_create` |
</details>
<details>
<summary><strong>payment_terms</strong> (8 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| GET | `/api/v1/payment_terms` | `get_payment_terms` |
| POST | `/api/v1/payment_terms` | `store_payment_term` |
| DELETE | `/api/v1/payment_terms/{id}` | `delete_payment_term` |
| GET | `/api/v1/payment_terms/{id}` | `show_payment_term` |
| PUT | `/api/v1/payment_terms/{id}` | `update_payment_term` |
| GET | `/api/v1/payment_terms/{id}/edit` | `edit_payment_terms` |
| POST | `/api/v1/payment_terms/bulk` | `bulk_payment_terms` |
| GET | `/api/v1/payment_terms/create` | `get_payment_terms_create` |
</details>
<details>
<summary><strong>subscriptions</strong> (8 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| GET | `/api/v1/subscriptions` | `get_subscriptions` |
| POST | `/api/v1/subscriptions` | `store_subscription` |
| DELETE | `/api/v1/subscriptions/{id}` | `delete_subscription` |
| GET | `/api/v1/subscriptions/{id}` | `show_subscription` |
| PUT | `/api/v1/subscriptions/{id}` | `update_subscription` |
| GET | `/api/v1/subscriptions/{id}/edit` | `edit_subscription` |
| POST | `/api/v1/subscriptions/bulk` | `bulk_subscriptions` |
| GET | `/api/v1/subscriptions/create` | `get_subscriptions_create` |
</details>
<details>
<summary><strong>tags</strong> (8 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| GET | `/api/v1/tags` | `get_tags` |
| POST | `/api/v1/tags` | `store_tag` |
| DELETE | `/api/v1/tags/{id}` | `delete_tag` |
| GET | `/api/v1/tags/{id}` | `show_tag` |
| PUT | `/api/v1/tags/{id}` | `update_tag` |
| GET | `/api/v1/tags/{id}/edit` | `edit_tag` |
| POST | `/api/v1/tags/bulk` | `bulk_tags` |
| GET | `/api/v1/tags/create` | `get_tags_create` |
</details>
<details>
<summary><strong>task_status</strong> (8 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| GET | `/api/v1/task_statuses` | `get_task_statuses` |
| POST | `/api/v1/task_statuses` | `store_task_status` |
| DELETE | `/api/v1/task_statuses/{id}` | `delete_task_status` |
| GET | `/api/v1/task_statuses/{id}` | `show_task_status` |
| PUT | `/api/v1/task_statuses/{id}` | `update_task_status` |
| GET | `/api/v1/task_statuses/{id}/edit` | `edit_task_statuss` |
| POST | `/api/v1/task_statuses/bulk` | `bulk_task_statuss` |
| GET | `/api/v1/task_statuses/create` | `get_task_statuss_create` |
</details>
<details>
<summary><strong>tokens</strong> (8 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| GET | `/api/v1/tokens` | `get_tokens` |
| POST | `/api/v1/tokens` | `store_token` |
| DELETE | `/api/v1/tokens/{id}` | `delete_token` |
| GET | `/api/v1/tokens/{id}` | `show_token` |
| PUT | `/api/v1/tokens/{id}` | `update_token` |
| GET | `/api/v1/tokens/{id}/edit` | `edit_token` |
| POST | `/api/v1/tokens/bulk` | `bulk_tokens` |
| GET | `/api/v1/tokens/create` | `get_tokens_create` |
</details>
<details>
<summary><strong>webhooks</strong> (8 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| GET | `/api/v1/webhooks` | `get_webhooks` |
| POST | `/api/v1/webhooks` | `store_webhook` |
| DELETE | `/api/v1/webhooks/{id}` | `delete_webhook` |
| GET | `/api/v1/webhooks/{id}` | `show_webhook` |
| PUT | `/api/v1/webhooks/{id}` | `update_webhook` |
| GET | `/api/v1/webhooks/{id}/edit` | `edit_webhook` |
| POST | `/api/v1/webhooks/bulk` | `bulk_webhooks` |
| GET | `/api/v1/webhooks/create` | `get_webhooks_create` |
</details>
<details>
<summary><strong>client_gateway_tokens</strong> (7 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| GET | `/api/v1/client_gateway_tokens` | `get_client_gateway_tokens` |
| POST | `/api/v1/client_gateway_tokens` | `store_client_gateway_token` |
| DELETE | `/api/v1/client_gateway_tokens/{id}` | `delete_client_gateway_token` |
| GET | `/api/v1/client_gateway_tokens/{id}` | `show_client_gateway_token` |
| PUT | `/api/v1/client_gateway_tokens/{id}` | `update_client_gateway_token` |
| GET | `/api/v1/client_gateway_tokens/{id}/edit` | `edit_client_gateway_token` |
| GET | `/api/v1/client_gateway_tokens/create` | `get_client_gateway_tokens_create` |
</details>
<details>
<summary><strong>locations</strong> (7 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| GET | `/api/v1/locations` | `get_locations` |
| POST | `/api/v1/locations` | `store_location` |
| DELETE | `/api/v1/locations/{id}` | `delete_location` |
| GET | `/api/v1/locations/{id}` | `show_location` |
| PUT | `/api/v1/locations/{id}` | `update_location` |
| POST | `/api/v1/locations/bulk` | `bulk_locations` |
| GET | `/api/v1/locations/create` | `get_locations_create` |
</details>
<details>
<summary><strong>task_schedulers</strong> (7 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| GET | `/api/v1/task_schedulers` | `get_task_schedulers` |
| POST | `/api/v1/task_schedulers` | `create_task_scheduler` |
| DELETE | `/api/v1/task_schedulers/{id}` | `destroy_task_scheduler` |
| GET | `/api/v1/task_schedulers/{id}` | `show_task_scheduler` |
| PUT | `/api/v1/task_schedulers/{id}` | `update_task_scheduler` |
| POST | `/api/v1/task_schedulers/bulk` | `bulk_task_scheduler_actions` |
| GET | `/api/v1/task_schedulers/create` | `get_task_scheduler` |
</details>
<details>
<summary><strong>tax_rates</strong> (7 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| GET | `/api/v1/tax_rates` | `get_tax_rates` |
| DELETE | `/api/v1/tax_rates/{id}` | `delete_tax_rate` |
| GET | `/api/v1/tax_rates/{id}` | `show_tax_rate` |
| PUT | `/api/v1/tax_rates/{id}` | `update_tax_rate` |
| GET | `/api/v1/tax_rates/{id}/edit` | `edit_tax_rate` |
| POST | `/api/v1/tax_rates/bulk` | `bulk_tax_rates` |
| GET | `/api/v1/tax_rates/create` | `get_tax_rate_create` |
</details>
<details>
<summary><strong>auth</strong> (6 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| POST | `/api/v1/login` | `post_login` |
| POST | `/api/v1/passkeys/login/options` | `post_passkey_login_options` |
| GET | `/api/v1/settings/passkeys` | `get_settings_passkeys` |
| POST | `/api/v1/settings/passkeys` | `post_settings_passkeys` |
| DELETE | `/api/v1/settings/passkeys/{passkey}` | `delete_settings_passkey` |
| POST | `/api/v1/settings/passkeys/options` | `post_settings_passkeys_options` |
</details>
<details>
<summary><strong>activities</strong> (4 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| GET | `/api/v1/activities` | `get_activities` |
| GET | `/api/v1/activities/download_entity/{activity_id}` | `get_activity_historical_entity_pdf` |
| POST | `/api/v1/activities/entity` | `post_activities_entity` |
| POST | `/api/v1/activities/notes` | `post_activities_notes` |
</details>
<details>
<summary><strong>charts</strong> (4 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| POST | `/api/v1/charts/calculated_fields` | `get_chart_calculated_fields` |
| POST | `/api/v1/charts/chart_summary_v2` | `get_chart_summary_v2` |
| POST | `/api/v1/charts/totals` | `get_chart_totals` |
| POST | `/api/v1/charts/totals_v2` | `get_chart_totals_v2` |
</details>
<details>
<summary><strong>imports</strong> (3 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| POST | `/api/v1/import` | `post_import` |
| POST | `/api/v1/import_json` | `get_import_json` |
| POST | `/api/v1/preimport` | `preimport` |
</details>
<details>
<summary><strong>migration</strong> (3 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| POST | `/api/v1/migration/purge_save_settings/{company}` | `post_purge_company_save_settings` |
| POST | `/api/v1/migration/purge/{company}` | `post_purge_company` |
| POST | `/api/v1/migration/start` | `post_start_migration` |
</details>
<details>
<summary><strong>postmark</strong> (3 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| POST | `/api/v1/apple/confirm_purchase` | `confirm_apple_purchase` |
| POST | `/api/v1/apple/process_webhook` | `process_apple_webhook` |
| POST | `/api/v1/postmark_webhook` | `postmark_webhook` |
</details>
<details>
<summary><strong>ping</strong> (2 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| GET | `/api/v1/last_error` | `get_last_error` |
| GET | `/api/v1/ping` | `get_ping` |
</details>
<details>
<summary><strong>preview</strong> (2 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| POST | `/api/v1/preview` | `get_preview` |
| POST | `/api/v1/preview/purchase_order` | `get_preview_purchase_order` |
</details>
<details>
<summary><strong>system_logs</strong> (2 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| GET | `/api/v1/system_logs` | `get_system_logs` |
| GET | `/api/v1/system_logs/{id}` | `show_system_logs` |
</details>
<details>
<summary><strong>templates</strong> (2 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| POST | `/api/v1/templates` | `get_show_template` |
| POST | `/api/v1/templates/preview/{hash}` | `get_template_preview` |
</details>
<details>
<summary><strong>update</strong> (2 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| POST | `/api/v1/self-update` | `self_update` |
| POST | `/api/v1/self-update/check_version` | `self_update_check_version` |
</details>
<details>
<summary><strong>claim_license</strong> (1 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| GET | `/api/v1/claim_license` | `get_claim_license` |
</details>
<details>
<summary><strong>company_ledger</strong> (1 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| GET | `/api/v1/company_ledger` | `get_company_ledger` |
</details>
<details>
<summary><strong>company_user</strong> (1 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| POST | `/api/v1/company_users` | `update_company_user` |
</details>
<details>
<summary><strong>connected_account</strong> (1 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| POST | `/api/v1/connected_account` | `post_connected_account` |
</details>
<details>
<summary><strong>documents</strong> (1 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| GET | `/api/v1/documents` | `get_documents` |
</details>
<details>
<summary><strong>emails</strong> (1 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| POST | `/api/v1/emails` | `send_email_template` |
</details>
<details>
<summary><strong>export</strong> (1 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| POST | `/api/v1/export` | `get_export` |
</details>
<details>
<summary><strong>health_check</strong> (1 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| GET | `/api/v1/health_check` | `get_health_check` |
</details>
<details>
<summary><strong>logout</strong> (1 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| POST | `/api/v1/logout` | `get_logout` |
</details>
<details>
<summary><strong>one_time_token</strong> (1 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| POST | `/api/v1/one_time_token` | `post_one_time_token` |
</details>
<details>
<summary><strong>refresh</strong> (1 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| POST | `/api/v1/refresh` | `post_refresh` |
</details>
<details>
<summary><strong>scheduler</strong> (1 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| GET | `/api/v1/scheduler` | `get_scheduler` |
</details>
<details>
<summary><strong>search</strong> (1 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| POST | `/api/v1/search` | `post_search` |
</details>
<details>
<summary><strong>statics</strong> (1 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| GET | `/api/v1/statics` | `get_statics` |
</details>
<details>
<summary><strong>support</strong> (1 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| POST | `/api/v1/support/messages/send` | `support_message` |
</details>
<details>
<summary><strong>webcron</strong> (1 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| GET | `/api/v1/webcron` | `get_webcron` |
</details>
<details>
<summary><strong>yodlee</strong> (1 operations)</summary>
| Method | Path | Operation ID |
|---|---|---|
| POST | `/api/v1/yodlee/refresh` | `yodlee_refresh_webhook` |
</details>
## Contributing
Contributions and issues are welcome. Please open an issue first before submitting a PR.
## License
AGPL-3.0: free for personal and open-source use. Organizations that cannot comply with the AGPL can purchase a commercial license, and hosted/managed versions are available. See [COMMERCIAL.md](https://github.com/NightSquawk/invoiceninja-mcp-server/blob/v1.0.0/COMMERCIAL.md) or contact hello@nightsquawk.tech.
### Copyright
For copyright concerns or takedown requests, contact hello@nightsquawk.tech.
TDQS
A4.3/5.0
Scored across 3 tools
Disambiguation5/5
Each tool has a clear, distinct role: list_endpoints for discovery, describe_endpoint for details, and call_endpoint for execution. No overlap or ambiguity.
Naming Consistency5/5
All tool names follow a consistent verb_noun pattern with snake_case (list_endpoints, describe_endpoint, call_endpoint), making the pattern predictable.
Tool Count4/5
With only 3 tools, the set is minimal but well-suited for its meta-API exploration purpose. The count feels slightly low but efficient for the intended workflow.
Completeness5/5
The tool set covers the full lifecycle of API interaction: discover endpoints, inspect parameters, and execute calls. There are no missing operations for this domain.
Maintenance
ActivityMaintained
ResponsivenessNo issues