A side-by-side look at the Sheets MCP and Xlsx Tools MCP MCP servers: transport, auth, tools, quality signals, and the config to install either one in Claude, Cursor, Windsurf or VS Code.
Verdict: choose Sheets MCP for workplace & productivity work as a local process; choose Xlsx Tools MCP for workplace & productivity as a local process. You can also run both side by side in one mcpServers block.
google_accounts, find_spreadsheet, create_spreadsheet.restore_backup, list_configured_files, list_sheets.Rows where the two servers differ are marked.
| Spec | ||
|---|---|---|
| Category | Workplace & Productivity | Workplace & Productivity |
| Quality signal | 65/100 · Great | 61/100 · Good |
| Install command | Confirmed | Confirmed |
| Transport | Local subprocess (stdio) | Local subprocess (stdio) |
| Auth | Not declared | No auth required |
| Pricing | Not declared | Free |
| Required env vars | None listed | None listed |
| Verified owner | Community listing | Community listing |
| GitHub stars | 34 | 4 |
| Directory activity | 2 views 0 installs 0 upvotes | 6 views 0 installs 0 upvotes |
| Tools | 29 | 29 |
| Full listing | View Sheets MCP | View Xlsx Tools MCP |
google_accountsManage the Google accounts Sheets MCP can use. list: show signed-in accounts and the default. add: sign in to a Google account (opens a browser sign-in; also use this when a sign-in has expired). remove: sign an account out and revoke access. set_default: choose the account used for new spreadsheets.find_spreadsheetFind a spreadsheet by name among the ones the user has opened or created with Sheets MCP before (the list is kept on their computer). Use it when the user names a sheet instead of pasting a link, e.g. "my budget sheet". It can't search the rest of their Google Drive: if nothing matches, ask for the link. Leave query empty to list the most recent.create_spreadsheetCreate a new Google Sheets spreadsheet.get_spreadsheet_infoGet a spreadsheet's title, tabs (sizes, frozen rows/cols), charts (ids, types, data ranges), named ranges, and the first few rows of each tab. Call this first to understand a sheet's layout.read_rangeRead cell contents from a range, or its formatting with mode "formats". Large ranges are truncated; use next_range to continue.read_rangesRead several ranges in one call, across any tabs. Faster than calling read_range repeatedly. Each range is truncated to its share of max_cells; use its next_range with read_range to continue.write_rangeWrite values and/or formulas starting at the top-left cell of the range. Input is parsed like typing into the UI (formulas, dates, percentages work). Previous contents are saved for undo_last. Returns any formula errors found after writing.fill_rangeFill cells from a source block, like dragging the fill handle or pasting onto a bigger selection: the source's formulas (relative references shift), values and formatting repeat across the destination. Use it after writing one row or column of formulas to extend them across a table, instead of sending every column. With continue_series, patterns continue instead (1, 2, 3 → 4, 5, 6; Jan → Feb; dates). The destination's previous contents are saved for undo_last. Returns any formula errors found after filling.append_rowsAppend rows after the last row of data in a table (detected from the given range or tab).clear_rangeClear values and formulas in a range (formatting is kept). Previous contents are saved for undo_last.find_replaceFind and replace text across a tab or the whole spreadsheet. Not undoable - consider read_range first.undo_lastUndo the most recent write_range, append_rows, or clear_range made through this server (restores values/formulas only, not formatting or structure). History is kept in memory until the server restarts.restore_backupRestore a backup file over a target workbook atomically.
Args:
backup_path: Path to the .bak file to restore from.
target_path: Path to the target .xlsx/.xlsm file to overwrite.
list_configured_filesList files preloaded at server startup (via the XLSX_MCP_FILES env var).
Call this first if unsure which files are available — every other tool's `path`
argument accepts these names directly (or can be omitted if only one is configured),
no filesystem search needed.
list_sheetsList every sheet in a workbook with its approximate row/column counts.
Args:
path: Path to the .xlsx file, or the name of a preloaded file. Omit if only
one file is configured.
get_workbook_infoGet workbook-level metadata: sheets, exact dimensions, active sheet, defined names.
Args:
path: Path to the .xlsx file, or the name of a preloaded file. Omit if only
one file is configured.
read_sheetRead cell values from a sheet.
Args:
path: Path to the .xlsx file, or the name of a preloaded file. Omit if only
one file is configured.
sheet: Sheet name.
cell_range: Optional A1-style range (e.g. "B2:F20"). Omit to read the full used area.
max_rows: Optional cap on the number of rows returned, to bound response size for large sheets.
offset_row: Skip a number of data rows (0-indexed from first data row).
format: "array" (default 2D list), "records" (list of dicts, first row as keys), or "markdown" (table string).
get_cellGet full detail for a single cell: value, formula, number format, font, fill, merge, comment.
Args:
path: Path to the .xlsx file, or the name of a preloaded file. Omit if only
one file is configured.
sheet: Sheet name.
cell: Cell reference, e.g. "C5".
search_workbookSearch cell values across one or all sheets for a substring match.
Args:
path: Path to the .xlsx file, or the name of a preloaded file. Omit if only
one file is configured.
query: Substring to search for.
sheet: Restrict the search to one sheet; omit to search every sheet.
match_case: Case-sensitive match when True.
limit: Optional cap on the number of matches returned, to bound response size for large sheets.
aggregate_sheetGroup and aggregate sheet data with pandas (e.g. sum sales by region).
Args:
path: Path to the .xlsx file, or the name of a preloaded file. Omit if only
one file is configured.
sheet: Sheet name.
group_by: Column names to group by (taken from the header row).
agg: Mapping of column name to aggregation function, e.g. {"amount": "sum"}.
cell_range: Optional A1-style range to read before aggregating.
has_header: Whether the first row of the range holds column names.
create_workbookCreate a new .xlsx workbook.
Args:
path: Path for the new file. New files aren't preloaded, so this must be a real path.
sheets: Sheet names to create (defaults to a single "Sheet1").
overwrite: Replace an existing file at path when True.
write_cellsWrite values and/or formulas into specific cells, then recalculate the workbook.
Set `recalculate=False` to skip the LibreOffice recompute (e.g. for structurally
complex workbooks you don't want round-tripped).
Args:
path: Path to the .xlsx file, or the name of a preloaded file. Omit if only
one file is configured.
sheet: Sheet name.
cells: List of {"cell": "A1", "value": ...} or {"cell": "B1", "formula": "=A1*2"}.
create_sheet_if_missing: Create the sheet first if it doesn't exist yet.
recalculate: Run the LibreOffice recompute pass after saving.
Returns:
Write result including `errors_found` — any Excel error values produced by recalculation.
append_rowsAppend rows after the last used row of a sheet, then recalculate the workbook.
Set `recalculate=False` to skip the LibreOffice recompute (e.g. for structurally
complex workbooks you don't want round-tripped).
Args:
path: Path to the .xlsx file, or the name of a preloaded file. Omit if only
one file is configured.
sheet: Sheet name.
rows: List of rows, each a list of cell values in column order.
create_sheet_if_missing: Create the sheet first if it doesn't exist yet.
recalculate: Run the LibreOffice recompute pass after saving.
create_sheetAdd a new empty sheet to an existing workbook.
Args:
path: Path to the .xlsx file, or the name of a preloaded file. Omit if only
one file is configured.
sheet: Name for the new sheet.
index: Zero-based position to insert at; omit to append at the end.
Paste either block (or both) into your client config, e.g. claude_desktop_config.json or ~/.cursor/mcp.json. We only show a config when the install command is confirmed.
{
"mcpServers": {
"sheets-mcp": {
"command": "npx",
"args": [
"-y",
"@sheetsmcp/server"
]
}
}
}
{
"mcpServers": {
"xlsx-tools-mcp": {
"command": "uvx",
"args": [
"xlsx-tools-mcp"
]
}
}
}