Skip to main content
Glama

sheets_spreadsheet

An existing spreadsheet: its cells (describe, read, write, clear), its tabs and rows, and their formatting.

op:

  • "metadata" (default): get a spreadsheet's metadata: title + the sheets/tabs it contains (id, title, rows, cols).

  • "read": read values from a range (A1 notation, e.g. 'Sheet1!A1:D20' or 'A:ZZ'). range omitted = 'A:ZZ'. Returns {rows: [[...], ...], count}.

  • "write": write a 2-D array of values to a range (A1 notation required). append: False (default) OVERWRITES the range ; True appends rows after the existing data (no overwrite), starting at the range's FIRST column. Instead of values, source writes a CSV oto fetches itself (e.g. {"kind": "http", "path": "/export.csv"} through your http connector): the values never go through you. A strict number goes as a number, a cell starting with ' stays text as is (long ids), a cell that would be a formula is written as text unless allow_formulas=True.

  • "clear": clear all values in a range (keeps formatting). Destructive — range is required, it has no default here.

  • "add_sheet" (title, index) ; "rename_sheet" (sheet → title).

  • "delete_sheet" (the tab and EVERYTHING in it) and "delete_rows" (start_row..end_row, 1-based inclusive): irreversible, so dry-run by default — the call says what would go ; dry_run=false does it.

  • "number_format": pattern (#,##0.00, 0.0%, dd/mm/yyyy) and type applied to every cell of range (e.g. 'P&L'!B2:D).

  • "copy_sheet": copy the tab sheet of this spreadsheet — values AND formatting (widths, frozen rows, colours, drop-downs, conditional formats) — into to_spreadsheet_id (this spreadsheet if omitted), named title, at index. The source is only read: copy a user's template tab into the file you produce, then write your data into the copy, to get their exact layout.

  • "format": style applied to every cell of range; only the keys given change — background/color (#rrggbb), bold, italic, font_size, wrap (true = wrap text), align (left|center|right), valign (top|middle|bottom). E.g. a grey wrapped header: range="'Suivi'!A1:Z1", style={"background": "#d9d9d9", "bold": true, "wrap": true}.

  • "column_width": width in pixels for the columns of range ('Suivi'!B:D).

  • "freeze": freeze the first frozen_rows rows and/or frozen_cols columns of sheet (0 unfreezes).

  • "dropdown": a drop-down list of options on every cell of range, other values rejected ; options=[] removes it. An unknown tab is refused, naming the existing ones.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "spreadsheet_id": "<spreadsheet_id>"
    },
    "name": "sheets_spreadsheet"
  }
}

Input Schema

NameRequiredDescriptionDefault
opNothe verb, listed above ; metadata (default).metadata
_orgNoOrg (id) de CET APPEL. `oto_list_orgs()`.
typeNoop="number_format" — NUMBER (default) | CURRENCY | PERCENT | DATE | TIME | DATE_TIME | SCIENTIFIC | TEXT.NUMBER
indexNoop="add_sheet"/"copy_sheet" — 0-based position of the new tab (end by default).
rangeNoA1 notation, e.g. 'Sheet1!A1:D20' or 'A:ZZ'. op="read" — optional ('A:ZZ' if omitted) ; op="write"/"clear"/"number_format"/"format"/ "column_width"/"dropdown" — REQUIRED.
sheetNoop="rename_sheet"/"delete_sheet"/"delete_rows"/"copy_sheet"/ "freeze" — the tab, by title or numeric id.
styleNoop="format" — the cell style, keys as listed above.
titleNoop="add_sheet" — the new tab's title ; op="rename_sheet" — the new title ; op="copy_sheet" — the copy's title (Google's `Copy of …` if omitted).
widthNoop="column_width" — pixels.
_groupNoÉquipe (id) de CET APPEL, sous son org parente.
appendNoop="write" — False (default) OVERWRITES the range ; True appends rows after the existing data (no overwrite), from the range's first column.
sourceNoop="write" — a CSV fetched server-side instead of `values`: `{"kind": "http", "path": "/…", "params": {…}}` (GET through your `http` connector, auth injected), or any file reference (drive, url, project_file). UTF-8, comma, RFC 4180 quotes.
valuesNoop="write" — the 2-D array of values to write. Exclusive with `source`.
_run_idNoOBLIGATOIRE à chaque appel dès `run_start` ou `data_claim_next` : sans lui, l'écriture sur une ligne réservée est refusée. Hérité seulement si le serveur tient un run actif — n'y compte pas.
accountNoGoogle account (email) to act as — same choice as `_account`.
dry_runNoop="delete_sheet"/"delete_rows" — True (default) only says what would be deleted ; False deletes.
end_rowNoop="delete_rows" — last row to delete, inclusive.
optionsNoop="dropdown" — the choices of the list ; [] removes it.
patternNoop="number_format" — the format pattern, as in the sheet UI.
_accountNoCompte à OPÉRER quand plusieurs existent. `oto_identity(op='list')`.
_projectNoProjet (id) de CET APPEL — jeton PRIMAIRE. `oto_project(op='list')`.
_instanceNoInstance de connecteur PRÉCISE (un credential exact). `oto_instance(op='list')`.
formattedNoop="read" — True = display strings (FORMATTED_VALUE) ; False = raw values.
start_rowNoop="delete_rows" — first row to delete (1-based, as displayed).
frozen_colsNoop="freeze" — columns frozen at the left (0 = none).
frozen_rowsNoop="freeze" — rows frozen at the top (0 = none).
allow_formulasNoop="write" with `source` — False (default) writes a cell starting with = + - @ as TEXT (a third party's CSV cannot plant a formula in your sheet) ; True lets formulas through.
spreadsheet_idYesthe spreadsheet to act on (every op).
to_spreadsheet_idNoop="copy_sheet" — the spreadsheet receiving the copy (this one if omitted).

Schema Changelog

Changes observed during successful MCP inspections.

No schema history has been recorded yet.

TDQS

A4.4/5.0
Behavior4/5

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

With zero annotations the description carries the whole burden and does so well: it flags that `clear` keeps formatting but drops values, that `delete_sheet` removes the tab 'and EVERYTHING in it', that deletes are dry-run by default, that `range` has no default for destructive ops, and that `allow_formulas=False` blocks CSV formula injection. It stops short of documenting return shapes beyond `read` ({rows, count}) and does not mention the `_run_id`/account requirements that writes depend on.

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 summary line is front-loaded and the op list is a scannable bullet structure where each bullet carries distinct information for a 14-op tool. Some wording is garbled ('a CSV oto fetches itself') and a few parentheticals are noisy, but nothing is padded relative to the surface area being covered.

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 29-parameter, 14-operation tool with no annotations and no output schema, the description covers every op, its defaults, and its destructive semantics. What remains thin is response shape for non-read ops (write, metadata, delete dry-run output) and prerequisite context such as account selection and run id, which an agent would only find in the schema.

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 already 100%, yet the description still adds real meaning: `style` is illustrated with a concrete grey wrapped header example, `number_format` gives sample patterns (`#,##0.00`, `0.0%`, `dd/mm/yyyy`), `source` shows its `{"kind": "http", "path": ...}` shape, and cross-parameter constraints (strict numbers as numbers, leading apostrophe forces text) are stated. This is well above the baseline for a fully documented 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 opening line states the resource precisely ('An existing spreadsheet: its cells, its tabs and rows, and their formatting'), and each of the 14 `op` values is a concrete verb+object pair with its own scope. An agent can tell from the description alone that this tool operates on an existing spreadsheet rather than creating one, which separates it from the `sheets_create` sibling.

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 op documents the conditions that select it — `range` omitted defaults to 'A:ZZ' on read but is required on clear, `append` chooses overwrite vs append, delete ops dry-run by default. `copy_sheet` even explains the intended workflow (copy a template tab, then write into the copy). The gap is sibling routing: nothing tells the agent this is the wrong tool when no spreadsheet exists yet and `sheets_create` is needed.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources