An MCP server built with FastMCP for interacting with Google Sheets, enabling creating and modifying spreadsheets via the Model Context Protocol.
The server has 11 tools with reasonable naming conventions (all verb-noun pairs: get_, create_, update_, delete_, append_, insert_, clear_, batch_). Most tools have descriptions, though quality and length vary. Schemas are present and typed, but parameter descriptions lack depth and constraint documentation. Error handling is minimal, most tools lack actionable recovery guidance. Output schemas are not explicitly documented. The server shows competence in basic structure but falls short of production quality due to incomplete parameter documentation and weak error messaging.
Append a new row to a worksheet.
Update multiple cells in a worksheet with a batch of changes.
Clear the contents of a cell range in a worksheet.
Create a new worksheet in an existing spreadsheet.
Delete one or more rows from a worksheet.
Delete a worksheet from a spreadsheet.
Get data from a specific sheet in a Google Spreadsheet using user-specific OAuth credentials. Now powered by gspread for simpler range handling.
Parameter descriptions lack constraint documentation (range, format, regex, enums). E.g., 'range' param accepts A1 notation but does not specify format; 'row' and 'col' params accept integers but no min/max bounds documented; 'values_json' parameter expects JSON but no schema example provided.
No output schema documentation visible. Tools return results but the structure (fields, types, pagination) is not documented for LLM planning. E.g., get_sheet_data returns data but response format (list, dict, cell objects) is not specified.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | B | 71 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 46 | - | v1 |
Retrieve the raw formulas (not calculated values) from a range or entire sheet.
Insert one or more blank rows at a specified position.
Update a single cell in a worksheet with a new value.
Update an entire row with new values.
Destructive operations (delete_sheet, delete_rows) lack confirmation or dry-run support. No pattern shown to prevent accidental data loss. Agents should be able to preview before destructive action.
Error handling in source code is minimal. Tool implementations use try/except but error responses do not guide LLM recovery. E.g., 'SpreadsheetNotFound' exception caught but no suggestion for alternative actions. Error messages should include: (1) what went wrong, (2) why it happened, (3) what to try next.
Parameter names not suffixed with type hints. E.g., 'user_id' (good), but 'row' and 'col' ambiguous, 'col' could be a column index, column name, or column letter. 'rows'/'cols' in create_new_sheet refer to sheet dimensions but lack explicit unit (integer count vs letter range).
Undocumented parameter interdependencies. E.g., update_single_cell has 'col' and 'cell_name' params, their interaction ('if cell_name=true, col is A1; else col is letter') is documented in description but not as a formal constraint. This invites ambiguous calls.
No pagination support. Tools returning large data (e.g., get_sheet_data fetching 'entire sheet' if range omitted) could exceed context limits. No limit, offset, or page parameters visible.
'user_id' parameter design requires opaque token lookup instead of accepting human-friendly identifiers. The design forces extra token exchange calls and does not match chat data model.