google-sheets-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| READ_ONLY | No | Set to "true" to disable all write tools and make the server read-only. | false |
| GOOGLE_CLIENT_ID | Yes | The OAuth client ID for the Google Cloud project. | |
| GOOGLE_CLIENT_SECRET | Yes | The OAuth client secret for the Google Cloud project. | |
| ALLOWED_SPREADSHEET_IDS | No | Comma-separated list of spreadsheet IDs the server is allowed to access. Leave empty to allow all spreadsheets accessible by the linked Google account. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_tabsA | Lists the tabs of a spreadsheet with their dimensions and sheetId, plus the file title. |
| read_rangeA | Reads the values of a range in A1 notation. Passing only a tab name (e.g. 'Sheet1') returns all data in that tab. |
| find_rowsA | Finds rows matching one or more criteria and returns only those, along with their absolute row numbers. Prefer this over read_range on long tables: it avoids pulling hundreds of irrelevant rows into the conversation. The row numbers it returns can be passed straight to update_row. |
| update_cellA | Changes the value of a single cell. Prefer this over write_range when the target is one cell: it cannot touch anything around it by accident. |
| update_rowA | Modifies only the named columns of an existing row, leaving every other column untouched. This is the right tool for changing a status or fixing a field in a register: unlike write_range it does not overwrite the whole row. The row is identified either by number (from find_rows) or by matching a value in a column. |
| write_rangeA | Overwrites the cells of a range with the given values. Warning: existing data in that range is lost. To add rows at the end use append_rows; to change a field in an existing record use update_row. |
| append_rowsA | Adds rows after the last occupied row of the given table. This is the safe way to insert new data without touching what is already there. |
| clear_rangeB | Clears the values of a range while leaving formatting intact. Destructive operation. |
| create_spreadsheetB | Creates a new spreadsheet in the user's Drive and returns its ID and URL. |
| add_tabC | Adds a new tab to an existing spreadsheet. |
| rename_tabA | Renames an existing tab. Formulas referencing it are updated by Google automatically. |
| delete_tabA | Permanently deletes a tab and all its contents. Not reversible from this server: the only recovery is Google Sheets' version history. Requires confirm=true, and explicit user confirmation should be obtained before calling it. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 12 tools
Each tool targets a distinct operation: tab management, range reading/writing, row searching, and cell/row updates. The descriptions explicitly differentiate overlapping tools like read_range vs find_rows and update_cell vs update_row vs write_range, preventing misselection.
All tools follow a consistent snake_case verb_noun pattern (e.g., list_tabs, read_range, update_row, create_spreadsheet). No deviations or mixed conventions.
12 tools is well-scoped for a Google Sheets server, covering read/write, search, and tab lifecycle without excessive bloat.
Core CRUD for cells, rows, and tabs is present, but there is no operation to delete rows or insert rows in the middle of a sheet, and no batch update tool. These are minor gaps that agents can work around with clear_range or multiple updates.