Skip to content

xlsx-for-ai v3.0.2

Choose a tag to compare

@senoff senoff released this 06 Jun 01:48
· 75 commits to main since this release

Hotfix closing two SPM P0s that broke 3.0.0's .mcpb install path in Claude Desktop.

What was broken in 3.0.0

  1. .mcpb attach hung under Claude Desktop's built-in Node 24.15.0. mcp.js blocked initialize on the first-run registration POST and the dynamic tool-catalog GET; under Electron's bundled Node 24 the dial would stall (IPv6 / Happy-Eyeballs), the client's 60s timeout fired, and the MCP attach died before tools/list was ever called. Same bundle worked under system Node 25.6.1 because the dial resolved instantly.
  2. tools/list shipped without inputSchema/description. The hosted /api/v1/tools/list returns minimal stubs ({name, category, maturity_state, endpoint} only), and mergeTools was letting those stubs replace the bundled-catalog full schemas. Claude Desktop received a tools/list with no inputSchema and silently dropped the entire array — tool permissions panel empty, no tools/call ever fires, even after reinstall / connector toggle / restart.

How 3.0.2 fixes it

  • initialize no longer blocks on the network. Transport connects first; the bundled 50-tool catalog serves as the floor. Background-upgrade with bounded timeouts (10s registration, 8s catalog). notifications/tools/list_changed fires when the live catalog lands. capabilities.tools.listChanged = true.
  • mergeTools is now a field-level merge. Remote wins on every field it provides; baked-in fills the gaps. The bundled-catalog description + inputSchema survive when the server returns a minimal stub.
  • sanitizeForMcp floor in lib/annotations.js. Safety net for any tool that still reaches the transport without inputSchema / description.
  • Real per-tool inputSchema for all 50 tools. xlsx_read_handle and xlsx_session_set_validations moved into the bundled TOOLS array with full properties + required mirroring server-side route validation. Dispatch handlers added. Zero tools fall through to the sanitize floor.

Other defenses: EPIPE on stdout exits cleanly (0) instead of crashing on Socket 'error'; stderr EPIPE silenced; non-EPIPE rethrown so transport failures still surface. withTimeout helper attaches a no-op catch so late rejections from the original promise don't crash Node minutes after startup.

Regression tests pin the invariants under XLSX_FOR_AI_API = TCP black hole and against a fake server that emits stub-shape tools. 54/54 tests pass.

Install

One-click (recommended):
Drag this .mcpb into Claude Desktop → Settings → Extensions.

Config (self-heals on restart):

{
  "mcpServers": {
    "xlsx-for-ai": {
      "command": "npx",
      "args": ["-y", "-p", "xlsx-for-ai@latest", "xlsx-for-ai-mcp"]
    }
  }
}

Full changelog: https://github.com/senoff/xlsx-for-ai/blob/main/CHANGELOG.md