Skip to main content
Glama

sheet-mcp

Let your AI agent read and edit Excel files without wrecking them.

sheet-mcp is an MCP server for .xlsx workbooks. Its edge over the other Excel MCP servers (for example haris-musa/excel-mcp-server, mort-lab/excel-mcp, bassem-elsodany/mcp_excel_server) is what it refuses to do:

  • It checks the file's zip structure before editing and lists everything a save would destroy: charts, images, shapes, pivot tables, macros, slicers, external links, threaded comments, dynamic-array formulas, sparklines, x14 conditional formats and more. If any are present, every edit is refused unless you pass allow_loss=true.

  • Edits are dry runs by default (a before/after table), and they write a new file (report.edited.xlsx). Nothing is overwritten unless you say overwrite=true, and the write is atomic (temp file, then replace).

  • Formulas stay formulas. Untouched cells, number formats, styles, column widths, data validation, conditional formatting, defined names, tables, comments and merged cells come out of an edit identical (the test suite proves it cell by cell).

  • It never pretends to calculate. Values are the results Excel cached in the file; if the file was never calculated (written by a script) the tools say so instead of showing blanks.

Install

Claude Code:

claude mcp add sheet -- uvx sheet-mcp --dir "/path/to/your/spreadsheets"

Claude Desktop (claude_desktop_config.json):

{
  "mcpServers": {
    "sheet": {
      "command": "uvx",
      "args": ["sheet-mcp", "--dir", "C:\\Users\\you\\Documents\\spreadsheets"]
    }
  }
}

--dir is the only place the server may read or write (default: the directory it was started in). Paths you give the tools are relative to it. Windows paths work.

Related MCP server: xlsx-for-ai

Tools

Tool

What it does

workbook_overview

Sheets (hidden / very hidden), used ranges, tables, named ranges, merged cells, hidden rows/columns, validations, conditional formats, comments, formula counts, formulas with no cached value, error cells, date system, and what a save would lose

read_range

Cells as markdown / csv / json. mode: values, formulas or both. Dates as ISO 8601 with the number format noted, merged ranges listed, capped with "continue with range X"

find_cells

Text, regex or number search across sheets, in values, formulas or both. Turkish-aware case folding (istanbul finds İstanbul)

describe_columns

Header detection, inferred type per column, nulls, distinct, min/max, mixed types, numbers stored as text, formulas vs constants

check_formulas

Broken refs, unknown names, error cells, circular refs, R1C1 pattern outliers, typed numbers inside a column of formulas, hardcoded numbers in formulas, volatile functions

set_cells

Write cells (value or formula) with explicit coercion rules. Dry run first. Refuses merged interiors and array formulas

append_rows

Append after the last data row or to an Excel table, copying styles and number formats from the row above

add_sheet / rename_sheet

Validated names. Rename rewrites every real reference (formulas on all sheets, names, validations, conditional formats, hyperlinks) and never touches text inside strings

csv_to_xlsx / xlsx_to_csv

Explicit encoding (utf-8, utf-8-sig, cp1254, ...) and delimiter (comma, semicolon, tab, pipe). A wrong encoding is an error, not garbage

How set_cells interprets values

You send

Stored as

"=SUM(A1:A3)"

a formula

"'=not a formula"

the text =not a formula (one leading apostrophe is removed)

"'007"

the text 007

42, 3.5

numbers; true / false are booleans; null clears the cell

"2024-12-31", "2024-12-31T10:30"

real dates (the cell keeps its date format, or gets yyyy-mm-dd)

any other string

text. Strings are never silently turned into numbers

Also checked: unbalanced parentheses, formulas pointing at sheets that do not exist, control characters, cells beyond XFD1048576. Newer functions that Excel stores as _xlfn.NAME (XLOOKUP, IFS, TEXTJOIN ...) and dynamic-array functions (FILTER, SORT, UNIQUE ...) produce a warning, because openpyxl cannot write them the way Excel expects.

What a save does and does not preserve

openpyxl (the library underneath) cannot calculate and cannot round-trip everything:

  • Always (every save): cached formula results are dropped. The formulas are kept, and Excel recalculates when the file is opened. Until then, other readers (pandas, previewers) see empty formula cells. The tool tells you this after each save.

  • Refused unless allow_loss=true: charts, images, shapes and text boxes, pivot tables, macros (VBA), slicers and timelines, external links, threaded comments, form controls / ActiveX, embedded objects, data connections / Power Query, the data model, dynamic-array metadata, custom ribbon UI, sparklines, x14 conditional formatting and data validation.

  • Harmless, reported: the calculation chain, printer settings, and comment box sizes (text and authors are kept).

After writing, the server re-opens the new file and checks that every sheet has exactly the number of formulas it should; if not, nothing is written to the destination.

Try asking

  • "Give me an overview of budget.xlsx. Is it safe to edit?"

  • "Show me Sheet1!A1:F30 with formulas and values side by side."

  • "Which cells in forecast.xlsx use VLOOKUP? Do any formulas look inconsistent with their neighbours?"

  • "Describe the columns of the Customers sheet. Is any column a mix of formulas and typed numbers?"

  • "Set C7 to =SUM(C2:C6) and D7 to the date 2026-01-31. Show me the dry run first."

  • "Append these three rows to the Orders table."

  • "Rename the sheet Q1 to Q1 2026 and tell me which formulas change."

  • "Convert export.csv (Windows-1254, semicolon separated) to xlsx."

Security

  • Sandbox: every path is resolved and must stay inside --dir; .. and absolute paths elsewhere are refused (symlinks are resolved first).

  • Zip bombs: at most 10,000 entries, 512 MiB per entry, 1 GiB in total, a 500:1 compression ratio limit, entry sizes verified while reading (a header that lies is refused), duplicate or path-traversing entry names refused, files over 256 MiB refused. Editing additionally needs the sheet XML to be at most 100 MiB (it is loaded into memory); reading has no such limit.

  • XML attacks: any XML part containing a DOCTYPE or ENTITY declaration is refused before parsing (Excel never writes one), non-UTF-8 XML is refused, and parsing goes through defusedxml. A billion-laughs workbook is part of the test suite.

  • Regex search: patterns over 200 characters or with nested quantifiers like (a+)+ are refused; Python's re has no timeout, so this is a guard rather than a guarantee.

  • CSV: fields starting with = are imported as text, never as formulas. Exports are written as-is, so treat a CSV exported from untrusted data as untrusted when opening it in Excel.

  • Writes: never in place by default, never over an existing file without overwrite=true, atomic replace, and temp files are cleaned up on failure.

  • Macros are never executed (nothing here runs workbook code).

Limits

  • Formulas are not calculated. There is no recalculation engine; read cached results or open the file in Excel / LibreOffice.

  • .xls (old binary) and password-protected workbooks are refused with an explanation.

  • .xlsm can be edited only with allow_loss=true (the VBA project bytes are carried over; buttons and ribbon wiring may not be).

  • Circular-reference detection follows direct cell and range references only (not INDIRECT, OFFSET, names or table references). Column-pattern checks flag only a cell that differs from the formulas directly above and below it.

  • CSV/TSV are handled through the two conversion tools; the read tools take .xlsx/.xlsm.

Development

uv sync --extra test
uv run pytest tests
uv run --with ruff==0.16.0 ruff check src tests
uv run --with mypy==2.3.0 mypy --strict src

Tests run against real workbooks: files written by openpyxl, hand-zipped XML for features openpyxl never writes (chart parts, pivot caches, vbaProject.bin, external links ...), a billion-laughs and a real compression-ratio zip bomb, 1900 and 1904 date systems, Turkish text, a 200,000-row sheet, and a test that launches the installed server over real MCP stdio.

There is a from-scratch tutorial that builds a minimal version of this server step by step: sheet-mcp-the-hard-way.

MIT licensed.

Available Tools

11 tools
add_sheetB

Add an empty sheet. name is validated (max 31 characters, none of [ ] : * ? / , unique ignoring case). position is 1-based (default: at the end). DRY RUN BY DEFAULT; output/overwrite/ allow_loss work as in set_cells.

NameRequiredDescriptionDefault
nameYes
pathYes
outputNo
dry_runNo
positionNo
overwriteNo
allow_lossNo

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must carry the full behavioral burden, and it does disclose two critical traits: the tool is DRY RUN BY DEFAULT, and name is validated for length, forbidden characters, and case-insensitive uniqueness. However, it punts on the semantics of output, overwrite, and allow_loss by deferring to set_cells, so the agent cannot tell from this definition what gets overwritten or lost.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The definition is dense and front-loaded, leading with the action before constraints, with no filler sentences. The terse 'work as in set_cells' clause trades clarity for brevity, which is the one place where compression costs the reader.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, and the description covers validation and the dry-run default well. For a 7-parameter, zero-annotation tool it is still incomplete: the overwrite/allow_loss behavior determines whether data can be destroyed, and that is left entirely to another tool's documentation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across 7 parameters, so the description has to compensate, and it partially does: name validation rules and position's 1-based indexing plus default are genuine additions beyond the schema. But three of the seven parameters are explained only by cross-reference to another tool, which is a real gap for a mutation-adjacent operation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Add an empty sheet.' This is unambiguous and clearly distinct from siblings like rename_sheet or set_cells, though it never explicitly names those alternatives to reinforce the distinction.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit when-to-use or when-not-to-use guidance, and no named alternative for cases where the agent should modify an existing sheet instead. The only implicit routing signal is the dry-run default, which tells the agent the call is a no-op unless dry_run is disabled.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

append_rowsA

Append rows after the last data row (or to the bottom of an Excel table). DRY RUN BY DEFAULT.

rows: list of rows, each a list of values using the same coercion rules as set_cells ('=...' formula, leading quote = literal text, ISO dates, null = empty cell). table: name of an Excel table on the sheet to extend (its range grows with the new rows). If the last data row belongs to a table and table= is omitted, the call is refused so rows are not left outside the table. Tables with a totals row are refused. Number formats and styles are copied from the row above. Rows start in the first used column. Refused if the space below is not empty. Warns when data validation or conditional formatting ranges end at the old last row and will not cover the new rows. output/overwrite/allow_loss work as in set_cells.

NameRequiredDescriptionDefault
pathYes
rowsYes
sheetYes
tableNo
outputNo
dry_runNo
overwriteNo
allow_lossNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so well: dry run is the default, number formats and styles are copied from the row above, rows start in the first used column, table ranges grow, and the call warns when data validation or conditional formatting ranges will not cover new rows. These are exactly the side effects an agent must know before invoking a mutation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and the dry-run warning, then organized as compact per-parameter notes with no filler sentences. The 'work as in set_cells' line offloads detail to a sibling rather than explaining it, which is efficient but leaves a small gap.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and the description covers the behavioral risks of a mutation tool thoroughly. Remaining gaps are the meaning of path (does the workbook need to exist?) and sheet, plus what a dry run actually returns.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% across 8 parameters, so the description must compensate. It explains the tricky ones in depth: rows coercion rules (formula, leading quote, ISO dates, null = empty cell), table semantics plus failure conditions, dry_run via 'DRY RUN BY DEFAULT', and output/overwrite/allow_loss by reference to set_cells. It never describes path or sheet, and the cross-reference to set_cells assumes knowledge of that sibling's parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and target: 'Append rows after the last data row (or to the bottom of an Excel table).' The scope, the insertion point, and the table-extending alternative are all named, so it is distinguishable from set_cells, which it explicitly references for shared semantics.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete conditions and refusal cases: refuses when the last data row belongs to a table and table= is omitted, refuses tables with a totals row, refuses if the space below is not empty. It does not draw an explicit 'use append_rows instead of set_cells when…' contrast, but the append-at-end framing makes the choice reasonably clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_formulasA

Audit formulas structurally (nothing is calculated). Reports: broken references (#REF! or a missing sheet), unknown names (#NAME?), cells currently showing error values, circular references reachable through direct cell/range references, formulas that differ from the pattern (R1C1) of the formulas directly above AND below them in the same column, typed numbers sitting inside a column of formulas, hardcoded numbers inside arithmetic (e.g. =A2*1.18), and volatile functions (NOW, TODAY, RAND, OFFSET, INDIRECT ...). Results are grouped per kind and capped by max_issues. Use sheet= to check one sheet.

NameRequiredDescriptionDefault
pathYes
sheetNo
max_issuesNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are supplied, so the description carries the full burden, and it does substantial work: 'nothing is calculated' signals pure read-only analysis with no side effects, and it discloses that results are grouped per kind and truncated by max_issues. It stops short of stating error conditions (e.g. non-xlsx files) or whether issues are deduplicated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The lead sentence states the action and the crucial non-calculation caveat first, then the long list of detections follows. The parenthetical examples are dense but each clarifies a category; the enumeration is lengthy yet nearly every item earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a three-parameter read-only audit tool with an output schema already documenting the return shape, the description covers what is detected, the scope control, and the result cap. Nothing essential to invoking it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does for two of three parameters: sheet= restricts scope to one sheet and max_issues caps results per kind. The path parameter is left implicit, but its meaning is self-evident from the other file-based siblings.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Audit formulas structurally') and immediately scopes it with 'nothing is calculated', which distinguishes it from read_range or find_cells. The enumeration of detected problem classes makes the tool's domain unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use it (structural formula auditing rather than value inspection) and adds one concrete usage hint, 'Use sheet= to check one sheet', but never explicitly contrasts it with siblings like find_cells or read_range, nor states when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

csv_to_xlsxA

Convert a CSV/TSV file into a new .xlsx.

encoding: any Python codec: utf-8, utf-8-sig (Excel's BOM), cp1254 (Turkish), cp1252, latin-1, utf-16 ... A wrong encoding is an error, never silently garbled. delimiter: one character or one of comma, semicolon, tab, pipe (Turkish/German Excel exports often use semicolons). infer_types: plain numbers (no leading zeros, at most 15 digits) and ISO dates become real numbers/dates; everything else stays text. Fields starting with '=' always stay text (a CSV is data, not formulas). Set false to store every field as text. Refuses to replace an existing output unless overwrite=true.

NameRequiredDescriptionDefault
outputYes
csv_pathYes
encodingNoutf-8
delimiterNo,
overwriteNo
sheet_nameNoSheet1
infer_typesNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does well: it states that a wrong encoding raises an error rather than silently garbling data, that existing output is refused unless overwrite=true, and that leading-'=' fields are deliberately kept as text to avoid formula injection. It omits permission/side-effect details such as whether the source CSV is modified or what happens with sheet_name conflicts.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with a one-line purpose, then dense per-parameter notes with no filler. The notes run as continuous wrapped prose rather than discrete items, which slightly hurts scannability, but essentially every sentence carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described; against that, the description covers the risky behaviors (encoding errors, overwrite refusal, type inference rules and formula safety) that an agent needs before calling a 7-parameter conversion tool. Only minor gaps remain (sheet_name semantics, source file handling).

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it supplies genuine meaning for encoding, delimiter, infer_types and overwrite, including concrete value examples and edge-case rules (leading zeros, 15-digit cap, ISO dates). It leaves sheet_name and the path parameters unexplained, but csv_path/output are self-evident from their names.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening line gives a specific verb and both source and target formats: 'Convert a CSV/TSV file into a new .xlsx.' The word 'new' plus the overwrite rule makes the direction and effect unambiguous, and it is clearly distinct from the sibling xlsx_to_csv.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is useful situational guidance embedded in the parameter notes (e.g. semicolon delimiters are common in Turkish/German Excel exports, set infer_types=false to force all text), but the description never explicitly says when to choose this tool over an alternative or states exclusions/prerequisites. Usage is implied rather than prescribed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

describe_columnsA

Profile the columns of a sheet or range like a data table: detected header row, inferred type per column (integer, number, text, date, datetime, boolean, mixed ...), non-null and empty counts, distinct count, min/max, most common text values, numbers stored as text, error cells, and whether the column holds formulas, constants or a MIX of both (a sign someone overwrote a formula with a typed number).

header_row: omit to auto-detect; 0 means 'no header'; N means row N is the header (rows above it are ignored). range limits the area (default: the whole used range).

NameRequiredDescriptionDefault
pathYes
rangeNo
sheetYes
max_rowsNo
header_rowNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden and does well: it discloses the profiling output, header auto-detection, range defaults, and formula/constant/mixed detection. However, it does not mention max_rows truncation, performance characteristics, or read-only/error behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, then moves into compact parameter notes. Every clause contributes profiling detail or non-obvious input semantics, with no wasted wording.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that an output schema exists, the description need not explain return values, yet it still adds useful output context. It covers the most non-obvious input behaviors, but leaves gaps around max_rows and sibling-tool selection.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry parameter meaning. It documents header_row very well and explains range's default, but it omits path, sheet, and especially max_rows, which can affect how much data is profiled.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: "Profile the columns of a sheet or range like a data table." It also enumerates the profile dimensions clearly. It does not explicitly distinguish this tool from overlapping siblings such as read_range or check_formulas, so it falls short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit when-to-use or when-not-to-use guidance, and no alternatives are named despite sibling tools that could overlap, especially check_formulas and read_range. The header_row and range notes are parameter guidance, not routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_cellsA

Find cells across all sheets (or one) and return their addresses.

mode: 'text' (substring), 'regex' (Python regular expression), or 'number' (numeric cells equal to the query, e.g. '1234.5'). search_in: 'values' (cached results / constants), 'formulas' (formula text, e.g. find every cell that uses VLOOKUP), or 'both' (default). Case-insensitive search also folds Turkish letters (dotted/dotless i, and u o s c g with their Turkish marks), so 'istanbul' finds 'İstanbul' and 'urun' finds 'Ürün'. Each hit shows the sheet, address, value and formula.

NameRequiredDescriptionDefault
modeNotext
pathYes
queryYes
sheetNo
search_inNoboth
max_resultsNo
case_sensitiveNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden; it does disclose useful traits: search is case-insensitive by default, it folds Turkish dotted/dotless i and marked letters, and each hit reports sheet, address, value and formula. It omits what happens when there are no matches, how results are truncated at max_results, and whether scanning is expensive on large workbooks.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the one-line purpose, then breaks mode/search_in into labeled lines, which is easy to scan. The Turkish case-folding paragraph is longer than strictly necessary for most callers, but it is placed last so it does not obstruct the core instruction.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-field explanation is a bonus rather than a necessity, and the description still names the fields per hit. For a 7-parameter search tool the only real gap is truncation/limit behavior and the semantics of path, which keeps it out of the top band.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across 7 parameters, so the description must compensate. It well explains mode (with examples: substring, Python regex, numeric equality) and search_in (values/formulas/both), and implies sheet scoping, but says nothing about path, max_results, or case_sensitive as an explicit parameter (the Turkish-folding note only hints at the default).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Find cells') plus scope ('across all sheets (or one)') and the return form ('return their addresses'). It does not explicitly contrast itself with read_range or describe_columns, so the agent must infer the read-vs-search distinction from the sibling names.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete usage contexts for mode and search_in, including a worked example ('find every cell that uses VLOOKUP') that makes the intent of 'formulas' unambiguous. It stops short of naming alternatives or exclusions (e.g., when to use read_range or describe_columns instead, or whether to prefer a sheet-scoped search for large workbooks).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_rangeA

Read cells from one sheet.

range: A1-style: 'A1:D20', 'B3', 'A:C' (whole columns), '2:9' (whole rows). Omit for the whole used range. Anything beyond the used range is clamped. mode: 'values' (cached results of formulas; constants as stored), 'formulas' (formula text instead of results), or 'both' ('=SUM(A1:A3) -> 6'). format: 'markdown' (default, with row numbers and column letters), 'csv', or 'json'. max_cells: output cap (default 2000, max 20000); when exceeded the reply says which range to request next.

Dates are shown as ISO 8601 and the number format is reported in a note. Formulas are NOT calculated: if the file has no cached values the reply says so instead of showing blanks. Merged ranges in view are listed (the value lives in the top-left cell).

NameRequiredDescriptionDefault
modeNovalues
pathYes
rangeNo
sheetYes
formatNomarkdown
max_cellsNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so well: it discloses clamping beyond the used range, that formulas are never calculated and missing cached values are reported rather than blanked, that merged ranges are enumerated, and that responses carry date-format and number-format notes. Gaps remain around failure modes (missing path, unknown sheet name) and any size limits beyond max_cells.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The leading sentence states the action immediately and each subsequent line maps to a parameter or a concrete output behavior, so nearly every sentence earns its place. The formatting is a bit dense and run-on in the trailing paragraph, but nothing is padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a six-parameter read tool with an output schema, this covers the decision-relevant surface: how to address a range, what mode returns, output format, and the truncation ceiling. Since an output schema exists, the description needn't explain return shape, yet the extra notes on dates, number formats, and merged cells are exactly the surprises an agent would otherwise misreport.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it documents four of six parameters in real depth — A1-style range variants including whole rows/columns, the three mode semantics with cached-value caveats, the three format values (which the schema does not even enumerate), and the max_cells cap with its overflow behavior. Only path and sheet are left unexplained, which are largely self-evident but leave questions like relative-vs-absolute paths and sheet-name matching unanswered.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

"Read cells from one sheet" gives a specific verb plus resource, and the parameter block makes the read-only, range-scoped nature unambiguous against siblings like set_cells or append_rows. It stops short of explicitly contrasting itself with workbook_overview, find_cells, or describe_columns, which would have made selection trivial.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: the reader can infer you use this to fetch cell contents once you know the sheet, and "Omit for the whole used range" guides in-tool behavior. There is no explicit guidance on when to reach for this versus find_cells (to locate data) or workbook_overview (to orient), which are the most likely confusion points.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

rename_sheetA

Rename a sheet AND update every reference to it: formulas on all sheets (only real references, never text inside string literals), defined names, data-validation and conditional-format formulas, and internal hyperlinks. DRY RUN BY DEFAULT: lists each formula that would change. new_name is validated like add_sheet. output/overwrite/allow_loss work as in set_cells.

NameRequiredDescriptionDefault
pathYes
sheetYes
outputNo
dry_runNo
new_nameYes
overwriteNo
allow_lossNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden and does well: it discloses the cascade scope, the string-literal exclusion (a real correctness trap), the dry-run default, and that overwrite/allow_loss can cause loss. Gaps remain on reversibility, whether the input file is modified in place vs written to 'output', and behavior for references in other workbooks.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences, front-loaded with the operation and its cascade scope, then the critical dry-run default, then parameter pointers. Every clause carries information; nothing is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 7-parameter mutation tool with no annotations, the description conveys scope, defaults, and risk-relevant flags, and an output schema exists so return values need not be explained. The main shortfall is relying on cross-references to sibling tools for three parameters instead of spelling out their effect in this context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across 7 parameters, so the description must compensate. It adds meaning for dry_run, new_name (validated like add_sheet), and bundles output/overwrite/allow_loss via reference to set_cells, but leaves 'path' and 'sheet' entirely unexplained and defers three parameters to another tool's documentation rather than describing them here.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Rename a sheet') plus the non-obvious scope of the operation: cascading updates to formulas, defined names, validation/conditional-format formulas, and internal hyperlinks. This is clearly distinguishable from siblings like add_sheet or set_cells, which do not touch sheet names.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states the default workflow ('DRY RUN BY DEFAULT: lists each formula that would change'), which tells the agent to preview before committing. It also routes the agent to sibling semantics ('validated like add_sheet', 'work as in set_cells'). It stops short of naming when to prefer this over manual edit-then-rename approaches, but the operation is largely unique in the toolset.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_cellsA

Write single cells, changing nothing else. DRY RUN BY DEFAULT: shows before/after for every cell and writes nothing; repeat with dry_run=false to save.

changes: list of {"cell": "B7", "value": ...} or {"cell": "B7", "formula": "SUM(B2:B6)"}, with an optional per-change "sheet". Value coercion rules:

  • a string starting with '=' is a FORMULA ("=SUM(A1:A3)")

  • a string starting with a single quote is literal TEXT with the quote removed ("'=not a formula" stores =not a formula; "'007" stores the text 007)

  • JSON numbers are numbers, true/false are booleans, null clears the cell

  • ISO strings 'YYYY-MM-DD' and 'YYYY-MM-DDTHH:MM[:SS]' become real dates (the cell keeps its date format, or gets yyyy-mm-dd); use a leading quote to keep such a string as text

  • any other string is text (never auto-converted to a number) Existing styles, number formats, validations, conditional formats and column widths are kept. Writes into merged-cell interiors and array formulas are refused. Formulas referring to a sheet that does not exist are refused.

The result goes to a NEW file '.edited.xlsx' next to the original unless output= is given; an existing file is never replaced unless overwrite=true (use overwrite=true with output equal to path to edit in place). If the workbook has features openpyxl would drop (see workbook_overview) the edit is refused unless allow_loss=true. All formulas lose their cached results on save (Excel recalculates when opened).

NameRequiredDescriptionDefault
pathYes
sheetYes
outputNo
changesYes
dry_runNo
overwriteNo
allow_lossNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations supplied, the description carries the full behavioral burden and does so thoroughly: default dry run, writes go to a new '.edited.xlsx' file, overwrite and allow_loss gating, refusal on merged-cell interiors, array formulas, missing-sheet references and lossy-workbook features, plus the loss of cached formula results on save. These are exactly the side-effect and safety facts an agent needs before invoking a mutation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the two highest-value facts (single-cell scope, dry-run-by-default) before the coercion detail, and the bulleted coercion list is easy to scan. It is dense but nearly every sentence carries a distinct rule; a minor amount of the quoting guidance could be tightened.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 7-parameter mutation tool with no annotations, the description covers write targets, side effects, refusal conditions, output file behavior and value typing, and an output schema exists so return values need no further explanation. Nothing an agent needs in order to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across 7 parameters, so the description must compensate, and it does: it specifies the shape of each change object, the optional per-change "sheet" override, and detailed value-coercion rules for formula strings, quoted literals, numbers, booleans, nulls and ISO dates. It also clarifies output, overwrite, dry_run and allow_loss semantics, leaving only the obvious path/sheet names implicit.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a concrete verb and resource ("Write single cells") and immediately bounds the scope with "changing nothing else", which implicitly contrasts with bulk-append siblings like append_rows. An agent can tell what this does and what it does not touch without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit procedural guidance: the tool is a dry run by default and the agent must repeat with dry_run=false to actually save, and it explains when to use output= vs. overwrite=true with output equal to path. It does not explicitly name sibling alternatives (e.g. append_rows for row insertion), which keeps it short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

workbook_overviewA

Start here. Summarise a workbook without changing it: sheets (with hidden/very hidden state), used ranges, tables, named ranges, merged cells, hidden rows/columns, data validations, conditional formats, comments, number of formulas, formulas that have NO cached value (the file was never calculated), cells showing errors like #REF!, and the list of features that saving would LOSE (charts, images, pivot tables, macros, slicers, external links, ...). The file is checked for zip bombs and XML entity attacks first.

path: .xlsx or .xlsm, relative to the server's --dir (or absolute inside it).

NameRequiredDescriptionDefault
pathYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations at all, the description carries the full burden and does well: it declares the operation is non-mutating, discloses a pre-flight safety scan (zip bombs, XML entity attacks), and warns that saving would lose features like charts, images, pivot tables and macros. It does not mention cost or latency on large workbooks, which is the main remaining behavioral gap for an agent deciding whether to call it.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with 'Start here' and the core action, followed by a dense but purposeful enumeration where each clause is distinct information. The single run-on sentence listing a dozen features is heavy to parse and the trailing '...' is imprecise, but no sentence is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter inspection tool, the description covers action, safety profile, return content, and path resolution. An output schema exists, so the informal enumeration of returned fields is a bonus for tool selection rather than a missing spec, and nothing an agent needs in order to call this correctly is absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and the single param is undocumented in the schema, but the description compensates: it restricts the accepted formats to .xlsx or .xlsm, explains that the path is resolved relative to the server's --dir, and that absolute paths must remain inside that directory. This is genuine semantic value, only slightly short of complete since it does not cover error behavior for a nonexistent path.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Summarise a workbook') and then enumerates precisely what the summary contains: sheet visibility states, used ranges, tables, named ranges, merged cells, validations, conditional formats, comments, formula counts, uncached formulas, error cells, and lossy-save features. This is far more distinguishing than sibling names like read_range or describe_columns, which it clearly is not.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Start here' is an explicit entry-point instruction that routes the agent before any other tool, and 'without changing it' signals the read-only counterpart to set_cells/append_rows. It stops short of naming a specific sibling to prefer for follow-up work or stating when this tool is overkill versus read_range, so it is strong but not fully explicit about alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

xlsx_to_csvA

Export one sheet (or a range) to CSV/TSV (.csv, .tsv or .txt).

mode: 'values' writes cached results (formula cells with no cached value are written empty and counted in a warning); 'formulas' writes the formula text. Dates are ISO 8601. encoding/delimiter as in csv_to_xlsx; characters the encoding cannot represent are an error. Refuses to replace an existing output unless overwrite=true.

NameRequiredDescriptionDefault
modeNovalues
pathYes
rangeNo
sheetYes
outputYes
encodingNoutf-8
delimiterNo,
overwriteNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present, the description carries the full behavioral burden and does well: it discloses that formula cells lacking a cached value are written empty and tallied in a warning, that dates are ISO 8601, that unrepresentable characters under the chosen encoding are an error rather than silently transcoded, and that overwriting is refused by default. It stops short of saying whether missing directories or missing extensions on the output path are created or appended.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The lead sentence front-loads purpose and formats, and the indented mode block is efficient. The phrase 'encoding/delimiter as in csv_to_xlsx' outsources semantics to a sibling's description, which is terse but slightly fragile for an agent that has not read that tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, and the mutation/overwrite risk is covered. However, with eight parameters at 0% schema coverage and no annotations, leaving path and output entirely undescribed makes the definition incomplete for a function that writes a new file to disk.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and no parameter has a description, so the description must supply meaning. It does so for mode, encoding, delimiter, overwrite, and the sheet/range scope, but path and output remain undocumented in both places—for a write tool the output path semantics (extension handling, directory creation, path relative to what) are exactly what an agent needs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource, 'Export one sheet (or a range) to CSV/TSV', and enumerates the accepted output formats, so an agent can tell immediately what it produces. The direction of the operation (xlsx in, delimited text out) contrasts cleanly with the inverse sibling csv_to_xlsx.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains how to choose between mode='values' and mode='formulas', and warns that an existing output blocks the call unless overwrite=true. It gives no guidance on when to prefer this tool over read_range or describe_columns for inspecting a sheet, so tool selection versus siblings is only implied by the name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 11 tool updatesv0.1.0
    • First observedadd_sheet
    • First observedappend_rows
    • First observedcheck_formulas
    • First observedcsv_to_xlsx
    • First observeddescribe_columns
    • First observedfind_cells
    • First observedread_range
    • First observedrename_sheet
    • First observedset_cells
    • First observedworkbook_overview
    • First observedxlsx_to_csv

TDQS

A3.9/5.0

Scored across 11 tools

Disambiguation5/5

Each tool has a distinct purpose: overview, read, search, profile, audit formulas, write cells, append rows, add/rename sheet, and CSV import/export. Overlaps such as read_range vs describe_columns or find_cells vs check_formulas are clearly separated by intent (raw extraction vs profiling vs structural audit). An agent can confidently pick the right tool.

Naming Consistency4/5

Nine of eleven tools follow a clear verb_noun pattern (read_range, find_cells, set_cells, add_sheet, etc.). The two conversion tools use noun_to_noun (csv_to_xlsx, xlsx_to_csv) and workbook_overview is noun_noun, which are minor but readable deviations.

Tool Count5/5

Eleven tools is well within the ideal 3–15 range for a spreadsheet server. Each tool covers a meaningful capability, with no redundant or filler operations.

Completeness4/5

The surface covers reading, analysis, formula auditing, cell/row writing, sheet creation/renaming, and CSV import/export, which handles most real workflows. Minor gaps remain: no delete-sheet or delete-rows operation, and no formatting/style manipulation, though set_cells with null can clear individual cells.

Maintenance

ActivityMaintained
ResponsivenessNo recent community issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    50 tools and 400 functions for working with Excel/.xlsx spreadsheets — read/write, recalculate formulas, diff, repair broken references, and audit. Built for AI agents.
    50
    2,388 npm
    6
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Enables AI agents to perform comprehensive Excel workbook operations with verified, freshness-labeled values and structural edits that preserve formulas, tables, and references, optionally using a private Excel instance for real recalculation and export.
    7
    1
    AGPL 3.0
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI coding agents to edit real .xlsx workbooks in place through spreadsheet-native tools like describe, find, read, write, and structural edits, recalculating formulas without Excel, LibreOffice, or Python. Every change comes back as a review link showing changed cells before and after, and nothing is written until the user accepts, while charts, pivots, and VBA data return byte-identical.
    10
    Apache 2.0