Minimal read-only Google Sheets MCP server for Claude Code/Desktop
Three read-only tools with clear naming (list_sheets, get_sheet, get_recent_sheets) and solid descriptions (avg 180 chars). All tools have input schemas with type definitions and parameter descriptions. However, output schemas are not formally documented in the code, only described in docstrings. Error handling is present but minimal (ValueError for missing sheets, no recovery guidance). Parameter descriptions are good but lack explicit constraints (e.g., max_rows bounds, regex pattern format). No tool annotations (readOnlyHint, idempotentHint) despite all being read-only. Composition is clean, each tool has one responsibility and tools chain well (list_sheets → get_sheet). Security is solid: read-only scope enforced, no secrets in params, OAuth handled server-side.
Get the N latest sheets whose names match a regex pattern. Typical use case: meeting-minutes tabs named YYMMDD (e.g. 260507) — sorted ASC by name, return the last `count` of them. Returns each sheet's full row data. Useful for "fetch the latest meeting minutes" without listing then fetching individually.
Get all cell values from a specific sheet (tab) in a spreadsheet. Returns the resolved sheet name and a list of rows (each row is a list of cell strings). Cells beyond the data area are omitted by the Sheets API.
List every sheet (tab) in a Google Spreadsheet. Returns a dict with the spreadsheet title and per-sheet metadata (name, sheet_id, index, row/column counts). Useful as a first step before pulling specific sheets.
Output schemas not formally documented. Docstrings describe return structure but no JSON Schema or structured type hints in code. LLMs cannot reliably parse expected fields.
No tool annotations despite all tools being read-only and idempotent. Missing readOnlyHint and idempotentHint metadata that would help agents reason about safety.
Error messages lack recovery guidance. ValueError for missing sheet provides available names but does not suggest next steps (e.g., 'Call list_sheets() first to see available sheets').
Parameter constraints not explicit. max_rows has no bounds documented (should specify min/max). pattern parameter is regex but format not validated or constrained in schema.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 60 | 2026-07-28+ | v2 |
No pagination support. get_sheet returns all rows up to max_rows but no offset/limit pattern. Large sheets could blow context window. No total_count or next_cursor in response.