All servers · Buy Pro $19 · All 48 for $39 · Source

Try duplicate-reference review in this browser — edit supplied history locally and inspect every review reason.

Install it in one click. Download duplicate-invoice-check.mcpb and double-click it in Claude Desktop. There is no hosted URL for this one. The other servers answer at https://mcp.zovo.one/mcp/<server>/t/<token>; this one has no endpoint yet, and that address returns 404 for it. Run it from the bundle above or from a clone.

Duplicate supplier invoice check MCP server

Review a supplied batch of supplier invoices for repeated invoice numbers, conservative formatting variations, or identical amounts and invoice dates. This local MCP server returns complete grouped evidence and the exact reason each record needs review. Distinct legitimate invoices can share an amount and date. Candidates are not confirmed duplicates, fraud scores, recoverable money or payment decisions. It does not connect to an ERP, read PDFs, use OCR, or retrieve missing history.

Built by theluckystrike. MIT. Support: support@zovo.one.

Install

Claude Desktop: download duplicate-invoice-check.mcpb v0.22.8 and open it. SHA-256: 181379eb6dcff3d90b55e080dd9c180f6c96802e991872865a6b0ce422b3aaea. Other clients can use the source instructions below.

Requires Node.js 18 or newer and an MCP client. No API key or account is needed for free use. The npm package is not published: build the source checkout, then use an absolute local path.

git clone https://github.com/theluckystrike/mcp-servers.git
cd mcp-servers
npm install
node scripts/bootstrap-timezone.mjs
npm run build --workspace @theluckystrike/mcp-license
npm run build --workspace @theluckystrike/mcp-duplicate-invoice-check

Claude Desktop: merge this entry into mcpServers in ~/Library/Application Support/Claude/claude_desktop_config.json on macOS, or %APPDATA%\Claude\claude_desktop_config.json on Windows. Replace /absolute/path with the checkout location.

{"mcpServers":{"duplicate-invoice-check":{"command":"node","args":["/absolute/path/mcp-servers/servers/duplicate-invoice-check/dist/index.js"]}}}

Claude Code:

claude mcp add duplicate-invoice-check -- node /absolute/path/mcp-servers/servers/duplicate-invoice-check/dist/index.js

Cursor: put this local entry in .cursor/mcp.json in your project or ~/.cursor/mcp.json:

{"mcpServers":{"duplicate-invoice-check":{"type":"stdio","command":"node","args":["/absolute/path/mcp-servers/servers/duplicate-invoice-check/dist/index.js"]}}}

VS Code: use .vscode/mcp.json with the top-level key servers:

{"servers":{"duplicate-invoice-check":{"type":"stdio","command":"node","args":["/absolute/path/mcp-servers/servers/duplicate-invoice-check/dist/index.js"]}}}

Windsurf's legacy Cascade agent: merge the Claude Desktop mcpServers JSON into ~/.codeium/windsurf/mcp_config.json. This file applies to Cascade; its newer Devin Local agent uses a different configuration route. The standalone server exposes eight tools.

Cline: open its MCP Servers panel, Configure tab, then Configure MCP Servers. Add this entry to the settings JSON (for the Cline CLI, the file is ~/.cline/mcp.json):

{"mcpServers":{"duplicate-invoice-check":{"type":"stdio","command":"node","args":["/absolute/path/mcp-servers/servers/duplicate-invoice-check/dist/index.js"],"disabled":false,"autoApprove":[]}}}

These are the six local stdio client configurations used by this project. There is no hosted endpoint or browser chat connector. If the client cannot find node, replace it with the absolute path printed by which node. After saving, reconnect the server (fully quit and restart Claude Desktop), call license_status, then run the example below. A tools/list result alone does not verify candidate checking.

Tools

Tool Input and result
duplicate_invoice_check records, optional save (false); complete grouped candidates, unique counts, source evidence and a free preview id.
report_list Optional offset (0), limit (20, max 100); saved UUIDs and count summaries.
report_get Saved id; source records, groups and reasons.
report_page Saved or preview id, section, optional offset, limit (max 100), group_id; complete evidence pages.
report_delete Saved id; delete one report and reuse its storage slot.
report_export_csv Saved or preview id, optional offset, limit (max 1000); one row per source record, candidate reasons and group ids.
license_status No arguments; offline tier and checkout link.
license_activate key; verify and store an offline Pro license.

A repeated reference and a legitimate equal total

Call duplicate_invoice_check with synthetic records:

{
  "records": [
    {"record_id":"A","entity_id":"UK-1","supplier_id":"S-9","document_type":"invoice","invoice_number":"INV-001","invoice_date":"2026-10-01","currency":"USD","total_minor":12500},
    {"record_id":"B","entity_id":"UK-1","supplier_id":"S-9","document_type":"invoice","invoice_number":"INV-001","invoice_date":"2026-10-02","currency":"USD","total_minor":13000},
    {"record_id":"C","entity_id":"UK-1","supplier_id":"S-9","document_type":"invoice","invoice_number":"inv /001","invoice_date":"2026-10-03","currency":"USD","total_minor":12500},
    {"record_id":"D","entity_id":"UK-1","supplier_id":"S-9","document_type":"invoice","invoice_number":"SERVICE-02","invoice_date":"2026-10-01","currency":"USD","total_minor":12500}
  ],
  "save": false
}

The result has four unique candidate records and three groups. exact_reference includes A/B despite their different dates and totals. normalized_reference includes A/B/C and exposes every conflicting field. same_amount_date includes A/D: two different legitimate services could have the same date and total, so this group is a review prompt. A appears in three groups but is counted once. No sum of possible losses is calculated. Changing C to INV-1 excludes it from the normalized INV001 group because leading zeros remain meaningful.

Exact input contract

Supply 1–1000 records, each with unique record_id, exact entity_id and supplier_id, document_type (invoice or credit_note), invoice_number, real YYYY-MM-DD invoice_date, uppercase three-letter currency, and positive safe-integer total_minor. IDs and invoice numbers are 1–160 characters without surrounding whitespace or control characters. Optional entity_label and supplier_label are display-only text, up to 200 characters without controls. Unknown fields are rejected.

Amounts are integer currency minor units, never floating point amounts: USD 12500 means $125.00. Currency codes are checked for uppercase three-letter syntax, not against an external currency registry. Credit notes use positive absolute amounts and compare only with credit notes. No amounts are added, converted or interpreted as a financial loss. Year 0000, impossible calendar dates, duplicate record ids, zero/negative/decimal/unsafe money and over-limit batches are input errors.

Each rule groups only records with exactly equal (entity_id, supplier_id, document_type, currency). Entity and supplier IDs are case-sensitive: similar names, different IDs and different entities never join. Multiple entities can appear in a batch, but each remains a separate scope. Display labels do not affect matching.

Three equality rules run independently:

  1. exact_reference: the original invoice number matches exactly, even when amounts/dates differ.
  2. normalized_reference: ASCII a-z becomes A-Z; only ASCII space, hyphen, slash and dot are removed. Leading zeros, accents, all Unicode characters, underscores, nonbreaking spaces, Unicode dashes and letter/digit lookalikes remain unchanged. Empty normalized keys do not collide.
  3. same_amount_date: positive amount and invoice date both match exactly. This frequently has legitimate explanations.

Groups contain complete membership, exact scope and match key, an explanation and differing source fields. They are independent overlapping reasons, not transitive confirmed-duplicate clusters. candidate_record_count counts the union once. no_candidates_in_supplied_batch means these limited rules found none in the records supplied; it does not mean safe to pay. Missing history and reference, date or amount changes can evade these rules. Saved reports never become implicit cross-call history: include all records you want compared every time.

Source records and report groups are sorted deterministically; reordering the same input records produces the same diagnostic evidence. The computation groups keys instead of producing every pair: at most 3000 memberships for 1000 records, including overlap. The server performs no telemetry or network requests.

Free evidence, paging and CSV

Every check returns a retrieval.report_id, including unsaved checks. Preview IDs are preview:<UUID>, local to the current server process. The last two previews remain available for 30 minutes. A third check, restart or expiry can evict a preview; resubmit the original free diagnostic. Saved UUIDs persist on disk.

report_page sections are records, groups, record_summaries, and group_members. Follow next_offset until null, with limit 1–100. Group pages return summary metadata and member_count; read all members using section: "group_members" and the exact group_id. Member pages contain complete original records. Records are stored once in the report; groups refer to their exact record ids. All pages and CSV exports are free, including after hitting the saved-report cap.

The encoded incoming stdio message must fit the SDK's 10 MiB receive buffer. Responses use an 8 MiB escaped text-envelope budget; a larger report returns an explicit paginated overview with the same free retrieval instructions. Current 1000-row/text limits fit that budget in transport tests, including worst-case quoting. CSV uses one row per record rather than repeating it for each group. It includes original source fields, candidate flag, reason codes and group ids. Formula-like leading text is escaped. Export returns text; it never writes to a caller-supplied filename. CSV pages can contain fewer rows than the requested limit when quoting would exceed the response budget. Follow the actual next_offset until null; returned always counts the rows in that page. Every CSV page repeats its header; retain one header when joining pages.

Free and Pro

Capability Free Pro
All checks, source records, grouped reasons Included, up to 1000 records/call Same
Preview pages and CSV Included Same
Concurrent saved reports 3 No report-count cap
Total saved storage 64 MiB 64 MiB
Input/output, text and preview safety bounds Same documented bounds Same

save: true at the free cap still returns the complete diagnostic and free preview with saved: false, save_error: "free_saved_report_cap", and an upgrade link. Delete a saved report to reuse a slot. Storage failures also preserve diagnostics. Pro removes only the saved-count cap; it does not increase input, transport, preview or total storage bounds.

Get Pro: $19 one time. All servers: $39 bundle. Set MCP_LICENSE_KEY or call license_activate. Keys verify offline.

All data stays local. Reports live under ${XDG_DATA_HOME:-~/.local/share}/mcp-servers/duplicate-invoice-check/. XDG_DATA_HOME must be absolute and directory ancestry must contain no symlinks. Private JSON files use atomic writes and cross-process mutation locks; reads revalidate source records and recompute the evidence instead of trusting edited derived results. License activation writes the shared local license config. Manage local accounting-data access and backups yourself.

Development

npm run build --workspace @theluckystrike/mcp-duplicate-invoice-check
npm test --workspace @theluckystrike/mcp-duplicate-invoice-check

Build Docker from the repository root: docker build -f servers/duplicate-invoice-check/Dockerfile .. Tests cover actual stdio calls, schema rejection, scope/Unicode/zero negatives, an independent 2000-batch pairwise oracle, grouped 1000-record transport, pages and CSV, cross-process save caps, recomputation, symlink/path rejection and aggregate storage boundaries. A local signed-key stdio test uses the operator's existing signer if present; it skips when that private signer is absent.

First five minutes

Three prompts that scored 3 of 3, measured in round 46, 2026-10-16. Paste one in as it is written.

The same supplier sent INV-001 twice with different dates and totals. Preserve both values and show why review is needed.

Paste this into Claude with the server connected.

What it did, measured in round 46, 2026-10-16: Two distinct candidate records in exact and normalized groups; Original dates and amounts preserved as explicit conflicting fields

Find INV-001 versus inv /001 but keep INV-1 separate: leading zeros matter.

Paste this into Claude with the server connected.

What it did, measured in round 46, 2026-10-16: Formatting change produces one two-record review group; Leading-zero difference excluded; All three original records retained

These identical references belong to another entity, supplier, currency or a credit note. Do not merge them.

Paste this into Claude with the server connected.

What it did, measured in round 46, 2026-10-16: Five source records retained; Zero candidate groups across distinct exact scopes; Zero means no candidates in supplied batch, not payment clearance

On the free tier for this path: Full diagnostics for up to 1000 supplied records, complete free paging and CSV export; store 3 reports at a time.

Or the 48-server bundle for $39.

Set it up in your client

Exact config path, entry and caveats: Claude Desktop · Claude Code · Cursor · VS Code · Windsurf · Cline · all clients

Compared with the alternatives

Duplicate supplier invoice checks: local MCP, Oracle and Invoice Triage Copilot · all comparisons

Guides

Review duplicate supplier invoice references in Claude · Check a supplier invoice against a purchase order and delivery note in Claude · How to track billable hours inside Claude Code and Cursor · Create an invoice PDF from a chat message with an MCP server · Ask questions about an Excel or CSV file from Cursor or Claude · Watch a product price with Claude and get told when it drops · What the free tier includes and what Pro adds · Log expenses and mileage in Claude, split VAT, rebill to an invoice · Convert currencies in Claude with real ECB rates, no API key · Generate Word proposals and contracts from a chat message · Find a meeting time across time zones without doing the arithmetic · Write a resume and a cover letter from chat, without inventing anything · Bill a retainer on a schedule without a billing SaaS · Assemble a contract from your own clause library, in chat · Connect MCP servers to Claude.ai, Claude Desktop, Cursor and VS Code without installing anything · Merge, split and stamp PDFs from chat, and why some come back as glyph numbers · Read a .ics calendar in Claude: free and busy, conflicts, and billable meetings · Run a kanban board in Claude, with time tracking on the same task · Resize, compress and watermark images from a chat message · Categorize and reconcile a bank CSV export from chat · Send a quote from chat, then turn the yes into an invoice · Put a SEPA payment QR code on an invoice from chat · Zip and unzip archives safely from Claude or Cursor · Client deposits and retainers from chat, applied to your real invoices · Fixed assets and depreciation from chat, on the rates the tax authorities publish · Per diem and travel allowances from chat, on the rate tables the tax authorities publish · One double-entry ledger out of every server you already run · Loan and lease schedules from chat, closing exactly on zero · Work orders and job cards from chat, and why the markup goes on the unit cost · Price lists and rate cards from chat, and the 100x scale gap between the invoice and the quote · Change orders and the running contract value from chat, and why a changed line is two items · A petty cash float from chat, and why the cheque is not the sum of the vouchers · Client statements and payment chasers from chat, aged as at any date you name · Credit notes and purchase orders from chat, against your real invoices · One install, every server: the office-suite bundle · Close a month in chat: invoice, credit note, retainer, bank reconciliation, statement · MCP server not showing up in Claude Desktop: the six checks that find it · Where is claude_desktop_config.json, and what goes in it · claude mcp add: every flag, and the scope that silently loses your server · MCP servers on Windows: spawn npx ENOENT, backslashes and the PATH · Installing these MCP servers when npx does not work yet · Cursor MCP setup: mcp.json, the required type field, and where the servers appear · Which MCP servers work with no network at all · Invoicing an EU client with reverse charge, from a chat message · Quote, deposit, invoice, statement: the whole cycle in one conversation · Is this project making money? Hours against costs, without a spreadsheet · Building a tax year pack for your accountant from chat · Keeping a mileage log in chat, with the rate you actually claim · Reconciling a bank CSV against what you invoiced and spent · Rebilling client expenses, with a markup and the VAT handled honestly · Chasing an unpaid invoice: aging, then the letter · A bill of sale from chat, with the identifiers checked and the signature lines printed · Pricing a job from a rate card, and what to do when the scope changes · Working out your hourly rate from what you actually billed · Converting CSV to xlsx and back without opening Excel · Asking a spreadsheet questions in plain language · Merging a folder of receipts into one PDF from chat · Splitting one big scan into separate documents · Sending a month of paperwork as one archive, safely · MCP servers in VS Code: the one-word mistake that breaks every config · MCP servers in Windsurf and Cline: two defaults that waste an afternoon · Local MCP server or hosted URL: which one, and what you give up · What these MCP servers actually do on the free tier · Choosing an MCP server for invoicing: the seven questions worth asking · When you need an MCP server, and when a prompt is enough · MCP config file locations and JSON keys, every client · Why an MCP server does not appear, in order of likelihood · How MCP registry search actually works, measured · What is actually in the MCP registry: 6,000 rows counted · stdio or streamable HTTP: which MCP transport, and what breaks · MCP protocol versions: what each one changed · Every field in an MCP server config entry, by client · MCP config scopes: which definition wins when a server is defined twice · Where each MCP client writes its logs · Shipping an MCP server: a bundle to download or a URL to paste · What is inside a .mcpb MCP bundle · Charging for an MCP server: how licensing actually works · How much text an MCP server may return, and how much it may describe · What to check before letting an MCP server run · Why a directory says your hosted MCP server is not responding · The MCP registry binds one remote URL to one server name · Capital letters in your GitHub username change your MCP registry rank · How many MCP servers already have your word in the name · server.json field reference for the MCP registry · When an MCP tool fails, do not return a JSON-RPC error · structuredContent and outputSchema in MCP, and what MUST hold · Rules for naming an MCP tool, and the collision nobody plans for · MCP has no session, so how do two tool calls share state · x-mcp-header: mirroring tool parameters into HTTP headers · How a directory scores an MCP server, and why your worst tool decides it · What AI crawlers fetch that Googlebot does not, measured on 141 URLs · Search Console's URL Inspection API changes its answer between calls · Which MCP servers work by pasting a URL, with nothing installed · Where to find MCP servers that cost money, and how you actually pay · Getting an assistant to fill in a quote or estimate for a customer · Is there an MCP server for a petty cash book or a cash ledger · Currency conversion in an assistant, and which MCP server to use · Zipping and unzipping archives from an assistant, and what the guards do · Producing a delivery schedule or a work order document from a chat · Will an MCP server email the invoice to my client · Can an assistant read a photo of a receipt and log the expense · Which MCP server can generate invoice PDFs from a chat message? · Can an MCP server read a bank statement PDF and categorise the transactions? · Best MCP servers for small business accounting and paperwork in 2026 · MCP Supplier Directory: keep supplier lists from rotting in a spreadsheet · MCP Service Agreement: stop copying a rotting contract template off the internet · MCP Maintenance Log: know what service is due without anyone remembering · MCP Mileage Log: keep the deductible log at the moment of the drive, not in April · Invoice payment terms best practices: Net 30, due date and late fees · How to categorize bank transactions · Petty cash log template · Ask questions about a spreadsheet in chat, no formulas needed · Turn a quote or estimate into an invoice without retyping it · Produce a delivery schedule and a work order from a chat · Use MCP servers without installing anything, by pasting a URL · MCP servers for small business accounting: the roundup · How to find and pay for MCP servers · Track billable hours as timesheet entries instead of a wall-clock timer · Convert a CSV into JSON for an API import or a dev tool · Build an NDA or mutual confidentiality agreement from clauses · Make a packing list or delivery note from the order in chat · Run a stock count with barcodes and update the catalogue in chat · Merge PDF files in Claude or Cursor without uploading them anywhere · Split a PDF into separate documents from the chat window · Track expenses and budgets inside Claude without a SaaS subscription · Run pomodoro focus sessions from Claude and bill the hours after · Track product prices and get drop alerts from your AI chat · Track billable time and export timesheets from your AI chat · Keep invoice numbers sequential and never reuse one · ATS resume check and cover letter from chat: pass the parser before the recruiter · Freelancer invoicing from chat: billable hours to invoice lines to PDF without a SaaS subscription · Price drop alerts and PDF cleanup from chat: two small jobs you keep postponing · Convert USD to cedis, rand and shillings in Claude with real rates · Build a loan amortization schedule from chat and export it for Excel · How much do MCP servers cost? One-time licenses vs monthly subscriptions · Turn a bank CSV export into Excel rows from chat · Generate barcodes and QR codes from chat with an MCP server · Spreadsheet MCP servers compared: building Excel files from chat · All guides

More servers

MCP Price Tracker · MCP Spreadsheet · MCP Server for Invoices — Generate Invoices from Claude · MCP Expense Tracker — Log Expenses from Claude · MCP Currency Converter · MCP Word Document Server — Create .docx from Claude · MCP Timezone Planner · MCP Resume and Cover Letter