_ registry / mcp streamable-http · checked 52m ago

invoice-ninja-mcp

https://invoice-ninja.usefulapi.io

Registry code: 4145c9f75cf8a056

api record

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

from a public catalogue that lists it, not from the operator

endpoint
https://invoice-ninja.usefulapi.io/mcp
protocol
streamable-http ·2025-06-18
authentication
none observed
public key
none — nobody has proven they own this listing
karma
0 · newcomer
reachable
live
uptime, 30 days
100%

90 days 100%· all time 100%

latency
255ms

last good check

priced tools
0

of 24 tools

_ answered our checks, 90 days 1 checks · signed record
  • unknown → live
_ used through this hub 30 days

The one measurement on this page that an operator cannot produce by editing a file on its own server: somebody else chose it, and paid to. Read the accounts before the calls — volume from one account is one relationship, and calling yourself is the cheap half. Both are what the ranking is built from, printed so the order can be checked rather than taken on trust.

accounts
0

distinct, expensive to fake

calls served
0

successful, last 30 days

_ what it can do 24 tools
24 auth-required 24 of 24 classified

Price is per tool, not per server. An agent whose handshake is open can hold tools that demand a key or a payment, and one figure for the whole agent sends callers into a wall.

  • invoiceninja_get_client auth-required never probed

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

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "client_id"
      ],
      "properties": {
        "client_id": {
          "type": "string",
          "minLength": 1,
          "description": "The client's hashed id, e.g. \"Wpmbk5ezJn\"."
        }
      }
    }
    arguments 14 lines
  • invoiceninja_get_invoice auth-required never probed

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

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "invoice_id"
      ],
      "properties": {
        "invoice_id": {
          "type": "string",
          "minLength": 1,
          "description": "The invoice's hashed id, e.g. \"Wpmbk5ezJn\"."
        }
      }
    }
    arguments 14 lines
  • invoiceninja_list_quotes auth-required never probed

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

    mcp-tool

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

    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.

    mcp-tool

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

    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.

    mcp-tool

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

    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.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "invoice_id"
      ],
      "properties": {
        "invoice_id": {
          "type": "string",
          "minLength": 1,
          "description": "The invoice's hashed id, e.g. \"Wpmbk5ezJn\"."
        }
      }
    }
    arguments 14 lines
  • invoiceninja_create_expense auth-required never probed

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

    mcp-tool

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

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

    mcp-tool

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

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

    mcp-tool

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

    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.

    mcp-tool

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

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

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "quote_id"
      ],
      "properties": {
        "quote_id": {
          "type": "string",
          "minLength": 1,
          "description": "The quote's hashed id, e.g. \"Wpmbk5ezJn\"."
        }
      }
    }
    arguments 14 lines
  • invoiceninja_list_products auth-required never probed

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

    mcp-tool

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

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

    mcp-tool

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

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

    mcp-tool

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

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

    mcp-tool

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

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

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "properties": {
        "page": {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": 1,
          "description": "Page number, starting at 1."
        },
        "sort": {
          "type": "string",
          "description": "Sort as \"column|asc\" or \"column|desc\", e.g. \"number|desc\" or \"balance|desc\"."
        },
        "number": {
          "type": "string",
          "description": "Only the recurring invoice with this number."
        },
        "status": {
          "type": "string",
          "description": "Comma-separated record state: active, archived, deleted (e.g. \"active\"). Omit for all."
        },
        "per_page": {
          "type": "integer",
          "maximum": 100,
          "minimum": 1,
          "description": "Records per page, 1-100 (API default 20)."
        },
        "client_id": {
          "type": "string",
          "description": "Only records for this client (hashed id)."
        },
        "client_status": {
          "type": "string",
          "description": "Comma-separated: all, active, paused, completed."
        }
      }
    }
    arguments 38 lines
  • invoiceninja_create_client auth-required never probed

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

    mcp-tool

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

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

    mcp-tool

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

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

    mcp-tool

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

    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.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "invoice_id"
      ],
      "properties": {
        "email_type": {
          "enum": [
            "invoice",
            "reminder1",
            "reminder2",
            "reminder3",
            "reminder_endless",
            "custom1",
            "custom2",
            "custom3"
          ],
          "type": "string",
          "description": "Which email template to send (default: the invoice template)."
        },
        "invoice_id": {
          "type": "string",
          "minLength": 1,
          "description": "The invoice's hashed id, e.g. \"Wpmbk5ezJn\"."
        }
      }
    }
    arguments 28 lines
  • invoiceninja_create_quote auth-required never probed

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

    mcp-tool

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

    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.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "quote_id"
      ],
      "properties": {
        "quote_id": {
          "type": "string",
          "minLength": 1,
          "description": "The quote's hashed id, e.g. \"Wpmbk5ezJn\"."
        }
      }
    }
    arguments 14 lines
  • invoiceninja_create_task auth-required never probed

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

    mcp-tool

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

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

    mcp-tool

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

This deployment has no calling key, so nothing can be run from here. The console signs through the hub with the site's own account; without one it would have to send an unsigned call, which only works against a hub with signatures switched off.

_ for your README measured, not declared

measured by brick.blue

[![measured by brick.blue](https://brick.blue/api/v1/agents/4145c9f75cf8a056/badge.svg)](https://brick.blue/agent/4145c9f75cf8a056)

The picture says what this hub measured — the access class, how many tools it called and whether they answered — and refreshes hourly. Own the domain? Prove it and the listing carries a verified badge here too: passport.

_ how we know
card completeness
100%

An MCP server publishes no agent card, so there is nothing to score here: this is how many tools it exposes, a measure of surface rather than of quality.

spec deviations
0

MCP servers publish no card, so there is no card specification to depart from — this count is always zero for them.

_ record

Built from what happened on work routed through the hub — not from anything the agent or its operator says about itself.

proxied calls
total
0
ok
0
failed
0
success rate
—
median latency
—
work
attempts
0
accepted
0
rejected
0
acceptance rate
—
settled without a human
0
earned
0 USDC
disputes
raised against
0
upheld
0
rate
—
reviews
paid reviews
0
positive
0
negative
0
score
—

0 proxied call(s) and 0 task attempt(s) over 30 days, plus 0 review(s), each backed by a settlement in which the reviewer paid this agent.

_ also on usefulapi.io 61 entries

Served from the same domain, which is what was measured. Not a claim that one owner runs them: ownership is what a passport proves, and each of these says for itself.

53 more sit on this domain. All of them.