google-sheets-mcp
Provides tools for reading and writing Google Sheets, including listing tabs, reading ranges, finding rows, updating cells and rows, writing ranges, appending rows, clearing ranges, creating spreadsheets, and managing tabs.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@google-sheets-mcpIn my Q3 budget sheet, append a row for new laptops at $3,200."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
google-sheets-mcp
A local MCP server that lets an AI assistant read and write your Google Sheets, with per-user OAuth and no cloud hosting.
Why
Most ways of giving an AI assistant access to a spreadsheet are either read-only or route your data through a third-party automation platform. Neither is good enough for a working document you update every day.
This server runs on your own machine and talks directly to the Google Sheets API as you. It exposes targeted operations rather than a raw API surface, so updating a status field changes that one cell instead of rewriting a block of rows — which matters when the spreadsheet is a register you rely on rather than a scratch file.
Related MCP server: sheets-mcp-server
Features
Twelve tools, split between reading and writing. Write tools can be disabled entirely with READ_ONLY=true.
Read
Tool | Description |
| Lists a spreadsheet's tabs with dimensions and sheet IDs |
| Reads a range in A1 notation, or a whole tab |
| Returns only rows matching column filters or free text, with their absolute row numbers |
Write
Tool | Description |
| Sets a single cell; cannot affect neighbouring cells |
| Updates only the named columns of an existing row, found by number or by a matching value |
| Overwrites a range with a value grid |
| Appends rows after the last occupied row |
| Clears values while preserving formatting |
| Creates a new spreadsheet in your Drive |
| Adds a tab to an existing spreadsheet |
| Renames a tab |
| Deletes a tab; requires an explicit |
Two design decisions worth calling out. find_rows returns row numbers that feed straight into update_row, so the model can locate a record and change one field without pulling the whole table into context. And update_row refuses to act when a match is ambiguous, listing the candidate rows instead of updating several at once.
Requirements
Node.js 20 or later
A Google account and a Google Cloud project
An MCP-capable client that supports local stdio servers (Claude Desktop, Claude Code, or any other MCP client)
This is a stdio server. It does not listen on a public port and cannot be used by browser-based clients that only reach remote HTTPS endpoints.
Setup
Starting from a clean machine.
1. Enable the Google Sheets API
Go to the Google Cloud Console, create or select a project, then open APIs & Services > Library, search for Google Sheets API and click Enable.
2. Configure the OAuth consent screen
Open Google Auth Platform > Branding and fill in the app name, user support email and developer contact email. Under Audience, choose Internal if your account belongs to a Google Workspace organisation, otherwise External.
If you chose External and stay in Testing publishing status, add your own address under Test users — without it, sign-in fails with access_denied — and be aware that Google revokes refresh tokens seven days after consent. Publishing the app to production removes that expiry; the app stays private either way, since reaching the consent screen requires your client ID.
3. Create OAuth credentials
Open Google Auth Platform > Clients > Create client and choose application type Desktop app. Desktop clients accept a loopback redirect on any port, so there is no redirect URI to configure. Copy the client ID and client secret.
4. Install
git clone https://github.com/your-username/google-sheets-mcp.git
cd google-sheets-mcp
npm install
npm run build5. Configure credentials
cp .env.example .envOpen .env and fill in GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET. On first run, consider also setting ALLOWED_SPREADSHEET_IDS to a single test spreadsheet.
6. Link your Google account
npm run loginThe command prints a URL. Open it, sign in with the account you added as a test user, and grant access. If the app is unverified you will see a "Google hasn't verified this app" screen — click Advanced, then continue. Google redirects to a temporary local server, the code is exchanged automatically, and the refresh token is written to ~/.gsheets-mcp/tokens.json with mode 0600.
To check how much time is left on the authorization:
npm run statusConfiguration
Add the server to your MCP client's configuration file. For Claude Desktop:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.jsonLinux:
~/.config/Claude/claude_desktop_config.json
{
"mcpServers": {
"gsheets": {
"command": "node",
"args": ["/absolute/path/to/google-sheets-mcp/dist/index.js"],
"env": {
"GOOGLE_CLIENT_ID": "your-client-id-here.apps.googleusercontent.com",
"GOOGLE_CLIENT_SECRET": "your-client-secret-here",
"ALLOWED_SPREADSHEET_IDS": ""
}
}
}
}The path in args must be absolute. On Windows, escape backslashes: "C:\\path\\to\\google-sheets-mcp\\dist\\index.js". Credentials can be supplied either here or through .env — the env block takes precedence.
Restart the client after editing the file.
Usage
Given a spreadsheet with a Log tab whose columns are Date, Task, Client, Hours, Status:
Find the rows in Log where Status is "Pending"
3 of 214 rows in "Log"
row Date Task Client Hours Status
47 2026-03-02 Draft API spec Acme 3 Pending
88 2026-03-14 Review contract Northwind 1.5 Pending
131 2026-04-01 Migrate CI pipeline Acme 6 PendingMark row 47 as Done
Row 47 of "Log" updated.
Status: "Pending" -> "Done"Only column E of row 47 is written. Every other cell in that row is left untouched, and the response reports the previous value so the change can be verified without opening the spreadsheet.
Known limitations
stdio only. No HTTP transport, so browser and mobile MCP clients cannot reach it. Adding one would require hosting and an OAuth authorization-server layer.
Values, not formatting. Cell values and formulas are supported; colours, borders, conditional formatting, charts, filters and data validation are not. Those need
spreadsheets.batchUpdate, which is deliberately not exposed — a general-purpose passthrough would be hard to reason about and easy to misuse.No server-side search. The Sheets API has no query endpoint, so
find_rowsreads the tab and filters in process. The saving is in what reaches the model's context, not in API traffic. On very large sheets the read itself is the cost.Single account. One linked Google identity per installation.
Scope granularity. The
spreadsheetsscope covers every spreadsheet the account can reach; Google offers no per-file scope.ALLOWED_SPREADSHEET_IDSis the only real restriction available, and it is enforced by this server rather than by Google.Rate limits. Google allows 300 read and 300 write requests per minute per project, and 60 per minute per user. Quota is shared across everything using the same Cloud project. Exceeding it returns HTTP 429; the server surfaces it but does not retry or back off.
Token expiry in Testing. With External audience and Testing publishing status, Google revokes refresh tokens after seven days. The server detects
invalid_grantand returns an actionable message rather than a raw API error.Untrusted cell content. Anything the model reads from a spreadsheet enters its context as untrusted text. A sheet shared by someone else could contain instructions aimed at the model. Consider
READ_ONLY=trueor an allowlist when working with files you did not create.
License
MIT — see LICENSE.
Available Tools
12 toolsadd_tabAdd a tabC
Adds a new tab to an existing spreadsheet.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Name of the new tab. | |
| spreadsheetId | Yes | Spreadsheet ID, or its full URL. The ID is the segment between /d/ and /edit in the URL. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It does not say whether the call fails on duplicate tab names, what permissions are required, whether the new tab's ID is returned, or what happens to a spreadsheet that already has many tabs — all meaningful gaps for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no waste. It is efficient, though its brevity contributes to gaps elsewhere rather than being a structural flaw.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, the description leaves too much unspecified: permission requirements, failure modes, and result shape are all unaddressed. Only the basic purpose is covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the schema already documents both 'title' and 'spreadsheetId' (including the URL/ID parsing hint), so the baseline of 3 applies. The description adds no parameter detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Adds a new tab') with the scope qualifier 'to an existing spreadsheet'. It is clearly distinguishable from create_spreadsheet or rename_tab in intent, though it does not explicitly name a sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this versus rename_tab, create_spreadsheet, or delete_tab, and no prerequisites (e.g., the spreadsheet must already exist and be writable). Usage is only implied by the verb.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
append_rowsAppend 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.
| Name | Required | Description | Default |
|---|---|---|---|
| range | Yes | Tab or range identifying the table, e.g. 'Sheet1' or 'Sheet1!A:D'. | |
| values | Yes | Rows to append. | |
| spreadsheetId | Yes | Spreadsheet ID, or its full URL. The ID is the segment between /d/ and /edit in the URL. | |
| valueInputOption | No | USER_ENTERED parses values as if typed by hand (formulas, dates, numbers). RAW stores them literally as strings. | USER_ENTERED |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does disclose the most important behavioral trait for an append tool: rows land after the last occupied row and existing data is preserved. However, it says nothing about permissions/auth, return payload, partial-append failure behavior, or how trailing blank rows are treated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the operation and followed by the differentiator. Nothing redundant and no wasted framing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter, 100%-documented schema with no output schema and no annotations, the description covers the core append semantics adequately. Minor gaps remain around return value expectations and failure/partial-write behavior, but nothing critical 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already documents range, values, spreadsheetId, and the RAW/USER_ENTERED enum. The description's only nod to parameters is the loose phrase 'the given table', adding no format or encoding detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('Adds rows') with a precise placement rule ('after the last occupied row of the given table'). It implicitly separates itself from overwriting siblings like write_range or update_row via 'without touching what is already there', but never names a sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'This is the safe way to insert new data without touching what is already there' gives a clear selection criterion: use it when you want additive inserts rather than replacement. It stops short of naming an alternative (e.g. write_range) or stating when-not to use it, so it is clear context without explicit routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clear_rangeClear a rangeB
Clears the values of a range while leaving formatting intact. Destructive operation.
| Name | Required | Description | Default |
|---|---|---|---|
| range | Yes | A1 range to clear. | |
| spreadsheetId | Yes | Spreadsheet ID, or its full URL. The ID is the segment between /d/ and /edit in the URL. |
TDQS
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 a real behavioral trait — this is a destructive mutation that preserves formatting — which is genuinely useful beyond structured fields. However it omits permission requirements, reversibility/undo behavior, and what happens to formulas, so it only partially covers the mutation's behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero waste, and the preservation constraint ('formatting intact') is packed into the first sentence before the destructive warning. Nothing to trim.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter destructive mutation with no annotations and no output schema, the description covers the essential 'what is destroyed / what is preserved' but leaves out permissions, undo behavior, and edge cases like formulas or empty cells. Adequate but with clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (spreadsheetId, range) are fully documented in the schema, setting the baseline at 3. The description adds no additional detail about range syntax or ID handling, so it neither helps nor hurts.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('clears the values of a range') plus a scope constraint ('leaving formatting intact') that meaningfully distinguishes it from write_range and update_cell. It does not name any sibling explicitly, so it stops short of full differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance at all. It never says when to prefer clearing over write_range with empty values, nor any prerequisites. The agent gets the what but not the when.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_spreadsheetCreate a spreadsheetB
Creates a new spreadsheet in the user's Drive and returns its ID and URL.
| Name | Required | Description | Default |
|---|---|---|---|
| tabs | No | Names of the tabs to create. Defaults to a single 'Sheet1'. | |
| title | Yes | Title of the new file. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It usefully discloses the return value (ID and URL) and the location (user's Drive), which goes beyond the schema, but omits anything about permissions/scopes required or side effects of creating a file.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single efficient sentence with no filler, front-loading the action and then the return value. Appropriate for a two-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple creation tool with full schema coverage and no output schema, the description covers the essential action and explicitly names what is returned (ID and URL). Only minor gaps remain, such as required auth scope.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both the title and tabs parameters are already documented in the schema. The description adds no parameter-level syntax or default details beyond what the schema provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (Creates) and resource (a new spreadsheet in the user's Drive), which is clear and distinguishable from the range/tab manipulation siblings. It does not explicitly name alternatives, but the create-vs-modify distinction is inherent in the verb.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites, and no mention of alternatives such as add_tab for adding tabs to an existing file. An agent must infer that this is the entry point for new files.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_tabDelete a 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.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Exact name of the tab to delete. | |
| confirm | Yes | Must be true. Exists to make deletion a deliberate act. | |
| spreadsheetId | Yes | Spreadsheet ID, or its full URL. The ID is the segment between /d/ and /edit in the URL. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does it well: states permanence, the recovery path (version history), and the confirm=true requirement. These are exactly the behavioral traits an agent needs to avoid accidental data loss.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: action + permanence, recovery constraint, and confirmation requirement. Front-loaded with the destructive nature; every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive no-annotation tool with no output schema, the description covers what matters: irreversibility, recovery path, and confirmation gating. Nothing essential for safe invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with rich per-parameter descriptions (title, confirm, spreadsheetId URL parsing), so the schema already documents parameters thoroughly. The description adds the confirm requirement contextually but doesn't exceed what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: permanently deletes a tab and all its contents. This clearly distinguishes it from siblings like clear_range (which empties without deleting) and add_tab/rename_tab.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains it is not reversible except via version history, and that explicit user confirmation should be obtained before calling. It implies when to use (intentional removal of entire tabs) but doesn't contrast with clear_range explicitly; that gap is minor given the destructive nature is front-loaded.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_rowsFind 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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum rows returned. | |
| query | No | Free text searched across all columns. | |
| sheet | Yes | Tab name, e.g. 'Log'. | |
| where | No | Criteria combined with AND. Omit together with query to return every row. | |
| headerRow | No | Row holding the headers. | |
| spreadsheetId | Yes | Spreadsheet ID, or its full URL. The ID is the segment between /d/ and /edit in the URL. |
TDQS
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 discloses the return shape (matching rows + absolute row numbers), the efficiency rationale versus read_range, and the chaining contract with update_row. It never states the operation is non-mutating, what happens on zero matches, or that results are capped, so it falls short of a full behavioral picture.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with purpose then routing then chaining, with zero filler. Every sentence changes how the agent behaves.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, when to prefer it, what comes back, and how to reuse the result — strong for a six-parameter read tool with no output schema. Minor gaps remain: the 50-row default/200 max cap and zero-match behavior are only discoverable from the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and each parameter (limit, query, where, sheet, headerRow, spreadsheetId) is already documented in the schema. The description only alludes to 'one or more criteria' without adding filter syntax, AND-combination, or default-limits context, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('finds rows matching one or more criteria') and explicitly says what is returned: only matching rows plus their absolute row numbers. It also distinguishes itself from the sibling read_range, so an agent can route 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit selection guidance: 'Prefer this over read_range on long tables' with the reason (avoids pulling hundreds of irrelevant rows into context). It also names the downstream use ('The row numbers it returns can be passed straight to update_row'), covering the main alternatives an agent would weigh.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tabsList tabsA
Lists the tabs of a spreadsheet with their dimensions and sheetId, plus the file title.
| Name | Required | Description | Default |
|---|---|---|---|
| spreadsheetId | Yes | Spreadsheet ID, or its full URL. The ID is the segment between /d/ and /edit in the URL. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It helpfully discloses what the response contains (tab dimensions, sheetId, file title), but says nothing about read-only safety, permissions, or pagination behavior on large spreadsheets.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with the verb and resource, with the return payload appended economically. Nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter read tool this is nearly sufficient: it compensates for the absent output schema by naming the fields returned, and the single parameter is fully documented in the schema. Only behavioral details like ordering or permissions are missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already explains the ID/URL format in detail. The description adds no parameter-level meaning beyond that, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (lists) and resource (tabs of a spreadsheet) and even enumerates the returned fields (dimensions, sheetId, file title). It is clearly distinct from the mutating siblings (add_tab, rename_tab, delete_tab), though it does not explicitly name them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer this is the read-only discovery step before calling read_range or update_cell. There is no explicit when-to-use, prerequisite, or alternative-tool guidance tying it to those siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_rangeRead a rangeA
Reads the values of a range in A1 notation. Passing only a tab name (e.g. 'Sheet1') returns all data in that tab.
| Name | Required | Description | Default |
|---|---|---|---|
| range | Yes | A1 range, e.g. 'Sheet1!A1:D20' or 'Sheet1'. | |
| spreadsheetId | Yes | Spreadsheet ID, or its full URL. The ID is the segment between /d/ and /edit in the URL. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden. It discloses the read-only nature implicitly and the bare-tab-name expansion behavior, which is useful, but says nothing about return format, empty ranges, permissions, or large-range behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the core purpose and immediately followed by the non-obvious edge case. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequate for a simple two-parameter read with full schema coverage, but with no annotations and no output schema, the description could disclose more about return shape or error behavior to fully equip the agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters are documented in the schema, including A1 examples and the spreadsheetId URL-derivation hint. The description's tab-name example overlaps with schema content without adding syntax beyond it, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (reads), resource (range values), and format (A1 notation). The special-case behavior of passing a bare tab name is a precise, distinguishing detail that differentiates it from siblings like write_range or find_rows.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the read semantics and the note about bare tab names, but there is no explicit guidance on when to use read_range vs alternatives like find_rows or list_tabs, nor any stated preconditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rename_tabRename a tabA
Renames an existing tab. Formulas referencing it are updated by Google automatically.
| Name | Required | Description | Default |
|---|---|---|---|
| newTitle | Yes | New name. | |
| currentTitle | Yes | Current tab name. | |
| spreadsheetId | Yes | Spreadsheet ID, or its full URL. The ID is the segment between /d/ and /edit in the URL. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses one non-obvious side effect — that formulas referencing the tab are updated automatically — but omits permission requirements, what happens if newTitle collides with an existing tab name, and whether the rename is reversible.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, with the action stated first and the side-effect note following. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple three-parameter mutation with no output schema and no annotations, the description covers the action and one important side effect. The main remaining gap is conflict/error behavior when the target name already exists, which an agent would need to handle.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and each parameter (spreadsheetId, currentTitle, newTitle) is already documented in the schema, including the URL-parsing detail for spreadsheetId. The description adds no additional parameter meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Renames an existing tab'), which clearly separates it from siblings like add_tab, delete_tab, and list_tabs even without naming them. It stops short of explicitly contrasting with those siblings, keeping it at a 4 rather than a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the name and the phrase 'an existing tab' signals the precondition that the tab must already exist. There is no explicit when-to-use guidance, no naming of alternatives (e.g., when to rename vs. delete and re-create), and no stated failure conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_cellUpdate a 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.
| Name | Required | Description | Default |
|---|---|---|---|
| cell | Yes | Single-cell reference, e.g. 'Log!D12'. | |
| value | Yes | New value. Formulas must start with an equals sign. | |
| spreadsheetId | Yes | Spreadsheet ID, or its full URL. The ID is the segment between /d/ and /edit in the URL. | |
| valueInputOption | No | USER_ENTERED parses values as if typed by hand (formulas, dates, numbers). RAW stores them literally as strings. | USER_ENTERED |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the key behavioral trait — the write is narrowly scoped to one cell and cannot affect neighbors — which is genuine added value. However, it says nothing about permissions, whether the previous value is overwritten/destroyed, or what the response looks like, leaving gaps for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, and the core purpose plus the routing hint are front-loaded. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter mutation tool with no annotations and no output schema, the description covers purpose, scope, and the sibling routing decision well. It would be complete at 5 if it stated the mutation is destructive/overwriting or mentioned the success response, but overall it is adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters (cell, value, spreadsheetId, valueInputOption) are already documented with formats and enum semantics in the schema. The description adds no parameter detail beyond that, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Changes the value of a single cell') and immediately differentiates itself from the sibling write_range. An agent can tell exactly what this does and how it differs from the range-writing alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the alternative (write_range) and the condition that selects this tool (single-cell target), plus the reason (cannot touch surrounding cells). This is exactly the when-to-use guidance an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_rowUpdate an existing 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.
| Name | Required | Description | Default |
|---|---|---|---|
| row | No | Absolute row number, as returned by find_rows. | |
| match | No | Alternative to row: locate the row by a unique value, e.g. an ID. | |
| sheet | Yes | Tab name, e.g. 'Log'. | |
| updates | Yes | Only the columns to change. | |
| headerRow | No | ||
| spreadsheetId | Yes | Spreadsheet ID, or its full URL. The ID is the segment between /d/ and /edit in the URL. | |
| valueInputOption | No | USER_ENTERED parses values as if typed by hand (formulas, dates, numbers). RAW stores them literally as strings. | USER_ENTERED |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, description carries full burden. It states the non-destructive scope (only named columns), which is valuable. However, it doesn't cover authentication needs, rate limits, error behavior, what happens if row/match not found, or reversibility. Some behavioral context is present but incomplete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core behavior (partial column update), then the sibling contrast and row identification. Every sentence earns its place with no waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 7 parameters, nested objects, and no output schema, the description covers the key behavioral trait (partial update) and row identification alternatives. It could mention what happens on missing row/match or the valueInputOption implications, but schema handles most parameter details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 86%, so schema already documents most parameters. The description adds meaning about row identification ('by number (from find_rows) or by matching a value in a column') and the partial-update semantics of 'updates'. This goes beyond the schema's per-field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (modifies) and scope (only named columns, other columns untouched), and distinguishes itself from write_range by contrast. Siblings like update_cell and write_range are implicitly differentiated by scope description.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use this tool ('changing a status or fixing a field') and names the alternative (write_range) with the condition that selects it ('unlike write_range it does not overwrite the whole row'). No explicit when-not conditions, but the alternative contrast is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
write_rangeWrite to a 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.
| Name | Required | Description | Default |
|---|---|---|---|
| range | Yes | Target A1 range, e.g. 'Sheet1!A1'. | |
| values | Yes | Value grid: an array of rows, each row an array of cells. | |
| spreadsheetId | Yes | Spreadsheet ID, or its full URL. The ID is the segment between /d/ and /edit in the URL. | |
| valueInputOption | No | USER_ENTERED parses values as if typed by hand (formulas, dates, numbers). RAW stores them literally as strings. | USER_ENTERED |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description carries the full behavioral burden, and it does disclose the critical destructive trait: existing data in the range is lost. It does not cover permission/auth requirements or the response shape, so it falls short of a full 5, but the most important risk is stated prominently.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly packed sentences: behavior, warning, and alternatives. The destructive warning is front-loaded after the action, and every clause earns its place with zero redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter write tool with no annotations and no output schema, the description covers the destructive overwrite semantics and sibling routing that an agent needs. It could optionally note return behavior or scope-limiting, but nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so range, values, spreadsheetId, and the valueInputOption enum are all documented in the schema itself. The description adds no parameter-level detail beyond that, which makes the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Overwrites the cells of a range') and immediately distinguishes itself from the two nearest siblings by naming them (append_rows for adding rows, update_row for editing a field). An agent can route correctly without opening any sibling schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use and when-not-to-use guidance: use append_rows to add rows at the end, update_row to change an existing field. This is the exact routing information needed among list_tabs/read_range/append_rows/update_row/clear_range siblings.
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.
12 tool updates
v1.0.0- First observed
add_tab - First observed
append_rows - First observed
clear_range - First observed
create_spreadsheet - First observed
delete_tab - First observed
find_rows - First observed
list_tabs - First observed
read_range - First observed
rename_tab - First observed
update_cell - First observed
update_row - First observed
write_range
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.
Maintenance
Related MCP Connectors
MCP server connecting AI agents to 100+ apps (Gmail, Slack, Notion, GitHub) via one-click OAuth.
MCP server that lets AI assistants use all OneSchema features exposed via the public API.
Driflyte MCP server which lets AI assistants query topic-specific knowledge from web and GitHub.
- ZapierOAuthcom.zapier
Hosted MCP server connecting AI assistants to 9,000+ apps and 40,000+ actions via Zapier.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceThis MCP server enables AI assistants to automatically sync Google Sheets data to a local database and perform natural language queries and analysis on spreadsheet data.19 npm4MIT
- AlicenseNot gradedqualityNot gradedmaintenanceAn MCP server that lets AI agents read and write Google Sheets using the Google Sheets API v4.MIT
- FlicenseNot gradedqualityDmaintenanceAn MCP server that enables AI assistants to interact with Google Docs, Sheets, and Drive using the user's own Google account.-
- AlicenseNot gradedqualityDmaintenanceMCP server for Google Docs and Sheets that enables AI assistants to read, create, edit, style, export, and collaborate on documents using local OAuth authentication.14 npm1MIT