Skip to main content
Glama

sheets-mcp

An MCP server that connects Claude — or any MCP client — to Google Sheets.

Ask in plain language, and the model reads and edits your spreadsheets directly:

"In my Q3 Pipeline sheet, find every deal marked Negotiation and add a follow-up row to the Tasks tab for each one."

Built on the official MCP Python SDK (v2) and the Google Sheets API v4.


Why this exists

Most spreadsheet automation dies at the glue layer: a script that reads a sheet is easy, but a script that reads whatever sheet someone asks about is not. MCP moves that decision to the model. You expose a handful of well-described tools, and the client figures out which to call.

Two design choices worth knowing about:

  • read_records over raw grids. Handing a model a 2D array of strings wastes tokens and invites off-by-one errors. read_records uses the header row to return labelled objects, each tagged with its real sheet row number so a follow-up write lands in the right place.

  • Read-only mode is enforced by registration, not by a check. With SHEETS_MCP_READ_ONLY=true, the write tools are never registered, so the model cannot see them and cannot be talked into calling them.


Related MCP server: mcp-google-sheets

Tools

Tool

What it does

list_spreadsheets

Lists accessible spreadsheets, newest first, optionally filtered by title.

get_spreadsheet

Returns a spreadsheet's title, URL, and every tab with its dimensions.

read_range

Reads a raw grid from an A1 range.

read_records

Reads a tab as labelled records using a header row. Each record carries _row.

find_rows

Returns records whose named column matches a value (exact or substring).

write_range

Overwrites a range with the rows you supply.

append_rows

Appends rows below the last used row. Overwrites nothing.

clear_range

Clears values in a range, leaving formatting intact.

create_spreadsheet

Creates a spreadsheet, optionally with named tabs, optionally shared with an email.

add_sheet

Adds a tab to an existing spreadsheet.

The last five are omitted entirely in read-only mode.


Install

Requires Python 3.11+.

git clone https://github.com/niberdi01gold/sheets-mcp.git
cd sheets-mcp
pip install -e .

Google setup (5 minutes)

A service account is the recommended path: no browser flow, no token to refresh, and it only ever sees the sheets you explicitly share with it.

  1. In the Google Cloud Console, create a project.

  2. Enable the Google Sheets API and the Google Drive API.

  3. Go to IAM & Admin → Service Accounts, create one, then Keys → Add key → JSON. Save the file somewhere outside the repo.

  4. Open the JSON and copy the client_email value.

  5. In Google Sheets, press Share on each spreadsheet you want the server to reach and paste that address (Viewer for read-only, Editor for writes).

Step 5 is the one people miss. A service account starts with access to nothing; sharing is what grants it.

Then point the server at the key:

cp .env.example .env
# set GOOGLE_SERVICE_ACCOUNT_FILE=/absolute/path/to/service-account.json

Use this when you want the server to see everything you can see, without sharing sheets one by one. Create an OAuth client of type Desktop app, download the JSON, then:

export GOOGLE_OAUTH_CLIENT_FILE=/absolute/path/to/oauth-client.json
sheets-mcp auth      # opens a browser once; caches a token at ~/.sheets-mcp/token.json

The server itself never opens a browser — it reads the cached token and fails with a clear message if there isn't one.

Connect it to a client

Claude Desktop

Edit claude_desktop_config.json (Settings → Developer → Edit Config):

{
  "mcpServers": {
    "sheets": {
      "command": "sheets-mcp",
      "env": {
        "GOOGLE_SERVICE_ACCOUNT_FILE": "/absolute/path/to/service-account.json",
        "SHEETS_MCP_READ_ONLY": "false"
      }
    }
  }
}

Use absolute paths. Claude Desktop launches the server in its own process and does not inherit your shell environment.

Claude Code

claude mcp add sheets -e GOOGLE_SERVICE_ACCOUNT_FILE=/absolute/path/to/service-account.json -- sheets-mcp

MCP Inspector (for development)

mcp dev src/sheets_mcp/server.py

Usage examples

Once connected, these are the kinds of requests the tools are shaped for.

Read and summarise

Open the spreadsheet called "Monthly Expenses" and tell me which category grew the most between June and July.

The model calls list_spreadsheetsget_spreadsheetread_records, then reasons over the labelled rows.

Append without clobbering

Add these three leads to the Leads tab: Acme (acme@example.com, cold), Globex (ops@globex.com, warm), Initech (hi@initech.com, cold).

Calls append_rows, which anchors below the last used row, so concurrent edits by a human do not get overwritten.

Targeted update

In the Inventory tab, find the row where SKU is TH-4410 and set its Stock column to 0.

Calls find_rows to get the record and its _row, then write_range on the single cell.

Build a new sheet from a conversation

Create a spreadsheet called "Q4 Content Calendar" with tabs for Blog, Email and Social, share it with me at nico@example.com, and fill the Blog tab with a header row.

Calls create_spreadsheet then write_range.


Configuration

Variable

Default

Purpose

GOOGLE_SERVICE_ACCOUNT_FILE

Path to the service account JSON key.

GOOGLE_SERVICE_ACCOUNT_JSON

The same key inlined, for hosts without a filesystem.

GOOGLE_OAUTH_CLIENT_FILE

OAuth client secrets, for the user-account flow.

GOOGLE_OAUTH_TOKEN_FILE

~/.sheets-mcp/token.json

Where the cached OAuth token lives.

SHEETS_MCP_READ_ONLY

false

When true, only the read tools are registered.

Credentials are resolved in the order listed above; the first one set wins.


Development

pip install -e ".[dev]"
pytest -q
ruff check .

The tests run the real server in memory through the SDK's Client, with a fake Google client injected — no network, no credentials required.


Notes and limits

  • Reads use FORMATTED_VALUE, so you get what a human sees in the cell, not the underlying float.

  • create_spreadsheet under a service account produces a file owned by that account. Pass share_with or it will be invisible in your Drive.

  • Cell formatting, charts, and pivot tables are out of scope for now. batchUpdate support is the obvious next addition.

  • Very large tabs are read whole before slicing. Fine to a few thousand rows; range-limited reads would be the fix beyond that.


License

MIT — see LICENSE.

Available Tools

10 tools
add_sheetA

Add a new tab to an existing spreadsheet.

Args: spreadsheet_id: The long token from the spreadsheet URL. title: Name of the new tab; must not already exist.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYes
spreadsheet_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/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 a real precondition ('must not already exist' for the title), which is useful behavioral context, but it says nothing about required permissions, whether the operation modifies existing tabs, or side effects of a mutation on a live spreadsheet.

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?

The core purpose sentence is front-loaded and concise, and the Args block is compact. The structure is slightly padded by the Python-style Args formatting, but no sentence is wasted.

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?

An output schema exists, so return values needn't be explained, and both parameters are documented. However, for a mutation tool with zero annotation coverage, the lack of permission requirements or effect disclosure leaves a meaningful gap.

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 description coverage is 0%, so the description must compensate, and it does: it explains spreadsheet_id as 'the long token from the spreadsheet URL' and title as the new tab name with a uniqueness constraint. Both parameters gain meaning beyond the bare schema types.

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 ('Add a new tab to an existing spreadsheet'), which cleanly separates it from create_spreadsheet (creates the whole spreadsheet) and the read/write range tools. It stops short of explicitly naming the sibling it contrasts with, but the resource scope is unambiguous.

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?

The phrase 'existing spreadsheet' implies the prerequisite that the target spreadsheet must already exist, but there is no explicit when-to-use vs create_spreadsheet guidance or list of exclusions. Usage is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

append_rowsA

Append rows below the last used row of a tab. Nothing is overwritten.

Args: spreadsheet_id: The long token from the spreadsheet URL. sheet_name: The tab to append to, e.g. "Sales". values: Rows of cell values, in the same column order as the sheet. value_input_option: USER_ENTERED parses formulas and dates; RAW stores literally.

ParametersJSON Schema
NameRequiredDescriptionDefault
valuesYes
sheet_nameYes
spreadsheet_idYes
value_input_optionNoUSER_ENTERED

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

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 burden. It usefully discloses the append semantics ('Nothing is overwritten') and the parsing behavior of value_input_option, but says nothing about permissions/auth, what happens if the tab is missing, or error behavior. Partial but meaningful behavioral context.

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?

Front-loaded with the purpose in the first sentence, followed by a tight per-argument list. No filler; the 'Args' block is efficient. Minor formatting roughness but nothing wasteful.

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?

An output schema exists, so return values need not be explained, and all four parameters are documented despite 0% schema coverage. What remains missing (auth requirements, failure modes) is minor for a straightforward append operation.

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 description coverage is 0%, so the description must compensate, and it largely does: it explains spreadsheet_id ('long token from the URL'), sheet_name with an example, values ('same column order as the sheet'), and the USER_ENTERED vs RAW distinction. This adds substantial meaning beyond the bare 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 (append) and resource (rows) with scope ('below the last used row of a tab'). The phrase 'Nothing is overwritten' implicitly contrasts it with write_range, though it never names the sibling. An agent can identify the operation, but the differentiation is left to inference.

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?

There is no explicit when-to-use versus alternatives. The 'Nothing is overwritten' note implies a contrast with write_range but does not say to prefer that tool for overwriting. Usage context is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clear_rangeA

Clear the values in a range, leaving formatting and the rows in place.

Args: spreadsheet_id: The long token from the spreadsheet URL. a1_range: The range to clear, e.g. "Sheet1!A2:D100".

ParametersJSON Schema
NameRequiredDescriptionDefault
a1_rangeYes
spreadsheet_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description bears the full behavioral burden. It partially delivers by disclosing what is destroyed (values) versus preserved (formatting, rows), but says nothing about permissions, irreversibility, or behavior on empty/merged cells, which matters for a destructive mutation.

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 of behavior followed by two terse parameter notes; the effect is front-loaded and nothing is padded.

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?

An output schema exists, so return values need not be described, and the two required parameters are explained. The main gap is that a destructive tool with no annotations omits any note on permissions or reversibility.

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 description coverage is 0%, so the description must carry the parameters, and it does: spreadsheet_id is explained as 'the long token from the spreadsheet URL' and a1_range is given a concrete format example. This meaningfully exceeds the bare schema titles.

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 ('Clear the values in a range') and immediately scopes the effect by naming what survives ('leaving formatting and the rows in place'). This lets an agent distinguish it from write_range, which overwrites, without opening either schema.

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?

No explicit when-to-use or when-not-to-use statement, and no sibling is named as an alternative. The preservation clause strongly implies the use case (delete content while keeping layout) but the routing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_spreadsheetA

Create a new spreadsheet and return its ID and URL.

A spreadsheet created by a service account is owned by that account, so pass share_with to give a human account access to it.

Args: title: Title of the new spreadsheet. sheet_names: Optional tab names to create instead of the default single tab. share_with: Optional email address to grant edit access to.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYes
share_withNo
sheet_namesNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/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 it discloses a genuinely non-obvious behavioral trait: spreadsheets created by a service account are owned by that account, which is why share_with matters. It also declares the return values, though it doesn't cover auth scopes or failure behavior.

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?

Purpose and the service-account caveat are front-loaded, followed by a clean Args block for the three parameters. The reflowed multi-line sentence is slightly padded but every sentence carries information.

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 creation tool with no annotations, this covers the purpose, all parameters, the ownership caveat, and the return shape (an output schema also exists, so return details are bonus). Missing pieces are modest: auth/permission requirements and behavior on invalid input.

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 description coverage is 0%, so the description must compensate, and it largely does: each of the three parameters (title, sheet_names, share_with) is explained, including the non-obvious effect of sheet_names replacing the default tab and share_with granting edit access. It adds little on formats or constraints (e.g., email validation) beyond that.

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+resource ('Create a new spreadsheet') and even names the return payload (ID and URL). It is clear what the tool does, but it never explicitly distinguishes itself from the sibling add_sheet, which also creates a tab and could be confused with the sheet_names parameter.

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?

There is one useful conditional ('pass share_with to give a human account access' when the creator is a service account), which implies usage context. However, there is no explicit when-to-use-this vs. when-to-use-add_sheet guidance, and no prerequisites are stated outright.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_rowsB

Find records in a tab whose column matches a value.

Args: spreadsheet_id: The long token from the spreadsheet URL. sheet_name: The tab name to search. column: Header name of the column to match against. value: Value to look for; matching is case-insensitive. header_row: 1-based row number holding the column headers. exact: True for an exact match, False for a substring match. limit: Maximum number of matches to return.

ParametersJSON Schema
NameRequiredDescriptionDefault
exactNo
limitNo
valueYes
columnYes
header_rowNo
sheet_nameYes
spreadsheet_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden, yet it never states that this is a read-only operation, how no-match or large-result cases behave, or any permission/limit considerations. It does disclose that matching is case-insensitive and that exact=True vs False toggles exact/substring matching, which is a small piece of genuine behavioral detail.

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?

The first sentence front-loads the purpose and the Args block is tight with no filler. It is appropriately sized for a 7-parameter tool, though the arg list is a plain enumeration rather than prioritized guidance.

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?

An output schema exists, so return-value explanation is not needed, and all 7 parameters are documented. What remains missing is usage routing and any behavioral/safety disclosure, which are the only real gaps for an otherwise well-covered read tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must do all the work, and it does: every one of the 7 parameters is explained, including the meaning of spreadsheet_id ('long token from the URL'), the 1-based indexing of header_row, case-insensitive matching for value, the exact/substring toggle, and limit as a maximum match count. This adds substantial meaning beyond bare JSON types.

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 gives a specific verb (find) plus resource (records in a tab) and a qualifying predicate (column matches a value), which is enough to distinguish it from a plain bulk reader. It does not explicitly name which sibling to use instead (e.g. read_records vs read_range), 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?

There is no statement of when to use this tool versus the several reading siblings (read_range, read_records, get_spreadsheet). The usage is only implied by 'find records ... whose column matches a value'; no exclusions or alternatives are offered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_spreadsheetA

Get a spreadsheet's title, URL and the name and size of every tab in it.

Call this before reading when you do not already know the tab names.

Args: spreadsheet_id: The long token from the spreadsheet URL.

ParametersJSON Schema
NameRequiredDescriptionDefault
spreadsheet_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/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 return shape (title, URL, tab names/sizes), which is useful, but says nothing about permissions, whether the call is read-only, or rate limits. It is adequate but not rich for a tool with zero annotation coverage.

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?

Front-loads the return contents, follows with the usage condition, and ends with a compact Args section. No filler sentences.

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?

An output schema exists, so return values need not be fully explained, yet the description still previews them. Combined with the parameter provenance and usage trigger, an agent has enough to invoke it correctly; only the absence of behavioral caveats keeps it from a 5.

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 description coverage is 0%, but the description explains the single parameter as the 'long token from the spreadsheet URL', which compensates for the missing schema description. With only one parameter and clear provenance guidance, this is above baseline.

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 (get a spreadsheet) and enumerates exactly what is returned: title, URL, and each tab's name and size. This distinguishes it from siblings like read_range or read_records, which read cell content rather than structure.

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 says to call this before reading when tab names are unknown, which names both the trigger condition and the downstream action. That is a clear when-to-use statement tied to a specific workflow.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_spreadsheetsA

List Google Sheets the credentials can access, most recently modified first.

Args: name_contains: Optional case-insensitive substring to filter titles by. limit: Maximum number of spreadsheets to return (1-100).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
name_containsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/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 access scoping ('credentials can access') and sort order (most recently modified first), which are genuine behavioral facts. However, it omits pagination behavior, total-count limits, and any rate/scope caveats beyond the credential filter.

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?

The leading sentence is front-loaded and efficient, and the Args section is a clean, scannable breakdown. Formatting is appropriate for the content; minor redundancy is minimal.

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?

An output schema exists, so return-value explanation is unnecessary. For a 2-param, no-annotation list tool, the description is adequate but thin: it lacks notes on pagination, result ordering stability, or empty-result/credential-expiry behavior that would make invocation fully unambiguous.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and no enums exist, so the schema alone gives no parameter meaning. The description does cover both params with useful semantics (case-insensitive substring; range 1-100, default visible in schema). But it does not clarify interactions, behavior at limit boundaries, or default handling, leaving gaps given the zero-coverage schema.

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 (List) and resource (Google Sheets) plus scope ('credentials can access') and an ordering rule ('most recently modified first'). This distinguishes it from get_spreadsheet and create_spreadsheet siblings, which operate on a single identified spreadsheet.

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?

The scope 'credentials can access' and the ordering hint imply when to use this (discovery/browsing), but it does not explicitly name alternatives like get_spreadsheet or state when not to use it. Usage is inferable but not spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_rangeB

Read a raw grid of cells from a spreadsheet.

Args: spreadsheet_id: The long token from the spreadsheet URL. a1_range: A1 notation, e.g. "Sheet1", "Sheet1!A1:D50" or "Sheet1!A:A".

ParametersJSON Schema
NameRequiredDescriptionDefault
a1_rangeYes
spreadsheet_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral burden but delivers only parameter documentation. It says nothing about auth requirements, rate limits, empty-cell handling, or how values are typed in the response, all of which matter for a spreadsheet read.

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?

Front-loaded one-line purpose followed by a compact Args block. Every line earns its place; only the format could be tidied, since the parameter docs live in the description rather than the schema.

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?

An output schema exists, so return values needn't be explained, and both params are covered. However, with zero annotation coverage the description omits any behavioral context (permissions, failure modes), leaving the definition minimally viable rather than complete.

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 description coverage is 0%, so the description must compensate, and it does: spreadsheet_id is explained as 'the long token from the spreadsheet URL' and a1_range is illustrated with three concrete A1 examples ('Sheet1', 'Sheet1!A1:D50', 'Sheet1!A:A'). This is helpful beyond the bare schema types.

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 clear verb+resource: 'Read a raw grid of cells from a spreadsheet.' The word 'raw' implicitly distinguishes it from read_records, but no sibling is named explicitly, so it stops short of 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?

There is no explicit when-to-use or when-not-to-use guidance, and no alternative tool is named. The contrast between 'raw grid' and structured siblings like read_records or find_rows is only implied, leaving the agent to infer selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_recordsA

Read a tab as labelled records, using one row as the column headers.

Each record includes a _row field with its 1-based sheet row number, which you can use to build an A1 range for a later update.

Args: spreadsheet_id: The long token from the spreadsheet URL. sheet_name: The tab name, e.g. "Sales". header_row: 1-based row number holding the column headers. limit: Maximum number of data records to return.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
header_rowNo
sheet_nameYes
spreadsheet_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

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 burden. It does disclose a real behavioral trait not in the schema: every record carries a 1-based `_row` field for building A1 ranges. It says nothing about permissions, pagination beyond `limit`, or behavior when header_row is wrong or the tab is empty.

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?

Purpose is front-loaded in the first sentence, the `_row` note is a genuinely useful second sentence, and the Args block earns its place because schema coverage is 0%. Slightly longer than minimal but no filler.

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?

An output schema exists, so return values need no explanation, and all four parameters are documented. What is missing is explicit routing among the many sibling read tools, which is the one gap for an agent choosing between this and read_range.

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 description coverage is 0%, so the description must compensate, and it documents all four parameters. It adds genuine meaning beyond the schema titles: spreadsheet_id is the long token from the URL, sheet_name is the tab name with an example, and header_row is the 1-based row holding headers. Only the `limit` default (200) is left unstated.

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 with a distinguishing qualifier: reads a tab as labelled records keyed by a header row, which separates it in spirit from read_range's raw range read. However, it never names read_range or find_rows explicitly, so sibling differentiation is left implicit.

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?

The mention of the `_row` field 'which you can use to build an A1 range for a later update' implies a read-then-update workflow, giving implied usage context. But there is no explicit statement of when to prefer this over read_range or find_rows, and no exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

write_rangeA

Overwrite a range of cells with the given rows. Existing values are replaced.

Args: spreadsheet_id: The long token from the spreadsheet URL. a1_range: Top-left anchored range, e.g. "Sheet1!A2:C10". values: Rows of cell values, outer list is rows, inner list is columns. value_input_option: USER_ENTERED parses formulas and dates; RAW stores literally.

ParametersJSON Schema
NameRequiredDescriptionDefault
valuesYes
a1_rangeYes
spreadsheet_idYes
value_input_optionNoUSER_ENTERED

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/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 usefully discloses the destructive overwrite behavior ('Existing values are replaced'), which is the most important trait for a write tool, but says nothing about required permissions, whether the range can extend the sheet, error/partial-write behavior, or rate limits.

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?

Front-loaded with the core operation in one sentence, followed by a tight Args list where every line adds information. No filler or 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 mutation tool with no annotations, the description covers the critical destructive behavior and all parameter semantics, and an output schema exists so return values need not be described. Remaining gaps (auth scope, error behavior) are minor.

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 0%, so the description must compensate, and it largely does: it documents all four parameters, including where spreadsheet_id comes from, the top-left anchoring meaning of a1_range with an example, the row/column nesting of values, and the practical difference between USER_ENTERED and RAW. It stops short of covering edge cases like range/value dimension mismatches, hence not a 5.

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 ('Overwrite a range of cells with the given rows') and clarifies the destructive semantics ('Existing values are replaced'). This cleanly separates it from read_range, append_rows, and clear_range without needing to 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?

The 'Existing values are replaced' clause implicitly signals this is for replacing content rather than appending, which lightly steers the agent away from append_rows. However, there is no explicit when-to-use/when-not-to-use statement or named alternative, so usage must be inferred.

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. 10 tool updatesv0.1.0
    • First observedadd_sheet
    • First observedappend_rows
    • First observedclear_range
    • First observedcreate_spreadsheet
    • First observedfind_rows
    • First observedget_spreadsheet
    • First observedlist_spreadsheets
    • First observedread_range
    • First observedread_records
    • First observedwrite_range

TDQS

A3.9/5.0

Scored across 10 tools

Disambiguation5/5

Each tool maps to a clearly distinct operation: list vs. get metadata, raw range vs. labelled record reads, overwrite vs. append vs. clear, search, and create spreadsheet vs. add tab. The boundaries are unambiguous and descriptions reinforce the differences.

Naming Consistency5/5

All tool names follow a consistent snake_case verb_noun pattern (e.g., list_spreadsheets, read_range, append_rows, create_spreadsheet). The convention is predictable throughout with no mixing of styles.

Tool Count5/5

Ten tools provide a well-scoped set for Google Sheets operations. Each tool earns its place without redundancy, and the count is comfortably within the ideal 3–15 range.

Completeness4/5

The surface covers core operations: list, read (raw and records), search, write, append, clear, create spreadsheet, and add tab. However, there is no delete or rename for spreadsheets or tabs, and no formatting or batch operations, which are minor gaps for a complete lifecycle.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers