xlsx-for-ai 2.4.0 → 2.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/mcp.js +48 -2
- package/package.json +1 -1
package/mcp.js
CHANGED
|
@@ -544,6 +544,45 @@ const TOOLS = [
|
|
|
544
544
|
required: ['file_path'],
|
|
545
545
|
},
|
|
546
546
|
},
|
|
547
|
+
|
|
548
|
+
{
|
|
549
|
+
name: 'xlsx_comments',
|
|
550
|
+
description:
|
|
551
|
+
'xlsx-for-ai — read, write, diff, redact, supervise .xlsx files locally.\n' +
|
|
552
|
+
'This tool: list every cell comment in a workbook — both legacy notes (yellow stickies, cell.note) AND modern threaded comments (multi-author conversations stored separately in the OOXML zip). Per entry: kind, sheet, cell, author, text, plus any reply thread.\n' +
|
|
553
|
+
'No other tool can do this: pandas drops both comment systems on read entirely; openpyxl reads only legacy notes (not threaded comments). xlsx_comments reads both, maps personId → display name via xl/persons/person.xml, and folds reply chains into each root comment.\n\n' +
|
|
554
|
+
'USE WHEN: extracting reviewer feedback / approval threads from a spreadsheet (this is where humans hide intent). Or auditing a workbook for hidden context the values themselves don\'t carry. Or building a "show me everywhere finance flagged something" report. ' +
|
|
555
|
+
'Free tier — counts against the 10k/mo cap.\n\n' +
|
|
556
|
+
'DO NOT USE WHEN: just reading values (use xlsx_read). Or trying to ADD comments to a workbook (xlsx_write does not write comments).',
|
|
557
|
+
inputSchema: {
|
|
558
|
+
type: 'object',
|
|
559
|
+
properties: {
|
|
560
|
+
file_path: { type: 'string', description: 'Absolute path to the .xlsx file.' },
|
|
561
|
+
sheet: { type: 'string', description: 'Optional: restrict to a specific sheet.' },
|
|
562
|
+
},
|
|
563
|
+
required: ['file_path'],
|
|
564
|
+
},
|
|
565
|
+
},
|
|
566
|
+
|
|
567
|
+
{
|
|
568
|
+
name: 'xlsx_styles',
|
|
569
|
+
description:
|
|
570
|
+
'xlsx-for-ai — read, write, diff, redact, supervise .xlsx files locally.\n' +
|
|
571
|
+
'This tool: surface cell formatting (number formats, fonts, fills, alignment) so an agent knows what a cell LOOKS like, not just its raw value. Default mode: per-sheet rollup of top-N number formats / fonts / fills with counts. Detailed mode (opt-in, capped at 1000 cells): per-cell breakdown for narrow queries.\n' +
|
|
572
|
+
'No other tool can do this with this fidelity: pandas drops styles on read entirely. The single most valuable slice is number formats — pandas hands an LLM "45292" and the cell rendered as "2024-01-01" because format was "yyyy-mm-dd". xlsx_styles is what makes that recoverable.\n\n' +
|
|
573
|
+
'USE WHEN: an LLM is about to interpret raw numbers (date serials, currency, percents, scientific notation) and you want the format hint that tells it what those numbers MEAN to a human. Or auditing a dashboard\'s typography. Or fingerprinting a template. ' +
|
|
574
|
+
'Free tier — counts against the 10k/mo cap.\n\n' +
|
|
575
|
+
'DO NOT USE WHEN: you only need the data (use xlsx_read which already includes basic numFmt hints in the output).',
|
|
576
|
+
inputSchema: {
|
|
577
|
+
type: 'object',
|
|
578
|
+
properties: {
|
|
579
|
+
file_path: { type: 'string', description: 'Absolute path to the .xlsx file.' },
|
|
580
|
+
sheet: { type: 'string', description: 'Optional: restrict to a specific sheet.' },
|
|
581
|
+
detailed: { type: 'boolean', description: 'If true, return per-cell breakdown (capped at 1000 cells). Default false (per-sheet rollup).' },
|
|
582
|
+
},
|
|
583
|
+
required: ['file_path'],
|
|
584
|
+
},
|
|
585
|
+
},
|
|
547
586
|
];
|
|
548
587
|
|
|
549
588
|
// ---------------------------------------------------------------------------
|
|
@@ -757,10 +796,17 @@ async function dispatchTool(name, args) {
|
|
|
757
796
|
});
|
|
758
797
|
}
|
|
759
798
|
|
|
760
|
-
// All other tools (list_sheets, schema
|
|
799
|
+
// All other tools (list_sheets, schema, hyperlinks, conditional_formats,
|
|
800
|
+
// styles, etc.) — single-file relay. Forward any common option keys the
|
|
801
|
+
// routes accept so we don't silently drop them. New keys added here as
|
|
802
|
+
// tools start accepting them; the server tolerates extras.
|
|
803
|
+
const opts = {};
|
|
804
|
+
if (args.sheet !== undefined) opts.sheet = args.sheet;
|
|
805
|
+
if (args.limit !== undefined) opts.limit = args.limit;
|
|
806
|
+
if (args.detailed !== undefined) opts.detailed = args.detailed;
|
|
761
807
|
const body = {
|
|
762
808
|
file_b64: fileToB64(args.file_path),
|
|
763
|
-
options:
|
|
809
|
+
options: opts,
|
|
764
810
|
};
|
|
765
811
|
return callTool(name, body);
|
|
766
812
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "xlsx-for-ai",
|
|
3
3
|
"mcpName": "io.github.senoff/xlsx-for-ai",
|
|
4
|
-
"version": "2.
|
|
4
|
+
"version": "2.6.0",
|
|
5
5
|
"description": "The MCP server that makes LLMs reliable on real-world Excel spreadsheets. Thin npm client over a hosted API — read, write, diff, redact, and supervise .xlsx files from any MCP-aware agent.",
|
|
6
6
|
"main": "index.js",
|
|
7
7
|
"bin": {
|