Duplicate supplier invoice check MCP server
You can use it to review supplied supplier invoice batches for duplicate candidates and inspect/export the local evidence.
Run
duplicate_invoice_checkon up to 1000 supplied invoice or credit-note records to find exact invoice-number matches, conservative normalized reference matches, and exact same amount/date matches within the same entity, supplier, document type, and currency.Get complete grouped candidate evidence, unique candidate counts, match keys, differing fields, and review reasons; candidates are not confirmed duplicates or payment decisions.
Page through records, groups, record summaries, and group members, and export CSV evidence with one row per source record.
Save, list, read, and delete local reports; free tier allows 3 concurrent saved reports, while Pro removes the saved-report count cap.
Check license status and activate an offline Pro license key.
Use it locally via stdio MCP clients; it does not connect to an ERP, read PDFs/OCR, retrieve missing history, calculate losses, approve payments, or make network/telemetry requests.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Duplicate supplier invoice check MCP server review this batch of supplier invoices for duplicate invoice numbers and amounts"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Duplicate supplier invoice check MCP server
MCP server for duplicate supplier invoice and vendor bills review: supplied-batch exact and normalized references with free CSV evidence. Review duplicate supplier invoice candidates in supplied local history.
Works with Claude Desktop, Claude Code, Cursor and any Model Context Protocol client. Runs on your own machine: this one has no hosted endpoint, so install it from the bundle or from source.
Product page: https://mcp.zovo.one/s/duplicate-invoice-check - capabilities, free limits and supported installation paths.
Try the editable duplicate-invoice review in your browser before installing. Synthetic fields are checked locally in your browser without uploads. Candidates require review; they are not payment decisions.
Install
Claude Desktop, one click. Download duplicate-invoice-check.mcpb from the bundle catalog and double-click it.
From source. The mirror is self-contained: every @theluckystrike/* dependency is vendored, so a fresh clone builds with no extra setup.
git clone https://github.com/theluckystrike/mcp-duplicate-invoice-check.git
cd mcp-duplicate-invoice-check
npm install && npm run buildThen point your client at the built entry point:
{
"mcpServers": {
"duplicate-invoice-check": {
"command": "node",
"args": ["/absolute/path/to/mcp-duplicate-invoice-check/dist/index.js"]
}
}
}
@theluckystrike/mcp-duplicate-invoice-checkis not published on npm yet, so annpx -y @theluckystrike/mcp-duplicate-invoice-checkcommand will fail. The three paths above are the working ones and each is exercised by CI.

Read-only mirror of mcp-servers/servers/duplicate-invoice-check. See MIRROR.md.
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.
Related MCP server: AP Invoice Intelligence MCP Server
Try it before installing
Run the free duplicate-invoice example in your browser. Edit the synthetic invoice records to see candidate groups and their reasons. The example runs locally in your browser without an account or uploads. Product details and installation options.
Your review task | Start here |
Find repeated invoice references across a supplied invoice-history batch | This server: |
Compare one supplier invoice with its PO, accepted receipts and prior billed quantities | Three-way supplier invoice matching, with a free browser example. |
Both servers include their full diagnostics and CSV evidence for free. Pro removes the limit of three saved reports; the $39 bundle covers both. Neither tool approves payment or retrieves missing accounting history.
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-checkClaude 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.jsCursor: 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 |
|
|
| Optional |
| Saved |
| Saved or preview |
| Saved |
| Saved or preview |
| No arguments; offline tier and checkout link. |
|
|
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:
exact_reference: the original invoice number matches exactly, even when amounts/dates differ.normalized_reference: ASCIIa-zbecomesA-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.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-checkBuild 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.
Available Tools
8 toolsduplicate_invoice_checkReview duplicate invoice candidatesB
Group up to 1000 supplied records by exact/normalized reference or exact amount/date within exact entity, supplier, type and currency. All evidence is free. Candidates require review; no payment approval.
Inputs: records (required), save.
license_activateActivate licenseA
Activate a Pro key (MCPL1.xxx.yyy) from checkout: verified offline against a built-in public key, saved to your config file. A wrong, malformed or expired key is refused, unsaved. license_status reads it back.
Inputs: key (required).
license_statusLicense statusA
Report this server's licence state: product, tier free or pro, licence id, expiry, the key source and the upgrade URL. No arguments, no network. Explains a free-tier refusal; license_activate installs a key.
Inputs: no named parameters.
report_deleteDelete one saved candidate reportADestructive
Delete one local saved report and free a storage slot. Does not change accounting records.
Inputs: id (required).
report_export_csvExport candidate records as CSVBRead-onlyIdempotent
Export free CSV pages from a saved report or unsaved preview. One row per record with reasons and group ids. Formula-like cells are escaped; no financial-loss total is calculated.
Inputs: id (required), limit, offset.
report_getRead a saved candidate reportARead-onlyIdempotent
Read a saved report with source records, reason groups and overlap-safe candidate counts. Large reports return free paging instructions.
Inputs: id (required).
report_listList saved candidate reportsARead-onlyIdempotent
List saved report ids, timestamps and unique candidate counts. Free on both tiers. Up to 100 reports per page.
Inputs: limit, offset.
report_pageRead full candidate evidence pagesCRead-onlyIdempotent
Read free pages of records, group summaries, record reasons or one group’s members. Unsaved preview ids last 30 minutes for the last two checks in this process.
Inputs: id (required), section (required), limit, offset, +1 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 8 tools
The core duplicate_invoice_check tool is clearly distinct from the report and license management tools. The report tools mostly have separate purposes, but report_get and report_page overlap in reading report content/pages, which could cause some misselection despite clarifying descriptions.
All tools use snake_case with a consistent domain-prefix plus action pattern: duplicate_invoice_check, report_list, report_get, report_page, report_delete, report_export_csv, license_status, and license_activate. The convention is predictable even though duplicate_invoice_check has a longer domain prefix.
Eight tools are well-scoped for the server: one core duplicate-checking tool, five report lifecycle tools, and two license tools. There is no obvious bloat, and each tool appears to earn its place.
The server covers duplicate checking, report listing/reading/paging/deleting/exporting, and license status/activation. However, there is no explicit tool for creating or saving a report from a duplicate check preview, leaving a notable gap in the saved-report lifecycle that may force workarounds.
Maintenance
Related MCP Connectors
Documents 1.4.2: five focused MCP tools. analyze_receipt extracts caller-supplied receipt text or checks supported fields (0.25 USDC). match_invoice allocates invoice quantities against a purchase order, including split lines and remaining quantities (0.50 USDC). reconcile_purchase_documents is the free choice for discrepancies across supplied receipt, invoice and PO fields; missing documents remain needs_review and split links are flagged rather than allocated. Neither comparison requires the other. Consolidated example and status tools are free. Paid calls require buyer-authorized x402 on Base. Human review required; no image OCR, stored-analysis retrieval, delivery certification, payment approval or accounting writes. Service-specific cache and payment-metadata terms are disclosed through status. Runtime utilities: https://agents.getardaro.com/mcp/utilities . Legacy /mcp remains compatible. Guide: https://agents.getardaro.com/document-review
Reconcile business documents, inspect exact differences and evidence, and export reports.
Evidence-backed UBL, PDF, and image invoice checks before approval or payment.
Review invoice records, flag duplicates, validate totals, and prepare spreadsheet-safe CSV.
Related MCP Servers
- AlicenseAqualityDmaintenanceExposes a ledger system (invoice queue, duplicate control, VAT register, contractor history, decision journal) as MCP tools for AI agents, enabling accurate invoice processing with deterministic validation.7MIT
- FlicenseNot gradedqualityCmaintenanceEnables accounts payable teams to extract invoice data from PDFs and images, detect duplicates, normalize vendor names, calculate payment terms, and validate invoice completeness. Supports local extraction for text PDFs and optional vision providers for scanned documents.-
- AlicenseNot gradedqualityCmaintenanceEnables accounts-payable teams to turn emailed or uploaded invoice PDFs into structured, source-cited fields via Claude, run deterministic arithmetic, date, PO and duplicate checks, and route each invoice to a named human for approval or rejection through scoped bearer tokens. Also supports listing pending approvals and forecasting what falls due in the coming weeks, with per-extraction cost tracking.MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents and finance teams to extract structured fields from messy invoices and audit them before payment, applying seven evidence-backed risk rules that catch total/tax mismatches, duplicate invoices, missing fields, future dates, and round amounts, then returning a 0–100 score with a payment link. Exposes four MCP tools over stdio and Streamable HTTP (spec 2025-11-25) plus a web UI, backed by an optional AWS Bedrock or OpenAI-compatible extraction brain that degrades gracefully to a zero-dependency offline engine.MIT