DeskCalc Verify
OfficialDeskCalc Verify (MCP server)
Let a human check and confirm numbers in DeskCalc before an AI agent relies on the total.
deskcalc.com · DeskCalc Verify · Download DeskCalc · Pricing · Contact
An agent (Claude Desktop / Claude for Work, Codex, …) extracts amounts from receipts,
statements or invoices and calls verify_numbers. The lines open as a labelled tape in
DeskCalc on the user's Windows PC; the user checks every line, corrects what is wrong and
presses Confirm in DeskCalc. Only then does the agent get the confirmed total, the lines
and the list of corrections.
Privacy
The check runs on your PC. The server talks to DeskCalc through files in
Documents\DeskCalc Verify; it opens no network connection, needs no account and sends no telemetry. The calculation is done by DeskCalc itself, not by the AI.What the AI sees: the document you give it (that is between you and your AI provider, as without this tool) and the confirmed result: total, lines, your corrections.
What stays local: the tapes in DeskCalc and the audit records (PDF) in
Documents\DeskCalc Verify\Prüfnachweise/Audit records. Job files are deleted after each check.Without a cloud relay: chat clients that only accept remote (HTTPS) MCP servers (ChatGPT chat, Microsoft 365 Copilot, Copilot Studio) are not supported on purpose.
Related MCP server: invoice-server
Requirements
Windows, DeskCalc 11.3 or later (website or Microsoft Store version)
Node.js 20+ (Claude Desktop brings its own)
What it checks
Check | How the agent sends it |
Sum of amounts (receipts, expenses - 30 receipts on one tape) |
|
Quantity × unit price against the printed line total |
|
VAT added or included, computed by DeskCalc from the subtotal |
|
Discount / surcharge / Skonto in percent |
|
Mixed VAT rates: one block per rate, GT line |
|
Printed subtotals / carry-overs (statements, ledgers) - names the first wrong one |
|
Footing and cross-footing a table: each row is a block on the tape (net, tax, printed gross as checkpoint), so DeskCalc shows net + tax; column totals against the printed ones. Up to 125 rows per tape |
|
Foreign currency (amount × rate) |
|
Amount payable |
|
Cent rounding as documents do it (per line, per tax amount, or tax per position as many billing programs do) is reported as a rounding difference, not as an error.
Tools
Tool | Purpose |
| open the tape, wait for Confirm → |
| continue waiting for a |
| reconcile two confirmed tapes (invoice ↔ delivery note, order, payment) |
| PDF audit record for the working papers (document, date, user, lines, corrections, check, fingerprint) |
| is DeskCalc installed, is a review open |
Ready-made prompts (Claude Desktop: "+" menu → deskcalc-verify): check an invoice, add up expense receipts, foot and cross-foot a table, check a statement with carry-overs, reconcile two documents.
Values are plain numbers with . as decimal separator; negative for credits.
Try it with the sample documents
samples/en (and samples/de in German) holds fictitious documents with
deliberate errors. Attach one in Claude Desktop, pick the prompt, check the tape in DeskCalc and
press Confirm. Each folder has a Solution.txt with the expected findings - don't attach it.
Sample | Prompt | What Verify should find |
V4 Expenses: 30 receipts + an expense claim | Add up expense receipts | One tape, 30 lines, total 1,316.75. Receipt 18 prints VAT 8.72 instead of 8.32. The claim is added up 1.00 too high and has receipt 12 as 50.74 instead of 57.04 (reconcile claim and receipts) |
V5 Bank statement: 3 pages with carry-overs | Check a statement with carry-overs | Carried forward page 2 is 10.00 off (first error); the closing balance only follows from it |
V6 Cross-footing: sales day book, 16 rows | Foot and cross-foot a table | INV-2026-1107: 6,566.55 + 328.33 = 6,894.88, printed 6,898.48; net column 100.00 too high |
V7 Reconcile: purchase order + invoice | Reconcile two documents | Toner invoiced at 98.90 instead of 89.90, archive box not invoiced, delivery charge not ordered; net difference -13.10 |
V8 Foreign currency: travel expenses in USD and CHF | "check the conversions and the total" | Trade fair admission 245.00 USD x 0.7850 = 192.33, printed 193.23; the total follows from it |
Then say "save the audit record": the PDF for the working papers lands in
Documents\DeskCalc Verify\Audit records (in German Prüfnachweise, following DeskCalc's language).
When a printed figure does not add up, DeskCalc 11.3.1 pins the document as printed next to the check - the wrong line in red, the figures that only follow from it in yellow (green frame when everything matches):

How the cross-footed table looks on the DeskCalc tape - every row is a block, DeskCalc adds net + VAT itself and puts it next to the gross printed on the document:
INV-2026-1107 Alpha 5%
Net 6,566.55 +
Tax 328.33 +
Gross per document 6,894.88 # <- the document prints 6,898.48And what the AI reports back (abridged):
document_check: 3 of 19 figures do NOT match the confirmed tape
row "INV-2026-1107": net 6566.55 + tax 328.33 document 6898.48, DeskCalc 6894.88 (difference -3.60)
net column document 73683.19, sum of rows 73583.19 (difference -100.00)
total follows from the row above, not a new errorConfiguration
Claude Desktop: download deskcalc-verify.mcpb
and double-click it - Claude Desktop installs the extension (it brings its own Node.js).
Or by hand in claude_desktop_config.json:
{ "mcpServers": { "deskcalc-verify": { "command": "npx", "args": ["-y", "@deskcalc/verify"] } } }Codex - CLI, IDE extension and the Codex mode of the ChatGPT desktop app share
~/.codex/config.toml:
[mcp_servers.deskcalc-verify]
command = "npx"
args = ["-y", "@deskcalc/verify"]Environment (optional): DESKCALC_PATH (path to deskcalc.exe), DESKCALC_VERIFY_DIR
(exchange folder, default Documents\DeskCalc Verify).
After updating DeskCalc, close it completely once: a DeskCalc that still runs from before the update does not know the newer line kinds (the server says so).
Development
npm install
npm run build # dist/server.js
npm test # unit + end-to-end tests with a fake DeskCalc
python fuzz/fuzz_verify.py --cases 200 --seed 6 # random invoices against the real DeskCalc (probe mode)
node test/live-client.mjs 40 # against a real DeskCalc (set DESKCALC_PATH; run from PowerShell)
npm run mcpb # dist/deskcalc-verify.mcpb (Claude Desktop extension)
python samples/make_samples.py # sample documents (PDF, German + English) with deliberate errors
python samples/make_previews.py # README images of the English samplessamples/de, samples/en: fictitious receipts, a bank statement with carry-overs, a sales day
book, an order + invoice and a travel expense claim in foreign currency, each with deliberate
errors and the expected findings (Lösung.txt / Solution.txt) - for testing and demo videos.
Protocol and plan: website repo plans/09.4-w17-verify-bauplan.md, plans/09.5-w17-verify-pruefer.md.
Available Tools
5 toolscompare_verificationsReconcile two confirmed tapesARead-onlyIdempotent
Compare the positions of two confirmed verifications to the cent, e.g. invoice vs delivery note, order, or bank statement. Returns matched positions, positions with a different amount (same text), positions only on one side and the difference of the totals. Verify both documents with verify_numbers first.
Inputs: review_a (required), review_b (required), ignore_sign.
deskcalc_statusDeskCalc statusBRead-onlyIdempotent
Whether DeskCalc is installed and where, and whether a verification is open.
Inputs: no named parameters.
get_verificationGet the confirmed result from DeskCalcARead-onlyIdempotent
Wait for and return the result of a verification that came back "pending". Returns "confirmed" with total, lines and corrections once the user pressed Confirm in DeskCalc.
Inputs: review_id (required), wait_seconds.
save_audit_recordSave the audit record (PDF)A
Save a confirmed verification as a PDF audit record for the working papers: document name, date and user, every line with its calculation, the user's corrections and the cent-exact document check. Saved locally in the DeskCalc Verify folder; returns the file path.
Inputs: review_id (required), note, source, language.
verify_numbersCheck numbers in DeskCalcA
Show numbers as a labelled adding-machine tape in DeskCalc so the user can check every line, correct it and press Confirm. Returns the confirmed total, the lines, the user's corrections and - if you pass the printed figures - a cent-exact check of the document. Use it before you rely on a sum you extracted from receipts, statements or invoices. If the result is "pending", tell the user to finish the check in DeskCalc and call get_verification with the review_id. Line kinds: (1) amount: {label, value}. (2) quantity x unit price: {label, qty, price, value?} - value is the printed line total, checked against qty x price. (3) VAT/sales tax: {type:"tax", rate, included?, value?} - put it after the taxable lines; DeskCalc computes the tax from the subtotal above and recomputes it when the user corrects a line; value is the printed tax amount; included=true for gross prices ("incl. VAT"). (4) discount/surcharge in percent on the subtotal above: {type:"percent", rate, value?} - rate -3 for "3 % Rabatt", -2 for "2 % Skonto", +5 for a surcharge; value is the printed amount. A DISCOUNT ON A SINGLE POSITION ("Rabatt"/"Disc." column): {label, qty, price, discount: 10, value: printed line total} - discount in percent; DeskCalc shows qty x price and the discount below it, the check compares the printed line total. Never derive the discount from the printed total. Prices per 100/1000 units: convert to a unit price or give the line total as an amount. (5) MIXED TAX RATES (e.g. 20 % and 10 % on one invoice): a tax line always applies to the whole subtotal above, so put the positions of each rate in their own group: {type:"group", label:"20 %"}, its positions, its tax line; then {type:"group", label:"10 %"}, ... DeskCalc adds a GT (grand total) line. If the result has gt_outdated=true (the user corrected a line, the GT line is a snapshot), call verify_numbers again with exactly the arguments in "rerun" and use that second result. (6) MANY RECEIPTS (expenses, a stack of bills): ONE call, ONE tape - one amount line per receipt (label "14.10. Hotel"), never one call per receipt. If the receipts print their VAT, ALWAYS give each receipt its own group: the gross amount, then its tax line with included=true and the PRINTED VAT as value - only then can a misprinted VAT be found (the GT is still the total of the receipts). If an expense report prints a total, pass it as expected_total. (7) PRINTED SUBTOTALS / CARRY-OVERS (bank statement, ledger over several pages, "Übertrag", "Zwischensumme"): {type:"subtotal", label:"Übertrag S.1", value} at that place - DeskCalc shows the running total there and the check names the first carry-over that is wrong. An opening balance is a normal amount line. (8) CROSS-FOOTING A TABLE (net, tax, gross columns): one line per row {label, value: gross, net, tax} and nothing else in that call; pass expected_total (gross column total), expected_net_total and expected_tax_total if printed (row_labels: omit - the tape uses DeskCalc's language). DeskCalc shows each row as its own block: net, tax, and the printed gross as a checkpoint. (9) FOREIGN CURRENCY: {label, foreign: 100, currency:"USD", fx_rate: 0.92, value: 92.00} - fx_rate is home currency per 1 unit; if the document quotes the inverse (1 EUR = 1.08 USD), give the printed home amount as a plain amount line and name the rate in the label. For invoices also pass expected_total (the printed amount payable). After a confirmed check, offer save_audit_record (PDF for the working papers); to reconcile two documents (invoice vs delivery note, order or payment), verify both, then call compare_verifications. If you use a figure that is NOT printed on the document (e.g. a fee from a published table, a rate you looked up), say so in the label, e.g. "(Tab. A, web)", and tell the user - the tape must not make your own assumptions look like the document. Numbers: plain, "." as decimal separator, negative for credits. Labels: SHORT, max ~25 characters, e.g. "Pos.1 Wandfarbe" or "14.10. Hotel" - longer labels are cut off on the tape. Title: 1-3 words; it becomes the tab name in DeskCalc.
Inputs: items (required), title (required), row_labels, wait_seconds, +4 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 5 tools
Each tool has a distinct role in the verification lifecycle: starting a verification, retrieving a pending result, comparing two confirmed results, checking DeskCalc status, and saving an audit PDF. Although verify_numbers and get_verification are closely related, the pending-flow instructions make their boundary clear.
Most names follow a clear verb_noun pattern (verify_numbers, get_verification, compare_verifications, save_audit_record). The main deviation is deskcalc_status, a noun-style status tool, plus slight singular/plural variation in verification names.
Five tools are well scoped for a focused verification/audit workflow. Each tool has a clear place, and the complexity is concentrated in verify_numbers rather than spread across redundant tools.
The surface covers the core lifecycle: initiate verification, handle pending results, compare documents, check app status, and save an audit record. Minor gaps remain, such as no explicit cancel/abort operation or listing of prior audit records, but normal workflows are covered.
Maintenance
Related MCP Connectors
Read PDFs, photos and emails into structured fields; check, correct and approve the results.
Invoice PDFs, scans and photos to Excel, with the math checked: fields, line items and totals.
Extract accounting data from invoices, flag what needs review, and check your page usage.
Turns invoice PDFs into one spreadsheet and checks the tax, totals and money math of each invoice.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceDeterministic verification for AI-generated analysis. Reconciliation, consistency and Excel-integrity checks that stop the line when the numbers don't add up.1MIT
- FlicenseNot gradedqualityCmaintenanceEnables AI assistants to inspect and extract invoice metadata from PDFs, Word documents, Excel files, and images, then synchronize and enrich the extracted data into an Excel ledger.-
- AlicenseAqualityBmaintenanceRead and check European e-invoices (Factur-X, ZUGFeRD, XRechnung, UBL, CII) from an AI assistant: contents in plain text plus an EN 16931 consistency check.2MIT
- AlicenseAqualityCmaintenanceEnables an AI assistant to read Portuguese invoices and receipts, file them by tax year, and book them into an Excel or Google Sheets workbook. It works out the boxes of the quarterly IVA return, tracks IRS and Segurança Social totals, and reports what documents are still missing.16MIT