Koskamo

Zovo Invoice Ledger MCP

An MCP server that processes batches of supplier invoices to create a consolidated Excel ledger. It extracts key fields like supplier, dates, and amounts, calculates tax by rate, and performs validation checks for duplicates and arithmetic accuracy across multiple currencies.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

Zovo Invoice Ledger MCP logo, by ZovoCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-08Published by Zovo
MCP endpoint (Streamable HTTP)
https://invoice-ledger.zovo.one/mcp
Vendor documentation

What its tools do

1 tool, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

1 of 1 have a description · 1 of 1 declare behavior hints · 1 of 1 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Consolidate multiple supplier invoices into a single Excel ledger
  • Generate a VAT summary broken down by tax rate
  • Check invoices for duplicate numbers and incorrect totals

Source and maintenance

Community listingRegistry 1.0.0

Protocol and capabilities

Server
invoice-ledger 1.0.0
MCP protocol negotiated in check
2025-11-25
Tools
1 advertised
Resources
1 advertised
Resource templates
1 advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  },
  "resources": {
    "listChanged": true
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Zovo Invoice Ledger turns several supplier invoices (rows, invoice PDFs with selectable text, or pasted invoice text) into one Excel and CSV ledger with supplier, invoice number, dates, net, tax by rate, gross and currency, totals per supplier and per tax rate, and flags for duplicate invoice numbers and totals that do not add up. Prefer the invoices rows when the values are in the chat. Share the totals, the flagged invoices verbatim and the download links.

Tools

1 advertised

generate_invoice_ledger — Generate invoice ledger
Advertised by the server during the last successful anonymous check.
Advertised read-only

Use this when the user wants several invoices in one spreadsheet ("put these invoices into Excel", "invoice log from these PDFs", "purchase ledger", "VAT summary by rate", "check these invoices for duplicates"). Send the invoices as rows when their values are in the chat or a screenshot; send attached invoice PDFs (selectable text) in files; send pasted invoice text in invoice_texts (one string per invoice), and use text only as a fallback. Returns an Excel ledger (supplier, invoice number, invoice and due date, currency, net, tax per rate, tax total, gross, status) with By supplier, By tax rate and Checks sheets, and a CSV. Flags totals that do not equal net + tax, tax that does not match its rate, and duplicate invoice numbers per supplier. Reads header totals only, not line items. Does not read scanned images, convert currencies, file tax returns, or say whether tax is reclaimable.

generate_invoice_ledger input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "text": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 400000
        },
        {
          "type": "null"
        }
      ],
      "description": "Fallback only: several invoices pasted as one text; they are split at --- lines or where a new invoice number starts."
    },
    "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,
      "description": "Invoice PDFs with selectable text (not scans), up to 20, e.g. acme-inv-1001.pdf, northwind-re-77.pdf. A .txt with pasted invoice text also works."
    },
    "currency": {
      "type": [
        "string",
        "number",
        "null"
      ],
      "description": "Currency for invoices that show none, as an ISO code, e.g. USD. A code printed on the invoice wins."
    },
    "invoices": {
      "anyOf": [
        {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "net": {
                "type": [
                  "string",
                  "number",
                  "null"
                ],
                "description": "Net amount before tax (subtotal), e.g. 1250.00 or \"1.250,00\"."
              },
              "tax": {
                "type": [
                  "string",
                  "number",
                  "null"
                ],
                "description": "Total tax amount if one rate, e.g. 250.00."
              },
              "gross": {
                "type": [
                  "string",
                  "number",
                  "null"
                ],
                "description": "Invoice total including tax, e.g. 1500.00."
              },
              "currency": {
                "type": [
                  "string",
                  "number",
                  "null"
                ],
                "description": "ISO currency code, e.g. GBP. Defaults to the currency argument."
              },
              "due_date": {
                "type": [
                  "string",
                  "number",
                  "null"
                ],
                "description": "Payment due date if printed, e.g. 2026-10-31."
              },
              "supplier": {
                "type": [
                  "string",
                  "number",
                  "null"
                ],
                "description": "Supplier name as printed, e.g. Acme Supplies Ltd."
              },
              "tax_rate": {
                "type": [
                  "string",
                  "number",
                  "null"
                ],
                "description": "Tax rate in percent if one rate, e.g. 20 (not 0.2)."
              },
              "tax_lines": {
                "anyOf": [
                  {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "net": {
                          "type": [
                            "string",
                            "number",
                            "null"
                          ],
                          "description": "Taxable base at this rate, e.g. 100.00."
                        },
                        "tax": {
                          "type": [
                            "string",
                            "number",
                            "null"
                          ],
                          "description": "Tax at this rate, e.g. 5.50."
                        },
                        "rate": {
                          "type": [
                            "string",
                            "number",
                            "null"
                          ],
                          "description": "Rate in percent, e.g. 5.5."
                        }
                      }
                    },
                    "maxItems": 10
                  },
                  {
                    "type": "null"
                  }
                ],
                "description": "Several tax rates on one invoice, e.g. [{\"rate\":5.5,\"net\":100,\"tax\":5.5},{\"rate\":20,\"net\":41.67,\"tax\":8.33}]."
              },
              "amount_due": {
                "type": [
                  "string",
                  "number",
                  "null"
                ],
                "description": "Amount due if it differs from the total (part paid), e.g. 500.00."
              },
              "invoice_date": {
                "type": [
                  "string",
                  "number",
                  "null"
                ],
                "description": "Invoice (issue) date, e.g. 2026-10-01 or 01/10/2026."
              },
              "invoice_number": {
                "type": [
                  "string",
                  "number",
                  "null"
                ],
                "description": "Invoice number exactly as printed, e.g. INV-1001."
              }
            },
            "additionalProperties": {}
          },
          "maxItems": 200
        },
        {
          "type": "null"
        }
      ],
      "description": "Invoices as rows, one per invoice, e.g. [{\"supplier\":\"Acme Supplies Ltd\",\"invoice_number\":\"INV-1001\",\"invoice_date\":\"2026-10-01\",\"currency\":\"GBP\",\"net\":1250,\"tax_rate\":20,\"gross\":1500}]. Use this when the invoice values are in the chat or a screenshot."
    },
    "date_order": {
      "anyOf": [
        {
          "enum": [
            "DMY",
            "MDY"
          ],
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "Order of numeric dates such as 03/04/2026: DMY (UK, EU) or MDY (US). Detected when a day is above 12."
    },
    "decimal_mark": {
      "anyOf": [
        {
          "enum": [
            ".",
            ","
          ],
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "Decimal mark of the amounts: \".\" (1,234.56) or \",\" (1.234,56). Detected per invoice when omitted."
    },
    "invoice_texts": {
      "anyOf": [
        {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 60000
          },
          "maxItems": 200
        },
        {
          "type": "null"
        }
      ],
      "description": "Pasted invoice text, one string per invoice, e.g. [\"Acme Supplies Ltd\\nInvoice No: INV-2044\\nInvoice Date: 14/10/2026\\nSubtotal £2,400.00\\nVAT 20% £480.00\\nTotal £2,880.00\"]."
    }
  }
}
generate_invoice_ledger output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "invoices",
    "currencies",
    "by_tax_rate",
    "by_supplier",
    "duplicate_numbers",
    "arithmetic_mismatches",
    "invoices_with_issues",
    "issues",
    "preview",
    "skipped_files",
    "notes",
    "downloads",
    "links_expire_minutes"
  ],
  "properties": {
    "notes": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "issues": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "preview": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "n",
          "source",
          "supplier",
          "number",
          "date",
          "currency",
          "net",
          "tax",
          "gross",
          "status"
        ],
        "properties": {
          "n": {
            "type": "number"
          },
          "net": {
            "type": "string"
          },
          "tax": {
            "type": "string"
          },
          "date": {
            "type": "string"
          },
          "gross": {
            "type": "string"
          },
          "number": {
            "type": "string"
          },
          "source": {
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "currency": {
            "type": "string"
          },
          "supplier": {
            "type": "string"
          }
        },
        "additionalProperties": false
      }
    },
    "invoices": {
      "type": "number"
    },
    "downloads": {
      "type": "object",
      "required": [
        "xlsx",
        "csv"
      ],
      "properties": {
        "csv": {
          "type": "string"
        },
        "xlsx": {
          "type": "string"
        }
      },
      "additionalProperties": false
    },
    "currencies": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "currency",
          "invoices",
          "net",
          "tax",
          "gross"
        ],
        "properties": {
          "net": {
            "type": "string"
          },
          "tax": {
            "type": "string"
          },
          "gross": {
            "type": "string"
          },
          "currency": {
            "type": "string"
          },
          "invoices": {
            "type": "number"
          }
        },
        "additionalProperties": false
      }
    },
    "by_supplier": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "currency",
          "supplier",
          "invoices",
          "gross"
        ],
        "properties": {
          "gross": {
            "type": "string"
          },
          "currency": {
            "type": "string"
          },
          "invoices": {
            "type": "number"
          },
          "supplier": {
            "type": "string"
          }
        },
        "additionalProperties": false
      }
    },
    "by_tax_rate": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "currency",
          "rate",
          "lines",
          "net",
          "tax"
        ],
        "properties": {
          "net": {
            "type": "string"
          },
          "tax": {
            "type": "string"
          },
          "rate": {
            "type": "string"
          },
          "lines": {
            "type": "number"
          },
          "currency": {
            "type": "string"
          }
        },
        "additionalProperties": false
      }
    },
    "preview_count": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "number"
      }
    },
    "skipped_files": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "file",
          "reason"
        ],
        "properties": {
          "file": {
            "type": "string"
          },
          "reason": {
            "type": "string"
          }
        },
        "additionalProperties": false
      }
    },
    "by_supplier_count": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "number"
      }
    },
    "by_tax_rate_count": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "number"
      }
    },
    "duplicate_numbers": {
      "type": "number"
    },
    "invoices_with_issues": {
      "type": "number"
    },
    "links_expire_minutes": {
      "type": "number"
    },
    "arithmetic_mismatches": {
      "type": "number"
    }
  },
  "additionalProperties": false
}
generate_invoice_ledger annotations
{
  "title": "Generate invoice ledger",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

1 advertised

invoice-ledger-widget — Zovo Invoice Ledger view

Advertised by the server during the last successful anonymous check.

Interactive view for Zovo Invoice Ledger.

invoice-ledger-widget URI
ui://widget/invoice-ledger-v1-1.0.0-6a6ef28770a92c3e944c456f8cae1a8b2e55840fbdabae4f7c82b87f69b9c62d.html

MIME type: text/html;profile=mcp-app

invoice-ledger-widget-legacy — Zovo Invoice Ledger view (previous versions)

Advertised by the server during the last successful anonymous check.

invoice-ledger-widget-legacy URI template
ui://widget/invoice-ledger-{version}.html

MIME type: text/html;profile=mcp-app

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
469 ms
95th percentile latency
469 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 469 ms · metadata changed · 1 tool(s), 1 resource(s), 1 resource template(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http zovo-invoice-ledger-mcp https://invoice-ledger.zovo.one/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add zovo-invoice-ledger-mcp --url https://invoice-ledger.zovo.one/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable zovo-invoice-ledger-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "zovo-invoice-ledger-mcp": {
      "url": "https://invoice-ledger.zovo.one/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "zovo-invoice-ledger-mcp": {
      "type": "streamableHttp",
      "url": "https://invoice-ledger.zovo.one/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start zovo-invoice-ledger-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "zovo-invoice-ledger-mcp": {
      "type": "http",
      "url": "https://invoice-ledger.zovo.one/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http zovo-invoice-ledger-mcp https://invoice-ledger.zovo.one/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://invoice-ledger.zovo.one/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "zovo-invoice-ledger-mcp": {
      "serverUrl": "https://invoice-ledger.zovo.one/mcp"
    }
  }
}

Let your agent find its tools

Find servers like Zovo Invoice Ledger MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.