invoice-ninja

Manage Invoice Ninja clients, invoices, quotes, expenses, tasks and projects.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
94%
Naming quality
78%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Findings (2)

  • LOWTool 'invoiceninja_list_recurring_invoices' name length outside 3-30 rangein invoiceninja_list_recurring_invoices
  • LOWTool 'invoiceninja_convert_quote_to_invoice' name length outside 3-30 rangein invoiceninja_convert_quote_to_invoice

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~7,004Tokens (tool definitions)
~2.8 KBTypical response size
Significant attention impact (5.47% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "invoice-ninja": {
      "url": "https://invoice-ninja.usefulapi.io/mcp"
    }
  }
}

Remote endpoints

https://invoice-ninja.usefulapi.io/mcpstreamable-http

What it can do

Tool inventory

Tools (24)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢invoiceninja_list_clients(filter, name, email, number, balance, ...)

List clients with balances and contacts, optionally searched by name, email or number. Invoice Ninja: GET /api/v1/clients.

Input Schema

{
  "type": "object",
  "properties": {
    "filter": {
      "description": "Free-text search across name, id number, contact names/emails/phones and custom fields.",
      "type": "string"
    },
    "name": {
      "description": "Only clients whose name matches.",
      "type": "string"
    },
    "email": {
      "description": "Only the client with a contact at this email.",
      "type": "string"
    },
    "number": {
      "description": "Only the client with this client number.",
      "type": "string"
    },
    "balance": {
      "description": "Balance comparison \"op:value\", op one of lt, lte, gt, gte, eq, e.g. \"gt:0\".",
      "type": "string"
    },
    "per_page": {
      "description": "Records per page, 1-100 (API default 20).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "page": {
      "description": "Page number, starting at 1.",
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    },
    "sort": {
      "description": "Sort as \"column|asc\" or \"column|desc\", e.g. \"number|desc\" or \"balance|desc\".",
      "type": "string"
    },
    "status": {
      "description": "Comma-separated record state: active, archived, deleted (e.g. \"active\"). Omit for all.",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢invoiceninja_get_client(client_id)

Fetch one client by id, with contacts, address, balance and paid-to-date. Invoice Ninja: GET /api/v1/clients/{id}.

Input Schema

{
  "type": "object",
  "properties": {
    "client_id": {
      "type": "string",
      "minLength": 1,
      "description": "The client's hashed id, e.g. \"Wpmbk5ezJn\"."
    }
  },
  "required": [
    "client_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢invoiceninja_list_invoices(client_id, client_status, number, filter, date_range, ...)

List invoices, filterable by client and payment status (paid / unpaid / overdue). status_id on each invoice: 1 draft, 2 sent, 3 partial, 4 paid, 5 cancelled, 6 reversed. Invoice Ninja: GET /api/v1/invoices.

Input Schema

{
  "type": "object",
  "properties": {
    "client_id": {
      "description": "Only records for this client (hashed id).",
      "type": "string"
    },
    "client_status": {
      "description": "Comma-separated payment status: all, paid, unpaid, overdue.",
      "type": "string"
    },
    "number": {
      "description": "Only the invoice with this number.",
      "type": "string"
    },
    "filter": {
      "description": "Free-text search across number, PO number, date, amount, balance, client name/contacts and line items.",
      "type": "string"
    },
    "date_range": {
      "description": "Invoice-date range \"YYYY-MM-DD,YYYY-MM-DD\".",
      "type": "string"
    },
    "per_page": {
      "description": "Records per page, 1-100 (API default 20).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "page": {
      "description": "Page number, starting at 1.",
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    },
    "sort": {
      "description": "Sort as \"column|asc\" or \"column|desc\", e.g. \"number|desc\" or \"balance|desc\".",
      "type": "string"
    },
    "status": {
      "description": "Comma-separated record state: active, archived, deleted (e.g. \"active\"). Omit for all.",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢invoiceninja_get_invoice(invoice_id)

Fetch one invoice by id — line items, totals, balance, dates, status and invitations. Invoice Ninja: GET /api/v1/invoices/{id}.

Input Schema

{
  "type": "object",
  "properties": {
    "invoice_id": {
      "type": "string",
      "minLength": 1,
      "description": "The invoice's hashed id, e.g. \"Wpmbk5ezJn\"."
    }
  },
  "required": [
    "invoice_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢invoiceninja_list_quotes(client_id, client_status, number, filter, per_page, ...)

List quotes (estimates), filterable by client and quote status. Invoice Ninja: GET /api/v1/quotes.

Input Schema

{
  "type": "object",
  "properties": {
    "client_id": {
      "description": "Only records for this client (hashed id).",
      "type": "string"
    },
    "client_status": {
      "description": "Comma-separated quote status: all, draft, sent, approved, expired, upcoming.",
      "type": "string"
    },
    "number": {
      "description": "Only the quote with this number.",
      "type": "string"
    },
    "filter": {
      "description": "Free-text search across number and custom fields.",
      "type": "string"
    },
    "per_page": {
      "description": "Records per page, 1-100 (API default 20).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "page": {
      "description": "Page number, starting at 1.",
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    },
    "sort": {
      "description": "Sort as \"column|asc\" or \"column|desc\", e.g. \"number|desc\" or \"balance|desc\".",
      "type": "string"
    },
    "status": {
      "description": "Comma-separated record state: active, archived, deleted (e.g. \"active\"). Omit for all.",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢invoiceninja_get_quote(quote_id)

Fetch one quote by id — line items, totals, status and the invoice it was converted to (invoice_id), if any. Invoice Ninja: GET /api/v1/quotes/{id}.

Input Schema

{
  "type": "object",
  "properties": {
    "quote_id": {
      "type": "string",
      "minLength": 1,
      "description": "The quote's hashed id, e.g. \"Wpmbk5ezJn\"."
    }
  },
  "required": [
    "quote_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢invoiceninja_list_products(filter, product_key, per_page, page, sort, ...)

List products / services in the catalog with price, cost and default taxes. Invoice Ninja: GET /api/v1/products.

Input Schema

{
  "type": "object",
  "properties": {
    "filter": {
      "description": "Free-text search across product name.",
      "type": "string"
    },
    "product_key": {
      "description": "Only the product with this product key.",
      "type": "string"
    },
    "per_page": {
      "description": "Records per page, 1-100 (API default 20).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "page": {
      "description": "Page number, starting at 1.",
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    },
    "sort": {
      "description": "Sort as \"column|asc\" or \"column|desc\", e.g. \"number|desc\" or \"balance|desc\".",
      "type": "string"
    },
    "status": {
      "description": "Comma-separated record state: active, archived, deleted (e.g. \"active\"). Omit for all.",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢invoiceninja_list_payments(client_id, number, filter, per_page, page, ...)

List payments received, with amount, date, refunded/applied totals and the invoices each was applied to (paymentables). Read-only: this server never records or refunds payments. Invoice Ninja: GET /api/v1/payments.

Input Schema

{
  "type": "object",
  "properties": {
    "client_id": {
      "description": "Only records for this client (hashed id).",
      "type": "string"
    },
    "number": {
      "description": "Only the payment with this number.",
      "type": "string"
    },
    "filter": {
      "description": "Free-text search across amount, date and custom fields.",
      "type": "string"
    },
    "per_page": {
      "description": "Records per page, 1-100 (API default 20).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "page": {
      "description": "Page number, starting at 1.",
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    },
    "sort": {
      "description": "Sort as \"column|asc\" or \"column|desc\", e.g. \"number|desc\" or \"balance|desc\".",
      "type": "string"
    },
    "status": {
      "description": "Comma-separated record state: active, archived, deleted (e.g. \"active\"). Omit for all.",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢invoiceninja_list_expenses(client_id, client_status, number, filter, per_page, ...)

List expenses, filterable by client and invoicing/payment state. Invoice Ninja: GET /api/v1/expenses.

Input Schema

{
  "type": "object",
  "properties": {
    "client_id": {
      "description": "Only records for this client (hashed id).",
      "type": "string"
    },
    "client_status": {
      "description": "Comma-separated: all, logged, pending, invoiced, uninvoiced, paid, unpaid.",
      "type": "string"
    },
    "number": {
      "description": "Only the expense with this number.",
      "type": "string"
    },
    "filter": {
      "description": "Free-text search across expense fields.",
      "type": "string"
    },
    "per_page": {
      "description": "Records per page, 1-100 (API default 20).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "page": {
      "description": "Page number, starting at 1.",
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    },
    "sort": {
      "description": "Sort as \"column|asc\" or \"column|desc\", e.g. \"number|desc\" or \"balance|desc\".",
      "type": "string"
    },
    "status": {
      "description": "Comma-separated record state: active, archived, deleted (e.g. \"active\"). Omit for all.",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢invoiceninja_list_vendors(filter, number, per_page, page, sort, ...)

List vendors (suppliers) with contacts and address. Invoice Ninja: GET /api/v1/vendors.

Input Schema

{
  "type": "object",
  "properties": {
    "filter": {
      "description": "Free-text search across vendor name and contacts.",
      "type": "string"
    },
    "number": {
      "description": "Only the vendor with this number.",
      "type": "string"
    },
    "per_page": {
      "description": "Records per page, 1-100 (API default 20).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "page": {
      "description": "Page number, starting at 1.",
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    },
    "sort": {
      "description": "Sort as \"column|asc\" or \"column|desc\", e.g. \"number|desc\" or \"balance|desc\".",
      "type": "string"
    },
    "status": {
      "description": "Comma-separated record state: active, archived, deleted (e.g. \"active\"). Omit for all.",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢invoiceninja_list_tasks(client_id, client_status, number, filter, per_page, ...)

List tasks / time entries with their time_log, duration, rate and linked client, project and invoice. Invoice Ninja: GET /api/v1/tasks.

Input Schema

{
  "type": "object",
  "properties": {
    "client_id": {
      "description": "Only records for this client (hashed id).",
      "type": "string"
    },
    "client_status": {
      "description": "Comma-separated: all, invoiced, uninvoiced, is_running, overdue.",
      "type": "string"
    },
    "number": {
      "description": "Only the task with this number.",
      "type": "string"
    },
    "filter": {
      "description": "Free-text search across task description and custom fields.",
      "type": "string"
    },
    "per_page": {
      "description": "Records per page, 1-100 (API default 20).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "page": {
      "description": "Page number, starting at 1.",
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    },
    "sort": {
      "description": "Sort as \"column|asc\" or \"column|desc\", e.g. \"number|desc\" or \"balance|desc\".",
      "type": "string"
    },
    "status": {
      "description": "Comma-separated record state: active, archived, deleted (e.g. \"active\"). Omit for all.",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢invoiceninja_list_projects(client_id, filter, number, per_page, page, ...)

List projects with client, budgeted hours, task rate, current hours and due date. Invoice Ninja: GET /api/v1/projects.

Input Schema

{
  "type": "object",
  "properties": {
    "client_id": {
      "description": "Only records for this client (hashed id).",
      "type": "string"
    },
    "filter": {
      "description": "Free-text search across project name and notes.",
      "type": "string"
    },
    "number": {
      "description": "Only the project with this number.",
      "type": "string"
    },
    "per_page": {
      "description": "Records per page, 1-100 (API default 20).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "page": {
      "description": "Page number, starting at 1.",
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    },
    "sort": {
      "description": "Sort as \"column|asc\" or \"column|desc\", e.g. \"number|desc\" or \"balance|desc\".",
      "type": "string"
    },
    "status": {
      "description": "Comma-separated record state: active, archived, deleted (e.g. \"active\"). Omit for all.",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢invoiceninja_list_recurring_invoices(client_id, client_status, number, per_page, page, ...)

List recurring invoice schedules with frequency, next send date and remaining cycles. Read-only. Invoice Ninja: GET /api/v1/recurring_invoices.

Input Schema

{
  "type": "object",
  "properties": {
    "client_id": {
      "description": "Only records for this client (hashed id).",
      "type": "string"
    },
    "client_status": {
      "description": "Comma-separated: all, active, paused, completed.",
      "type": "string"
    },
    "number": {
      "description": "Only the recurring invoice with this number.",
      "type": "string"
    },
    "per_page": {
      "description": "Records per page, 1-100 (API default 20).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "page": {
      "description": "Page number, starting at 1.",
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    },
    "sort": {
      "description": "Sort as \"column|asc\" or \"column|desc\", e.g. \"number|desc\" or \"balance|desc\".",
      "type": "string"
    },
    "status": {
      "description": "Comma-separated record state: active, archived, deleted (e.g. \"active\"). Omit for all.",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴invoiceninja_create_client(name, website, phone, address1, address2, ...)

Create a client, optionally with contacts. Give at least a name or one contact. Invoice Ninja: POST /api/v1/clients.

Input Schema

{
  "type": "object",
  "properties": {
    "name": {
      "description": "Client company / display name.",
      "type": "string"
    },
    "website": {
      "type": "string"
    },
    "phone": {
      "type": "string"
    },
    "address1": {
      "type": "string"
    },
    "address2": {
      "type": "string"
    },
    "city": {
      "type": "string"
    },
    "state": {
      "type": "string"
    },
    "postal_code": {
      "type": "string"
    },
    "country_id": {
      "description": "Country as its ISO 3166-1 NUMERIC code, as a string, e.g. \"840\" (US), \"826\" (UK), \"276\" (DE).",
      "type": "string"
    },
    "vat_number": {
      "type": "string"
    },
    "id_number": {
      "description": "Your own id / registration number for this client.",
      "type": "string"
    },
    "public_notes": {
      "type": "string"
    },
    "private_notes": {
      "type": "string"
    },
    "contacts": {
      "description": "People at the client; the first is the primary contact.",
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "first_name": {
            "type": "string"
          },
          "last_name": {
            "type": "string"
          },
          "email": {
            "description": "Contact email (unique per client).",
            "type": "string"
          },
          "phone": {
            "type": "string"
          },
          "send_email": {
            "description": "Whether this contact receives invoice emails.",
            "type": "boolean"
          }
        }
      }
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴invoiceninja_update_client(client_id, name, website, phone, address1, ...)

Update a client's details; only the fields you pass change. Passing contacts replaces the contact list. Invoice Ninja: PUT /api/v1/clients/{id}.

Input Schema

{
  "type": "object",
  "properties": {
    "client_id": {
      "type": "string",
      "minLength": 1,
      "description": "The client's hashed id, e.g. \"Wpmbk5ezJn\"."
    },
    "name": {
      "description": "Client company / display name.",
      "type": "string"
    },
    "website": {
      "type": "string"
    },
    "phone": {
      "type": "string"
    },
    "address1": {
      "type": "string"
    },
    "address2": {
      "type": "string"
    },
    "city": {
      "type": "string"
    },
    "state": {
      "type": "string"
    },
    "postal_code": {
      "type": "string"
    },
    "country_id": {
      "description": "Country as its ISO 3166-1 NUMERIC code, as a string, e.g. \"840\" (US), \"826\" (UK), \"276\" (DE).",
      "type": "string"
    },
    "vat_number": {
      "type": "string"
    },
    "id_number": {
      "description": "Your own id / registration number for this client.",
      "type": "string"
    },
    "public_notes": {
      "type": "string"
    },
    "private_notes": {
      "type": "string"
    },
    "contacts": {
      "description": "Full replacement contact list.",
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "first_name": {
            "type": "string"
          },
          "last_name": {
            "type": "string"
          },
          "email": {
            "description": "Contact email (unique per client).",
            "type": "string"
          },
          "phone": {
            "type": "string"
          },
          "send_email": {
            "description": "Whether this contact receives invoice emails.",
            "type": "boolean"
          }
        }
      }
    }
  },
  "required": [
    "client_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴invoiceninja_create_invoice(client_id, date, due_date, number, po_number, ...)

Create a DRAFT invoice for a client. It is not sent or emailed — use invoiceninja_mark_invoice_sent or invoiceninja_email_invoice afterwards. Invoice Ninja: POST /api/v1/invoices.

Input Schema

{
  "type": "object",
  "properties": {
    "client_id": {
      "type": "string",
      "minLength": 1,
      "description": "The client's hashed id, e.g. \"Wpmbk5ezJn\"."
    },
    "date": {
      "description": "Document date, YYYY-MM-DD.",
      "type": "string"
    },
    "due_date": {
      "description": "Due date (valid-until for quotes), YYYY-MM-DD.",
      "type": "string"
    },
    "number": {
      "description": "Document number. Omit to let Invoice Ninja assign the next one.",
      "type": "string"
    },
    "po_number": {
      "description": "Purchase order number.",
      "type": "string"
    },
    "line_items": {
      "description": "Line items. On update this REPLACES all existing lines.",
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "product_key": {
            "description": "Product / item name (the product key).",
            "type": "string"
          },
          "notes": {
            "description": "Line description.",
            "type": "string"
          },
          "cost": {
            "description": "Unit price.",
            "type": "number"
          },
          "quantity": {
            "description": "Quantity.",
            "type": "number"
          },
          "discount": {
            "description": "Line discount (amount or percent, see is_amount_discount).",
            "type": "number"
          },
          "is_amount_discount": {
            "description": "true = discount is an amount; false = a percentage.",
            "type": "boolean"
          },
          "tax_name1": {
            "description": "First tax name, e.g. VAT.",
            "type": "string"
          },
          "tax_rate1": {
            "description": "First tax rate in percent.",
            "type": "number"
          },
          "tax_name2": {
            "description": "Second tax name.",
            "type": "string"
          },
          "tax_rate2": {
            "description": "Second tax rate in percent.",
            "type": "number"
          }
        }
      }
    },
    "public_notes": {
      "description": "Notes shown to the client.",
      "type": "string"
    },
    "private_notes": {
      "description": "Internal notes, not shown to the client.",
      "type": "string"
    },
    "terms": {
      "description": "Terms text.",
      "type": "string"
    },
    "footer": {
      "description": "Footer text.",
      "type": "string"
    },
    "discount": {
      "description": "Document-level discount (amount or percent).",
      "type": "number"
    },
    "is_amount_discount": {
      "description": "true = discount is an amount; false = a percentage.",
      "type": "boolean"
    },
    "partial": {
      "description": "Deposit / partial amount due first.",
      "type": "number"
    },
    "partial_due_date": {
      "description": "Due date of the partial amount, YYYY-MM-DD.",
      "type": "string"
    },
    "project_id": {
      "description": "Link to a project (hashed id).",
      "type": "string"
    },
    "tax_name1": {
      "description": "Document-level tax name.",
      "type": "string"
    },
    "tax_rate1": {
      "description": "Document-level tax rate in percent.",
      "type": "number"
    }
  },
  "required": [
    "client_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴invoiceninja_update_invoice(invoice_id, date, due_date, number, po_number, ...)

Edit an invoice; only the fields you pass change, but line_items (if passed) replace every existing line. Does not send anything. Invoice Ninja: PUT /api/v1/invoices/{id}.

Input Schema

{
  "type": "object",
  "properties": {
    "invoice_id": {
      "type": "string",
      "minLength": 1,
      "description": "The invoice's hashed id, e.g. \"Wpmbk5ezJn\"."
    },
    "date": {
      "description": "Document date, YYYY-MM-DD.",
      "type": "string"
    },
    "due_date": {
      "description": "Due date (valid-until for quotes), YYYY-MM-DD.",
      "type": "string"
    },
    "number": {
      "description": "Document number. Omit to let Invoice Ninja assign the next one.",
      "type": "string"
    },
    "po_number": {
      "description": "Purchase order number.",
      "type": "string"
    },
    "line_items": {
      "description": "Line items. On update this REPLACES all existing lines.",
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "product_key": {
            "description": "Product / item name (the product key).",
            "type": "string"
          },
          "notes": {
            "description": "Line description.",
            "type": "string"
          },
          "cost": {
            "description": "Unit price.",
            "type": "number"
          },
          "quantity": {
            "description": "Quantity.",
            "type": "number"
          },
          "discount": {
            "description": "Line discount (amount or percent, see is_amount_discount).",
            "type": "number"
          },
          "is_amount_discount": {
            "description": "true = discount is an amount; false = a percentage.",
            "type": "boolean"
          },
          "tax_name1": {
            "description": "First tax name, e.g. VAT.",
            "type": "string"
          },
          "tax_rate1": {
            "description": "First tax rate in percent.",
            "type": "number"
          },
          "tax_name2": {
            "description": "Second tax name.",
            "type": "string"
          },
          "tax_rate2": {
            "description": "Second tax rate in percent.",
            "type": "number"
          }
        }
      }
    },
    "public_notes": {
      "description": "Notes shown to the client.",
      "type": "string"
    },
    "private_notes": {
      "description": "Internal notes, not shown to the client.",
      "type": "string"
    },
    "terms": {
      "description": "Terms text.",
      "type": "string"
    },
    "footer": {
      "description": "Footer text.",
      "type": "string"
    },
    "discount": {
      "description": "Document-level discount (amount or percent).",
      "type": "number"
    },
    "is_amount_discount": {
      "description": "true = discount is an amount; false = a percentage.",
      "type": "boolean"
    },
    "partial": {
      "description": "Deposit / partial amount due first.",
      "type": "number"
    },
    "partial_due_date": {
      "description": "Due date of the partial amount, YYYY-MM-DD.",
      "type": "string"
    },
    "project_id": {
      "description": "Link to a project (hashed id).",
      "type": "string"
    },
    "tax_name1": {
      "description": "Document-level tax name.",
      "type": "string"
    },
    "tax_rate1": {
      "description": "Document-level tax rate in percent.",
      "type": "number"
    }
  },
  "required": [
    "invoice_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴invoiceninja_mark_invoice_sent(invoice_id)

Mark a draft invoice as sent WITHOUT emailing it. This moves it out of draft and adds its amount to the client's balance. Invoice Ninja: GET /api/v1/invoices/{id}/mark_sent.

Input Schema

{
  "type": "object",
  "properties": {
    "invoice_id": {
      "type": "string",
      "minLength": 1,
      "description": "The invoice's hashed id, e.g. \"Wpmbk5ezJn\"."
    }
  },
  "required": [
    "invoice_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴invoiceninja_email_invoice(invoice_id, email_type)

OUTWARD-FACING: sends a real email with the invoice to the client's invited contacts, and marks the invoice sent. Cannot be unsent — confirm with the user first. Invoice Ninja: POST /api/v1/invoices/bulk with action=email.

Input Schema

{
  "type": "object",
  "properties": {
    "invoice_id": {
      "type": "string",
      "minLength": 1,
      "description": "The invoice's hashed id, e.g. \"Wpmbk5ezJn\"."
    },
    "email_type": {
      "description": "Which email template to send (default: the invoice template).",
      "type": "string",
      "enum": [
        "invoice",
        "reminder1",
        "reminder2",
        "reminder3",
        "reminder_endless",
        "custom1",
        "custom2",
        "custom3"
      ]
    }
  },
  "required": [
    "invoice_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴invoiceninja_create_quote(client_id, date, due_date, number, po_number, ...)

Create a DRAFT quote (estimate) for a client. Nothing is emailed. Invoice Ninja: POST /api/v1/quotes.

Input Schema

{
  "type": "object",
  "properties": {
    "client_id": {
      "type": "string",
      "minLength": 1,
      "description": "The client's hashed id, e.g. \"Wpmbk5ezJn\"."
    },
    "date": {
      "description": "Document date, YYYY-MM-DD.",
      "type": "string"
    },
    "due_date": {
      "description": "Due date (valid-until for quotes), YYYY-MM-DD.",
      "type": "string"
    },
    "number": {
      "description": "Document number. Omit to let Invoice Ninja assign the next one.",
      "type": "string"
    },
    "po_number": {
      "description": "Purchase order number.",
      "type": "string"
    },
    "line_items": {
      "description": "Line items. On update this REPLACES all existing lines.",
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "product_key": {
            "description": "Product / item name (the product key).",
            "type": "string"
          },
          "notes": {
            "description": "Line description.",
            "type": "string"
          },
          "cost": {
            "description": "Unit price.",
            "type": "number"
          },
          "quantity": {
            "description": "Quantity.",
            "type": "number"
          },
          "discount": {
            "description": "Line discount (amount or percent, see is_amount_discount).",
            "type": "number"
          },
          "is_amount_discount": {
            "description": "true = discount is an amount; false = a percentage.",
            "type": "boolean"
          },
          "tax_name1": {
            "description": "First tax name, e.g. VAT.",
            "type": "string"
          },
          "tax_rate1": {
            "description": "First tax rate in percent.",
            "type": "number"
          },
          "tax_name2": {
            "description": "Second tax name.",
            "type": "string"
          },
          "tax_rate2": {
            "description": "Second tax rate in percent.",
            "type": "number"
          }
        }
      }
    },
    "public_notes": {
      "description": "Notes shown to the client.",
      "type": "string"
    },
    "private_notes": {
      "description": "Internal notes, not shown to the client.",
      "type": "string"
    },
    "terms": {
      "description": "Terms text.",
      "type": "string"
    },
    "footer": {
      "description": "Footer text.",
      "type": "string"
    },
    "discount": {
      "description": "Document-level discount (amount or percent).",
      "type": "number"
    },
    "is_amount_discount": {
      "description": "true = discount is an amount; false = a percentage.",
      "type": "boolean"
    },
    "partial": {
      "description": "Deposit / partial amount due first.",
      "type": "number"
    },
    "partial_due_date": {
      "description": "Due date of the partial amount, YYYY-MM-DD.",
      "type": "string"
    },
    "project_id": {
      "description": "Link to a project (hashed id).",
      "type": "string"
    },
    "tax_name1": {
      "description": "Document-level tax name.",
      "type": "string"
    },
    "tax_rate1": {
      "description": "Document-level tax rate in percent.",
      "type": "number"
    }
  },
  "required": [
    "client_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴invoiceninja_convert_quote_to_invoice(quote_id)

Convert a quote into a new invoice (the quote is marked converted and links to it). Returns the new invoice. Invoice Ninja: GET /api/v1/quotes/{id}/convert_to_invoice.

Input Schema

{
  "type": "object",
  "properties": {
    "quote_id": {
      "type": "string",
      "minLength": 1,
      "description": "The quote's hashed id, e.g. \"Wpmbk5ezJn\"."
    }
  },
  "required": [
    "quote_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴invoiceninja_create_expense(amount, date, vendor_id, client_id, project_id, ...)

Log an expense, optionally tied to a vendor, client or project and flagged to be re-invoiced. Invoice Ninja: POST /api/v1/expenses.

Input Schema

{
  "type": "object",
  "properties": {
    "amount": {
      "type": "number",
      "description": "Expense amount."
    },
    "date": {
      "description": "Expense date, YYYY-MM-DD.",
      "type": "string"
    },
    "vendor_id": {
      "description": "Vendor (hashed id).",
      "type": "string"
    },
    "client_id": {
      "description": "Client to re-bill (hashed id).",
      "type": "string"
    },
    "project_id": {
      "description": "Project (hashed id).",
      "type": "string"
    },
    "category_id": {
      "description": "Expense category (hashed id).",
      "type": "string"
    },
    "currency_id": {
      "description": "Currency id as a string, e.g. \"1\" (USD). Omit for the company default.",
      "type": "string"
    },
    "public_notes": {
      "description": "Description.",
      "type": "string"
    },
    "private_notes": {
      "type": "string"
    },
    "transaction_reference": {
      "description": "Receipt / transaction reference.",
      "type": "string"
    },
    "payment_date": {
      "description": "Date it was paid, YYYY-MM-DD.",
      "type": "string"
    },
    "should_be_invoiced": {
      "description": "Flag the expense to be billed to the client.",
      "type": "boolean"
    },
    "tax_name1": {
      "type": "string"
    },
    "tax_rate1": {
      "type": "number"
    }
  },
  "required": [
    "amount"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴invoiceninja_create_task(description, client_id, project_id, rate, due_date, ...)

Create a task, optionally with logged time entries, for a client or project. Invoice Ninja: POST /api/v1/tasks.

Input Schema

{
  "type": "object",
  "properties": {
    "description": {
      "type": "string",
      "minLength": 1,
      "description": "What the work was."
    },
    "client_id": {
      "description": "Client (hashed id).",
      "type": "string"
    },
    "project_id": {
      "description": "Project (hashed id).",
      "type": "string"
    },
    "rate": {
      "description": "Hourly rate; omit to use the project/client default.",
      "type": "number"
    },
    "due_date": {
      "description": "Due date, YYYY-MM-DD.",
      "type": "string"
    },
    "time_log": {
      "description": "Time entries. Entries must not overlap.",
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "start": {
            "type": "integer",
            "minimum": -9007199254740991,
            "maximum": 9007199254740991,
            "description": "Start, Unix timestamp in seconds."
          },
          "end": {
            "type": "integer",
            "minimum": -9007199254740991,
            "maximum": 9007199254740991,
            "description": "End, Unix timestamp in seconds (0 = still running)."
          },
          "description": {
            "description": "Note for this time entry.",
            "type": "string"
          },
          "billable": {
            "description": "Whether this entry is billable.",
            "type": "boolean"
          }
        },
        "required": [
          "start",
          "end"
        ]
      }
    }
  },
  "required": [
    "description"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴invoiceninja_create_project(name, client_id, task_rate, budgeted_hours, due_date, ...)

Create a project for a client, with an optional hourly task rate, budget and due date. Invoice Ninja: POST /api/v1/projects.

Input Schema

{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "minLength": 1,
      "description": "Project name."
    },
    "client_id": {
      "type": "string",
      "minLength": 1,
      "description": "The client's hashed id, e.g. \"Wpmbk5ezJn\"."
    },
    "task_rate": {
      "description": "Hourly rate for tasks in this project (default 0 = inherit).",
      "type": "number"
    },
    "budgeted_hours": {
      "type": "number"
    },
    "due_date": {
      "description": "Due date, YYYY-MM-DD.",
      "type": "string"
    },
    "public_notes": {
      "type": "string"
    },
    "private_notes": {
      "type": "string"
    },
    "color": {
      "description": "Hex color, e.g. \"#1f77b4\".",
      "type": "string"
    }
  },
  "required": [
    "name",
    "client_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded24 tools