Turns invoice PDFs into one spreadsheet and checks the tax, totals and money math of each invoice.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Use this when the user types or pastes invoice amounts (line quantities, unit prices, line amounts, subtotal, discount, tax, shipping, total) and wants to know whether the invoice adds up. Returns PASS, MISMATCH with the difference in cents, or NOT CHECKABLE when a value is missing, for three checks: lines add up to the subtotal, subtotal - discount + tax + shipping = total, quantity x unit price = amount. Uses integer cent math. Does not read files (use read_invoices for PDFs), does not compute tax rates, and does not pay or send anything.
Amount as printed, e.g. 33.56. Leave out when the invoice has none.
Invoice lines, e.g. [{"description":"Toner","qty":2,"unit_price":"89.99","amount":"179.98"}]. Up to 500.
Amount as printed, e.g. 440.29. Leave out when the invoice has none.
Amount as printed, e.g. 15.00. Leave out when the invoice has none.
Amount as printed, e.g. 9.95. Leave out when the invoice has none.
Amount as printed, e.g. 406.73. Leave out when the invoice has none.
Decimal mark of the amounts: "." for 1,234.56 or "," for 1.234,56. Default: decided from the values.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http invoice-reader https://invoice-reader.zovo.one/mcp
Use this when the user types or pastes invoice amounts (line quantities, unit prices, line amounts, subtotal, discount, tax, shipping, total) and wants to know whether the invoice adds up. Returns PASS, MISMATCH with the difference in cents, or NOT CHECKABLE when a value is missing, for three checks: lines add up to the subtotal, subtotal - discount + tax + shipping = total, quantity x unit price = amount. Uses integer cent math. Does not read files (use read_invoices for PDFs), does not compute tax rates, and does not pay or send anything.
| Argument | Type | Description |
|---|---|---|
| tax | any | Amount as printed, e.g. 33.56. Leave out when the invoice has none. |
| lines | array | Invoice lines, e.g. [{"description":"Toner","qty":2,"unit_price":"89.99","amount":"179.98"}]. Up to 500. |
| total | any | Amount as printed, e.g. 440.29. Leave out when the invoice has none. |
| discount | any | Amount as printed, e.g. 15.00. Leave out when the invoice has none. |
| shipping | any | Amount as printed, e.g. 9.95. Leave out when the invoice has none. |
| subtotal | any | Amount as printed, e.g. 406.73. Leave out when the invoice has none. |
| decimal_mark | string | Decimal mark of the amounts: "." for 1,234.56 or "," for 1.234,56. Default: decided from the values. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"tax": {
"anyOf": [
{
"type": "string",
"maxLength": 40
},
{
"type": "number"
}
],
"description": "Amount as printed, e.g. 33.56. Leave out when the invoice has none."
},
"lines": {
"type": "array",
"items": {
"type": "object",
"properties": {
"qty": {
"anyOf": [
{
"type": "string",
"maxLength": 30
},
{
"type": "number"
}
],
"description": "Quantity, e.g. 2 or 1.5."
},
"amount": {
"anyOf": [
{
"type": "string",
"maxLength": 40
},
{
"type": "number"
}
],
"description": "Line amount, e.g. 179.98."
},
"unit_price": {
"anyOf": [
{
"type": "string",
"maxLength": 40
},
{
"type": "number"
}
],
"description": "Unit price, e.g. 89.99."
},
"description": {
"type": "string",
"maxLength": 200,
"description": "Line text, e.g. Toner cartridge."
}
}
},
"maxItems": 500,
"description": "Invoice lines, e.g. [{\"description\":\"Toner\",\"qty\":2,\"unit_price\":\"89.99\",\"amount\":\"179.98\"}]. Up to 500."
},
"total": {
"anyOf": [
{
"type": "string",
"maxLength": 40
},
{
"type": "number"
}
],
"description": "Amount as printed, e.g. 440.29. Leave out when the invoice has none."
},
"discount": {
"anyOf": [
{
"type": "string",
"maxLength": 40
},
{
"type": "number"
}
],
"description": "Amount as printed, e.g. 15.00. Leave out when the invoice has none."
},
"shipping": {
"anyOf": [
{
"type": "string",
"maxLength": 40
},
{
"type": "number"
}
],
"description": "Amount as printed, e.g. 9.95. Leave out when the invoice has none."
},
"subtotal": {
"anyOf": [
{
"type": "string",
"maxLength": 40
},
{
"type": "number"
}
],
"description": "Amount as printed, e.g. 406.73. Leave out when the invoice has none."
},
"decimal_mark": {
"enum": [
".",
","
],
"type": "string",
"description": "Decimal mark of the amounts: \".\" for 1,234.56 or \",\" for 1.234,56. Default: decided from the values."
}
}
}Use this when the user attaches 1 to 20 invoice PDFs and wants them in a spreadsheet, wants invoice data extracted (vendor, invoice number, invoice date, due date, subtotal, tax or VAT or GST, shipping, discount, total, amount due, line items), or wants the invoice arithmetic checked. Returns one Excel workbook (Invoices and Line items sheets) and a ZIP of CSV files, plus per-invoice checks: lines add up to the subtotal, subtotal - discount + tax + shipping = total, quantity x unit price = amount. Each check is PASS, MISMATCH with the difference, or NOT CHECKABLE when a value is missing. Text-based PDFs only (no OCR), up to 10 MB and 20 pages per file. Does not pay, approve, or send invoices. Do not use for receipts photographed with a phone or for making a new invoice.
| Argument | Type | Description |
|---|---|---|
| files* | array | The invoice PDFs, in any order, e.g. inv-1001.pdf, inv-1002.pdf. 1 to 20 files. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"files"
],
"properties": {
"files": {
"type": "array",
"items": {
"type": "object",
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string",
"description": "ChatGPT file id, e.g. file_abc123."
},
"file_name": {
"type": "string",
"description": "Original file name if known, e.g. statement.pdf."
},
"mime_type": {
"type": "string",
"description": "Media type if known, e.g. application/pdf."
},
"download_url": {
"type": "string",
"description": "Temporary download link for the file, supplied by ChatGPT."
}
}
},
"maxItems": 20,
"minItems": 1,
"description": "The invoice PDFs, in any order, e.g. inv-1001.pdf, inv-1002.pdf. 1 to 20 files."
}
}
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 8, 2026.