Skip to main content
Glama

Google Sheets MCP

English | Русский

npm CI Glama License: MIT

A1 Google Sheets MCP lets an AI app work with Google Sheets in plain language. Find a spreadsheet, read its data, write and append rows, shape sheets and formatting, build charts and share the result.

It uses the Google Sheets API with your Google account. It separates reading from writing, keeps destructive operations explicit and makes the limits of the Sheets API clear instead of implying that every spreadsheet task is possible.

  • 20 tools. Search and create spreadsheets, read and write ranges, manage sheets, formatting, data validation, protected ranges, conditional formats, structured tables, charts and access.

  • Writes are deliberate. A write is never replayed after an ambiguous failure — a replayed append would duplicate rows — and destructive tools are marked so your AI client can ask first.

  • Sheets only. Drive is an internal dependency for spreadsheet search and sharing alone; there is no generic Drive tool, and raw_request cannot reach Drive.

  • Minimal Google scopes. spreadsheets covers every Sheets tool; a Drive scope is needed only for spreadsheet search and sharing.

Start with a read-only question:

Find the quarterly budget spreadsheet and summarize what each of its sheets contains.

Connect the server · Explore use cases · Open technical documentation


See it work in a minute

You: Show me the structure of the sales report spreadsheet — its sheets, their sizes and frozen rows.

Assistant: Shows the sheets with their sizes, frozen headers and the objects on them. Nothing changes.

You: Prepare a “March” sheet as a copy of “February” and clear the numbers, keeping the layout.

Assistant: Shows the plan — duplicate the sheet, rename it and clear the data ranges — then asks for confirmation before changing anything.

You: Confirm.

Assistant: Duplicates the sheet and clears the values. Formatting, data validation and frozen rows stay.

Related MCP server: Google Sheets MCP Server

Contents

Quick start

You need Node.js 20+, a Google account and OAuth credentials from a Google Cloud project with the Google Sheets API enabled.

  1. Prepare Google OAuth access.

  2. Add the server to your AI app.

  3. Ask the read-only question above.

In the app: open Settings → MCP servers, select Add server, choose STDIO, enter the command npx -y @a1-x-tech/mcp-google-sheets@latest and environment variables GOOGLE_SHEETS_CLIENT_ID, GOOGLE_SHEETS_CLIENT_SECRET, GOOGLE_SHEETS_REFRESH_TOKEN, then select Save and Restart.

From the command line:

codex mcp add google-sheets \
  --env GOOGLE_SHEETS_CLIENT_ID=your_client_id \
  --env GOOGLE_SHEETS_CLIENT_SECRET=your_client_secret \
  --env GOOGLE_SHEETS_REFRESH_TOKEN=your_refresh_token \
  -- npx -y @a1-x-tech/mcp-google-sheets@latest
codex mcp list

Codex MCP documentation

claude mcp add \
  --env GOOGLE_SHEETS_CLIENT_ID=your_client_id \
  --env GOOGLE_SHEETS_CLIENT_SECRET=your_client_secret \
  --env GOOGLE_SHEETS_REFRESH_TOKEN=your_refresh_token \
  --transport stdio --scope user google-sheets \
  -- npx -y @a1-x-tech/mcp-google-sheets@latest
claude mcp list

Claude Code MCP documentation

The current official path is Settings → Extensions. For a custom desktop extension, open Advanced settings → Extension Developer → Install Extension…, select a .mcpb file and follow the prompts.

This repository currently publishes an npm stdio package and does not contain a .mcpb bundle. For Claude Desktop builds that still support local configuration, use the following JSON stdio configuration as a fallback:

{
  "mcpServers": {
    "google-sheets": {
      "command": "npx",
      "args": ["-y", "@a1-x-tech/mcp-google-sheets@latest"],
      "env": {
        "GOOGLE_SHEETS_CLIENT_ID": "your_client_id",
        "GOOGLE_SHEETS_CLIENT_SECRET": "your_client_secret",
        "GOOGLE_SHEETS_REFRESH_TOKEN": "your_refresh_token"
      }
    }
  }
}

In those builds, save it to ~/Library/Application Support/Claude/claude_desktop_config.json on macOS or %APPDATA%\Claude\claude_desktop_config.json on Windows.

Claude Desktop MCP documentation

Add this to ~/.cursor/mcp.json on macOS/Linux or %USERPROFILE%\.cursor\mcp.json on Windows:

{
  "mcpServers": {
    "google-sheets": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@a1-x-tech/mcp-google-sheets@latest"],
      "env": {
        "GOOGLE_SHEETS_CLIENT_ID": "your_client_id",
        "GOOGLE_SHEETS_CLIENT_SECRET": "your_client_secret",
        "GOOGLE_SHEETS_REFRESH_TOKEN": "your_refresh_token"
      }
    }
  }
}

Cursor MCP documentation

Run MCP: Open User Configuration and add:

{
  "servers": {
    "google-sheets": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@a1-x-tech/mcp-google-sheets@latest"],
      "env": {
        "GOOGLE_SHEETS_CLIENT_ID": "${input:sheets_client_id}",
        "GOOGLE_SHEETS_CLIENT_SECRET": "${input:sheets_client_secret}",
        "GOOGLE_SHEETS_REFRESH_TOKEN": "${input:sheets_refresh_token}"
      }
    }
  },
  "inputs": [
    { "type": "promptString", "id": "sheets_client_id", "description": "Google OAuth client ID" },
    { "type": "promptString", "id": "sheets_client_secret", "description": "Google OAuth client secret", "password": true },
    { "type": "promptString", "id": "sheets_refresh_token", "description": "Google OAuth refresh token", "password": true }
  ]
}

Check it with MCP: List Servers.

VS Code MCP documentation

What you can ask it to do

Find and read data

  • Find the newest spreadsheet with “budget” in the name and show its structure.

  • Read 'Q3'!A1:F50 and summarize the totals.

  • Show the formulas behind the Summary sheet.

Update the numbers

  • Write this table into Sheet1!A1, formulas included.

  • Append today’s figures as a new row of the log.

  • Update several ranges in one batch, or clear a draft range while keeping its formatting.

Shape and present

  • Add a “March” sheet, freeze the header row and make it bold.

  • Highlight negative amounts in red with a conditional format and add borders.

  • Build a column chart of revenue by month on its own sheet.

  • Turn the data into a structured table and add a dropdown with data validation.

Protect and share

  • Protect the totals row so only I can edit it.

  • Give a colleague edit access and everyone else read-only.

  • Show who currently has access to the file.

How a spreadsheet changes

  1. Values tools address cells in A1 notation ('Sheet name'!A1:C10); structural tools (sheets, formatting, rules, tables, charts) address a numeric sheetId with 0-based indexes. get_spreadsheet supplies the ids — sheet titles are not addresses.

  2. A write overwrites its range; append_values adds rows after the last data row; a null cell is skipped, not cleared.

  3. clear_values empties values and formulas but keeps formatting, data validation, notes and merges. There is no undo through the API — deleting a sheet, rows or columns destroys their data.

  4. Batch tools carry several ranges or requests in one call and count once against the quota; a batchUpdate is atomic — all of its requests apply or none do.

Some spreadsheet features have no dedicated tool: merged cells, named ranges, banding, filters, slicers, find-and-replace and gradient conditional-format rules go through raw_request, which is limited to the Sheets API origin. A new spreadsheet lands in the My Drive root — moving it into a folder is not covered, and manage_permissions cannot transfer ownership.

What can change

Operation

What happens

Confirmation boundary

Read metadata or values

Reads structure and cells

No change

Create a spreadsheet

Adds a file to My Drive

Changes Google Sheets

Write, batch-write or append values

Overwrites cells or adds rows

Changes a spreadsheet

Format, freeze, borders, dimensions, validation, rules, tables, charts

Changes presentation, structure and rules

Changes a spreadsheet

Clear values or delete a sheet, rows or columns

Removes data with no undo through the API

Destructive

Manage protected ranges and permissions

Changes who can open or edit the file

Changes access

Raw API request

Can call API methods without a dedicated tool

Potentially destructive

The AI client controls confirmation prompts. The server marks reads, writes and destructive tools so the client can distinguish an inspection from a live change.

Getting access

Google Sheets requires OAuth 2.0 to edit spreadsheets; an API key is not enough.

  1. Create or select a Google Cloud project and enable the Google Sheets API. Also enable the Google Drive API if you want spreadsheet search and sharing.

  2. Configure the OAuth consent screen and create a Desktop app OAuth client.

  3. Authorize the Google account that owns or can edit the spreadsheets. The OAuth 2.0 Playground can obtain the refresh token when Use your own OAuth credentials is enabled.

  4. Request the minimal scope:

    https://www.googleapis.com/auth/spreadsheets

    It covers every Sheets tool. Only search_spreadsheets and manage_permissions need a Drive scope on top: https://www.googleapis.com/auth/drive, or drive.readonly for search alone, or drive.file for files created through this app.

Testing-mode OAuth refresh tokens can expire after seven days. Publish the OAuth app, or use an Internal app in a Workspace domain, when you need long-lived access. Treat the client secret and refresh token as passwords.

Configuration

Variable

Required

Description

GOOGLE_SHEETS_CLIENT_ID

Yes*

OAuth client ID.

GOOGLE_SHEETS_CLIENT_SECRET

Yes*

OAuth client secret.

GOOGLE_SHEETS_REFRESH_TOKEN

Yes*

OAuth refresh token.

GOOGLE_SHEETS_ACCESS_TOKEN

Yes*

Short-lived (~1 h) alternative to the OAuth trio.

GOOGLE_SHEETS_API_BASE

No

Google Sheets API base URL override.

GOOGLE_SHEETS_TIMEOUT_MS

No

Per-request timeout; default 60000 ms.

GOOGLE_SHEETS_MAX_RETRIES

No

Temporary-error retries; default 3.

* Provide either the OAuth trio or an access token. Without credentials the server still starts and lists its tools; the first call names the variables to set.

Data, limits and background work

  • Requests go to Google. The local server refreshes Google OAuth tokens and calls the Sheets API — and, for spreadsheet search and sharing only, the Drive API. Its anonymous telemetry contains an installation ID, package version, AI client and platform versions, and tool names — never OAuth tokens, spreadsheet data, tool arguments or prompts. Set ASKADS_TELEMETRY=0 to opt out.

  • Google applies per-minute quotas. The documented limits are 300 reads and 300 writes per minute per project, and 60 of each per user; a batch call counts once however many ranges or requests it carries. A spreadsheet holds at most 10,000,000 cells. On 429, the server uses backoff; reads also retry after network and 5xx errors, while writes are not replayed after an uncertain failure.

  • There is no background polling. The server runs only when called. If your AI app supports scheduled tasks, it can check a spreadsheet periodically.

Technical documentation

Support

Found a bug or need a scenario? Create an issue or write in Telegram.

Available Tools

20 tools
append_valuesAppend rowsA

Appends rows after the last row of the data table that contains the given range — pass the table's region (e.g. "Sheet1!A1:D1" or just "Sheet1") and the API finds the first free row itself; the response's updates.updatedRange shows where the rows actually landed. insert_data_option INSERT_ROWS pushes existing data below down; OVERWRITE (default behaviour) writes into the free rows after the table. Never retried after an ambiguous failure — re-appending would duplicate the rows, so check the sheet first (read_values) before re-sending.

ParametersJSON Schema
NameRequiredDescriptionDefault
rangeYesA1 range identifying the table to append to (the API scans it for the last data row).
valuesYes2-D array of cell values, outer array = rows: [["Name","Score"],["Ada",42]]. null leaves the existing cell untouched.
spreadsheet_idYesThe spreadsheet id — the long id from the URL (docs.google.com/spreadsheets/d/<spreadsheetId>/edit) or from create_spreadsheet / search_spreadsheets output.
insert_data_optionNoOVERWRITE writes after the table (default); INSERT_ROWS inserts new rows, shifting data below.
value_input_optionNoUSER_ENTERED (default) parses formulas/numbers/dates; RAW stores literal strings.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations only flag readOnlyHint: false and idempotentHint: false, but the description goes far beyond them: it warns that re-appending duplicates rows, explains what happens with INSERT_ROWS vs OVERWRITE (data shifts vs writes into free rows), and documents that the response's updates.updatedRange reveals where rows landed. This is exactly the behavioral context that the flat annotation flags cannot convey. No contradiction with annotations.

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?

Four dense sentences, all carrying operational value: purpose+mechanism, response behavior, option semantics, and the retry warning. The core purpose is front-loaded and the retry guidance earns its place as critical safety information. Slightly long, but there is no filler or repetition of schema content.

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?

Complete for a 5-param mutation tool with no output schema: it covers the append mechanism, the return field (updates.updatedRange) since no output schema exists, option semantics, and the retry safety path. The only minor gap is that the alternative write_values is never explicitly named for choosing the right tool in the first place.

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 100%, so baseline is 3, but the description adds real value on top: concrete range format examples ('Sheet1!A1:D1' or just 'Sheet1') clarify how the table region is specified, and it explains the behavioral difference between INSERT_ROWS and OVERWRITE beyond the enum labels. The values and spreadsheet_id params are already well-handled by the 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?

The description states a specific verb+resource combo ('Appends rows after the last row of the data table') and explains the distinguishing mechanism — the API finds the first free row from a table region. This clearly separates it from write_values (targeted range) and batch_write_values without needing to open either sibling's schema.

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?

The description gives explicit guidance for the retry case: 'Never retried after an ambiguous failure... check the sheet first (read_values) before re-sending,' naming the exact alternative tool and the condition for using it. It explains insert_data_option behavior, but it never explicitly contrasts append_values with write_values for the normal case — the 'finds the first free row itself' mechanism implies it, but the sibling distinction isn't made explicit.

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

batch_write_valuesWrite values to many rangesA
DestructiveIdempotent

Overwrites several A1 ranges in ONE call — one write against the per-minute quota instead of one per range, so always prefer this over looping write_values. data is a list of {range, values} pairs; all are written with the same value_input_option (USER_ENTERED parses formulas/numbers/dates, RAW stores literally). Returns totalUpdatedCells and a per-range responses[] breakdown. Like write_values, null entries skip cells rather than clearing them.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataYesThe ranges to write, each with its own 2-D values matrix.
spreadsheet_idYesThe spreadsheet id — the long id from the URL (docs.google.com/spreadsheets/d/<spreadsheetId>/edit) or from create_spreadsheet / search_spreadsheets output.
value_input_optionNoUSER_ENTERED (default) parses formulas/numbers/dates; RAW stores literal strings.

TDQS

A4.7/5.0
Behavior5/5

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

The description discloses overwriting behavior (destructive), idempotent nature (consistent overwrite), and return fields (totalUpdatedCells, responses[]). It explains USER_ENTERED vs RAW and null skipping. These details add value beyond the annotations (destructiveHint, idempotentHint) without contradiction.

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 sentences, each earning its place: the quota advantage, the input structure and options, and the return value. No fluff, front-loaded with the key differentiator.

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 multi-range write tool, it covers the alternative (write_values), the input format, the option semantics, null behavior, and return fields. With no output schema, it provides enough for an agent to call it correctly. The mention of returns is sufficient for the given complexity.

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%, so parameters are well-documented. The description adds a high-level summary of the data structure and explains value_input_option choices, but these are largely redundant with the schema. It provides narrative coherence but no substantial new semantic information.

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?

The description clearly states the action (overwrites several A1 ranges in one call), distinguishes it from looping write_values, and highlights the benefit of a single quota write. It is specific and unambiguous.

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 instructs to prefer this over looping write_values, referencing the alternative directly. Also explains value_input_option semantics and null skipping, providing clear context for when to use this tool.

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

clear_valuesClear valuesA
Destructive

Empties the VALUES of one or more A1 ranges in a single call — cell contents and formulas are gone (no undo through the API), while formatting, data validation, notes, conditional formats and merges all stay. To also remove formatting use format_cells or raw_request; to delete whole rows/columns (not just their content) use manage_dimensions action=delete.

ParametersJSON Schema
NameRequiredDescriptionDefault
rangesYesThe A1 ranges to clear.
spreadsheet_idYesThe spreadsheet id — the long id from the URL (docs.google.com/spreadsheets/d/<spreadsheetId>/edit) or from create_spreadsheet / search_spreadsheets output.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already flag destructive=true and readOnly=false, but the description adds valuable beyond-annotation context: 'no undo through the API' and the precise closure that formatting, data validation, notes, conditional formats, and merges all stay. This materially expands what the agent knows about side effects and postcondition state. There is no contradiction with annotations.

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?

The description is two sentences with zero filler, front-loading the core semantics first and then routing edge cases to alternatives. Every clause earns its place by either refining behavior or disambiguating siblings.

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 mutation tool with no output schema, the description tells the agent what happens, what does not happen, that it is irreversible, and which sibling to choose for nearby operations. Combined with the fully covered schema and clear annotations, nothing needed to call this tool 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%, so the schema already fully documents both parameters, including the A1-notation examples and the spreadsheet URL format. The description's 'one or more A1 ranges in a single call' adds process context but not new parameter-level meaning beyond the schema. 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?

The description opens with a specific verb and resource ('Empties the VALUES of one or more A1 ranges') and precisely scopes what is affected: cell contents and formulas are removed while formatting, validation, notes, conditional formats, and merges are preserved. This clearly distinguishes the tool from siblings like format_cells, manage_dimensions, and raw_request.

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?

The description explicitly names the alternatives for adjacent use cases: 'To also remove formatting use format_cells or raw_request; to delete whole rows/columns... use manage_dimensions action=delete.' This makes the selection criteria concrete and leaves no inference about when clear_values is or is not the right tool.

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

create_spreadsheetCreate a spreadsheetA

Creates a new Google Sheets spreadsheet and returns it: spreadsheetId, spreadsheetUrl, properties (title, locale, timeZone) and sheets[] with each sheet's numeric sheetId. sheet_titles creates one tab per title in order (omitted = a single default "Sheet1"). The file lands in the authorized user's My Drive root — moving it into a folder needs the Drive API, which this server does not cover. Save the returned spreadsheetId: the Sheets API has no list endpoint of its own (search_spreadsheets exists, but it needs a Drive scope on the token).

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYesThe spreadsheet title (also the Drive file name).
localeNoSpreadsheet locale as ISO code, e.g. "en_US" or "ru_RU" (affects number/date parsing).
time_zoneNoTime zone in CLDR format, e.g. "Europe/Moscow" (affects NOW()/TODAY()).
sheet_titlesNoTab titles to create, in order, e.g. ["Data","Summary"]. Omitted = one default sheet.

TDQS

A4.9/5.0
Behavior5/5

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

The description discloses behavior beyond the annotations: the created file's location, the sheet creation behavior with sheet_titles, the default 'Sheet1' fallback, and the returned structure. It also explains a limitation of the Sheets API that affects subsequent operations, which is valuable context not present in the annotations.

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?

The description is information-dense but well structured: it leads with the core action and return value, then covers file placement and API limitations. Every sentence contributes practical, decision-relevant information without repetition or filler.

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?

Because there is no output schema, the description correctly explains the return fields: spreadsheetId, spreadsheetUrl, properties, and sheets[]. It also covers the missing Drive API folder behavior and the lack of a native list endpoint, which are critical for an agent to set correct expectations and handle the returned ID properly.

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 100%, so the schema already explains each parameter. The description adds meaningful behavioral semantics beyond that, such as 'sheet_titles creates one tab per title in order' and 'omitted = a single default "Sheet1"', which clarifies how the array parameter affects the result.

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?

The description states a specific verb and resource: 'Creates a new Google Sheets spreadsheet and returns it...' and enumerates the returned fields. It is immediately distinct from sibling tools like search_spreadsheets or write_values, so an agent can tell what this tool does without ambiguity.

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?

The description gives practical usage context: the file lands in My Drive root, moving it requires the Drive API which is not covered, and the spreadsheetId should be saved because there is no native Sheets list endpoint. It also names search_spreadsheets as the alternative for finding spreadsheets, while noting the Drive scope requirement.

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

format_cellsFormat cellsA
DestructiveIdempotent

Applies cell formatting to a range: background_color, text color/bold/italic/strikethrough/underline/font_size/font_family, horizontal/vertical alignment, wrap_strategy, and number format (number_format_type NUMBER/PERCENT/CURRENCY/DATE/TIME/DATE_TIME/SCIENTIFIC/TEXT with an optional number_format_pattern like "#,##0.00" or "dd.mm.yyyy"). Only the provided properties are touched — the update mask is computed automatically, so existing formatting outside it survives; at least one formatting field is required. The range is a grid rectangle addressed by sheet_id + 0-based indexes (get sheet_id from get_spreadsheet). Colors are "#RRGGBB" hex strings.

ParametersJSON Schema
NameRequiredDescriptionDefault
boldNoBold text.
rangeYesCell rectangle in grid coordinates: rows 1-10 × columns A-B = {start_row_index:0, end_row_index:10, start_column_index:0, end_column_index:2}.
italicNoItalic text.
font_sizeNoFont size in points.
underlineNoUnderlined text.
text_colorNoText color "#RRGGBB".
font_familyNoFont family, e.g. "Roboto".
strikethroughNoStrikethrough text.
wrap_strategyNoHow long text behaves: overflow into empty neighbors, clip at the edge, or wrap.
spreadsheet_idYesThe spreadsheet id — the long id from the URL (docs.google.com/spreadsheets/d/<spreadsheetId>/edit) or from create_spreadsheet / search_spreadsheets output.
background_colorNoHex color "#RRGGBB", e.g. "#FF0000".
number_format_typeNoNumber format category.
vertical_alignmentNoVertical alignment.
horizontal_alignmentNoHorizontal alignment.
number_format_patternNoFormat pattern, e.g. "#,##0.00", "0.0%", "dd.mm.yyyy" (requires number_format_type).

TDQS

A4.3/5.0
Behavior4/5

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

It discloses the key behavioral guarantee: 'Only the provided properties are touched — the update mask is computed automatically, so existing formatting outside it survives,' which goes beyond the readOnly/destructive/idempotent annotations. It also clarifies that formatting fields must be supplied and that range coordinates are 0-based. It does not discuss return or error behavior, but the annotations cover the main safety profile.

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?

Three dense sentences with no filler; the core action and most important side-effect ('only provided properties are touched') are front-loaded. The first sentence is a long enumeration, but that is acceptable given the breadth of 15 formatting parameters.

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?

The description covers selection, update behavior, range addressing, required-field constraints, and color format, which is substantial for a mutating formatting tool with no output schema. Remaining omissions such as return value and potential errors are minor against the fully documented input schema and annotations.

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 100%, so the baseline is 3, but the description adds meaning beyond individual field docs: it explains the automatic update mask, the requirement to provide at least one formatting field, and the '#RRGGBB' color convention. This helps the agent understand which optional parameters form a valid call.

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?

The description opens with a specific verb and resource: 'Applies cell formatting to a range,' then enumerates all supported formatting categories such as background color, font styles, alignment, wrap, and number format. This makes it easy to distinguish from sibling tools like write_values, set_borders, and clear_values.

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?

The description clearly signals this is the tool for styling cells rather than writing values or managing sheets, and adds a concrete validity constraint: 'at least one formatting field is required.' It does not explicitly name alternative tools or state when not to use it, but the context is strong enough for correct selection.

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

get_spreadsheetGet spreadsheet metadataA
Read-onlyIdempotent

Returns the spreadsheet's structure: properties (title, locale, timeZone), sheets[] with properties (sheetId, title, index, gridProperties incl. rowCount/columnCount and frozenRowCount/frozenColumnCount), plus each sheet's protectedRanges, conditionalFormats, tables and charts, and the spreadsheet's namedRanges. Call this FIRST whenever a structural tool needs a sheetId, protectedRangeId, tableId, chartId or a conditional-format rule index — titles are not addresses. By default no cell data is returned; include_grid_data=true (optionally limited to ranges) embeds cells but is heavy — prefer read_values for data. fields is a partial-response mask to trim the payload, e.g. "sheets.properties".

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldsNoPartial-response field mask, e.g. "sheets.properties" or "namedRanges".
rangesNoLimit the returned sheets/grid data to these A1 ranges.
spreadsheet_idYesThe spreadsheet id — the long id from the URL (docs.google.com/spreadsheets/d/<spreadsheetId>/edit) or from create_spreadsheet / search_spreadsheets output.
include_grid_dataNoEmbed cell data (values, formats) in the response. Heavy — prefer read_values.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already mark the tool as read-only and idempotent, and the description adds important behavioral context: by default no cell data is returned, include_grid_data is heavy, and fields is a partial-response mask. This goes beyond the annotations without contradicting them.

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?

The description is dense but every sentence earns its place: it inventories the returned structure, states the triggering usage rule, and warns about payload weight. It is front-loaded with the most important information and contains no filler.

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 read-only metadata tool with no output schema, the description fully covers return shape, default behavior, parameter trade-offs, and when to call it. An agent has everything needed to select and invoke the tool correctly.

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 100%, so the baseline is 3, and the description adds extra meaning: include_grid_data is described as heavy, fields is positioned as a payload-trimming mask, and ranges are explained in A1 notation. This is above the baseline but still not a fully exhaustive parameter contract.

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?

The description states a specific verb and resource ('Returns the spreadsheet's structure') and enumerates the exact payload components, so an agent immediately understands what the tool does. It also distinguishes itself from read_values, which covers cell data retrieval, making sibling differentiation clear.

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?

The description explicitly says to call this tool FIRST whenever a structural tool needs ids like sheetId, tableId, or chartId, and warns that titles are not addresses. It also directs agents to prefer read_values for cell data, giving clear when-to-use and when-not-to-use guidance.

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

manage_chartsManage chartsA
Destructive

Manages embedded charts. action=add builds a chart from chart_type (COLUMN/BAR/LINE/AREA/STEPPED_AREA/SCATTER/PIE), domain_range (x-axis labels / pie labels), series_ranges (one grid range per data series; PIE takes exactly one) and optional title/legend_position/header_count (rows of the ranges treated as headers, default 1) — place it with anchor {sheet_id,row_index,column_index} (the cell under the chart's top-left corner) or new_sheet=true for its own chart sheet; the reply carries the new chartId. Ranges should be single columns (or rows) including the header cell. For chart kinds beyond the basic set (combo, waterfall, histogram, org …) pass a raw Sheets API ChartSpec via spec instead — it overrides the simplified fields. action=update REPLACES the whole spec of an existing chart (chart_id + the same spec-building fields; there is no partial chart update). action=delete removes the chart by chart_id. Find chartIds via get_spreadsheet (sheets[].charts).

ParametersJSON Schema
NameRequiredDescriptionDefault
specNoRaw Sheets API ChartSpec — full control; overrides the simplified fields above.
titleNoChart title.
actionYesWhat to do with the charts.
anchorNoadd: place the chart over the grid, top-left at this cell.
chart_idNoupdate/delete: the chartId from get_spreadsheet or the add reply.
new_sheetNoadd: put the chart on its own new chart sheet instead.
chart_typeNoadd/update: the chart kind (required unless spec is given).
domain_rangeNoThe x-axis (or pie label) values, incl. header cell.
header_countNoHow many leading rows of the ranges are headers (default 1).
series_rangesNoOne range per data series, incl. header cells (PIE: exactly one).
spreadsheet_idYesThe spreadsheet id — the long id from the URL (docs.google.com/spreadsheets/d/<spreadsheetId>/edit) or from create_spreadsheet / search_spreadsheets output.
legend_positionNoBOTTOM_LEGEND, LEFT_LEGEND, RIGHT_LEGEND, TOP_LEGEND or NO_LEGEND (default: API's choice).

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already mark destructiveHint=true, and the description adds specifics: delete removes the chart by chart_id, while update REPLACES the entire spec with no partial mutation. It also discloses that spec overrides the simplified fields, which is useful behavioral context beyond the annotations.

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 description is dense but lean, front-loading the tool's purpose and moving through actions in a logical order. Parenthetical definitions compress a lot of parameter meaning. It could be easier to scan with line breaks, but no sentence is 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?

For a 12-parameter tool with no output schema, the description covers all key workflow elements: how to describe ranges, how to place the chart, how chart IDs are obtained, and what the add reply returns. The only mild gap is that update does not state whether position fields are honored or ignored, but overall it is sufficient.

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 100%, so a baseline of 3 applies. The prose adds practical semantics beyond the schema: ranges must be single columns/rows including the header cell, header_count defaults to 1, PIE takes exactly one range, and spec overrides the simplified fields. That extra guidance justifies a 4.

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?

The description opens with 'Manages embedded charts' and then enumerates the three selectable actions (add/update/delete), specifying that add builds a chart from chart_type plus data ranges. This clearly distinguishes the tool from sibling spreadsheet tools and from raw_request.

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?

It gives action-by-action guidance: add uses chart_type and ranges, update replaces the whole spec and explicitly rules out partial updates, and delete removes by chart_id. It also tells the agent where to find chartIds (get_spreadsheet) and that non-basic chart kinds should go through spec rather than the simplified fields.

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

manage_conditional_formatsManage conditional formattingA
Destructive

Manages conditional-format rules that style cells when a condition holds (boolean rules; gradient color scales need raw_request). Rules are addressed by SHEET + INDEX in that sheet's rule list — get current rules and indexes from get_spreadsheet (sheets[].conditionalFormats), and re-read after every mutation because add/delete shift later indexes. action=add inserts a rule at index (default 0 = highest priority; rules are evaluated in order and the first match wins): needs ranges, condition_type (+condition_values; CUSTOM_FORMULA with a "=..." formula is the most flexible) and at least one format field (background_color, text_color, bold, italic). action=update replaces the ENTIRE rule at sheet_id+index with the newly provided one. action=delete removes the rule at sheet_id+index.

ParametersJSON Schema
NameRequiredDescriptionDefault
boldNoBold text for matching cells.
indexNoRule position in the sheet's list. add: insert position (default 0); update/delete: required.
actionYesWhat to do with the rules.
italicNoItalic text for matching cells.
rangesNoadd/update: the cells the rule applies to.
sheet_idNoupdate/delete: the sheet whose rule list is addressed.
text_colorNoText color for matching cells, "#RRGGBB".
condition_typeNoSheets API condition type, e.g. ONE_OF_LIST, ONE_OF_RANGE, NUMBER_GREATER, NUMBER_LESS, NUMBER_BETWEEN, NUMBER_EQ, TEXT_CONTAINS, TEXT_STARTS_WITH, TEXT_EQ, TEXT_IS_EMAIL, DATE_AFTER, DATE_BEFORE, DATE_BETWEEN, DATE_IS_VALID, BLANK, NOT_BLANK, BOOLEAN, CUSTOM_FORMULA.
spreadsheet_idYesThe spreadsheet id — the long id from the URL (docs.google.com/spreadsheets/d/<spreadsheetId>/edit) or from create_spreadsheet / search_spreadsheets output.
background_colorNoFill for matching cells, "#RRGGBB".
condition_valuesNoCondition arguments: list items for ONE_OF_LIST (["Yes","No"]), one number for NUMBER_GREATER (["100"]), two for NUMBER_BETWEEN, "=A1>B1"-style formula for CUSTOM_FORMULA and ONE_OF_RANGE ("=Sheet1!A1:A10"), relative dates as values. Omit for BLANK / NOT_BLANK / DATE_IS_VALID.

TDQS

A5/5.0
Behavior5/5

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

Even though annotations already indicate destructive and non-read-only behavior, the description adds meaningful operational detail: first-match-wins evaluation, highest-priority default index 0, update replacing the ENTIRE rule, and index shifting after mutations. This goes well beyond what annotations or schema express.

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?

The description is dense but every sentence earns its place. It front-loads the core addressing model, then systematically covers add/update/delete semantics without filler or repetition.

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 complex 11-parameter mutation tool with no output schema, the description covers addressing, state sourcing, side effects, action-specific requirements, condition types, formula usage, and required format fields. 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.

Parameters5/5

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

Schema coverage is 100%, but the description still adds significant semantic value by specifying action-dependent requirements: add needs ranges, condition_type, condition_values, and at least one format field; update/delete require sheet_id + index; CUSTOM_FORMULA needs a '=...' formula; index defaults to 0 for add. This is a strong enhancement over raw schema 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?

The description opens with a specific verb and resource: 'Manages conditional-format rules that style cells when a condition holds.' It immediately scopes the tool to boolean rules and explicitly routes gradient color scales to raw_request, distinguishing it from siblings.

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?

The description gives concrete usage context: rules are addressed by sheet + index, current rules are read from get_spreadsheet, and indexes must be re-read after every mutation because add/delete shift later indexes. It also names raw_request as the alternative for gradient color scales, providing clear routing.

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

manage_dimensionsManage rows and columnsA
Destructive

Row/column operations on a run of rows (dimension=ROWS) or columns (dimension=COLUMNS), addressed by sheet_id + 0-based start_index (inclusive) and end_index (exclusive) — e.g. columns A-C = start 0, end 3. action=resize sets an exact pixel_size; auto_resize fits to content; insert adds empty rows/columns at start_index (inherit_from_before=true copies formatting from the row/column before instead of after); delete removes them WITH their data (irreversible; cell references below/right shift); hide/show toggle visibility without touching data; group/ungroup add or remove a collapsible outline group over the run (groups nest — repeat group on a subrange for a deeper level).

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesWhat to do with the rows/columns.
sheet_idYesThe numeric sheetId (NOT the title) from get_spreadsheet sheets[].properties.sheetId; the first sheet of a new spreadsheet is 0.
dimensionYesWhether the run is rows or columns.
end_indexYesEnd of the run, exclusive (rows 1-3 = start 0, end 3).
pixel_sizeNoresize: the new size in pixels.
start_indexYesFirst row/column of the run, 0-based inclusive.
spreadsheet_idYesThe spreadsheet id — the long id from the URL (docs.google.com/spreadsheets/d/<spreadsheetId>/edit) or from create_spreadsheet / search_spreadsheets output.
inherit_from_beforeNoinsert: new rows/columns copy formatting from before the insertion point (default: after).

TDQS

A4.6/5.0
Behavior5/5

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

The description adds substantial behavioral detail beyond the annotations: delete is described as irreversible with cell-reference shifts, hide/show explicitly does not touch data, insert explains formatting inheritance direction, and group/ungroup explains nesting behavior. This goes well beyond the destructiveHint and readOnly annotations.

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 description is dense and front-loaded with the core concept, followed by actions separated by semicolons. Every piece of information earns its place, though the long single-sentence structure could be more scannable with bullet points.

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?

Despite having no output schema, the description fully covers all eight actions, parameter roles, index math, and edge-case behaviors such as irreversibility and formatting inheritance. An agent has all necessary context to invoke the tool correctly on any of the supported operations.

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 100%, so the schema already documents all parameters. The description enriches this with concrete examples like 'columns A-C = start 0, end 3', explains the inclusive/exclusive index boundary, and clarifies how action-specific parameters (pixel_size, inherit_from_before) affect behavior.

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?

The description names the exact resource ('rows/columns') and the verb ('operations'), then enumerates each action. It differentiates itself from sibling tools like manage_sheets and set_frozen by specifying row/column run semantics rather than sheet-level or formatting operations.

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?

The scope is clearly stated: this handles row/column operations on a run, with explicit indexing and action semantics. It does not explicitly name alternatives or exclusion conditions, but the context is unambiguous enough for an agent to select this tool for row/column operations.

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

manage_permissionsManage spreadsheet accessA
Destructive

Shares the spreadsheet (Drive permissions on the file — the OAuth token needs a Drive scope; the spreadsheets scope alone gets 403 here while every Sheets tool still works). action=list shows who has access: id, type, role, emailAddress/domain per permission; one page per call (shared-drive files cap a page at 100) — when the reply carries nextPageToken, pass it back as page_token for the rest. action=grant gives role reader/commenter/writer to type user/group (email_address required), domain (domain required, e.g. "example.com") or anyone (makes the link public — use deliberately); send_notification_email (default true for users) and email_message control the notification, allow_file_discovery lets domain/anyone grants surface in search. action=update changes an existing permission's role (permission_id + role). action=revoke removes a permission (permission_id) — the person loses access immediately. Ownership transfer is not supported by this server. Protecting individual ranges from co-editors is manage_protected_ranges, not this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
roleNogrant/update: the access level to give.
typeNogrant: who the grantee is.
actionYesWhat to do with the file's permissions.
domainNogrant (domain): the domain, e.g. "example.com".
page_sizeNolist: max permissions per page (1..100; shared-drive files default to 100).
page_tokenNolist: nextPageToken from the previous page.
email_addressNogrant (user/group): the grantee's email.
email_messageNogrant: custom text for the notification email.
permission_idNoupdate/revoke: the permission's id from action=list (or the grant reply).
spreadsheet_idYesThe spreadsheet id — the long id from the URL (docs.google.com/spreadsheets/d/<spreadsheetId>/edit) or from create_spreadsheet / search_spreadsheets output.
allow_file_discoveryNogrant (domain/anyone): let the file appear in search results (default false).
send_notification_emailNogrant: send the standard sharing notification (default true for users/groups).

TDQS

A5/5.0
Behavior5/5

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

Goes well beyond the annotations: discloses that revoke removes access immediately, anyone grants make the link public, a Drive scope is required while Sheets scope fails, pagination is one page per call, and shared-drive pages cap at 100. This is substantial behavioral context beyond destructiveHint and readOnlyHint.

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?

The description is long but tightly structured around the four actions, with the core purpose and critical auth caveat front-loaded. Every sentence adds necessary information; there is no filler or repetition of the schema.

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 12-parameter, four-action tool with no output schema, the description is remarkably complete. It covers all action semantics, parameter combinations, defaults, pagination, auth requirements, destructive behavior, and the boundary with a sibling tool. Nothing essential is missing for correct invocation.

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?

Even though schema coverage is 100%, the description adds meaningful semantics: action-specific parameter usage, defaults, pagination flow, and consequences of certain values like domain/anyone. It explains how page_token, permission_id, and send_notification_email behave in practice, which the schema alone does not convey.

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?

Description states a specific resource (Drive permissions on the spreadsheet) and enumerates each action (list, grant, update, revoke). It explicitly distinguishes itself from the sibling manage_protected_ranges, so an agent can tell exactly what this tool does.

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?

Provides explicit per-action usage conditions: which parameters are required for each grantee type, pagination handling with nextPageToken, and defaults for send_notification_email and allow_file_discovery. It also explicitly routes range-protection work to manage_protected_ranges instead.

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

manage_protected_rangesManage protected rangesA
Destructive

Manages protections that stop other editors from changing cells. action=add protects a grid range (or a named range via named_range_id; a range with only sheet_id protects the whole sheet): warning_only=true merely warns before edits, otherwise only the listed editor_users/editor_groups (emails) plus the owner may edit — note the calling user is NOT added automatically. Returns the new protectedRangeId in the replies. action=update changes description/warning_only/editors of an existing protection (protected_range_id required; provided fields replace the old values). action=delete removes the protection — the cells and data stay, but anyone with edit access can change them again. Find existing protectedRangeIds via get_spreadsheet.

ParametersJSON Schema
NameRequiredDescriptionDefault
rangeNoadd: the cells to protect.
actionYesWhat to do with the protections.
descriptionNoLabel shown in the Sheets UI protections list.
editor_usersNoEmails of users allowed to edit the protected cells.
warning_onlyNotrue = anyone can still edit after a warning; false = only the listed editors.
editor_groupsNoEmails of Google Groups allowed to edit.
named_range_idNoadd: protect a named range instead of a grid range.
spreadsheet_idYesThe spreadsheet id — the long id from the URL (docs.google.com/spreadsheets/d/<spreadsheetId>/edit) or from create_spreadsheet / search_spreadsheets output.
protected_range_idNoupdate/delete: the protection's id from get_spreadsheet or the add reply.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already provide readOnlyHint=false and destructiveHint=true. The description adds important context: action=delete removes protection but keeps data intact, the calling user is NOT automatically added as an editor, and warning_only behavior. It does not explicitly warn about potential data exposure or irreversible updates, but it adds meaningful 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 description is dense but well-organized: it structures content by action and front-loads the purpose. It is longer than average, but each clause conveys a meaningful behavioral constraint or workflow hint. Some repetition of schema details (emails, editor_groups) could be trimmed, but overall it earns its length.

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 mutating tool with no output schema, the description covers action semantics, required parameters per action, the effect of delete on data, editor authorization rules, and how to discover existing protections. It also hints at the return value (new protectedRangeId). No critical information is missing for an agent to select and use the tool correctly.

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 100%, so baseline is 3. The description adds value by explaining action-specific required parameters (protected_range_id for update/delete, named_range_id versus range for add), and clarifies that in update mode provided fields replace old values. It also brings attention to the caller-not-automatically-added nuance that the schema does not express.

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?

The description clearly states it manages protections that stop other editors from changing cells, with explicit action=add/update/delete semantics. It distinguishes itself from sibling tools focused on formatting, values, or permissions by naming the resource (protected ranges) and behavioral outcome.

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?

The description explains when to use each action and provides a pointer to get_spreadsheet for finding protectedRangeIds. It implies this tool is for protecting ranges rather than editing cells or managing general permissions, but does not explicitly mention alternative tools to avoid.

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

manage_sheetsManage sheetsA
Destructive

Manages the sheets (tabs) of a spreadsheet. action=add creates a tab (title required; optional index position and row_count/column_count — default 1000×26). action=duplicate copies a tab within the same spreadsheet (sheet_id; optional title for the copy and index). action=rename changes a tab's title (sheet_id + title; the numeric sheetId never changes, so other tools keep working). action=delete removes the tab AND all its data — irreversible through the API, and deleting the last remaining sheet fails. action=copy_to copies a tab into ANOTHER spreadsheet (sheet_id + destination_spreadsheet_id; the copy arrives named "Copy of ..." — rename it there). Get sheet_id values from get_spreadsheet; every action except add returns batchUpdate replies with the affected sheet's properties.

ParametersJSON Schema
NameRequiredDescriptionDefault
indexNoadd/duplicate: 0-based tab position for the new sheet (omit = after the existing tabs).
titleNoadd: the new tab's title (required). rename: the new title (required). duplicate: the copy's title.
actionYesWhat to do with the sheets.
sheet_idNoduplicate/rename/delete/copy_to: the target sheet.
row_countNoadd: grid rows for the new sheet (default 1000).
column_countNoadd: grid columns for the new sheet (default 26).
spreadsheet_idYesThe spreadsheet id — the long id from the URL (docs.google.com/spreadsheets/d/<spreadsheetId>/edit) or from create_spreadsheet / search_spreadsheets output.
destination_spreadsheet_idNocopy_to: the spreadsheet to copy the sheet into.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already flag mutating/destructive behavior, and the description adds significant specifics: delete is irreversible through the API, deleting the last sheet fails, copies arrive named 'Copy of ...', and the default grid is 1000×26. It also states the output shape (batchUpdate replies with affected sheet properties), which is especially valuable with no output schema.

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?

The description is longer than average but every sentence conveys a distinct operational constraint or behavior. The action-by-action structure makes it scannable, and the primary purpose is front-loaded.

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?

This is a polymorphic tool with five actions, one enum, and eight parameters, and the description covers action-specific semantics, parameter requirements, edge cases, and output shape. An agent has enough information to invoke every action correctly even with no output schema.

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 100% and property descriptions already encode action-conditional meanings, so the bar for extra value is high. The description still adds useful cross-action guidance, the default grid size, the copy-to naming convention, and the pointer to get_spreadsheet for resolving sheet_id.

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?

The description leads with a specific resource ('sheets (tabs) of a spreadsheet') and then enumerates five distinct verbs (add, duplicate, rename, delete, copy_to), making the tool's scope unmistakable. This clearly separates it from sibling tools like manage_dimensions or manage_charts.

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?

The description gives actionable cross-tool guidance, notably telling the agent to get sheet_id values from get_spreadsheet and noting that a renamed tab keeps its numeric sheetId so other tools keep working. It does not explicitly state when not to use this tool versus each sibling, but the action list makes the targeted sheet/tab use case obvious.

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

manage_tablesManage tablesA
Destructive

Manages structured tables (the "Convert to table" feature: named ranges with per-column types, filters and formatting). action=add creates a table over a grid range whose FIRST ROW becomes the header: name (must be unique in the spreadsheet) + range required; column_properties optionally types the columns — a list of raw TableColumnProperties objects, e.g. [{"columnIndex":0,"columnName":"Task","columnType":"TEXT"},{"columnIndex":1,"columnName":"Done","columnType":"BOOLEAN"}] (columnType TEXT/PERCENT/DROPDOWN/DOUBLE/CURRENCY/DATE/TIME/DATE_TIME/BOOLEAN; DROPDOWN adds dataValidationRule). The reply carries the new table with its tableId. action=update renames and/or re-ranges an existing table (table_id + name and/or range; expanding the range grows the table). action=delete removes the TABLE DEFINITION only — the cell data stays; clear the cells separately if needed. Find tableIds via get_spreadsheet (sheets[].tables).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoadd (required) / update: the table's unique name.
rangeNoadd (required) / update: the table's cells incl. the header row.
actionYesWhat to do with the tables.
table_idNoupdate/delete: the tableId from get_spreadsheet or the add reply.
spreadsheet_idYesThe spreadsheet id — the long id from the URL (docs.google.com/spreadsheets/d/<spreadsheetId>/edit) or from create_spreadsheet / search_spreadsheets output.
column_propertiesNoadd: raw TableColumnProperties list, e.g. [{"columnIndex":0,"columnName":"Task","columnType":"TEXT"}].

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the destructiveHint annotation, the description specifies exactly what delete destroys — the table definition only, not cell data — and discloses that expanding the range grows the table and that DROPDOWN adds a dataValidationRule. These are important side effects an agent needs to predict before invoking the 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?

The description is dense but organized by action and front-loads the feature identity. The inline JSON example is somewhat long but earns its place by showing the exact expected shape of column_properties, so nothing feels 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?

The description covers all three actions, required parameters, side effects, and how to discover tableIds. Since there is no output schema, the mention of the add reply carrying the new table is helpful, though update/delete response shapes and failure conditions such as duplicate names are not described.

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?

The description adds significant meaning beyond the schema: it explains action-dependent parameter requirements, gives an explicit JSON example for column_properties, lists the allowed columnType values, and clarifies how the first row becomes the header. This goes well beyond the schema's generic 'raw TableColumnProperties list' description.

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?

The description names the concrete resource — structured tables via the Convert to table feature — and enumerates the distinct actions: add, update, and delete. It clearly distinguishes itself from sibling tools like format_cells or manage_sheets by describing the named-range table feature rather than generic formatting or sheet operations.

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?

Each action has clear preconditions: add requires a unique name and range, update requires table_id, and delete removes only the table definition. It also directs users to get_spreadsheet for tableIds and notes that cell data must be cleared separately, implying the complement of clear_values, though it never explicitly names an alternative tool.

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

raw_requestRaw Google Sheets API callA
Destructive

Escape hatch to call any Google Sheets API v4 path directly, for requests the typed tools don't cover — e.g. a batchUpdate with mergeCells, named ranges, banding, basic filters, slicers, sortRange, findReplace, gradient conditional-format rules, developer metadata, or several requests in one atomic call: path "v4/spreadsheets/:batchUpdate", method POST, body {"requests":[...]}. The path may carry a query string. The Bearer token is added automatically; the method defaults to GET (values updates use PUT). Sheets API paths only — Drive paths are not reachable here.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyNoJSON request body (POST/PUT only).
pathYesAPI path relative to https://sheets.googleapis.com, e.g. "v4/spreadsheets/<id>:batchUpdate".
methodNoHTTP method (the Sheets API uses only these three). Defaults to GET.

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the annotations (destructive, open-world, not idempotent), the description discloses that the Bearer token is added automatically, that the method defaults to GET with PUT for values updates, that the path may carry a query string, and that batchUpdate requests are atomic. These details materially affect how an agent invokes the tool and what it should expect.

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 description is dense and front-loaded with purpose, but the list of examples is long. Each example earns its place by illustrating what the typed tools do not cover, yet the sentence could be slightly more compact. Overall, it is well-structured and every sentence contributes value.

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 generic raw API tool with no output schema, the description covers the key operational aspects: path construction, method selection, body usage, authentication, and scope restriction. It also includes representative use cases that signal to the agent what kinds of operations are possible. Nothing essential is missing for an agent to invoke this correctly.

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?

The schema already provides 100% coverage for the three parameters, so the baseline is 3. The description adds useful semantic context beyond the schema: an example path format, the body shape for batchUpdate, the note that methods are limited to GET/POST/PUT, and the reminder that body is for POST/PUT only. This is meaningful but not exhaustive, so a 4 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?

The description clearly identifies the tool as an escape hatch for arbitrary Google Sheets API v4 paths, with a specific verb ('call any ... path directly') and a clear resource boundary ('Sheets API paths only'). It distinguishes itself from the typed sibling tools by stating it covers requests they don't. The examples further clarify the intended scope.

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?

The description explicitly states when to use this tool: 'for requests the typed tools don't cover', and provides concrete examples like batchUpdate with mergeCells, slicers, and developer metadata. It also gives an exclusion ('Drive paths are not reachable here') and explains the default method behavior, giving an agent enough to decide between this and a typed sibling.

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

read_valuesRead valuesA
Read-onlyIdempotent

Reads one or more A1 ranges in a single call (one request against the quota, however many ranges) and returns valueRanges[] — each with its resolved range and a 2-D values array (outer = rows unless major_dimension=COLUMNS). Trailing empty rows/columns are omitted; a fully empty range has no values key at all. value_render_option: FORMATTED_VALUE (default, strings as displayed, honoring the cell's number format and locale), UNFORMATTED_VALUE (raw numbers/booleans), FORMULA (the formula text, e.g. "=SUM(A1:A10)" — the way to read formulas). With UNFORMATTED_VALUE, dates arrive as serial numbers unless date_time_render_option=FORMATTED_STRING.

ParametersJSON Schema
NameRequiredDescriptionDefault
rangesYesOne or more A1 ranges to read in a single call.
spreadsheet_idYesThe spreadsheet id — the long id from the URL (docs.google.com/spreadsheets/d/<spreadsheetId>/edit) or from create_spreadsheet / search_spreadsheets output.
major_dimensionNoWhether the outer array is rows (default) or columns.
value_render_optionNoHow values are rendered (default FORMATTED_VALUE); FORMULA returns formula text.
date_time_render_optionNoHow dates/times render with UNFORMATTED_VALUE (default SERIAL_NUMBER).

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already mark this as read-only and idempotent, and the description adds meaningful behavioral detail: trailing empty rows/columns are omitted, fully empty ranges omit the values key, and date rendering depends on value_render_option and date_time_render_option. This goes well beyond the structured hints.

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?

The description is dense but well-organized: the core behavior and quota benefit are front-loaded, followed by return-shape details and then option semantics. Every sentence conveys a distinct, useful fact without redundancy.

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?

Even with no output schema, the description fully covers return structure, edge cases, option behavior, and quota implications. Combined with the annotations, an agent has everything needed to call this tool correctly across all documented options.

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 coverage is 100%, but the description still adds significant meaning: it explains what FORMATTED_VALUE means in terms of display formatting and locale, gives a concrete formula example, and clarifies how UNFORMATTED_VALUE affects date serial numbers. This enriches all option parameters beyond the 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?

The description states a precise verb and resource: "Reads one or more A1 ranges in a single call." It also explains the return shape (valueRanges[], 2-D arrays), which makes the tool's purpose unmistakable and clearly distinguishes it from sibling write/clear tools.

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?

The description gives clear context about batching multiple ranges into one request to conserve quota, which helps an agent decide how to use it efficiently. It does not explicitly name alternatives or state when not to use it, but the purpose is clear enough against siblings like write_values and clear_values.

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

search_spreadsheetsSearch spreadsheetsA
Read-onlyIdempotent

Finds Google Sheets spreadsheets the authorized user can open (own files and shared drives; trashed files are excluded): id, name, createdTime, modifiedTime, owners and webViewLink per file, newest-modified first by default. name_contains filters by name substring; omit it to list everything. Paginate with page_token from nextPageToken. This is the one read that goes through the Drive API internally, so the OAuth token needs a Drive scope (drive, drive.readonly or drive.file for app-created files) — with only the spreadsheets scope it fails with 403 while every other tool still works.

ParametersJSON Schema
NameRequiredDescriptionDefault
order_byNoDrive sort key, e.g. "modifiedTime desc" (default), "name", "createdTime desc", "viewedByMeTime desc".
page_sizeNoMax files per page (1..1000; default 100).
page_tokenNonextPageToken from the previous page.
name_containsNoCase-insensitive name substring to filter by (omit to list all spreadsheets).

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the readOnly/idempotent annotations, the description discloses meaningful behavior: results are limited to openable files, trashed files are excluded, ordering is newest-modified first, and the tool uniquely goes through the Drive API. The 403 failure mode without a Drive scope is especially valuable and goes far beyond annotation defaults.

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?

The description is dense but each sentence earns its place: scope, returned fields, filtering, pagination, and the critical auth caveat. It front-loads the core purpose before the scope requirement, making it efficient for an agent to parse.

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?

With no output schema, the description compensates by listing the returned fields and default ordering. It covers pagination, filtering, exclusions, and authentication failure modes. For a 4-parameter read-only listing tool, nothing essential is missing.

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 100%, so the baseline is 3. The description adds semantic context on top: name_contains is a substring filter with 'omit to list everything', page_token is tied to nextPageToken, and order_by has a documented default. This enriches the schema rather than repeating it.

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?

The description uses a specific verb ('Finds') and names the exact resource ('Google Sheets spreadsheets the authorized user can open'), including exclusions like trashed files and shared drives. It lists returned fields and default sorting, clearly distinguishing this search/list operation from sibling tools like get_spreadsheet or read_values.

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?

It gives clear operational guidance: omit name_contains to list everything, use page_token for pagination, and handle the Drive-scope requirement. It does not explicitly contrast with get_spreadsheet or other alternatives, but the search/list context is unmistakable and practical.

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

set_bordersSet cell bordersA
DestructiveIdempotent

Draws borders around and/or inside a grid range. top/bottom/left/right are the range's outer edges; inner_horizontal/inner_vertical are the grid lines between cells inside it. Each side takes {style, color?} — styles SOLID, SOLID_MEDIUM, SOLID_THICK, DOTTED, DASHED, DOUBLE, or NONE to remove that side's border. Only the provided sides change; at least one is required. Colors are "#RRGGBB" hex (default black).

ParametersJSON Schema
NameRequiredDescriptionDefault
topNoBorder line: {style, color?}.
leftNoBorder line: {style, color?}.
rangeYesCell rectangle in grid coordinates: rows 1-10 × columns A-B = {start_row_index:0, end_row_index:10, start_column_index:0, end_column_index:2}.
rightNoBorder line: {style, color?}.
bottomNoBorder line: {style, color?}.
inner_verticalNoVertical lines between columns inside the range.
spreadsheet_idYesThe spreadsheet id — the long id from the URL (docs.google.com/spreadsheets/d/<spreadsheetId>/edit) or from create_spreadsheet / search_spreadsheets output.
inner_horizontalNoHorizontal lines between rows inside the range.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already indicate mutability and destructiveness; the description adds meaningful behavioral context by noting that 'only the provided sides change' and that NONE removes a border. It also clarifies the default color, which is not obvious from the schema alone. No contradiction with the annotations is present.

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?

The description is compact and front-loaded, with every sentence contributing necessary semantics: range positioning, side grouping, style options, non-destructive behavior, and color format. There is no filler or repetition of the input schema.

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?

Given the rich input schema and annotations, the description covers the remaining conceptual gaps: what inner vs outer means, that only specified sides change, that at least one side is required, and how colors are specified. No output schema is present, but the tool's invocation semantics are sufficiently 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 coverage is 100%, so the baseline is 3, but the description adds real semantic value by grouping top/bottom/left/right as outer edges, inner_horizontal/inner_vertical as internal grid lines, explaining the {style, color?} shape, and noting the default black color. This goes beyond the schema descriptions.

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 opens with a specific verb and resource: 'Draws borders around and/or inside a grid range.' It clearly defines outer vs inner sides, making the tool's scope unambiguous. It does not explicitly differentiate from siblings like format_cells, but the border-specific language is enough to identify its purpose.

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?

The description provides clear operational context: it explains which parameters affect outer edges vs inner grid lines, states that only provided sides change, and requires at least one side. It does not name alternatives or spell out when not to use the tool, so it stops short of a 5.

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

set_data_validationSet data validationA
DestructiveIdempotent

Sets — or clears — a data-validation rule on a grid range. With condition_type set, every cell in the range gets the rule: ONE_OF_LIST with condition_values plus show_custom_ui=true is the classic in-cell dropdown; ONE_OF_RANGE takes a "=Sheet1!A1:A10" formula; NUMBER_/TEXT_/DATE_ conditions restrict input; CUSTOM_FORMULA takes a formula evaluated per cell. strict=true rejects invalid input outright, strict=false only shows a warning; input_message is the help text shown on the cell. OMIT condition_type (and the other rule fields) to REMOVE validation from the range. Overwrites any previous rule on the range — one rule per cell.

ParametersJSON Schema
NameRequiredDescriptionDefault
rangeYesCell rectangle in grid coordinates: rows 1-10 × columns A-B = {start_row_index:0, end_row_index:10, start_column_index:0, end_column_index:2}.
strictNotrue rejects invalid input; false (default) shows a warning.
input_messageNoHelp text shown when the cell is selected.
condition_typeNoSheets API condition type, e.g. ONE_OF_LIST, ONE_OF_RANGE, NUMBER_GREATER, NUMBER_LESS, NUMBER_BETWEEN, NUMBER_EQ, TEXT_CONTAINS, TEXT_STARTS_WITH, TEXT_EQ, TEXT_IS_EMAIL, DATE_AFTER, DATE_BEFORE, DATE_BETWEEN, DATE_IS_VALID, BLANK, NOT_BLANK, BOOLEAN, CUSTOM_FORMULA.
show_custom_uiNoShow a dropdown UI for ONE_OF_LIST / ONE_OF_RANGE conditions.
spreadsheet_idYesThe spreadsheet id — the long id from the URL (docs.google.com/spreadsheets/d/<spreadsheetId>/edit) or from create_spreadsheet / search_spreadsheets output.
condition_valuesNoCondition arguments: list items for ONE_OF_LIST (["Yes","No"]), one number for NUMBER_GREATER (["100"]), two for NUMBER_BETWEEN, "=A1>B1"-style formula for CUSTOM_FORMULA and ONE_OF_RANGE ("=Sheet1!A1:A10"), relative dates as values. Omit for BLANK / NOT_BLANK / DATE_IS_VALID.

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the annotations, the description discloses key behaviors: OMIT condition_type removes validation, overwrites any previous rule, one rule per cell, strict=true rejects vs false warns, and input_message provides help text. This is substantial behavioral context and aligns with destructiveHint=true.

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?

The description is dense but every sentence contributes operational value: setting, clearing, dropdown behavior, strict mode, input message, and overwrite semantics. The core set/clear behavior is front-loaded, with no filler.

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?

Given the rich schema, nested range object, and annotations, the description covers all decisions an agent needs: how to configure a rule, when to omit fields to clear, what strict does, and what gets overwritten. No output schema is needed for a mutation tool whose success response is standard.

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?

Although schema coverage is 100%, the description adds significant meaning: ONE_OF_LIST plus show_custom_ui=true creates the dropdown, ONE_OF_RANGE takes a formula reference, CUSTOM_FORMULA is evaluated per cell, and condition_values shapes are explained with examples. This goes well beyond the raw 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?

The description states a specific action ('Sets — or clears — a data-validation rule on a grid range') and names the exact resource and scope. It clearly distinguishes itself from formatting, conditional formats, and sheet-management siblings by focusing entirely on data validation rules.

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?

The description explains when to use different condition types and how to clear validation, which gives actionable usage guidance. It doesn't explicitly name alternatives, but no sibling tool covers data validation, so the omission is minor.

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

set_frozenFreeze rows and columnsA
DestructiveIdempotent

Freezes the first N rows and/or columns of a sheet so they stay visible while scrolling (typical: frozen_rows=1 pins the header). 0 unfreezes. At least one of frozen_rows / frozen_columns is required; the other stays as it is. You cannot freeze all rows or all columns of a sheet — at least one unfrozen row/column must remain.

ParametersJSON Schema
NameRequiredDescriptionDefault
sheet_idYesThe numeric sheetId (NOT the title) from get_spreadsheet sheets[].properties.sheetId; the first sheet of a new spreadsheet is 0.
frozen_rowsNoHow many top rows to freeze (0 = unfreeze).
frozen_columnsNoHow many left columns to freeze (0 = unfreeze).
spreadsheet_idYesThe spreadsheet id — the long id from the URL (docs.google.com/spreadsheets/d/<spreadsheetId>/edit) or from create_spreadsheet / search_spreadsheets output.

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotations (idempotent, destructive), the description adds important behavioral detail: 0 unfreezes, omitting one dimension leaves it unchanged, and freezing all rows/columns is prohibited. These are non-obvious state-change semantics that an agent must know to call the tool correctly. There is no contradiction with the annotations.

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?

Four short sentences pack distinct information: purpose, unfreeze behavior, partial-update semantics, and the boundary condition. The most identifying information appears first, and every sentence earns its place without repetition.

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 simple mutation tool with no output schema, the description plus annotations and full parameter schema cover everything needed to invoke it correctly: the action, typical usage, reversal, partial-update behavior, and the key restriction. No material gap remains.

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?

With 100% schema description coverage, the baseline is 3 because the schema already documents each parameter. The description adds value by clarifying the hidden constraint that at least one of frozen_rows or frozen_columns is required, and by giving the typical semantic of frozen_rows=1 for pinning a header.

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?

The description uses a specific verb and resource: it freezes the first N rows and/or columns of a sheet so they stay visible while scrolling. The concrete example (frozen_rows=1 pins the header) and the distinction between rows and columns make the purpose unambiguous and distinguish it from sibling tools that format cells, manage sheets, or edit data.

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?

It clearly states the intended use case—keeping rows/columns visible while scrolling—and gives a typical scenario for pinning a header. It does not explicitly name alternatives or say when not to use it, but no sibling tool competes for the same freeze action, so the context is sufficiently clear.

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

write_valuesWrite values to a rangeA
DestructiveIdempotent

Overwrites one A1 range with a 2-D values matrix (rows first) and returns updatedRange/updatedRows/updatedColumns/updatedCells. The matrix is anchored at the range's top-left corner; cells beyond the matrix keep their old content, and a null entry skips (does not clear) that cell — use clear_values to empty cells. value_input_option USER_ENTERED (default) parses input like typing in the UI: "=SUM(A1:A10)" becomes a live formula, "1,234" and "2026-01-15" become number/date per the spreadsheet locale; RAW stores everything as literal values. For several ranges use batch_write_values (one quota unit instead of N).

ParametersJSON Schema
NameRequiredDescriptionDefault
rangeYesA1-notation range, e.g. "Sheet1!A1:C10", "'My sheet'!B2:D" (quote titles with spaces) or a bare sheet title for the whole sheet.
valuesYes2-D array of cell values, outer array = rows: [["Name","Score"],["Ada",42]]. null leaves the existing cell untouched.
spreadsheet_idYesThe spreadsheet id — the long id from the URL (docs.google.com/spreadsheets/d/<spreadsheetId>/edit) or from create_spreadsheet / search_spreadsheets output.
value_input_optionNoUSER_ENTERED (default) parses formulas/numbers/dates; RAW stores literal strings.
include_values_in_responseNoReturn the written cells (as rendered) in the response.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already mark destructiveHint=true, and the description adds depth: explains anchoring, that cells beyond matrix are untouched, null entries skip (not clear) cells, and the parsing behavior for USER_ENTERED vs RAW. This goes beyond annotations and accurately describes side effects without contradiction.

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 description is three sentences with dense, useful information. It front-loads the primary action and return value, then details edge cases and alternatives. Slightly long but every clause earns its place; could be trimmed but remains efficient.

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 the return fields (updatedRange/updatedRows/updatedColumns/updatedCells), key behaviors, and sibling distinctions. It lacks error-handling details or quota specifics (beyond batch hint), but given no output schema, this is sufficient for an agent to invoke correctly.

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 coverage is 100%, but the description enriches each parameter: range anchoring, null behavior in values, and concrete examples for value_input_option ('=SUM(A1:A10)' becomes formula, '1,234' becomes number/date). This adds meaning that the schema alone does not convey.

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?

The description clearly states the tool 'Overwrites one A1 range with a 2-D values matrix' – a specific verb and resource. It differentiates from siblings by explicitly mentioning batch_write_values for multiple ranges and clear_values for clearing cells, making its role distinct.

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?

Provides explicit usage context: when to use batch_write_values instead of this tool (multiple ranges, quota savings) and when to use clear_values (to empty cells). Also explains the implications of null entries and value_input_option behavior, guiding the agent on when each option is appropriate.

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. Dates show when Glama detected each change.

  1. 20 tool updatesv0.1.0
    • First observedappend_values
    • First observedbatch_write_values
    • First observedclear_values
    • First observedcreate_spreadsheet
    • First observedformat_cells
    • First observedget_spreadsheet
    • First observedmanage_charts
    • First observedmanage_conditional_formats
    • First observedmanage_dimensions
    • First observedmanage_permissions
    • First observedmanage_protected_ranges
    • First observedmanage_sheets
    • First observedmanage_tables
    • First observedraw_request
    • First observedread_values
    • First observedsearch_spreadsheets
    • First observedset_borders
    • First observedset_data_validation
    • First observedset_frozen
    • First observedwrite_values

TDQS

A4.4/5.0
Disambiguation5/5

Every tool targets a distinct resource or action: values, structure, formatting, validation, conditional formatting, charts, tables, permissions, and protected ranges are all cleanly separated. Even close pairs like write_values vs batch_write_values and manage_permissions vs manage_protected_ranges are explicitly scoped so an agent can tell them apart.

Naming Consistency4/5

The tools overwhelmingly follow a snake_case verb_noun pattern such as create_spreadsheet, read_values, and manage_sheets, with a consistent manage_* group. raw_request is the one non-verb deviation, and set_frozen uses an adjective rather than a noun, but these are minor and do not create confusion.

Tool Count3/5

At 20 tools, the set sits in the 16-25 range that feels heavy for an agent to scan, though the Google Sheets domain is broad enough that each tool has a plausible purpose. It is borderline rather than bloated, but still above the ideal 3-15 range.

Completeness4/5

The toolset covers the core spreadsheet lifecycle well: create/read/search spreadsheets, CRUD for sheets, dimensions, tables, charts, permissions, protections, plus full read/write/append/clear values and formatting/validation/conditional-format rules. Minor gaps remain around Drive-level file operations like deleting or moving a spreadsheet, and some conveniences like named-range management are left to raw_request, but the escape hatch covers most Sheets-API gaps.

Maintenance

ActivityMaintained
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/A1-x-Tech/mcp-google-sheets'

If you have feedback or need assistance with the MCP directory API, please join our Discord server