Hosted MCP server · #7 most used on Smithery · ✓ verified
Google Sheets
googlesheets
Search and inspect Google Sheets, create and edit spreadsheets, scan for data issues, review edit history, and manage comments.
- Uses
- 56k
- Tools
- 13
- Runs
- Hosted
- Listed
- 12mo ago
Get started
Add it to your agent
npx -y @smithery/cli@latest install googlesheets --client claudeSwap --client claude for cursor, vscode, windsurf or another client. The CLI asks for any required settings.
claude mcp add --transport http google-sheets https://server.smithery.ai/googlesheets/mcpA hosted server: nothing to install. Run /mcp in Claude Code to sign in if it asks.
[mcp_servers.google-sheets]
url = "https://server.smithery.ai/googlesheets/mcp"Add to ~/.codex/config.toml.
{
"mcpServers": {
"google-sheets": {
"url": "https://server.smithery.ai/googlesheets/mcp"
}
}
}Add to ~/.cursor/mcp.json.
{
"servers": {
"google-sheets": {
"type": "http",
"url": "https://server.smithery.ai/googlesheets/mcp"
}
}
}Add to .vscode/mcp.json.
gemini mcp add --transport http google-sheets https://server.smithery.ai/googlesheets/mcpSaved to .gemini/settings.json.
What it can do
13 tools
Arcade_ListAppsSee the apps the current caller can act on and whether they are connected. Returns each app's id, name, connected state, and (when connec…
See the apps the current caller can act on and whether they are connected. Returns each app's id, name, connected state, and (when connected) the account it is connected as. Call this to answer "what apps do I have?" or when the caller's connection state may have changed since the session started.
GoogleSheets_CheckSpreadsheetAccess1 paramCheck whether this app can already read each of several spreadsheets, in one batched pre-flight call, before attempting to read them. Use…
Check whether this app can already read each of several spreadsheets, in one batched pre-flight call, before attempting to read them. Use this when the user references multiple spreadsheets so any that are not yet accessible can be granted together in a single picker step, instead of hitting a separate access error and grant prompt for each one. Each input may be a bare file id or a full Google Sheets/Drive URL. Returns ``spreadsheets`` (a per-id list with ``accessible``, the ``title`` and ``mim
| Parameter | Type | Description |
|---|---|---|
spreadsheets | array | The spreadsheets to check access for, each given as a bare spreadsheet id or a full Google Sheets/Drive URL (the id is extracted from the URL). Provide at most 50 per call; split larger lists across m |
GoogleSheets_CommentOnSpreadsheet4 paramsCreate a comment on a spreadsheet, edit a comment's body, or resolve/reopen it. Comments are created at the file level: the Drive API can…
Create a comment on a spreadsheet, edit a comment's body, or resolve/reopen it. Comments are created at the file level: the Drive API cannot anchor a NEW Sheets comment to a specific cell or range. Cell/range-anchored comments made in the Sheets UI are still readable via list_spreadsheet_comments (which returns their anchor). Editing a comment's body is allowed only for the comment's author.
| Parameter | Type | Description |
|---|---|---|
status | string | Resolve or reopen an existing comment (requires comment_id). Implemented as a reply with an action. Omit to create or edit instead. |
content | string | The comment text. Required when creating. When editing an existing comment (comment_id set, no status) this replaces the body (author-only). When a status is set, this is the optional text of the reso |
comment_id | string | Omit to CREATE a new comment. Provide an existing comment id to edit it (pass content) or to resolve/reopen it (pass status). |
spreadsheet_id | string | The id of the spreadsheet to comment on. |
GoogleSheets_CreateOrEditSpreadsheet3 paramsCreate a new spreadsheet or batch-edit an existing one. Omit `spreadsheet_id` to create; provide it to edit. All writes flow through `req…
Create a new spreadsheet or batch-edit an existing one. Omit `spreadsheet_id` to create; provide it to edit. All writes flow through `requests[]` — typed operations like updateCells, addSheet, sortRange, addConditionalFormatRule, autoResizeDimensions, and more. For updateCells use ExtendedValue with an explicit type field (stringValue, numberValue, boolValue, formulaValue). By default, build clean, professional-looking tables with restrained, consistent formatting and plain-text tab names/header
| Parameter | Type | Description |
|---|---|---|
title | string | Title for a newly created spreadsheet. Ignored when spreadsheet_id is provided. Defaults to 'Untitled spreadsheet'. |
requests | array | A list of Google Sheets `spreadsheets.batchUpdate` request objects. Each object must have exactly one key naming the operation. FIELDS MASK: updateCells, repeatCell, updateSheetProperties, and updateD |
spreadsheet_id | string | ID of an existing spreadsheet to edit. Omit to create a new spreadsheet. |
GoogleSheets_DeleteComment2 paramsDelete a comment from a spreadsheet. Only the comment's author can delete it (enforced by Google Drive); deleting marks the whole thread …
Delete a comment from a spreadsheet. Only the comment's author can delete it (enforced by Google Drive); deleting marks the whole thread (the comment and its replies) as deleted.
| Parameter | Type | Description |
|---|---|---|
comment_id | string | The id of the comment to delete. |
spreadsheet_id | string | The id of the spreadsheet the comment belongs to. |
GoogleSheets_GenerateGoogleFilePickerUrlGenerate a URL where the user can grant this app access to spreadsheets. Opens Google's first-party Drive picker, filtered to Google Shee…
Generate a URL where the user can grant this app access to spreadsheets. Opens Google's first-party Drive picker, filtered to Google Sheets, where the user browses and selects which spreadsheets to share with this application — it is not a sign-in or credential prompt. Use this when a prior tool reported that a file was not found or access was denied, and the user expects the file to exist. After the user completes the picker flow, retry the prior operation.
GoogleSheets_GetSpreadsheetEditHistory4 paramsReport who edited a spreadsheet and when, from Google Drive revisions. Reports the "who" and "when" only — not which cells changed, and i…
Report who edited a spreadsheet and when, from Google Drive revisions. Reports the "who" and "when" only — not which cells changed, and it can't revert. 'summary' (default) answers "who last edited this and when" (read from the file's head, so always accurate), plus per-window aggregates (revisions read, contributors, first edit) and a preview of recent edits — computed over a bounded window of history per call. These aggregates describe the whole history only when `is_incomplete` is false; it i
| Parameter | Type | Description |
|---|---|---|
mode | string | 'summary' (default): the latest edit, plus per-window aggregates (revisions read, contributors, first edit) that cover the whole history only when is_incomplete is false, and a preview of recent edits |
limit | integer | Max revisions per page in 'list' mode. Between 1 and 50. Defaults to 20. Ignored in 'summary' mode. |
spreadsheet_id | string | The id of the spreadsheet to get the edit history for. |
pagination_token | string | Token from a previous response's pagination_token, to continue reading more history. Works in both modes. |
GoogleSheets_InspectSpreadsheet12 paramsInspect a Google Sheets spreadsheet's structure or read a range of cells. Use the default 'structure' mode to understand a workbook cheap…
Inspect a Google Sheets spreadsheet's structure or read a range of cells. Use the default 'structure' mode to understand a workbook cheaply before reading. Switch to 'read' mode to pull a range as a grid of rows, optionally with per-cell annotations and a rendered markdown/csv/tsv export. In 'read' mode the response's per-tab 'sheets' block reports only tab identity and the allocated grid; its scan-derived fields (used_range, populated_cell_count, formula_cell_count, first_row, table_regions) ar
| Parameter | Type | Description |
|---|---|---|
mode | string | What to return. 'structure' (default) gives a cheap workbook overview: every tab's ids, allocated grid, frozen panes, merges, charts, protected ranges, conditional-format counts, real used range, firs |
a1_range | string | Read mode only: the range of cells to pull, in A1 notation (e.g. 'A1:F100'), WITHIN the selected tab — the tab is chosen by sheet_id/sheet_title, and any sheet prefix here (e.g. 'Other!A1:B2') is igno |
max_rows | integer | Read mode only: maximum rows to return. Sets truncated=True when the range has more rows; pass the returned next_range as a1_range to page. When filtering, this bounds the rows SCANNED per page (match |
sheet_id | integer | Read mode only: select the tab by its numeric sheetId. Mutually exclusive with sheet_title. Defaults to the first tab when both are omitted. |
export_as | string | Read mode only: also render the returned values as text. Omit to return structured values only. csv/tsv are lossless; markdown is display-oriented (in-cell newlines become <br>, pipes are escaped). |
max_length | integer | Read mode only: cap each returned cell string at this many characters. A longer cell becomes '<first chars>…(+N chars)' (the suffix is not counted; N = hidden chars). Pass 0 for full, untruncated stri |
annotations | array | Read mode only: per-cell extras to include — pass only the kinds you need (e.g. ['formulas','notes']); each extra kind adds payload. Omit or leave empty to return values only (cheaper). Returned spars |
sheet_title | string | Read mode only: select the tab by name. Mutually exclusive with sheet_id. Defaults to the first tab when both are omitted. |
value_render | string | Read mode only: 'formatted' (default) returns display strings like '$1,234.50'; 'unformatted' returns raw values suitable for math. |
filter_combine | string | Read mode only: how to combine multiple filter_conditions — a single top-level 'and'/'or' applied to all conditions (no nested grouping or mixed and/or). Defaults to 'and'. |
select_columns | array | Read mode only: return only these columns, by spreadsheet column LETTER (not header name), in this order. Defaults to all columns in a1_range. |
spreadsheet_id | string | The id of the spreadsheet to inspect. |
GoogleSheets_ListSpreadsheetComments12 paramsList a spreadsheet's comment threads, or the full replies of a single comment. In 'comments' mode each comment includes up to a few trimm…
List a spreadsheet's comment threads, or the full replies of a single comment. In 'comments' mode each comment includes up to a few trimmed reply previews plus the total reply_count; use 'thread' mode for a comment's complete reply list. Without filters/ordering, pagination walks every comment. Client-side filters (has_replies, resolved) and order_by are applied only within a bounded scan of the first 500 comments, so on larger sheets drop them and page through everything with the native (unboun
| Parameter | Type | Description |
|---|---|---|
mode | string | 'comments' (default) lists top-level comments, each with a capped reply preview and a reply_count. 'thread' lists the FULL replies of one comment (set comment_id). |
limit | integer | Max comments (or replies, in thread mode) to return. Clamped to [1, 50]. |
order_by | string | Client-side ordering (comments mode) by created/modified time, ascending or descending. Defaults to Drive's native order. |
resolved | boolean | Client-side filter (comments mode): keep only resolved (True) or unresolved (False) comments. |
comment_id | string | Required when mode='thread': the comment whose replies to list. |
max_length | integer | Cap each returned comment/reply body (and quoted text) at this many characters. A longer body becomes '<prefix>…(+N chars)' (suffix not counted; N = hidden chars). Pass 0 for full, untruncated text; a |
page_token | string | Opaque token from a previous call's page_token to fetch the next page. |
comment_ids | array | Fetch exactly these comments by id (comments mode), instead of paging. Replaces a dedicated get tool. At most 50 ids per call, and not combined with page_token. |
has_replies | boolean | Client-side filter (comments mode): keep only comments that have (True) or lack (False) replies. |
modified_after | string | Server-side filter: only comments modified at/after this RFC3339 time (e.g. '2025-01-01T00:00:00Z'). Comments mode only. |
spreadsheet_id | string | The id of the spreadsheet whose comments to list. |
include_deleted | boolean | Include deleted comments/replies (their bodies are blank). Defaults to False. |
GoogleSheets_ReplyToComment3 paramsAdd a reply to an existing comment on a spreadsheet. To resolve or reopen the comment instead, use comment_on_spreadsheet with a status.
| Parameter | Type | Description |
|---|---|---|
comment_id | string | The id of the comment to reply to. |
reply_text | string | The text of the reply. |
spreadsheet_id | string | The id of the spreadsheet the comment belongs to. |
GoogleSheets_ScanForDataIssues11 paramsDeterministically flag 'weird'/bad cells in spreadsheet data. No LLM judgement: the same input always returns the same flags. Each cell-l…
Deterministically flag 'weird'/bad cells in spreadsheet data. No LLM judgement: the same input always returns the same flags. Each cell-level finding carries a coord, a 0-based row_index/column_index (ready for a Sheets GridRange), the rule, a severity (high -> red, medium/low -> yellow), and a note-ready reason — so the output drops straight into an annotate/format recipe. In the default `mode='grouped'` these are aggregated per rule+column within each table into `groups` (with A1 `coords`); us
| Parameter | Type | Description |
|---|---|---|
mode | string | 'grouped' (default) aggregates findings per rule+column within each table with counts; 'list' enumerates every flagged cell. |
rules | array | Which deterministic checks to run. Omit to run every check. Each is fully reproducible (no LLM judgement). |
a1_range | string | Single-sheet only: limit the analysis window (e.g. 'A1:F100'). Table detection still runs inside it; scope it to a single table's range for a precise scan. Defaults to the tab's used range. |
max_rows | integer | Max rows scanned per tab (applies to every scanned tab). Defaults to 200, floored to 1. |
sheet_id | integer | Scan only this tab (by numeric sheetId). Mutually exclusive with sheet_title. Omit both to scan every tab, grouped by sheet. |
has_header | boolean | Treat each detected table's first row as labels (never flagged as a type outlier). Defaults to True. |
orientation | string | 'columns' (default): records are rows, fields are columns. 'rows': the table is transposed — records are columns and fields are rows (row labels down column A). Applies to the whole scan, not per-tabl |
sheet_title | string | Scan only this tab (by name). Mutually exclusive with sheet_id. Omit both to scan every tab. |
spreadsheet_id | string | The id of the spreadsheet to scan. Scan one tab via sheet_id/sheet_title, or every tab when both are omitted. |
max_items_per_group | integer | Grouped mode: max cell coords listed per rule+column (within a table) before an 'omitted' count. Defaults to 10, hard-capped at 50. |
treat_range_as_single_table | boolean | Single-sheet only: treat the whole a1_range as ONE table, skipping auto-detection. Use when detection would over-split a table that has an interior blank row. Defaults to False. |
GoogleSheets_SearchSpreadsheets8 paramsSearches for spreadsheets in the user's Google Drive based on the titles and content and returns the title, ID, and URL for each matching…
Searches for spreadsheets in the user's Google Drive based on the titles and content and returns the title, ID, and URL for each matching spreadsheet. Does not return the content/data of the sheets in the spreadsheets - only the metadata. Excludes spreadsheets that are in the trash.
| Parameter | Type | Description |
|---|---|---|
limit | integer | The maximum number of spreadsheets to list. Defaults to 10. Max is 50 |
order_by | array | Sort order. Defaults to listing the most recently modified spreadsheets first. If spreadsheet_contains or spreadsheet_not_contains is provided, then the order_by will be ignored. |
pagination_token | string | The pagination token to continue a previous request |
spreadsheet_contains | array | Keywords or phrases that must be in the spreadsheet title. Provide a list of keywords or phrases if needed. |
include_shared_drives | boolean | Whether to include spreadsheets from shared drives. Defaults to False (searches only in the user's 'My Drive'). |
spreadsheet_not_contains | array | Keywords or phrases that must NOT be in the spreadsheet title. Provide a list of keywords or phrases if needed. |
search_only_in_shared_drive_id | string | The ID of the shared drive to restrict the search to. If provided, the search will only return spreadsheets from this drive. Defaults to None, which searches across all drives. |
include_organization_domain_spreadsheets | boolean | Whether to include spreadsheets from the organization's domain. This is applicable to admin users who have permissions to view organization-wide spreadsheets in a Google Workspace account. Defaults to |
GoogleSheets_WhoAmIGet comprehensive user profile and Google Sheets environment information. This tool provides detailed information about the authenticated…
Get comprehensive user profile and Google Sheets environment information. This tool provides detailed information about the authenticated user including their name, email, profile picture, Google Sheets access permissions, and other important profile details from Google services.