A side-by-side look at the Google Workspace 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 Google Workspace 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.
start_google_auth, search_gmail_messages, get_gmail_message_content.restore_backup, list_configured_files, list_sheets.Rows where the two servers differ are marked.
| Spec | ||
|---|---|---|
| Category | Workplace & Productivity | Workplace & Productivity |
| Quality signal | 67/100 · Great | 59/100 · Good |
| Install command | Confirmed | Confirmed |
| Transport | Local subprocess (stdio) | Local subprocess (stdio) |
| Auth | OAuth 2.0 | Not declared |
| Pricing | Free | Not declared |
| Required env vars | None listed | None listed |
| Verified owner | Community listing | Community listing |
| GitHub stars | 3,344 | 3 |
| Directory activity | 1 views 0 installs 0 upvotes | 2 views 0 installs 0 upvotes |
| Tools | 123 | 29 |
| Full listing | View Google Workspace MCP | View Xlsx Tools MCP |
start_google_authManually initiate Google OAuth authentication flow.
NOTE: This is a legacy OAuth 2.0 tool and is disabled when OAuth 2.1 is enabled.
The authentication system automatically handles credential checks and prompts for
authentication when needed. Only use this tool if:
1. You need to re-authenticate with different credentials
2. You want to proactively authenticate before using other tools
3. The automatic authentication flow failed and you need to retry
In most cases, simply try calling the Google Workspace tool you need - it will
automatically handle authentication if required.search_gmail_messagesSearches messages in a user's Gmail account based on a query.
Returns both Message IDs and Thread IDs for each found message, along with Gmail web interface links for manual verification.
Supports pagination via page_token parameter.get_gmail_message_contentRetrieves the full content (subject, sender, recipients, body) of a specific Gmail message.
Bodies are returned inline and truncated at 20,000 characters. Set full=True to
get the complete, untruncated message instead: it is exported to disk and the
response carries a short-lived download URL (HTTP transport) or file path (stdio
transport) rather than the body, so large messages never stream through the model
context. Stateless deployments have no file storage, so there full=True returns the
untruncated body inline.get_gmail_messages_content_batchRetrieves the content of multiple Gmail messages in a single batch request.
Supports up to 25 messages per batch to prevent SSL connection exhaustion.get_gmail_attachment_contentDownloads an email attachment and saves it to local disk.
In stdio mode, returns the local file path for direct access.
In HTTP mode, returns a temporary download URL (valid for 1 hour).
May re-fetch message metadata to resolve filename and MIME type.send_gmail_messageSends an email using the user's Gmail account. Supports new emails, replies, and
forwards, with optional attachments. Supports Gmail's "Send As" feature to send
from configured alias addresses.
To forward an existing message, pass forward_message_id. The original subject,
body (quoted with a "Forwarded message" header), and attachments are carried over.
In forward mode, body (if any) is prepended as a note and subject is optional.
Threading, reply, and signature options do not apply when forwarding.
THIS TOOL SENDS IMMEDIATELY AND CANNOT SCHEDULE. Gmail's REST API exposes no
send-time parameter; Schedule send is a web-UI feature with no API equivalent,
so no argument to this tool can defer delivery. Never tell a user a message
was scheduled. For "prepare now, deliver later", create a draft with
draft_gmail_message. An external scheduler must retain the message data to
create and send a new message via send_gmail_message at the chosen time, or
call users.drafts.send with the draft ID returned by draft_gmail_message.
Alternatively, let the user schedule that draft in the Gmail UI.draft_gmail_messageCreates a draft email in the user's Gmail account. Supports both new drafts and reply drafts with optional attachments.
Supports Gmail's "Send As" feature to draft from configured alias addresses.
SCHEDULED SEND IS NOT AVAILABLE. Gmail's REST API exposes no send-time
parameter; the Schedule send feature is web-UI only, and a message cannot be
placed in the Scheduled folder through the API. Do not claim a message was
scheduled. To deliver at a chosen time, create a draft with
draft_gmail_message. An external scheduler must retain the message data to
create and send a new message via send_gmail_message then, or call
users.drafts.send with the draft ID returned by draft_gmail_message.
Alternatively, let the user schedule the draft in the Gmail UI.get_gmail_thread_contentRetrieves the complete content of a Gmail conversation thread, including all messages.
Optionally also returns structured ownership analysis so a caller can
determine who sent the last message and who owes whom a response without
re-parsing the formatted string or making a second tool call.get_gmail_threads_content_batchRetrieves the content of multiple Gmail threads in a single batch request.
Supports up to 25 threads per batch to prevent SSL connection exhaustion.list_gmail_labelsLists labels in the user's Gmail account.manage_gmail_labelManages Gmail labels: create, update, or delete labels.list_gmail_filtersLists all Gmail filters configured in the user's mailbox.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": {
"taylorwilsdon-google-workspace-mcp": {
"command": "uvx",
"args": [
"workspace-mcp"
]
}
}
}
{
"mcpServers": {
"xlsx-tools-mcp": {
"command": "uvx",
"args": [
"xlsx-tools-mcp"
]
}
}
}