Skip to content
SKILLS
MCP ServerPublisher identity verifiedNo findings from static checks

@spboucher/xlsx-audit-mcpv1.0.0

MCP server that audits Excel workbooks without Excel: errors, hard-coded numbers, broken formula patterns, circular references, controls, stale values, comparison with a reference and a rubric-based grading aid. Read-only, dependency-free reader.

  • downloadable
  • installable
  • executable
Version
1.0.0
Published
Nov 10, 2026
Licence
MIT
Archive
93 kB
Files
27
Transport
stdio
Tools
14

Install

Register the local server

claude mcp add --transport stdio --env XLSX_AUDIT_ROOT=<value> --env XLSX_AUDIT_MAX_FILE_MB=<value> --env XLSX_AUDIT_MAX_UNZIPPED_MB=<value> --env XLSX_AUDIT_MAX_CELLS=<value> xlsx-audit-mcp -- node server.mjs
.mcp.json (project scope)
{
  "mcpServers": {
    "xlsx-audit-mcp": {
      "command": "node",
      "args": [
        "server.mjs"
      ],
      "env": {
        "XLSX_AUDIT_ROOT": "${XLSX_AUDIT_ROOT}",
        "XLSX_AUDIT_MAX_FILE_MB": "${XLSX_AUDIT_MAX_FILE_MB}",
        "XLSX_AUDIT_MAX_UNZIPPED_MB": "${XLSX_AUDIT_MAX_UNZIPPED_MB}",
        "XLSX_AUDIT_MAX_CELLS": "${XLSX_AUDIT_MAX_CELLS}"
      }
    }
  }
}

Environment variables — set locally, never sent to the registry

VariableRequiredPurpose
XLSX_AUDIT_ROOToptionalOnly directory the server may read workbooks from and write reports to (default: working directory).
XLSX_AUDIT_MAX_FILE_MBoptionalLargest workbook file accepted, in megabytes (default 50).
XLSX_AUDIT_MAX_UNZIPPED_MBoptionalCap on decompressed size, per part and in total, in megabytes (default 128 per part, 384 in total).
XLSX_AUDIT_MAX_CELLSoptionalLargest number of non-empty cells loaded from one workbook (default 2000000).
More steps
  1. 1Set the required environment variables locally

    XLSX_AUDIT_ROOT, XLSX_AUDIT_MAX_FILE_MB, XLSX_AUDIT_MAX_UNZIPPED_MB, XLSX_AUDIT_MAX_CELLS — configured on your machine only; never sent to the registry.

  2. 2Optional: download the listing's source archive for review

    skills download @spboucher/xlsx-audit-mcp@1.0.0
  • Declared permissions: filesystem:read, filesystem:write.
  • This server runs locally on your machine with your user's privileges. Review the source before running it; the registry does not execute or host it.

Installing only copies or configures. Nothing is executed for you. The Skills CLI verifies the checksum before writing files.

Documentation

xlsx-audit-mcp

An MCP server that audits Excel workbooks without Excel. It reads the .xlsx / .xlsm file itself (a ZIP of XML parts), executes nothing, and reports what a careful reviewer looks for: errors, numbers buried in formulas, broken patterns, circular references, failing controls and stale values. It also compares a submission with a reference workbook and prepares rubric-based grading evidence.

  • No dependency beyond the MCP SDK: the reader uses node:zlib only.
  • Read-only. The only writes are reports, to new files inside the allowed directory.
  • Local only: no network access.

Install

shell
skills install @spboucher/xlsx-audit-mcp --client claude-code

or by hand:

shell
cd xlsx-audit-mcp && npm install --omit=dev
claude mcp add xlsx-audit --env XLSX_AUDIT_ROOT="$HOME/Documents/models" -- node "$PWD/server.mjs"

Generic MCP configuration:

json
{ "mcpServers": { "xlsx-audit": { "command": "node", "args": ["/path/to/xlsx-audit-mcp/server.mjs"], "env": { "XLSX_AUDIT_ROOT": "/path/to/workbooks" } } } }

Requires Node.js 20 or later.

Configuration

VariableDefaultMeaning
XLSX_AUDIT_ROOTworking directoryOnly directory workbooks are read from and reports written to. Symbolic links leaving it are refused.
XLSX_AUDIT_MAX_FILE_MB50Largest workbook file accepted.
XLSX_AUDIT_MAX_UNZIPPED_MB128 per part, 384 totalCap on decompressed size. Inflation stops at the cap whatever the ZIP header declares.
XLSX_AUDIT_MAX_CELLS2 000 000Largest number of non-empty cells loaded.

Tools

ToolWhat it answers
workbook_summaryWhat is in this file? Sheets (hidden included), used ranges, counts, names, functions, macros, external links.
read_rangeWhat do these cells hold? Value, formula, number format, and where the value comes from. Paged.
list_formulasHow is the model built? Formulas with R1C1 pattern and precedent / dependent counts, or grouped by pattern.
find_errorsWhich cells are in error, and which ones are the root causes?
find_hardcodedWhere are numbers buried in formulas? Where was a formula overwritten by a typed number?
formula_consistencyWhich cell breaks the pattern of its row or column, and what should it hold?
find_circularAre there circular references? Each loop is printed cell by cell.
trace_precedentsWhere does this number come from?
trace_dependentsWhat does this cell feed?
check_controlsDo the model's own checks pass? Are some of them typed by hand? Does the overall cell agree?
recalc_checkDo the stored results follow from the formulas? (stale or altered values)
compare_workbooksHow does a submission differ from the reference?
grade_submissionRubric-based evidence and suggested points. An aid: a human decides.
export_reportThe whole audit as Markdown or JSON, inline or in a new file.

Typical session: workbook_summary → export_report → trace_precedents on each finding worth explaining.

Where values come from

Every value carries a source:

  • constant: typed in the cell.
  • cached: the result Excel (or LibreOffice) stored in the file next to the formula.
  • evaluated: the file holds no stored result and the formula is inside the supported subset.
  • unknown: no stored result and the formula is outside the subset. Never guessed.

The evaluated subset

+ - * / ^, unary minus, %, comparisons, SUM, AVERAGE, MIN, MAX, ROUND, IF, cell, range and cross-sheet references, defined names that are plain references. Nothing else. recalc_check and workbook_summary state the share of formulas outside the subset and the reasons (for example function VLOOKUP (212)); those formulas are only read from stored values.

Grading rubric

json
{
  "tolerance": 0.005,
  "items": [
    { "id": "revenue", "label": "Revenue per year", "range": "Calc!B3:F3", "points": 5 },
    { "id": "units", "range": "Calc!C2:F2", "points": 4, "formula_required": true, "constant_credit": 0.5 },
    { "id": "summary", "ranges": ["Outputs!B1:B2"], "points": 2, "partial": "all_or_nothing", "carried_forward_credit": 0.5 }
  ]
}

Per cell: correct (credit 1), correct_value_typed_as_constant (constant_credit, default 0.5, only when formula_required), carried_forward_error (carried_forward_credit, default 1: the reference formula applied to the submission's own earlier values gives the submitted value, so the mistake is upstream and penalised there), wrong, missing, unknown (0, listed in needs_human_review). partial: proportional (default) or all_or_nothing. Top-level fields are defaults for every item. The result always carries a disclaimer: it is evidence for a grader, not a grade.

Security

  • Workbooks are untrusted input. Nothing in them is executed: macros, external links, pivot caches and embedded objects are never opened; their presence is reported.
  • The ZIP reader refuses entry names that leave the archive (.., absolute paths, backslashes), ZIP64, multi-disk and encrypted archives, and stops inflating at the configured limit. Nothing is ever extracted to disk.
  • XML entities other than the five predefined ones are not expanded.
  • Paths are resolved with symbolic links followed and must stay inside XLSX_AUDIT_ROOT.
  • Reports are created with exclusive-create: an existing file is an error, never overwritten.
  • Cell text is data. Every result carries a notice reminding the model not to follow instructions found in a workbook.

Limits

  • .xlsx and .xlsm only. Not .xls, .xlsb, .ods, .csv; not password-protected files.
  • The evaluator is deliberately small (see above). A workbook saved by a library that does not calculate (openpyxl, for example) has no stored results: formulas outside the subset are then unknown until the file is opened and saved in Excel or LibreOffice.
  • Dates are reported as serial numbers with their number format; they are not converted.
  • Array formulas, data tables, structured table references, 3-D references and external references are recognised and reported as outside the subset.
  • Not read: conditional formatting, data validation, charts, pivot tables, comments, cell protection, VBA.
  • Pattern checks are heuristics: formula_consistency grades each finding high or low confidence, and a constant inside a formula is not always a defect. Errors hidden by IFERROR are invisible.
  • A clean report shows that these mechanical defects are absent. It does not show the model is right.
  • The dependency graph stops expanding after three million edges and says so (graph_truncated).

Tests

shell
npm test            # 37 tests: engine, hostile files, MCP protocol with the official client
npm run fixtures    # rebuild the .xlsx fixtures (a test checks they are up to date)

Fixtures are written by a small writer in test/fixtures/ that stores a result next to each formula. clean-libreoffice.xlsx was recalculated by LibreOffice and serves as an external check of the evaluator. See test/fixtures/README.md.

License

MIT

Tools

14 tools · declared by the publisher
ToolWhat it does
workbook_summarySheets, used ranges, formula and error counts, names, functions used, share of formulas outside the evaluated subset.
read_rangeRead cells page by page: value, type, formula, number format, value source.
list_formulasFormulas with R1C1 pattern, precedents and dependents counts; or grouped by pattern.
find_errorsError cells and broken references, root causes separated from propagated errors.
find_hardcodedNumeric constants inside formulas and typed numbers where a formula is expected.
formula_consistencyCells breaking the formula pattern of their row or column, with the expected formula.
find_circularCircular references across sheets, each loop printed cell by cell.
trace_precedentsWhere a number comes from, level by level and across sheets.
trace_dependentsWhat a cell feeds, level by level and across sheets.
check_controlsRead the model's own controls: failing, typed, and the overall check cell.
recalc_checkRecompute the supported subset and compare with stored values; states what could not be recomputed.
compare_workbooksSubmission against reference: right by formula, typed constant, wrong, missing; structural differences.
grade_submissionRubric-based grading evidence with partial and carried-forward credit. An aid: a human decides.
export_reportFull audit as Markdown or JSON, inline or written to a new file that never overwrites.

Environment variables

VariableRequiredPurpose
XLSX_AUDIT_ROOToptionalOnly directory the server may read workbooks from and write reports to (default: working directory).
XLSX_AUDIT_MAX_FILE_MBoptionalLargest workbook file accepted, in megabytes (default 50).
XLSX_AUDIT_MAX_UNZIPPED_MBoptionalCap on decompressed size, per part and in total, in megabytes (default 128 per part, 384 in total).
XLSX_AUDIT_MAX_CELLSoptionalLargest number of non-empty cells loaded from one workbook (default 2000000).

Files

27 files · 268 kB unpacked

Select a file to preview it. Files are shown as plain text and never executed.

Security & permissions

Declared permissions

  • filesystem:read
  • filesystem:write

Static checks

No advisory findings from static-1.0.0 on Nov 10, 2026. 13 informational notes.

Static checks are advisory. They never certify that a package is safe. Compatibility entries are publisher claims unless marked verified.

Compatibility

  • claude-code · claimed
  • codex · claimed
  • cursor · claimed
  • generic-mcp · claimed

Versions

1 release · immutable
VersionPublishedSizeSHA-256State
1.0.0latestNov 10, 202693 kB33c71c9c4da6…published

Publication history

  1. release.publish@spboucher/xlsx-audit-mcp@1.0.0by Simon-Pierre Boucher
  2. artifact.create@spboucher/xlsx-audit-mcpby Simon-Pierre Boucher
  • MCP ServerVerified publisher

    @spboucher/manuscript-audit-mcp

    MCP server for deterministic, offline audits of LaTeX and Markdown manuscripts: citations, cross-references, numbers, statistics reporting, tables, claims, style, replication statements, referee-report scaffold, version comparison.

    Latest version
    v1.0.0
    Licence
    MIT
    Updated
    53 min ago
  • MCP ServerVerified publisher

    @spboucher/scholarly-mcp

    MCP server for scholarly search and citation verification over Crossref, OpenAlex, arXiv and doi.org: checks that a DOI resolves and its metadata matches, audits .bib files, flags retractions, walks the citation graph.

    Latest version
    v1.0.0
    Licence
    MIT
    Updated
    1 h ago
  • MCP ServerVerified publisher

    @spboucher/latex-build-mcp

    MCP server that compiles LaTeX without shell escape and checks the result: parsed log diagnostics, overfull boxes, Beamer frames that overflow, references and citations, numbering from the .aux, LaTeX to Word.

    Latest version
    v1.0.0
    Licence
    MIT
    Updated
    1 h ago

↑↓ to navigate · enter to open · esc to close