Skip to main content
Glama
DeskCalc Verify

DeskCalc Verify

Official

DeskCalc 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)

{label, value} per line

Quantity × unit price against the printed line total

{label, qty, price, value}

VAT added or included, computed by DeskCalc from the subtotal

{type:"tax", rate, included?, value?}

Discount / surcharge / Skonto in percent

{type:"percent", rate, value?}

Mixed VAT rates: one block per rate, GT line

{type:"group", label} before each block

Printed subtotals / carry-overs (statements, ledgers) - names the first wrong one

{type:"subtotal", label, value}

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

{label, value: gross, net, tax} + expected_net_total, expected_tax_total, row_labels

Foreign currency (amount × rate)

{label, foreign, currency, fx_rate, value}

Amount payable

expected_total

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

verify_numbers

open the tape, wait for Confirm → confirmed (total, lines, corrections, document check) or pending

get_verification

continue waiting for a pending review

compare_verifications

reconcile two confirmed tapes (invoice ↔ delivery note, order, payment)

save_audit_record

PDF audit record for the working papers (document, date, user, lines, corrections, check, fingerprint)

deskcalc_status

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):

DeskCalc Verify: the invoice as printed on the left, the wrong line in red; DeskCalc's calculation on the right

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.48

And 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 error

Configuration

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 samples

samples/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 tools
compare_verificationsReconcile two confirmed tapesA
Read-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 statusB
Read-onlyIdempotent

Whether DeskCalc is installed and where, and whether a verification is open.

Inputs: no named parameters.

get_verificationGet the confirmed result from DeskCalcA
Read-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

    A4.1/5.0

    Scored across 5 tools

    Disambiguation5/5

    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.

    Naming Consistency4/5

    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.

    Tool Count5/5

    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.

    Completeness4/5

    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

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      C
      maintenance
      Deterministic verification for AI-generated analysis. Reconciliation, consistency and Excel-integrity checks that stop the line when the numbers don't add up.
      1
      MIT
    • F
      license
      Not graded
      quality
      C
      maintenance
      Enables 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.
      -
    • A
      license
      A
      quality
      B
      maintenance
      Read 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.
      2
      MIT
    • A
      license
      A
      quality
      C
      maintenance
      Enables 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.
      16
      MIT