Skip to main content
Glama

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

list_tabs

Lists a spreadsheet's tabs with dimensions and sheet IDs

read_range

Reads a range in A1 notation, or a whole tab

find_rows

Returns only rows matching column filters or free text, with their absolute row numbers

Write

Tool

Description

update_cell

Sets a single cell; cannot affect neighbouring cells

update_row

Updates only the named columns of an existing row, found by number or by a matching value

write_range

Overwrites a range with a value grid

append_rows

Appends rows after the last occupied row

clear_range

Clears values while preserving formatting

create_spreadsheet

Creates a new spreadsheet in your Drive

add_tab

Adds a tab to an existing spreadsheet

rename_tab

Renames a tab

delete_tab

Deletes a tab; requires an explicit confirm: true

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 build

5. Configure credentials

cp .env.example .env

Open .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 login

The 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 status

Configuration

Add the server to your MCP client's configuration file. For Claude Desktop:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

  • Linux: ~/.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      Pending

Mark 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_rows reads 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 spreadsheets scope covers every spreadsheet the account can reach; Google offers no per-file scope. ALLOWED_SPREADSHEET_IDS is 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_grant and 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=true or an allowlist when working with files you did not create.

License

MIT — see LICENSE.

Available Tools

12 tools
add_tabAdd a tabC

Adds a new tab to an existing spreadsheet.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYesName of the new tab.
spreadsheetIdYesSpreadsheet ID, or its full URL. The ID is the segment between /d/ and /edit in the URL.

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
rangeYesTab or range identifying the table, e.g. 'Sheet1' or 'Sheet1!A:D'.
valuesYesRows to append.
spreadsheetIdYesSpreadsheet ID, or its full URL. The ID is the segment between /d/ and /edit in the URL.
valueInputOptionNoUSER_ENTERED parses values as if typed by hand (formulas, dates, numbers). RAW stores them literally as strings.USER_ENTERED

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
rangeYesA1 range to clear.
spreadsheetIdYesSpreadsheet ID, or its full URL. The ID is the segment between /d/ and /edit in the URL.

TDQS

B3.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
tabsNoNames of the tabs to create. Defaults to a single 'Sheet1'.
titleYesTitle of the new file.

TDQS

B3.2/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYesExact name of the tab to delete.
confirmYesMust be true. Exists to make deletion a deliberate act.
spreadsheetIdYesSpreadsheet ID, or its full URL. The ID is the segment between /d/ and /edit in the URL.

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum rows returned.
queryNoFree text searched across all columns.
sheetYesTab name, e.g. 'Log'.
whereNoCriteria combined with AND. Omit together with query to return every row.
headerRowNoRow holding the headers.
spreadsheetIdYesSpreadsheet ID, or its full URL. The ID is the segment between /d/ and /edit in the URL.

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
spreadsheetIdYesSpreadsheet ID, or its full URL. The ID is the segment between /d/ and /edit in the URL.

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
rangeYesA1 range, e.g. 'Sheet1!A1:D20' or 'Sheet1'.
spreadsheetIdYesSpreadsheet ID, or its full URL. The ID is the segment between /d/ and /edit in the URL.

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
newTitleYesNew name.
currentTitleYesCurrent tab name.
spreadsheetIdYesSpreadsheet ID, or its full URL. The ID is the segment between /d/ and /edit in the URL.

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
cellYesSingle-cell reference, e.g. 'Log!D12'.
valueYesNew value. Formulas must start with an equals sign.
spreadsheetIdYesSpreadsheet ID, or its full URL. The ID is the segment between /d/ and /edit in the URL.
valueInputOptionNoUSER_ENTERED parses values as if typed by hand (formulas, dates, numbers). RAW stores them literally as strings.USER_ENTERED

TDQS

A4.2/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
rowNoAbsolute row number, as returned by find_rows.
matchNoAlternative to row: locate the row by a unique value, e.g. an ID.
sheetYesTab name, e.g. 'Log'.
updatesYesOnly the columns to change.
headerRowNo
spreadsheetIdYesSpreadsheet ID, or its full URL. The ID is the segment between /d/ and /edit in the URL.
valueInputOptionNoUSER_ENTERED parses values as if typed by hand (formulas, dates, numbers). RAW stores them literally as strings.USER_ENTERED

TDQS

A4.2/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
rangeYesTarget A1 range, e.g. 'Sheet1!A1'.
valuesYesValue grid: an array of rows, each row an array of cells.
spreadsheetIdYesSpreadsheet ID, or its full URL. The ID is the segment between /d/ and /edit in the URL.
valueInputOptionNoUSER_ENTERED parses values as if typed by hand (formulas, dates, numbers). RAW stores them literally as strings.USER_ENTERED

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

  1. 12 tool updatesv1.0.0
    • First observedadd_tab
    • First observedappend_rows
    • First observedclear_range
    • First observedcreate_spreadsheet
    • First observeddelete_tab
    • First observedfind_rows
    • First observedlist_tabs
    • First observedread_range
    • First observedrename_tab
    • First observedupdate_cell
    • First observedupdate_row
    • First observedwrite_range

TDQS

A3.8/5.0

Scored across 12 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

12 tools is well-scoped for a Google Sheets server, covering read/write, search, and tab lifecycle without excessive bloat.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers