xlsx-for-ai v3.0.9
Wild-adoption fix pair surfaced by a non-Bob Claude agent live-testing the MCP. Both pure friction-removal for callers who can't see our server logs.
Fixed
1. `xlsx_write` is now self-describing. The `spec` param was bare `{type:'object'}` with no shape. Agents guessed reasonable-but-wrong forms (top-level rows array, A1-keyed cells map). 3.0.9 declares the full nested shape:
```json
{
"spec": {
"sheets": [
{
"name": "Sheet1",
"cells": [
{ "address": "A1", "value": "id" },
{ "address": "A2", "value": 1 },
{ "address": "B2", "formula": "A2*2" }
]
}
]
}
}
```
Includes per-property constraints: `address` regex (`^[A-Za-z]+\d+$`), `value` typed as a primitive union, `formula` with a no-leading-`=` pattern, and `oneOf` enforcing value-XOR-formula. Tool description carries the inline example so a single-shot read works.
2. 4xx validation errors now surface inline. `friendlyErrorMessage` had no `API_CLIENT_ERROR` case; precise server messages (`spec.sheets must be an array`, `cells[3].address is not a valid Excel address`) were computed, preserved by `lib/client.js`, then discarded at the MCP boundary in favor of the generic "see server-side logs" text.
3.0.9 surfaces the structured server message (`payload.error.message` → `payload.message` → wrapped `err.message` with the prefix stripped). Specific HTTP statuses (429 rate-limit, 402 tier-upgrade) keep their pre-existing short text.
Security boundary preserved
- 5xx stays generic. Upstream stacks / internals can't leak through.
- Defensive PII scrubber on the 4xx inline message redacts absolute paths, emails, JWTs, Bearer tokens, Slack tokens, xfa_ API keys, and 32+ char hex strings to `` shapes. The caller-actionable signal survives; the sensitive payload doesn't.
- Bounded at 280 chars with an ellipsis to prevent pathological payloads.
Install
One-click (recommended):
Drag this `.mcpb` into Claude Desktop → Settings → Extensions.
Full changelog: https://github.com/senoff/xlsx-for-ai/blob/main/CHANGELOG.md