InvoiceBloom

Create, send and track invoices for freelancers and small businesses.

Should I use this

Quality & Safety

A
Description quality
98%
Schema completeness
81%
Naming quality
98%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~2,237Tokens (tool definitions)
~1.5 KBTypical response size
Moderate attention impact (1.75% 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": {
    "invoicebloom": {
      "url": "https://invoicebloom.io/mcp"
    }
  }
}

Remote endpoints

https://invoicebloom.io/mcpstreamable-http

What it can do

Tool inventory

Tools (11)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢get_account

Returns the signed-in user's profile: business name, address, saved payment instructions, whether their email is confirmed (required before sending invoices), whether they can take card payments, and client/invoice counts. Call this first to know who you are acting for.

Input Schema

{
  "type": "object",
  "properties": {},
  "required": [],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢list_clients(query)

Lists the user's clients (people or companies they invoice), optionally filtered by a search term matched against name, email and company. Use it to find a client_id before creating an invoice.

Input Schema

{
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "description": "Optional case-insensitive search across name, email and company name."
    }
  },
  "required": [],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟡create_client(name, email, company_name, address, phone, ...)

Creates a new client to invoice. Name and email are required; the email is where invoices are sent. Check list_clients first so you do not create duplicates.

Input Schema

{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Contact name, up to 100 characters."
    },
    "email": {
      "type": "string",
      "description": "Email address invoices will be sent to."
    },
    "company_name": {
      "type": "string"
    },
    "address": {
      "type": "string",
      "description": "Postal address, printed on invoices."
    },
    "phone": {
      "type": "string"
    },
    "notes": {
      "type": "string",
      "description": "Private notes, never shown to the client."
    }
  },
  "required": [
    "name",
    "email"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟡update_client(client_id, name, email, company_name, address, ...)

Updates an existing client's details. Only the fields you pass are changed.

Input Schema

{
  "type": "object",
  "properties": {
    "client_id": {
      "type": "integer"
    },
    "name": {
      "type": "string"
    },
    "email": {
      "type": "string"
    },
    "company_name": {
      "type": "string"
    },
    "address": {
      "type": "string"
    },
    "phone": {
      "type": "string"
    },
    "notes": {
      "type": "string"
    },
    "status": {
      "type": "string",
      "enum": [
        "active",
        "inactive"
      ]
    }
  },
  "required": [
    "client_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢list_invoices(status, client_id, overdue_only, limit)

Lists the user's invoices, newest first, without line items. Filter by status (draft, sent, paid), by client, or overdue_only for unpaid invoices past their due date (there is no 'overdue' status; use overdue_only). Use get_invoice for full detail.

Input Schema

{
  "type": "object",
  "properties": {
    "status": {
      "type": "string",
      "enum": [
        "draft",
        "sent",
        "paid"
      ]
    },
    "client_id": {
      "type": "integer"
    },
    "overdue_only": {
      "type": "boolean",
      "description": "Only unpaid invoices whose due date has passed."
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100,
      "description": "Defaults to 25."
    }
  },
  "required": [],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢get_invoice(invoice_id)

Returns one invoice with its line items, totals, status, the client it is for, a public_url the client can open, and a payment link if one exists.

Input Schema

{
  "type": "object",
  "properties": {
    "invoice_id": {
      "type": "integer"
    }
  },
  "required": [
    "invoice_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟡create_invoice(client_id, client_email, line_items, date, due_date, ...)

Creates a draft invoice with line items for an existing client. Identify the client by client_id or client_email (must already exist; use create_client otherwise). Totals are computed server-side: subtotal + tax% + late_fee. Nothing is emailed until you call send_invoice. Returns the invoice, including its invoice_number and public_url.

Input Schema

{
  "type": "object",
  "properties": {
    "client_id": {
      "type": "integer",
      "description": "ID from list_clients."
    },
    "client_email": {
      "type": "string",
      "description": "Alternative to client_id: email of an existing client."
    },
    "line_items": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "description": {
            "type": "string",
            "description": "What was delivered, e.g. 'Logo design'."
          },
          "quantity": {
            "type": "number",
            "description": "Quantity, greater than 0."
          },
          "unit": {
            "type": "string",
            "description": "Unit label such as 'hours', 'days' or 'units'. Defaults to 'units'."
          },
          "rate": {
            "type": "number",
            "description": "Price per unit."
          }
        },
        "required": [
          "description",
          "quantity",
          "rate"
        ]
      },
      "minItems": 1,
      "description": "At least one line item."
    },
    "date": {
      "type": "string",
      "description": "Invoice date, YYYY-MM-DD. Defaults to today."
    },
    "due_date": {
      "type": "string",
      "description": "Due date, YYYY-MM-DD. Defaults to 30 days from today."
    },
    "tax": {
      "type": "number",
      "description": "Tax as a percentage of the subtotal, e.g. 8.5. Omit for no tax."
    },
    "late_fee": {
      "type": "number",
      "description": "Flat late fee amount added to the total. Omit for none."
    },
    "theme": {
      "type": "string",
      "enum": [
        "minimal",
        "classic",
        "modern",
        "creative",
        "freelancer",
        "contractor",
        "consultant"
      ],
      "description": "Visual template. Defaults to 'minimal'."
    },
    "terms": {
      "type": "string",
      "description": "Payment terms text, e.g. 'Net 30'."
    },
    "payment_instructions": {
      "type": "string",
      "description": "How to pay (bank details etc.). Defaults to the user's saved instructions."
    },
    "business_name": {
      "type": "string",
      "description": "Override the sender name printed on this invoice."
    },
    "business_address": {
      "type": "string",
      "description": "Override the sender address printed on this invoice."
    }
  },
  "required": [
    "line_items"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟡update_invoice(invoice_id, client_id, client_email, line_items, date, ...)

Updates an invoice. Only fields you pass change. If you pass line_items, they REPLACE the existing line items entirely, so include every item that should remain. Works on draft and sent invoices; re-send with send_invoice if the client needs the new version.

Input Schema

{
  "type": "object",
  "properties": {
    "invoice_id": {
      "type": "integer"
    },
    "client_id": {
      "type": "integer"
    },
    "client_email": {
      "type": "string"
    },
    "line_items": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "description": {
            "type": "string",
            "description": "What was delivered, e.g. 'Logo design'."
          },
          "quantity": {
            "type": "number",
            "description": "Quantity, greater than 0."
          },
          "unit": {
            "type": "string",
            "description": "Unit label such as 'hours', 'days' or 'units'. Defaults to 'units'."
          },
          "rate": {
            "type": "number",
            "description": "Price per unit."
          }
        },
        "required": [
          "description",
          "quantity",
          "rate"
        ]
      },
      "description": "Full replacement list of line items."
    },
    "date": {
      "type": "string",
      "description": "Invoice date, YYYY-MM-DD. Defaults to today."
    },
    "due_date": {
      "type": "string",
      "description": "Due date, YYYY-MM-DD. Defaults to 30 days from today."
    },
    "tax": {
      "type": "number",
      "description": "Tax as a percentage of the subtotal, e.g. 8.5. Omit for no tax."
    },
    "late_fee": {
      "type": "number",
      "description": "Flat late fee amount added to the total. Omit for none."
    },
    "theme": {
      "type": "string",
      "enum": [
        "minimal",
        "classic",
        "modern",
        "creative",
        "freelancer",
        "contractor",
        "consultant"
      ],
      "description": "Visual template. Defaults to 'minimal'."
    },
    "terms": {
      "type": "string",
      "description": "Payment terms text, e.g. 'Net 30'."
    },
    "payment_instructions": {
      "type": "string",
      "description": "How to pay (bank details etc.). Defaults to the user's saved instructions."
    },
    "business_name": {
      "type": "string",
      "description": "Override the sender name printed on this invoice."
    },
    "business_address": {
      "type": "string",
      "description": "Override the sender address printed on this invoice."
    }
  },
  "required": [
    "invoice_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟡send_invoice(invoice_id)

Emails the invoice (with a PDF attached) to the client's email address and marks it as sent. This contacts a real person: confirm with the user before calling. Requires at least one line item and a confirmed user email. If the user takes card payments, a Stripe payment link is added first.

Input Schema

{
  "type": "object",
  "properties": {
    "invoice_id": {
      "type": "integer"
    }
  },
  "required": [
    "invoice_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
⚪mark_invoice_paid(invoice_id)

Marks an invoice as paid, for payments received outside InvoiceBloom (bank transfer, cash, cheque). Card payments through the payment link are recorded automatically.

Input Schema

{
  "type": "object",
  "properties": {
    "invoice_id": {
      "type": "integer"
    }
  },
  "required": [
    "invoice_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴delete_invoice(invoice_id)

Permanently deletes an invoice and its line items. Cannot be undone. Confirm with the user before calling; prefer leaving paid invoices in place for their records.

Input Schema

{
  "type": "object",
  "properties": {
    "invoice_id": {
      "type": "integer"
    }
  },
  "required": [
    "invoice_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded11 tools