Back to Directory/Monitoring & Observability

io.github.arose26/xlsx-audit-mcp

Audit Excel workbooks: formula dependency tracing, circular references, risk smells. Local only.

Monitoring & ObservabilityTypeScriptv0.1.0

xlsx-audit-mcp

An MCP server that audits Excel workbooks. Other Excel MCP servers read and write your data — this one reviews your model:

  • "What feeds the Total cell on the Summary sheet?" — precedent tracing
  • "If I change this assumption, what breaks?" — dependent tracing, including cells that consume it through ranges like SUM(A1:A40)
  • "Audit this workbook" — circular references with example chains, volatile functions (INDIRECT, OFFSET, NOW, RAND...), hardcoded constants buried inside formulas, external workbook links, merged cells, extra-long formulas

Spreadsheet mistakes are famously expensive. This is the "trace precedents" discipline auditors apply by hand, exposed to an LLM for a whole workbook at once. Local files only; nothing leaves your machine.

Quick start

Claude Code

claude mcp add xlsx-audit -- npx -y xlsx-audit-mcp

Claude Desktop — add to claude_desktop_config.json:

{
  "mcpServers": {
    "xlsx-audit": {
      "command": "npx",
      "args": ["-y", "xlsx-audit-mcp"]
    }
  }
}

Then: "Audit C:\models\budget-2026.xlsx and tell me what looks fragile."

Tools

ToolWhat it does
workbook_overviewSheets, dimensions, formula counts, defined names, external links
list_formulasFormulas with addresses and cached values, filterable (INDIRECT, VLOOKUP, ...)
trace_cellOne cell's formula, value, precedents, and dependents (direct + via ranges)
audit_workbookRanked risk report across the whole model

How it works

  • Reference tokenizer that understands real formulas: string literals are stripped first (the "A1" in INDIRECT("A1") is not a reference), function names can't collide (the G10 in LOG10(...) is not a cell), $ absolutes, quoted sheet names ('My Data'!A1), and ranges are handled.
  • Shared formulas are materialized. Excel stores filled formulas once with an offset scheme; the loader translates them per-cell (relative refs shifted, absolutes preserved), so dependency queries see what each cell actually computes.
  • Ranges are never expanded for storage — dependents queries use range-containment tests, and cycle detection caps range fan-out (a SUM(A:A) can't explode the graph; capped ranges are reported, not silently dropped).
  • No formula evaluation. Cached values from the file are shown instead — no spreadsheet engine dependency.

Known limitations: R1C1 notation and structured table references ([@Column]) are counted but not resolved into the graph.

Development

npm install
npm test                 # offline tests — synthetic workbooks built in-suite
npm run build            # tsc → dist/
node scripts/smoke.mjs   # end-to-end: generates a workbook, drives the server over stdio

Architecture: src/xlsx.ts (zip + XML → workbook model) and src/formulas.ts (tokenizer, graph, smells) are pure logic; src/index.ts is the MCP wiring.

License

MIT

Installation

Source-derived launch command. Check the maintainer’s required arguments and credentials before running:

bash
npx -y xlsx-audit-mcp

Set up in your AI client

Merge this template into ~/Library/Application Support/Claude/claude_desktop_config.json. Keep existing servers. Add any arguments, credentials, and permissions required by the maintainer; this template has not been install-tested.

json
{
  "mcpServers": {
    "io-github-arose26-xlsx-audit-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "xlsx-audit-mcp"
      ]
    }
  }
}

Restart Claude Desktop completely for changes to take effect. Confirm the server appears connected in the client’s tool list, then try a read-only example from its documentation.

Claude Desktop setup reference

Package

xlsx-audit-mcpnpm

Compatible MCP Clients

io.github.arose26/xlsx-audit-mcp works with any MCP-compatible client. Copy the config snippet from the Configuration section above and add it to the file shown for your client, then restart the application.

  • Claude Desktop~/Library/Application Support/Claude/claude_desktop_config.jsonRestart Claude Desktop completely for changes to take effect.
  • Cursor~/.cursor/mcp.jsonRestart Cursor for changes to take effect.
  • VS Code.vscode/mcp.jsonReload VS Code window for changes to take effect.
  • Windsurf~/.codeium/windsurf/mcp_config.jsonRestart Windsurf for changes to take effect.
  • Claude Code.mcp.jsonSave at the project root, then start Claude Code in that project and review the MCP server approval prompt. Keep real credentials out of shared files.

Learn More