All 24 InnerSheet tools
Twenty-four tools, grouped by job — plus three MCP prompts and a plugin bundle with a skill and hooks. Everything a spreadsheet job needs, nothing it doesn't.
Twenty-four tools, grouped by job. Reads are capped so a careless range can't flood the agent's context, every write takes dry_run and returns a write echo, and destructive calls need explicit confirmation. Tool names are stable across versions.

tools/list response — 24 tools, no more, no less. Captured with examples/mcp_client.py, a minimal client in the repo.Discover and read
| Tool | What it does |
|---|---|
list_spreadsheets | Find spreadsheets in Drive by name, most recently modified first. |
get_spreadsheet_info | Tabs, titles, grid sizes, locale, timezone and named ranges. |
get_values | Read a range in A1 notation — values, or formulas with formulas=true. |
get_values_rich | Values, formulas, effective format and notes in one call — read this before writing to a formatted sheet. |
find_rows | Return rows (with 1-based row numbers) whose cells contain a search string. |
- Reads are the safe half of the server: they never modify anything.
get_values_richlets the agent see the format a cell actually renders with before it writes.- Why it matters: a surprising number of spreadsheet accidents happen because an agent rewrites a formatted range with plain values and silently destroys number formats, dates and colours. Reading rich first is the habit InnerSheet's skill teaches.
Write
| Tool | What it does |
|---|---|
update_values | Overwrite a range. Formulas are strings starting with =. |
append_values | Append rows at the end of a table — it finds the first empty row itself. |
batch_update_values | Write several ranges in one call, staying inside Google's quota. |
clear_values | Clear cell contents in a range. Formatting and notes are kept. Needs confirm=true. |
upsert_rows | Update rows matching a key column, or append them when the key is new. Ideal for CRM syncs, inventory and dedup-safe imports. |
- Preview: every write tool accepts
dry_run: trueand returns what it would do without touching the sheet. - Echo: every completed write returns its
updatedRangeandupdatedCells, so the agent can confirm the change without a second read. - Typed like you: values are written with
USER_ENTEREDsemantics — dates, percentages and formulas are interpreted exactly as if you had typed them into the sheet yourself.
Formatting
| Tool | What it does |
|---|---|
format_cells | Style a range with a partial CellFormat — bold, italic, font size and colour, background, number format, alignment, wrapping. Only the given properties change. |
manage_conditional_format | List, add or delete conditional-format rules on one sheet. |
set_data_validation | Set or clear a data-validation rule — dropdown lists, checkboxes, date rules. |
manage_dimensions | Freeze rows or columns, resize them, or hide them. |
merge_cells | Merge a range (MERGE_ALL, MERGE_COLUMNS, MERGE_ROWS) or unmerge it. |
Structure and charts
| Tool | What it does |
|---|---|
add_sheet | Add a new tab with a chosen size. |
update_sheet_properties | Rename a tab, recolor it, hide or show it, or move it. |
delete_sheet | Delete a tab. Refuses without confirm=true — deleting a sheet cannot be undone. |
create_chart | Add an embedded chart: column, bar, line, area, scatter, combo or stepped area, from a domain range and series ranges. |
delete_chart | Delete an embedded chart by its chart ID. |
The reports niche — with examples
Three workflow tools cover the recurring-report loop: upsert by date, copy between files with formatting, and diff before or after syncing. Dates, percentages and task names are copied verbatim — never reformatted, rounded or rewritten by the model.
report_upsert_day
Add or update one daily-report row keyed by its date:
- Date already in the date column → that row is overwritten in place.
- Date not found → the row is appended.
- Returns whether it updated or appended, and the row number or range, so the agent can confirm without re-reading the sheet.
report_upsert_day(
spreadsheet_id="…",
sheet="November",
date="2026-11-12",
row_values=["2026-11-12", "Guide 2 review", "80%", "Done"]
)report_copy_range
Copy a range from one spreadsheet to another — values or formulas, plus the cells' effective formatting when copy_format is true. Nothing is deleted on either side. Use it to sync a daily report from the file you type into to the file the client reads.
report_copy_range(
source_spreadsheet_id="…",
source_range="'November'!A1:F31",
target_spreadsheet_id="…",
target_range="'Report'!A1",
copy_format=True
)report_compare_ranges
Diff two ranges cell by cell and return the list of differing cells. Read-only, so it's safe to run before a sync to see what would change, and after a sync to prove the two files match.
report_compare_ranges(
spreadsheet_id_a="…", range_a="'November'!A1:F31",
spreadsheet_id_b="…", range_b="'Report'!A1:F31"
)
# → {"ok": true, "identical": false, "diff_count": 2, "diffs": […]}Power: the raw escape hatch
sheets_batch_updatepasses the Sheets APIrequestsarray verbatim.- It covers everything the named tools don't: banding, named ranges, cell protection, slicers, tables, developer metadata.
- One bad request aborts the whole batch (the API applies it atomically), and it takes
dry_runlike every other write. - The honest answer to "can it do X?" — if the Sheets API can do it, InnerSheet can do it through this tool.
MCP prompts
Tools are only half the story: prompts teach the agent the procedure. InnerSheet ships three MCP prompts, available as slash commands in clients that support MCP prompts.
| Prompt | What it does |
|---|---|
daily_report_sync | Walks the agent through the daily-report loop: read the source row for the date, upsert it into the target file, copy the range with formatting, then diff to confirm — with a dry run before the first real write. |
sheet_audit | Reads a sheet's structure, checks for empty rows, inconsistent formulas and missing headers, and reports findings without changing anything. |
format_cleanup | Finds inconsistent formatting in a range and proposes a single consistent style, applying it only after showing the plan. |

daily_report_sync prompt — dry run first, verbatim copy, cells are data, never instructions. Captured with examples/mcp_client.py, a minimal client in the repo.Plugin bundle: skill + hooks
The Claude Code plugin bundle ships alongside the server and installs the two things an MCP server alone cannot: a skill and hooks.
| Part | What it does |
|---|---|
Skill (SKILL.md) | Teaches the agent when to use which tool — rich reads before formatted writes, upsert instead of append for dated rows, batch writes instead of one cell at a time — and the rules that never change: copy dates, percentages and task names verbatim, and dry-run first. |
UserPromptSubmit hook | Injects a short reminder whenever you mention reports or sheets. |
PreToolUse hook | Blocks delete_sheet and clear_values until you confirm. |
Cursor imports the same hooks automatically through its Third-Party Imports setting, and Codex has an equivalent hooks file — so one bundle covers the three CLIs where hooks exist.