SheetForge MCP
SheetForge MCP is a local-first Excel MCP server for reading, inspecting, querying, and safely editing .xlsx workbooks through AI/MCP clients without Excel or LibreOffice.
Create workbooks/sheets and inspect workbook metadata, sheets, ranges, and native tables.
Read compact tabular data with schema hints, pagination, column windows, object/array row modes, and boundary controls.
Query, filter, sort, aggregate, and analyze worksheet or table data, including multi-workbook bulk aggregate/filter/union/cross-lookup operations.
Write cell/range data; append, upsert, or update table rows; copy, insert, delete, merge, and unmerge ranges/rows/columns.
Apply formatting, column/row sizing, freeze panes, autofilters, print area/titles, worksheet protection/visibility, and validation/conditional-format cleanup.
Create native tables, charts, pivot tables, and named ranges; apply/validate/inspect formulas and detect circular dependencies.
Audit and profile workbooks, plan/apply repairs, preview/commit assertion-backed changesets, snapshot workbooks, and diff before/after versions.
Search cell values and inspect layout, formatting, chart placement, range impact, and formula dependency metadata.
Use dry-run previews, compact responses, structure tokens, and structured JSON envelopes for safer agent workflows.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@SheetForge MCPread the sales table from report.xlsx"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
SheetForge MCP
Local-first Excel MCP server for AI agents that need structured reads, workbook introspection, and safer
.xlsxmutation.
SheetForge MCP is an Excel MCP server for .xlsx automation over the Model Context Protocol. It is built for AI agents, MCP clients, and automation workflows that need more than raw cell access: compact structured reads, workbook-aware guidance, layout-aware inspection, and safer write paths with Python and openpyxl, without launching Microsoft Excel or LibreOffice.
If you are looking for an Excel MCP server for spreadsheet automation, workbook inspection, Excel report generation, dashboard authoring, or .xlsx editing from AI tools, SheetForge MCP is built for that workflow.
Instead of treating every sheet as a blind cell grid, SheetForge helps agents distinguish native Excel tables, worksheet-shaped datasets, layout-heavy dashboards, and chart sheets, then choose the right read or mutation path for each workbook task.
Package name: sheetforge-mcp
CLI command: sheetforge-mcp
Published package release: 0.14.0
Repository docs track the current main-branch tool surface, which currently exposes 83 MCP tools.
Workbook Contracts v1 is included in 0.14.0: explicit bindings and full bounded data checks can guard Recipe preview/commit, with logical-field, file-path and worksheet-versus-table recovery guidance.
Verified Recipes v1 is included in 0.11.0: reusable native-table reports with explicit checks and verified preview/commit.
Verified Explanations v1 is included in 0.12.0: read-only, independently reconciled changes between recomputed recipe results.
Verified Rebase and Verified Scenarios v1 are included in 0.13.0: intent-preserving keyed edits and outcome-checked alternatives with verified commits.
Why SheetForge
reusable workbook contracts via
inspect_workbook_contractand optional Recipe enforcement: separate declared meanings from checked key/type/value rules, resolve only approved exact headers, block ambiguous bindings, and guide agents through logical-field errors without weakening the contractoutcome-checked alternatives via
evaluate_workbook_scenarios: compare explicit keyed changes against exact overall/group metric bounds, then commit one selected outcome with post-save recomputation and rollbackintent-preserving table edits via
apply_table_patch: rebind keyed updates against a pinned base, reject changed premises and conflicting writes, and commit a fresh verified preview while keeping unrelated current valuesagent-friendly reads via
suggest_read_strategy,describe_dataset,query_table, andaggregate_tableverified multi-step edits via
apply_workbook_changeset: preview the complete candidate, value/table/layout assertions, structural diff, and sampled cell changes, then commit that exact plan only if the source workbook still matchesreusable report recipes via
run_workbook_recipe: filter and aggregate a native table, check the result, and write it through a verified ChangeSet without passing intermediate rows through the modelexplainable report changes via
explain_recipe_delta: recompute the same recipe on two source versions, compare by unique keys, and reconcile added/removed/updated contributions without modifying either workbooksafer workbook creation and baselines:
create_workbookrefuses to overwrite an existing.xlsx, whilecreate_workbook_snapshotcreates a verified non-overwriting copy for before/after validationserialized workbook mutation: same-host writers lock each workbook before loading it, then keep the lock through atomic replace and reopen verification so concurrent agents do not silently overwrite one another
smarter worksheet boundaries with bounded
strict,default, andextendedread presets plus compact metadata for any trailing blocks that were intentionally left outworkbook and layout awareness via
profile_workbook,describe_sheet_layout,list_tables,list_charts, andanalyze_range_impactsafer local mutation through
dry_run, compact write responses, guarded native-table append/upsert flows, and workbook diff/audit/repair loopslocal-first performance and privacy with
openpyxl, no desktop Excel dependency, and no cloud-auth requirement
Related MCP server: fcp-sheets
Excel MCP Server Features
workbook creation and metadata
worksheet creation, renaming, copying, deletion, and visibility
structured reads, compact table reads, declarative table queries, grouped aggregates, and cell search
row, column, and range mutations
formulas and validation checks
formatting, freezes, autofilters, merges, and conditional formatting
native Excel tables, charts, and pivot summaries
stdio,streamable-http, and deprecatedssetransports
Common Use Cases
AI agents that need safe, structured Excel workbook access through MCP
spreadsheet automation workflows that read and update
.xlsxreportsExcel dashboard generation with formatting, tables, charts, freeze panes, and print setup
workbook QA and inspection flows that need metadata, named ranges, tables, charts, and protection state
data extraction from native Excel tables or worksheet-shaped datasets without hand-written
openpyxlscripts
Requirements
Python
3.10+.xlsxworkbookseither
uvxor a local package install
Quick Start
Install and run directly from PyPI with uvx, or install the package locally in your Python environment.
Stdio
Use stdio when the MCP client starts the server locally.
uvx sheetforge-mcp stdio{
"mcpServers": {
"excel": {
"command": "uvx",
"args": ["sheetforge-mcp", "stdio"]
}
}
}Streamable HTTP
Use streamable-http when you want a long-running local server process.
EXCEL_FILES_PATH=/path/to/excel-files uvx sheetforge-mcp streamable-httpDefault endpoint:
http://127.0.0.1:8017/mcpExample client config:
{
"mcpServers": {
"excel": {
"url": "http://127.0.0.1:8017/mcp"
}
}
}Remote binding is an explicit opt-in because the HTTP transports do not provide built-in authentication:
FASTMCP_HOST=0.0.0.0 \
SHEETFORGE_ALLOW_REMOTE=true \
EXCEL_FILES_PATH=/path/to/excel-files \
uvx sheetforge-mcp streamable-httpOnly expose a remote listener behind an authenticated and access-controlled network boundary.
SSE
SSE is kept for compatibility, but new integrations should prefer streamable-http.
EXCEL_FILES_PATH=/path/to/excel-files uvx sheetforge-mcp sseDefault endpoint:
http://127.0.0.1:8017/sseFile Path Rules
Paths refer to the server filesystem, not the client's cwd. Reuse supplied paths; never invent an absolute prefix for a relative name.
In
stdiomode,filepathvalues must be absolute paths.In
streamable-httpandssemode, relative paths are resolved underEXCEL_FILES_PATH.In
streamable-httpandssemode, absolute paths are accepted only when they remain insideEXCEL_FILES_PATH; parent traversal and symlink escapes are rejected.In
streamable-httpandssemode, the server createsEXCEL_FILES_PATHautomatically if it does not exist.
Path-policy errors include a stable code and safe next step. Retry the original user-supplied root-relative path on a rooted server, or ask for the intended absolute path in normal stdio. No automatic basename fallback or relocation occurs. See path guidance and error recovery.
Environment Variables
Variable | Default | Used by | Purpose |
|
| HTTP and SSE | Bind address for the server process |
|
| HTTP and SSE | Port for the server process |
|
| HTTP and SSE | Base directory for relative workbook paths |
| unset | HTTP and SSE | Required opt-in for any non-loopback bind; does not add authentication |
Tooling Overview
Worksheet tabs and native Excel tables have separate names. For a named source,
use list_tables to verify its containing tab, then read_excel_table; a missing
name in the worksheet list does not prove the table is absent. See
source selection and error recovery.
The server currently registers 83 MCP tools across these groups:
workbook overview:
create_workbook,create_worksheet,create_workbook_snapshot,get_workbook_metadata,profile_workbook,describe_sheet_layout,audit_workbook,plan_workbook_repairs,apply_workbook_repairs,apply_workbook_changeset,run_workbook_recipe,explain_recipe_delta,diff_workbooks,analyze_range_impact,explain_formula_cell,detect_circular_dependencies,create_named_range,inspect_named_range,list_named_ranges,delete_named_range,list_all_sheets,list_tablesdata access:
suggest_read_strategy,describe_dataset,query_table,aggregate_table,bulk_aggregate_workbooks,bulk_filter_workbooks,union_tables,cross_workbook_lookup,quick_read,read_excel_table,read_data_from_excel,read_excel_as_table,search_in_sheet,write_data_to_excel,append_table_rows,append_excel_table_rows,upsert_excel_table_rows,update_rows_by_keyworksheet and range changes:
copy_worksheet,delete_worksheet,rename_worksheet,set_worksheet_visibility,get_worksheet_protection,set_worksheet_protection,copy_range,delete_range,insert_rows,insert_columns,delete_sheet_rows,delete_sheet_columnsformatting and layout:
format_range,format_ranges,read_range_formatting,freeze_panes,set_autofilter,set_print_area,set_print_titles,set_column_widths,autofit_columns,set_row_heights,merge_cells,unmerge_cells,get_merged_cellsformulas and validation:
apply_formula,validate_formula_syntax,inspect_formula,validate_excel_range,get_data_validation_info,inspect_data_validation_rules,remove_data_validation_rules,inspect_conditional_format_rules,remove_conditional_format_rulesanalysis and structure:
create_table,list_charts,find_free_canvas,create_chart,create_chart_from_series,create_pivot_tableguarded table patches:
apply_table_patchguarded alternatives:
evaluate_workbook_scenariosworkbook contracts:
inspect_workbook_contractandrun_workbook_recipe(..., workbook_contract=...)
For explicit reusable field definitions and mandatory source checks before report generation, see the Workbook Contracts guide and net-sales contract. Declared business meanings are not machine-verified facts. V1 integrates Recipes only; it does not silently enforce contracts on other tools.
For comparing proposed edits before choosing one, see the Verified Scenarios guide and budget example. Scenarios verify explicit sum/count bounds, not forecasts or the business correctness of a decision.
For native-table edits prepared against an earlier snapshot, see apply_table_patch
and the Verified Rebase guide. This is separate from
unconditional key-based upserts: declared read dependencies and old target values
are checked before compiling a fresh ChangeSet.
For chart authoring, prefer create_chart as the primary entry point:
use
data_rangefor the simple contiguous-data pathuse explicit
seriesplus optionalcategories_rangefor non-contiguous or hand-authored chartsuse top-level
widthandheightto control chart size in centimeters; defaults are15 x 7.5use
placementwhen you want SheetForge to position the chart relative to worksheet content, a source range, or a named table instead of guessingtarget_cellmanuallyuse
placement={"relative_to": "free_canvas"}when a busy dashboard needs the first non-overlapping chart slot instead of a simple right/below placement rulekeep
create_chart_from_seriesfor backward compatibility or existing prompts that already rely on it
The most agent-friendly read tools are:
suggest_read_strategy: recommends the best next read tool for a workbook target, including whether SheetForge should treat it as a native Excel table, a clean worksheet dataset, a layout-heavy dashboard sheet, or a chart sheetdescribe_dataset: samples a worksheet or native Excel table and returns headers, schema hints, key-candidate guesses, structural signals, guarded worksheet-boundary metadata, and a recommended follow-up read pathquery_table: filters, projects, sorts, and limits worksheet-shaped data or native Excel tables with a declarative JSON query instead of ad hoc cell loopsaggregate_table: computes grouped metrics such ascount,sum,avg,min, andmaxover worksheet-shaped data or native Excel tablesbulk_aggregate_workbooks: computes the same grouped metrics across many workbook files in one call, with explicit schema handling viastrict,intersect, orunionbulk_filter_workbooks: returns matching rows across many workbook files with optional source provenance columns, so recurring cross-file QA and reporting checks no longer need one-tool-call-per-file loopsunion_tables: combines comparable worksheet or native-table rows across many workbook files, with optional deduplication keys and explicit schema handling for workbook collections that drift over timecross_workbook_lookup: enriches one workbook dataset from one or more lookup workbooks with left-join style matching, optional duplicate-match handling, and compact per-row provenance for matched lookup rowsprofile_workbook: one-call inventory for sheets, tables, charts, named ranges, and key layout/protection state, including chartoccupied_rangefor grid-anchored worksheet chartsdescribe_sheet_layout: worksheet-level structural summary for safe dashboard edits, including freeze panes, print settings, merges, chart anchors, table metadata, conditional-format and validation counts, custom row/column sizing, and a small free-canvas previewaudit_workbook: workbook-level audit for high-signal problems such as broken#REF!formulas, error cells, hidden sheets, header-quality issues, layout-heavy sheets, and named ranges that reference missing sheetsplan_workbook_repairs: converts workbook audit findings into prioritized next steps, including suggested SheetForge tool calls for inspection, safe dry runs, and repair workflowsapply_workbook_repairs: dry-runs or applies the safe repair subset from those plans, including broken named ranges, broken validation rules, broken conditional formats, and optional hidden-sheet revealsapply_workbook_changeset: previews a bounded multi-tool report mutation on an isolated candidate, evaluates explicit postconditions, and commits it with exact-file stale-write protection plus optional verified snapshot and rollbackrun_workbook_recipe: executes a versioned JSON recipe over one native table, checks unique keys, row counts or sum reconciliation, probes column/row-order invariance, and writes a reserved rectangle in the same workbook through ChangeSet preview/commit. See the Verified Recipes guide and example recipe.explain_recipe_delta: independently reconciles changes in recomputedsum/countrecipe results across two source versions by unique keys. Includes group drilldown, exact decimal evidence and explicit sample remainders. It does not validate saved report cells or infer business causes. See Verified Explanations.diff_workbooks: compares two workbook files and reports structural changes plus sampled cell-value diffs, which is useful for before/after verification in agent workflowscreate_workbook_snapshot: creates the verified, non-overwriting baseline that makesdiff_workbooksusable without an external copy scriptanalyze_range_impact: preflight blast-radius check for a worksheet range, including overlaps with tables, chart footprints, merged cells, named ranges, data validations, conditional formats, autofilters, print areas, formula cells inside the range, and formulas or rule expressions elsewhere that depend on it directly or transitively, through named ranges, or through structured table references such asTable1[Sales]explain_formula_cell: resolves a formula cell's direct references, shows upstream formula-chain cells, returns a compactformula_chainsummary with depth layers and sampled paths, and reports downstream dependents so agents can debug workbook logic without manual tracingdetect_circular_dependencies: scans workbook formula graphs, including named-range-driven edges, and reports self-references plus multi-cell circular dependency groups before they surprise downstream automationcreate_named_range: creates workbook-level or sheet-scoped named ranges withdry_runandreplacesupport, so agents can promote important workbook regions into stable references without dropping to ad hoc Pythoninspect_formula: inspects a formula string without workbook context, listing functions, reference token types, volatile functions, and risky functions such asINDIRECTinspect_named_range: inspects one defined name, including its scope, destinations, and whether it points at missing sheets or broken referencesquick_read: single-call compact table read that auto-selects the first sheet when needed, with guardedstrict/default/extendedboundaries,start_rowpagination, andstart_col/end_colcolumn windowing for large sheetsread_excel_table: read a native Excel table bytable_namewithout guessing worksheet bounds, now withstart_rowpagination and optionalstart_col/end_coltable column windowinglist_all_sheets: quick workbook inventory with sheet sizes, emptiness flags, andsheet_typefor worksheets versus chart sheetsread_excel_as_table: compactheaders + rowsoutput for structured datasets, with guarded boundary presets,compact=Truefor the smallest payload,start_rowfor page-like reads, andstart_col/end_colfor narrower column slicesread_data_from_excel: cell-address-aware range reader that supportsmax_rowsandmax_colswindowing for large non-tabular ranges,values_only=Truefor smaller 2D payloads, and cursor-based continuations for multi-step 2D traversalread_range_formatting: compact formatting readback for a worksheet range, grouped by distinct style signatures instead of noisy per-cell dumps, with merged-range and conditional-format overlap summariessearch_in_sheet: exact or partial value search across instantiated worksheet cells, so distant style-only cells do not force a scan of the entire rectangular used range
Workbook inventory tools such as list_all_sheets, profile_workbook, and list_charts surface both worksheets and chart sheets. Grid-oriented tools such as quick_read, read_excel_table, create_table, formatting, formulas, and validation require a real worksheet and return a clear chartsheet error if you target the wrong sheet type.
The most agent-friendly write helpers for structured data are:
upsert_excel_table_rows: update matching rows in a native Excel table and append missing keys in one call Note: totals-row tables are update-only for now; append attempts are rejected rather than shifting unrelated rows.append_excel_table_rows: append rows to a native Excel table when you want the tablerefto grow with the new recordsappend_table_rows: append header-aware rows to worksheet-shaped data when you do not have a native Excel tableupdate_rows_by_key: update worksheet-shaped data by a named key column without appending missing keys
For the compact table readers (quick_read, read_excel_as_table, read_excel_table):
row_mode="arrays"keeps the smallestheaders + rowsshaperow_mode="objects"returnsrecordskeyed by normalized field names such asfirst_namenormalized field names are ASCII-safe transliterations, so headers like
Näyttökerratbecomenayttokerratinfer_schema=Trueadds lightweightschemahints inferred from the returned rowsstart_col/end_collet you slice wide worksheets or native Excel tables down to just the columns you need before pagination or schema inferencetruncated pages now include
next_start_row, which you can pass back to the same tool for the next pagenon-tabular range reads can also return
continuations.downandcontinuations.rightcursor tokens so agents can continue large 2D windows without recomputing coordinatessuggest_read_strategyhelps agents choose between table-aware, worksheet-aware, range-aware, and workbook-orientation reads before they spend context on the wrong pathdescribe_datasetprovides a lighter-weight dataset summary than a full read, including sample rows, header quality, key candidates, and recommended next tooldescribe_dataset,quick_read,read_excel_as_table, andread_excel_tablenow also returnstructure_token,content_token, andsnapshot_metadata, so agents can carry read-time identity forward into safer optimistic-concurrency writesworksheet-shaped compact readers and row-mutation helpers favor the first contiguous data block after the header, so sparse footer notes or distant outlier rows do not silently stretch
total_rows, append targets, or key-based update scansworksheet reads can opt into
read_boundary_mode="strict"(0 blank rows),"default"(5), or"extended"(100); the bounded presets deliberately avoid an unlimited raw gap parameterdescribe_dataset,quick_read, andread_excel_as_tablesurface aread_boundaryobject with the effective tolerance, data end, ignored row count, and compact trailing-block locationsnon-default boundary views are read-only diagnostics and return
write_precondition_compatible=false; reread with the default mode before carrying a structure token into a writequery_tableis the lightest way to pull just the matching rows and columns you need from a worksheet dataset or native Excel tablequery_tableandbulk_filter_workbooksacceptneas a shorthand forneq, and membership filters can use eithervaluesor the shortervaluelist formaggregate_tablelets agents compute grouped summaries directly in SheetForge instead of over-reading the full dataset into context firstbulk_aggregate_workbooksextends that pattern across many workbook files when a recurring reporting workflow would otherwise need ad hoc Python or repeated per-file tool callsaggregate metrics accept both the canonical
{"op": "sum", "field": "Sales", "as": "total_sales"}shape and the more guessable alias form{"agg": "sum", "column": "Sales", "as": "total_sales"}bulk_filter_workbooksdoes the same for row-level inspection, while keeping workbook provenance visible by defaultunion_tablesis the fastest way to normalize many comparable workbook datasets into one combined tabular payload before downstream QA, export, or further aggregationcross_workbook_lookupis the fastest way to enrich one workbook from another without writing an ad hoc merge script, especially for master-data lookups, status enrichment, and cross-file QA workflowsappend_excel_table_rowsis the right append path for native Excel tables when you do not need key-based upsert behaviorappend_table_rowsnow refuses to write directly under an adjacent native Excel table and points you atappend_excel_table_rowsinstead of silently leaving the table range staletoken-aware structured writes can pass
expected_structure_tokento abort on structural drift; append-style writes additionally requireallow_structure_change=True, and successful writes report both previous and new structure/content tokensrename_worksheetnow updates formula cells as well as chart references and named ranges, and it also renames the default sibling pivot sheet (Data_pivot->Revenue_pivot) when that move is conflict-freecopy_worksheetpreserves native tables with workbook-unique copied names, data validations, conditional formatting, freeze panes, autofilters, print settings, protection, charts with their exact anchor geometry, and sheet-scoped names; copied self-references and structured table references are rewritten to the new sheetformatting color inputs accept
RRGGBB,#RRGGBB,AARRGGBB, or#AARRGGBB, so prompts do not need to strip CSS-style#prefixes firstaudit_workbookis the fastest workbook-wide preflight when you need to know whether a spreadsheet is safe and predictable enough for autonomous editingaudit_workbooknow treats dominant native-table sheets more honestly when nearby dashboard/layout artifacts extend the used range, so unrelated merged/chart areas do not create false blank-header risk on an otherwise clean tableplan_workbook_repairsis the fastest way to turn those audit findings into an actual action queue instead of manually deciding the next tool call for every problemapply_workbook_repairslets agents preview or apply the safe subset of those repairs without having to orchestrate each broken workbook artifact manuallydiff_workbooksis the quickest before/after QA pass when an agent has touched workbook structure and wants proof of what actually changed
Recommended Agent Workflows
Unfamiliar workbook -> verified multi-step mutation Start with
profile_workbook(orlist_all_sheetsfor the lightest inventory), inspect layout-heavy tabs withdescribe_sheet_layout, and runanalyze_range_impact. Put supported report-building edits and explicit postconditions intoapply_workbook_changeset(mode="preview"); ifready_to_commit=true, repeat the same plan withmode="commit",expected_workbook_sha256, andchangeset_tokenfrom the preview.Workbook repair loop Use
audit_workbookto find high-signal issues,plan_workbook_repairsto turn them into an action queue,apply_workbook_repairs(..., dry_run=True)to preview the safe subset, then rerunaudit_workbookafter applying repairs to confirm the workbook is back to a low-risk state.Multi-workbook reporting Use
bulk_aggregate_workbooks,bulk_filter_workbooks,union_tables, orcross_workbook_lookupto build the reporting dataset first, then write the summarized rows into a fresh workbook tab and finish the presentation layer withformat_ranges,find_free_canvas,create_chart, andautofit_columns.
See TOOLS.md for the full reference. Release notes live in CHANGELOG.md.
Response Format
Every tool now returns a JSON envelope with a consistent top-level shape:
{
"ok": true,
"operation": "read_excel_as_table",
"message": "read_excel_as_table completed",
"data": {}
}Error responses follow the same contract:
{
"ok": false,
"operation": "write_data_to_excel",
"error": {
"type": "DataError",
"message": "No data provided to write"
}
}For destructive tools that support preview mode, the envelope may also include dry_run and changes.
Committed write operations now default to compact summaries; pass include_changes=True when you want per-cell, per-range, or per-operation detail.
Development
Install dependencies:
uv sync --extra devRun tests:
uv run --extra dev pytest -qRun lint checks:
uv run --extra dev ruff check src testsRun the package locally:
uv run sheetforge-mcp stdioBuild distributions locally:
uv buildRelease Flow
Update
pyproject.toml,manifest.json, and the tracked.mcpbbundle together for each release.Keep the tracked bundle filename in sync with the package version, for example
sheetforge-mcp-<version>.mcpb.Every distribution-building workflow verifies the wheel, source distribution, and tracked MCPB bundle against shared public-artifact allowlists before release or publication.
GitHub releases run a build verification workflow only.
PyPI publishing is a separate manual workflow, so releases do not create a failing deployment before Trusted Publisher is configured for the package.
Repository Layout
src/excel_mcp/server.py: MCP server, transport setup, and tool registrationsrc/excel_mcp/workbook.py: workbook lifecycle helpers and workbook metadatasrc/excel_mcp/changeset.py: verified multi-operation preview/commit transactions and assertionssrc/excel_mcp/recipes.py: bounded native-table report recipes, checks, lineage samples, and ChangeSet compilationsrc/excel_mcp/explanations.py: read-only keyed recipe deltas with independent arithmetic/filter checks and bounded evidencesrc/excel_mcp/data.py: read, write, table, and search helperssrc/excel_mcp/sheet.py: worksheet and range mutationstests/: regression tests covering data, layout, charts, pivots, formatting, tables, and resource safetyscripts/verify_release_artifacts.py: shared wheel/sdist/MCPB content verifier used by CI and release workflowsmanifest.json: packaged MCP bundle metadatadocs/index.html: static project landing page
Why SheetForge MCP
Excel-first MCP surface: the toolset is focused on real
.xlsxworkbook operations, not generic file I/Oagent-friendly responses: consistent JSON envelopes, compact writes, and
dry_runpreviews reduce context wasteworkbook introspection:
profile_workbook,list_all_sheets,list_tables, andlist_chartsmake unfamiliar spreadsheets easier to navigatesafer edits:
analyze_range_impactgives agents a read-only preflight before overwriting, deleting, or restructuring an important range, including downstream formula chains plus validation-rule and conditional-format references elsewhere in the workbook even when formulas point at the range through named ranges or structured table referencesverified transactions:
apply_workbook_changesetbinds a bounded operation/assertion plan to the canonical target path and exact source SHA-256, tests it on an isolated candidate, verifies cells, tables, freeze panes, autofilters, and chart placement, and replaces the source once only after all checks passlayout planning:
find_free_canvassuggests safe empty slots for charts or dashboard blocks before you place them, defaulting to the standard chart footprint when you omit explicit sizingpractical Excel output: formatting, print setup, worksheet protection, table upserts, chart authoring, and autofit helpers cover real reporting workflows
Python ecosystem fit: built on
openpyxl, packaged foruvx, and easy to run locally overstdioor through a deliberately gated HTTP deployment
Notes For Integrators
stdiomode is careful not to write non-protocol text tostdout.All tools return structured JSON envelopes, which makes client-side parsing predictable.
Tool responses now use compact JSON serialization to reduce MCP payload size while keeping the same envelope shape.
read_data_from_excel(..., preview_only=True)limits the response to the first 10 rows in the selected range and marks the payload as truncated when applicable.read_data_from_excel(..., compact=True)omits default validation stubs for cells that do not have validation rules.read_data_from_excel(..., values_only=True)returns a plain 2Dvaluesarray for range reads that do not need per-cell addresses or validation metadata.read_data_from_excel(..., max_rows=...)paginates tall rectangular ranges and returnsnext_start_rowplusnext_start_cellwhen more rows remain.read_data_from_excel(..., max_cols=...)paginates wide rectangular ranges and returnsnext_start_colplusnext_column_start_cellwhen more columns remain.read_data_from_excel(..., cursor=...)resumes from a continuation token so agents can keep paging without recomputing the next window manually; 2D windows expose directional continuations undercontinuations.downandcontinuations.rightread_excel_as_table(..., compact=True)minimizes the tabular payload toheadersandrowsunless truncation metadata is needed, while still returning dataset identity metadatacompact tabular readers still include
structure_token,content_token, andsnapshot_metadata, even when the tabular payload itself is minimizedquick_read(..., start_row=...)andread_excel_as_table(..., start_row=...)let agents paginate deep worksheets without first reading from the top.quick_read(..., start_col=..., end_col=...)andread_excel_as_table(..., start_col=..., end_col=...)let agents request only the relevant columns from wide worksheets instead of pulling every column into context.read_excel_table(..., start_col=..., end_col=...)now supports the same narrower column slices for native Excel tables, as long as the requested columns fall inside the table range.quick_read(..., include_headers=False),read_excel_as_table(..., include_headers=False), andread_excel_table(..., include_headers=False)let follow-up pages omit repeated header payload once the first page already established the schema.read_excel_table(..., start_row=...)now supports deeper pagination into native Excel tables instead of always reading from the top.Truncated tabular reads now return
next_start_rowso agents can continue paging without recalculating offsets.Oversized read responses now fail early with
ResponseTooLargeErrorplus structuredhints, so agents can retry with smaller ranges or pagination before the client truncates the payload.quick_read,read_excel_as_table, andread_excel_tablecan now returnrecordsplus inferredschemahints when you opt intorow_mode="objects"andinfer_schema=True.Read tools do not recalculate Excel formulas; formula cells surface as formula text such as
=B2*C2, and inferred schema labels formula-backed columns asformulaso agents do not mistake them for fresh numeric values.profile_workbookprovides a single-call workbook inventory with sheet-level table, chart, protection, print, and filter metadata for faster agent orientation, and now includes chartoccupied_rangealongside anchors and dimensions for grid-anchored worksheet charts.Core mutation tools now default to compact responses on committed writes, including data writes, formatting, worksheet layout helpers, and merge/unmerge helpers. Use
include_changes=Truefor detailed diffs.Token-aware structured writes now return
previous_structure_token,new_structure_token,previous_content_token,new_content_token, andsnapshot_metadata, which makes multi-agent or read-then-write flows safer without adding hidden workbook metadata.dry_runversions of those structured writes now label snapshot metadata astoken_basis="dry_run_preview"and keep the on-disk file facts undersource_file_*, so preview tokens are no longer mixed with live-file metadata.Workbook saves that go through
safe_workbook(..., save=True)use a timeout-aware same-host workbook lock plus temp-file save,fsync, atomic replace, rollback-on-verification-failure, and reopen verification. Symlink paths update their real target without replacing the symlink itself. If automatic rollback fails, the recovery backup is retained and identified in the error. This protects cooperating SheetForge processes on one machine; it is not a distributed lock for cloud-sync providers.format_rangesbatches multiple formatting operations into one workbook pass and reports per-rangeerrorswithout discarding successful ranges. A failed range is rolled back to its pre-operation styles, values, comments, hyperlinks, merge state, and conditional-format rules before the batch continues.validate_formula_syntaxperforms structural token validation, checks Excel coordinate limits, and rejects risky functions such asINDIRECT,HYPERLINK,WEBSERVICE,DGET, andRTDcase-insensitively. It does not calculate formulas or replace Excel's own calculation engine.write_data_to_excelremains a raw cell-write primitive and can store formula strings directly; use it only with trusted data, or useapply_formulawhen you want SheetForge's formula safety checks.Server logs rotate at 5 MiB with two backups instead of growing without a bound.
autofit_columnsestimates practical column widths from the current cell contents, with optional column filters and min/max bounds.list_chartsnow reports chartwidthandheightin centimeters in addition to anchor, type, and series metadata.get_worksheet_protectionandset_worksheet_protectionadd a safe worksheet-level wrapper around Excel protection flags.set_print_areaandset_print_titlesmake report/export setup scriptable without dropping into raw openpyxl workbook internals.list_tablesnow returns lightweight schema metadata such as headers, row counts, and stripe settings in addition to table names and ranges.upsert_excel_table_rowsexpands native Excel table ranges automatically when it appends missing keys, refuses to grow a table into already occupied cells, and rejects append attempts when the target table has an enabled totals row.Core mutation tools support
dry_run=Trueso clients can preview changes before saving a workbook.
License
MIT. See LICENSE.
Available Tools
83 toolsaggregate_tableCRead-only
Compute grouped metrics over worksheet-shaped data or a native Excel table.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| filters | No | ||
| metrics | No | ||
| sort_by | No | ||
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| group_by | No | ||
| row_mode | No | arrays | |
| sort_desc | No | ||
| header_row | No | ||
| sheet_name | No | ||
| table_name | No | ||
| infer_schema | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already covers the safety profile, so the tool is honest about being a read. Beyond that the description adds no behavior: no indication of how metrics/filters are applied, whether missing group_by means a single total, how limit interacts with ordering, or what happens when both table_name and worksheet data are plausible.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler, which is structurally good. For a 12-parameter aggregation tool, though, this level of brevity crosses into under-specification rather than efficient conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Twelve parameters, near-zero schema descriptions, no output schema, and a one-line description leave the agent without enough to call this correctly. It lacks any explanation of metric/filter shapes, output shape, or the sheet-vs-table selection logic.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With roughly 0% schema description coverage across roughly 10 parameters (filters, metrics, group_by, sort_by, sort_desc, limit, row_mode, header_row, table_name, infer_worksheet), the description carries the full explanatory burden and explains none of them. The object-shaped filters/metrics arrays are especially opaque without guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb ('compute grouped metrics') and resource ('worksheet-shaped data or a native Excel table'), so the general idea of a read-only grouped aggregation is conveyed. However, 'worksheet-shaped data' is vague and nothing distinguishes this from close siblings like query_table, create_pivot_table, or bulk_aggregate_workbooks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The sentence says nothing about when to use this tool versus alternatives, no prerequisites (e.g. sheet vs table selection, header row expectations), and no exclusions. An agent must infer routing entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analyze_range_impactBRead-only
Inspect workbook structures that overlap a worksheet range before mutation.
| Name | Required | Description | Default |
|---|---|---|---|
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| range_ref | Yes | ||
| sheet_name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe read, so the description is not carrying the safety burden. It adds the meaningful framing that this is a pre-mutation impact check. However, it doesn't disclose what the result contains (a list of affected structures? a risk summary?) or how exhaustive the analysis is, which is the core behavioral question for an 'impact' tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler; the precondition is placed at the end where it reads naturally. It is efficient, though the brevity edges into under-specification given the tool's analytic complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Three required parameters, no output schema, and only one-third schema description coverage — this description needed to explain the range format and what 'structures' means. It does neither, so an agent can call it but cannot predict or interpret its result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 33%: filepath is well-documented in the schema, but range_ref and sheet_name have no descriptions at all. The description does not compensate — it never specifies the range_ref notation (A1? sheet-qualified? named range?) or whether sheet_name scopes the analysis or is just context. For a low-coverage schema this is a real gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Inspect') and a scoped resource ('workbook structures that overlap a worksheet range'), plus a temporal qualifier ('before mutation'). The ambiguity is that 'structures' is never enumerated — an agent can't tell whether it covers merged cells, tables, named ranges, validation, conditional formats, or formulas — though the aggregate/impact framing does separate it from point-inspection siblings like get_merged_cells or list_named_ranges.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'before mutation' implies the usage context (a pre-write safety check), which is genuine guidance. But no alternative is named, no exclusion is stated, and there's no guidance on which mutation tools it should precede or whether it's required vs. optional.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
append_excel_table_rowsCDestructive
Append rows to a native Excel table and expand its range safely.
| Name | Required | Description | Default |
|---|---|---|---|
| rows | Yes | ||
| dry_run | No | ||
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| sheet_name | No | ||
| table_name | Yes | ||
| include_changes | No | ||
| allow_structure_change | No | ||
| expected_structure_token | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotation already declares destructiveHint=true, and the description adds the useful facts that rows are appended and the table's range is expanded. However, 'safely' is unsubstantiated: nothing explains what 'expand its range' actually changes, what can go wrong, or how the dry_run / allow_structure_change / structure-token guards behave. Safety-profile coverage is inherited from annotations rather than earned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; every word is about the action and its effect. It is tight but borders on under-specified rather than padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An eight-parameter, destructive, structure-token-guarded mutation with no output schema needs far more description than one sentence. The agent is left without any explanation of the guard parameters or the return shape, which is inadequate for a write operation of this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 13% (only filepath is documented), so the description must compensate for eight parameters and does not touch any of them. Critical semantics — the shape/keys of 'rows', what dry_run previews, when expected_structure_token must be supplied, and what allow_structure_change permits — are undisclosed in either the schema or the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('append rows') and resource ('native Excel table'), plus the side effect of expanding the table range. It does not distinguish itself from siblings append_table_rows or upsert_excel_table_rows, so an agent must guess which append variant to use.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no when-to-use context, no prerequisites, and no exclusions. With near-identical siblings (append_table_rows, upsert_excel_table_rows, update_rows_by_key) in the toolset, the absence of routing guidance is a real gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
append_table_rowsCDestructive
Append dictionary-shaped rows by matching worksheet headers on a worksheet dataset.
| Name | Required | Description | Default |
|---|---|---|---|
| rows | Yes | ||
| dry_run | No | ||
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| header_row | No | ||
| sheet_name | Yes | ||
| include_changes | No | ||
| allow_structure_change | No | ||
| expected_structure_token | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds one genuine behavioral fact — rows are dicts matched against existing worksheet headers — but annotations already flag destructiveHint=true, and the description never explains what makes this destructive, that appending may extend the sheet, or what allow_structure_change/expected_structure_token guard against. For a destructive write with an 8-parameter surface, that is a significant disclosure gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the core mechanism is stated first. Its brevity is efficient, though it borders on under-specification for the tool's complexity rather than being verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 8 parameters, a destructive mutation, low schema coverage, and no output schema to explain results, the description leaves the agent without critical context — notably the dry-run preview path and the structure-change safety token. What is present is accurate but far from sufficient for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 13% (just filepath), so the description must carry the load and largely does not. The phrase 'dictionary-shaped rows by matching worksheet headers' usefully clarifies the required `rows` shape, but dry_run, header_row, include_changes, allow_structure_change, and expected_structure_token get no explanation at all.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (append), resource (rows), and mechanism (matching worksheet headers), which is enough for an agent to know this writes new records rather than updating existing ones. It does not explicitly distinguish itself from close siblings like append_excel_table_rows or upsert_excel_table_rows, leaving the 'worksheet dataset' vs 'excel table' boundary to be inferred.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no statement of when to prefer this over append_excel_table_rows, upsert_excel_table_rows, update_rows_by_key, or write_data_to_excel. Nothing tells the agent when dry_run or expected_structure_token should be employed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apply_formulaCDestructive
Apply Excel formula to cell. Excel formula will write to cell with verification.
| Name | Required | Description | Default |
|---|---|---|---|
| cell | Yes | ||
| formula | Yes | ||
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| sheet_name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The destructiveHint annotation already signals mutation, and the description adds useful context that the formula will be written with verification. However, it does not explain whether existing cell content is overwritten, whether recalculation occurs, or how verification failures are surfaced.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded with the core action. The second sentence is slightly redundant by repeating 'Excel formula', but it adds the verification behavior and does not waste much space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation tool with four required parameters, 25% schema coverage, and no output schema, the description is too thin. It omits overwrite behavior, formula evaluation expectations, and error/verification details that an agent would need to invoke it confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 25%, with meaningful guidance only for filepath. The description does not compensate by explaining the expected format for formula, how cell references should be specified, or how sheet_name interacts with cell.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: apply an Excel formula to a cell. It is clear enough to distinguish from validation or inspection siblings, but it does not explicitly name or differentiate those alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies usage for writing a formula into a cell, but gives no guidance on when to use this instead of validate_formula_syntax, write_data_to_excel, or inspect_formula. No exclusions or prerequisites are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apply_table_patchADestructive
Preview/commit a three-way keyed patch against a pinned retained base.
patch requires version=1, source={table_name, optional sheet_name}, nonempty
key_fields, explicit read_fields (use [] only for no extra dependencies), and
updates=[{key: {all key fields}, values: {literal field updates}}]. Write fields
must not be keys/read_fields. Checks complete unique keys and row-local read
dependencies; does not infer undeclared or cross-row dependencies. Existing
rows only, same exact headers with reordering allowed, no formula evaluation.
Conflicts/missing rows/changed premises block the entire batch. Commit requires
the identical patch/base and rebase_token/expected_workbook_sha256 from a fresh
preview. Reuses ChangeSet snapshots, exact-file checks and rollback. Limits:
1000 target cells, 50 contiguous column spans, 50000 table cells/64 columns per
source; sample_limit 1-10 bounds examples only. Tokens are not authentication.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | preview | |
| patch | Yes | ||
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| rebase_token | No | ||
| sample_limit | No | ||
| base_filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| expected_base_sha256 | Yes | ||
| expected_workbook_sha256 | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Well beyond the destructiveHint=true annotation, the description discloses that conflicts/missing rows/changed premises block the entire batch, that commit demands an identical patch/base plus token and sha256 from a fresh preview, that ChangeSet snapshots and rollback are reused, and that tokens are not authentication. It even quantifies limits (1000 target cells, 50 spans, 50000 cells/64 columns, sample_limit 1-10), giving the agent a full behavioral profile before invoking a destructive operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and constraints are front-loaded, and nearly every clause carries non-redundant operational detail (validations, blocking rules, commit prerequisites, limits). The middle paragraph is dense and multi-clause, which costs some readability, but it is compact relative to the complexity of an 8-parameter destructive patch tool rather than padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex, destructive, nested-object tool with no output schema, the description covers invocation requirements, validations, blocking conditions, and limits thoroughly. The notable gap is what the preview returns (the actual shape of the token, examples, or conflict report), which the agent would need to interpret results — but safety and invocation semantics are fully addressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 25% and the critical `patch` parameter is an opaque free-form object in the schema, yet the description fully specifies its required structure (version=1, source={table_name, sheet_name}, nonempty key_fields, explicit read_fields with [] semantics, updates=[{key, values}]) and the constraint that write fields must not be keys or read_fields. It also clarifies mode behavior, what sample_limit bounds, and the role of rebase_token/expected_workbook_sha256 — compensating almost entirely for the sparse schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb (preview/commit), resource (three-way keyed patch), and target (pinned retained base) in a single well-formed clause. The body enumerates the exact patch shape and operation semantics, making the purpose unmistakable. It stops short of naming a sibling tool it replaces (e.g., apply_workbook_changeset or update_rows_by_key), so differentiation is by capability rather than by explicit routing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is implied through the preview/commit split and the statement that commit requires a fresh preview's rebase_token/expected_workbook_sha256. It also lists blocking conditions (conflicts, missing rows, changed premises). However, there is no explicit 'use this when / use X instead' guidance against the many sibling mutation tools, so the agent must infer the boundary itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apply_workbook_changesetADestructive
Preview or commit an assertion-backed group of workbook mutations as one transaction.
Each operation is {"tool": "name", "args": {...}}. Supported tool names are
create_worksheet, write_data_to_excel, format_range, format_ranges, freeze_panes,
set_autofilter, set_column_widths, set_row_heights, autofit_columns, create_table,
and create_chart. Assertions support sheet_exists, cell_equals, range_equals,
range_values_unchanged, table_exists, freeze_panes_equals, autofilter_equals,
chart_exists, and no_cell_ref_errors.
Call preview first. Commit the identical plan with expected_workbook_sha256 and
changeset_token from that preview. Snapshot creation defaults to enabled.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | preview | |
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| assertions | No | ||
| operations | Yes | ||
| sample_limit | No | ||
| changeset_token | No | ||
| create_snapshot | No | ||
| snapshot_filepath | No | ||
| expected_workbook_sha256 | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations supply only destructiveHint=true, and the description adds real value on top: transactional grouping, an enforced preview→commit handshake bound to a workbook SHA and token, and the fact that snapshot creation defaults to enabled. It stops short of stating rollback/atomicity semantics on partial failure or what happens if the SHA no longer matches.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then the data shapes, then the workflow — three tight paragraphs with no filler. The long enumerations are necessary because the schema does not constrain those object shapes, so every token earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter destructive batch tool with no output schema, the description covers the plan format, verification strategy, and commit safety contract. Gaps remain around failure/rollback behavior and what the preview response contains (tokens, samples), which an agent must infer from the parameter names.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With only 11% schema coverage, the description carries most of the load and does so for the important parameters: the operations element shape ({tool, args}), the valid tool names, the valid assertion types, plus changeset_token and expected_workbook_sha256. It leaves sample_limit and snapshot_filepath unexplained, and mode is only inferable from 'preview or commit'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — preview or commit a group of workbook mutations as a single transaction — and immediately distinguishes itself from the many single-operation siblings (write_data_to_excel, format_range, freeze_panes) by being the batch/transactional entry point. The enumeration of composable tool names makes the scope unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Call preview first. Commit the identical plan with expected_workbook_sha256 and changeset_token from that preview" gives an explicit two-phase workflow with the exact inputs required at each step. It does not state when an agent should prefer this over calling the individual mutation tools directly, which is the one missing routing cue.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apply_workbook_repairsBDestructive
Apply safe workbook repair actions with dry-run planning and before/after diff output.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | ||
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| header_row | No | ||
| sheet_names | No | ||
| repair_types | No | ||
| sample_limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, so the safety profile is partly covered. The description adds useful behavioral context by mentioning dry-run planning and before/after diff output, but it does not explain what kinds of changes are destructive, whether repairs are reversible, or what permissions are needed. The word 'safe' is also somewhat vague against a destructive annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no filler. Every phrase contributes to the stated purpose and safety mechanism.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a destructive six-parameter tool with no output schema and very low schema description coverage. The one-sentence description is too thin to fully prepare an agent to invoke it correctly; it omits repair scope, parameter meanings, and risk details beyond the dry-run and diff mention.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 17%, with only filepath documented in the schema. The description does not explain repair_types, sheet_names, header_row, sample_limit, or the dry_run default, so it fails to compensate for the low parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Apply safe workbook repair actions.' An agent can tell this tool mutates workbook repairs rather than reading or planning. It does not explicitly differentiate itself from the sibling plan_workbook_repairs or apply_workbook_changeset, so it misses the top score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description mentions dry-run planning but does not explain when to use this tool versus plan_workbook_repairs or apply_workbook_changeset. There is no explicit guidance on prerequisites, when a dry run should be used first, or when to avoid applying repairs directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
audit_workbookCRead-only
Audit workbook structure for high-signal issues that affect agent workflows.
| Name | Required | Description | Default |
|---|---|---|---|
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| header_row | No | ||
| sample_limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe read, so the description's remaining job is to disclose what the audit actually examines and returns. It does not: no categories of issues, no severity model, no indication of cost or scoping, and no output schema exists to compensate. Only the vague 'high-signal' qualifier is added.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler or repetition. It is appropriately sized, though the economy comes at the cost of substance rather than through efficient packing of useful detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, three parameters at 33% coverage, and no annotation beyond readOnlyHint, the description should describe what an audit returns and how the two optional tuning parameters change it. Neither is covered, so an agent can select the tool but not invoke or interpret it confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33% — only filepath is documented (and that documentation lives in the schema, not the description). header_row and sample_limit carry no explanation anywhere, and the description never mentions them, so an agent cannot tell what header_row=1 means for detection or what sample_limit bounds.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Audit workbook structure') plus the class of finding ('high-signal issues that affect agent workflows'), so an agent knows roughly what it produces. It does not distinguish itself from near-siblings such as inspect_workbook_contract, profile_workbook, or describe_sheet_layout, leaving overlap unaddressed.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to choose this over inspect_workbook_contract, profile_workbook, or describe_dataset, nor any prerequisite or exclusion. The phrase 'affects agent workflows' gestures at a use case but never states a condition for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
autofit_columnsCDestructive
Auto-fit worksheet columns based on content width.
| Name | Required | Description | Default |
|---|---|---|---|
| columns | No | ||
| dry_run | No | ||
| padding | No | ||
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| max_width | No | ||
| min_width | No | ||
| sheet_name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotation declares destructiveHint=true, yet the description does not state that this tool mutates and saves the workbook, nor that dry_run exists as a preview escape hatch. 'Based on content width' hints at the algorithm but discloses nothing about persistence, overwrite of existing widths, or reversibility.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The single sentence is front-loaded and wastes no words, but its brevity here reflects under-specification rather than efficiency given seven parameters and a mutation side effect.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, 7-parameter mutation tool with no output schema and near-zero schema descriptions, the description should at minimum cover the columns scoping, dry_run preview, and padding/bounds parameters. None of that is present, leaving the agent likely to call it with defaults blindly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 14% (only filepath documented), and the description mentions none of the five other parameters: columns, dry_run, padding, min_width, max_width. With the description silent and the schema bare, the agent cannot know how to scope the fit to specific columns or tune width bounds.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Auto-fit worksheet columns') and gives the basis for sizing ('content width'), so the core action is understandable. However, it never distinguishes itself from the sibling set_column_widths, which an agent could easily confuse with this tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to auto-fit versus explicitly setting widths via set_column_widths, and no mention of prerequisites such as the sheet needing to exist or be writable. The agent must infer all routing decisions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulk_aggregate_workbooksCRead-only
Aggregate comparable worksheet or table data across multiple workbooks.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| filters | No | ||
| metrics | No | ||
| sort_by | No | ||
| group_by | No | ||
| row_mode | No | arrays | |
| filepaths | Yes | ||
| sort_desc | No | ||
| header_row | No | ||
| sheet_name | No | ||
| table_name | No | ||
| schema_mode | No | strict | |
| infer_schema | No | ||
| source_sample_limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation establishes that this is a safe read operation, and the description is consistent with that. However, beyond the annotation, the description adds only the scope 'across multiple workbooks' and does not explain output shape, schema handling, limits, or what happens with non-comparable data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler. It is concise, though extremely sparse given the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter aggregation tool with no output schema and almost no annotation detail, the description is far too thin. An agent cannot reliably infer how to use schema_mode, infer_schema, filters, metrics, grouping, sorting, or row modes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are 14 parameters with 0% schema description coverage, so the description must compensate for parameter semantics. It explains none of them: filters, metrics, group_by, sort_by, row_mode, schema_mode, infer_schema, source_sample_limit, header_row, sheet_name, and table_name are all left undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: aggregate comparable worksheet or table data across multiple workbooks. It is clear enough for an agent to grasp the core operation, but it does not distinguish this tool from siblings such as aggregate_table, union_tables, or cross_workbook_lookup.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by mentioning multiple workbooks, but it gives no explicit when-to-use or when-not-to-use guidance. It also fails to name alternatives like aggregate_table, bulk_filter_workbooks, or query_table.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulk_filter_workbooksCRead-only
Filter comparable worksheet or table data across multiple workbooks. Uses the same filter operators and aliases as query_table.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| select | No | ||
| filters | No | ||
| sort_by | No | ||
| row_mode | No | arrays | |
| filepaths | Yes | ||
| sort_desc | No | ||
| header_row | No | ||
| sheet_name | No | ||
| table_name | No | ||
| schema_mode | No | strict | |
| infer_schema | No | ||
| source_sample_limit | No | ||
| include_source_columns | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is covered. Beyond that the description discloses almost nothing: it doesn't explain what happens when schemas differ across files, how schema_mode 'strict' vs 'infer_schema' changes behavior, or what source_sample_limit and include_source_columns do to the result.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with zero filler, and the core action is front-loaded. The brevity is efficient rather than padded, though it comes at the cost of the missing detail noted above.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter, cross-workbook aggregation tool with no output schema, the definition is far too thin. Schema reconciliation behavior, output shape (concatenated rows? per-file grouping?), and error handling for mismatched workbooks are all unstated, so an agent cannot confidently predict results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 14 parameters, so only 'filepaths' carries any documentation at all. The description's only semantic contribution is pointing to query_table for filter operator syntax; it says nothing about limit, select, row_mode, sort_by/sort_desc, header_row, schema_mode, infer_schema, or source_sample_limit, leaving most parameters undocumented in both places.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Filter ... worksheet or table data') plus the multi-workbook scope, and names the sibling whose semantics it mirrors (query_table). An agent can distinguish it from query_table on the single-vs-multiple-workbook axis. The adjective 'comparable' is left unexplained, which slightly weakens the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The clause 'Uses the same filter operators and aliases as query_table' implies this is the batch counterpart to that tool, which is useful routing context. However, there is no explicit when-to-use/when-not statement and nothing about which path to take when the workbooks are not in fact comparable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
copy_rangeCDestructive
Copy a range of cells to another location.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | ||
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| sheet_name | Yes | ||
| source_end | Yes | ||
| source_start | Yes | ||
| target_sheet | No | ||
| target_start | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations declare destructiveHint=true, so the agent knows this is a mutation, but the description does not disclose what gets destroyed or overwritten. It does not explain that copying to an occupied target may replace existing cell contents, which is critical behavioral context for a destructive operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The single sentence is front-loaded and free of filler, but it is under-specified for a seven-parameter destructive mutation. Conciseness is not the issue; the description is too thin for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, sparse annotations, and very low schema description coverage, the description should carry more weight. It omits overwrite behavior, range format expectations, dry_run semantics, and target sheet defaults, leaving significant gaps for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 14% across seven parameters, so the description must compensate—but it provides no detail on parameter meaning. It does not specify the expected range notation for source_start, source_end, or target_start, whether target_start is a top-left anchor, or what dry_run does.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ("Copy a range of cells") and a destination ("to another location"), which is clear enough to understand the operation. It does not differentiate from sibling tools like copy_worksheet or delete_range, leaving the agent to infer the distinction from names alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives, no prerequisites (e.g., target sheet must exist), and no exclusions. The agent is told what it does but not when to choose it over sibling operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
copy_worksheetCDestructive
Copy a worksheet with tables, rules, charts, names, and layout settings.
| Name | Required | Description | Default |
|---|---|---|---|
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| source_sheet | Yes | ||
| target_sheet | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description usefully discloses what content is carried over (tables, rules, charts, names, layout), which goes beyond the destructiveHint=true annotation. However, it never addresses the destructive side: whether an existing target sheet is overwritten, whether the source is consumed, or what happens on name collision — the most important behavioral question for this tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler, but its brevity comes at the cost of under-specification rather than efficiency. For a destructive copy operation with three required parameters, the one-liner is too minimal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given destructiveHint=true, 3 required params, 33% schema coverage, and no output schema, the description leaves critical gaps: overwrite semantics, target creation behavior, and whether permissions/protected sheets affect the copy. It names what gets copied but not how the operation behaves.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33% — filepath is well documented in the schema, but source_sheet and target_sheet carry names only. The description adds no meaning about these two parameters, such as whether target_sheet must be a new name or an existing sheet, so it fails to compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (copy) and resource (worksheet), and enumerates what is carried over: tables, rules, charts, names, layout settings. It implicitly distinguishes itself from copy_range by scoping to the whole sheet, though it never explicitly contrasts with that sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus copy_range or create_worksheet, and no prerequisites such as whether target_sheet must already exist or whether an existing sheet is overwritten. The agent must infer the usage context entirely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_chartADestructive
Create chart in worksheet from a contiguous range or explicit series.
This is the preferred chart authoring entry point; explicit-series calls are
also still available via create_chart_from_series for backward compatibility.
| Name | Required | Description | Default |
|---|---|---|---|
| style | No | ||
| title | No | ||
| width | No | ||
| height | No | ||
| series | No | ||
| x_axis | No | ||
| y_axis | No | ||
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| placement | No | ||
| chart_type | Yes | ||
| data_range | No | ||
| sheet_name | Yes | ||
| target_cell | No | ||
| categories_range | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, but the description adds no behavioral context about what may be overwritten (e.g., an existing chart at target_cell), placement side effects, or permissions. It is consistent with the create mutation, so no contradiction, but it does not go beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with the primary purpose front-loaded; the sibling note is useful routing rather than padding. There is essentially no wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter mutation tool with 7% schema coverage and no output schema, the description is too thin. It does not cover required chart_type values, valid series/range forms, placement collision behavior, or output/return expectations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 7%; only filepath is documented. The description hints at data_range and series but says nothing about chart_type values, series object shape, placement, target_cell, categories_range, style, width/height, or axes, leaving most of 14 parameters unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence gives a specific verb and resource ('Create chart in worksheet') and explicitly names the two input modes, contiguous range or explicit series. It also distinguishes this tool from sibling create_chart_from_series by calling itself the preferred entry point.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states this is the preferred chart authoring entry point and directs legacy explicit-series use to create_chart_from_series. It does not explain when the sibling is actually required rather than merely available, nor when to prefer data_range over series, but the primary routing is explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_chart_from_seriesCDestructive
Create a chart from explicit series definitions for non-contiguous ranges.
| Name | Required | Description | Default |
|---|---|---|---|
| style | No | ||
| title | No | ||
| width | No | ||
| height | No | ||
| series | No | ||
| x_axis | No | ||
| y_axis | No | ||
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| placement | No | ||
| chart_type | Yes | ||
| sheet_name | Yes | ||
| target_cell | No | ||
| categories_range | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations supply only destructiveHint=true; the description adds no behavioral context at all — nothing about where the chart is inserted (placement/target_cell), whether it can overwrite an existing chart, or that it mutates the workbook file. For a 13-parameter mutation tool this leaves almost everything undisclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single well-formed sentence with the differentiating qualifier front-loaded and no filler. It is efficient, though its brevity is more a symptom of under-specification than of disciplined editing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 13 parameters, 8% schema description coverage, no output schema, and only a destructiveHint annotation, the description would need to carry far more. It omits chart_type values, series object shape, placement semantics, and any note on mutation effects, leaving an agent unable to call it confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 8% (just filepath), and the description only vaguely gestures at two of the thirteen parameters via 'series definitions' and 'non-contiguous ranges' (i.e., series, categories_range). Required parameters like chart_type and sheet_name, plus placement, target_cell, style, and axis labels, get zero semantic guidance and chart_type has no enum.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a chart') and adds a scope qualifier ('from explicit series definitions for non-contiguous ranges') that implicitly distinguishes it from the sibling create_chart. It stops short of naming create_chart, so the contrast must be inferred rather than read.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'for non-contiguous ranges' implies the selection condition, but the description never says when to prefer create_chart instead, nor does it mention prerequisites such as an existing workbook/sheet or whether the chart is appended vs. placed. Usage is inferable but not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_named_rangeCDestructive
Create a workbook-level or sheet-scoped named range.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| hidden | No | ||
| dry_run | No | ||
| replace | No | ||
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| range_ref | Yes | ||
| sheet_name | No | ||
| scope_sheet | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare destructiveHint=true; the description doesn't explain why creation is destructive or what gets destroyed (e.g., an existing range with the same name), nor does it mention the replace, hidden, or dry_run behaviors. The scope wording adds a little context about name visibility/conflicts, but the heavy behavioral burden for an 8-parameter mutation tool is largely unmet.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler, but it is under-specified rather than appropriately concise given the tool's parameter surface. Nothing is wasted, yet very little is said.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter, destructive-annotated mutation tool with 13% schema coverage and no output schema, the description should at minimum explain overwrite/replace behavior, scope semantics, and dry_run. Almost all of that is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 13% — only filepath is documented in the schema. The description gestures at scope via 'workbook-level or sheet-scoped' but never clarifies how sheet_name and scope_sheet differ, nor what replace, hidden, or dry_run do. With seven undocumented parameters, the description does not compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create ... named range') and adds a meaningful scope distinction (workbook-level vs sheet-scoped) that an agent couldn't infer from the name alone. It doesn't explicitly differentiate from siblings like list_named_ranges, inspect_named_range, or delete_named_range, but the create semantics are unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus the other named-range tools, no mention of prerequisites such as whether the workbook must be open/saved, and no explanation of when to prefer sheet-scoped over workbook-level scope. The agent must infer everything from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_pivot_tableCDestructive
Create pivot table in worksheet.
| Name | Required | Description | Default |
|---|---|---|---|
| rows | Yes | ||
| values | Yes | ||
| columns | No | ||
| agg_func | No | sum | |
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| data_range | Yes | ||
| sheet_name | Yes | ||
| replace_existing | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true, so the agent knows this is a mutating operation, but the description adds nothing: it doesn't say that replace_existing overwrites an existing pivot at the same location, where the resulting pivot is placed, or whether the source data is touched. For a destructive 8-parameter mutation, that is a substantial gap beyond what the annotation already says.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short sentence with no filler, but its brevity reflects under-specification rather than economy — the length budget is unused on the information an agent actually needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 8 parameters, 5 of them required, destructiveHint=true, and no output schema, the definition needs to carry serious weight. It says nothing about parameter intent, overwrite semantics, or what is returned, so it is not sufficient to invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 13% (filepath alone is documented), leaving rows, values, columns, agg_func, data_range, sheet_name, and replace_existing as bare titles. The description doesn't compensate at all — no mention of expected aggregation keywords for agg_func ('sum' is only a default in the schema), the address format for data_range, or what null columns means.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create pivot table') and the target location ('in worksheet'), so the basic operation is identifiable. However, it does not distinguish this from nearby aggregation siblings such as aggregate_table, query_table, or create_table, leaving an agent to guess which one to pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this tool rather than aggregate_table, query_table, or create_table, and no prerequisites (sheet must exist, must be unprotected). The only framing is the noun 'pivot table', which the agent has to interpret on its own.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_tableCDestructive
Creates a native Excel table from a specified range of data.
| Name | Required | Description | Default |
|---|---|---|---|
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| data_range | Yes | ||
| sheet_name | Yes | ||
| table_name | No | ||
| table_style | No | TableStyleMedium9 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations declare destructiveHint=true, but the description does not explain what may be destroyed, whether an existing table would be overwritten, or any permission/formatting side effects. With this annotation present, the description should at least acknowledge the destructive implications or conditions under which data may be replaced.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no wasted words. However, its brevity is also the source of missing behavioral and parameter context, which is captured elsewhere.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with destructiveHint=true, five parameters, and no output schema, the description is too sparse. It omits overwrite behavior, table naming/style options, and any indication of what the tool returns or how it interacts with existing tables.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 20%, and the description adds no information about table_name, table_style, or sheet_name. It only vaguely references 'a specified range of data,' leaving four of five parameters undocumented in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 native Excel table from a specified range of data.' It is clear what the tool does, but it does not distinguish this from sibling tools such as create_pivot_table, list_tables, or read_excel_as_table.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use create_table versus alternatives like create_pivot_table, list_tables, or append_table_rows. No prerequisites, exclusions, or selection criteria are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_workbookCDestructive
Create a new Excel workbook with an optional initial worksheet name.
| Name | Required | Description | Default |
|---|---|---|---|
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| sheet_name | No | Sheet1 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true, which strongly suggests the call can overwrite/clobber an existing file at filepath, yet the description never mentions overwrite behavior, error handling, or what is returned. For a file-creating mutation whose safety profile is flagged destructive, this is a meaningful omission.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no waste. It is short, though that brevity contributes to the gaps elsewhere rather than reflecting efficient information density.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema and no annotations describing return values, so the description should say what comes back (workbook object, path, metadata) and whether an existing file is overwritten. Neither is covered, leaving the agent unable to predict side effects of a destructive-flagged call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%: filepath has a detailed path-handling description in the schema, but sheet_name has no description there. The description only restates that the sheet name is optional and initial; it adds no format constraints (length, invalid characters, behavior if the sheet name already exists) and doesn't reinforce the path rules.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear verb+resource: 'Create a new Excel workbook' with an optional initial worksheet. It is distinguishable from create_worksheet (which adds a sheet to an existing workbook) by implication, though the description never explicitly contrasts them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus create_worksheet, create_workbook_snapshot, or write_data_to_excel. The agent gets no conditions, prerequisites, or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_workbook_snapshotBDestructive
Create a verified workbook snapshot without overwriting an existing file.
| Name | Required | Description | Default |
|---|---|---|---|
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| snapshot_filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true (a file is written), and the description adds a genuinely useful constraint: an existing file will not be overwritten. However, it does not say whether the call errors or silently no-ops when the target exists, what 'verified' checks, or what permissions/paths are required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence with no filler; the non-overwrite constraint is stated up front. The only inefficiency is the unexplained qualifier 'verified', which costs a word without conveying behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter file-writing tool with no output schema and no readOnly hint, the definition covers the essential guard (no overwrite) but omits return behavior and failure modes an agent needs to plan around. Adequate, not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both path parameters carry detailed routing guidance (server-relative vs absolute on unrooted stdio), so the schema does the heavy lifting. The description adds no meaning about how filepath and snapshot_filepath relate or whether they may coincide — baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('create a verified workbook snapshot'), so the action is unambiguous. It does not differentiate itself from neighbors like create_workbook or diff_workbooks, nor does it explain what 'verified' adds, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description never says when to snapshot versus copying a workbook, diffing, or committing changes via apply_workbook_changeset. There are no prerequisites or exclusions — only an implicit clue that the call is meant for recording a state before mutation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_worksheetCDestructive
Create new worksheet in workbook.
| Name | Required | Description | Default |
|---|---|---|---|
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| sheet_name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The only annotation is destructiveHint=true, with no readOnlyHint, so the agent knows this mutates state — but the description adds nothing beyond that. It does not say what happens if a sheet with that name already exists, whether the file must be closed, or what write permissions are needed. For a mutation tool with minimal annotation coverage, this leaves significant behavioral gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The single sentence is front-loaded and waste-free, but its brevity comes at the cost of under-specification rather than genuine economy. It is concise without being informative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a file-mutating tool with no output schema, half its parameters undocumented, and no stated duplicate-name behavior, the description is too thin. An agent cannot predict success/failure conditions or the result of the call from this text alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%: filepath has a rich description, but sheet_name is completely bare. The tool description does not compensate — it says nothing about sheet_name uniqueness, the 31-character Excel limit, or invalid characters, which are the most common failure modes for this operation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb ('Create') and resource ('new worksheet in workbook'), so the agent knows exactly what the tool does. It does not, however, differentiate itself from siblings like copy_worksheet, rename_worksheet, or create_workbook, which all touch sheets in the same workbook.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this versus copy_worksheet (to duplicate an existing sheet) or create_workbook (when no workbook exists yet), and no prerequisites are stated. The agent must infer the usage context entirely from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cross_workbook_lookupCRead-only
Enrich one workbook dataset from matching rows in one or more lookup workbooks.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| select | No | ||
| row_mode | No | arrays | |
| join_type | No | left | |
| lookup_key | No | ||
| match_mode | No | first | |
| source_key | Yes | ||
| schema_mode | No | strict | |
| infer_schema | No | ||
| lookup_select | No | ||
| case_sensitive | No | ||
| lookup_sort_by | No | ||
| source_filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| lookup_filepaths | Yes | ||
| lookup_sort_desc | No | ||
| lookup_header_row | No | ||
| lookup_sheet_name | No | ||
| lookup_table_name | No | ||
| source_header_row | No | ||
| source_sheet_name | No | ||
| source_table_name | No | ||
| lookup_sample_limit | No | ||
| include_lookup_match_count | No | ||
| include_lookup_source_columns | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation only confirms this is a non-mutating read, so the description carries the rest of the burden and discloses almost nothing. With 24 parameters controlling join_type, match_mode, schema_mode, and row_mode -- all of which materially change behavior -- plus no output schema, the description gives no insight into what happens with multiple lookup workbooks, duplicate matches, or schema mismatches.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no padding and the core operation stated first. It is efficient, though the extreme brevity for a 24-parameter tool suggests under-specification rather than genuine editorial discipline.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 24 parameters, 4% schema coverage, no output schema, and only a readOnlyHint annotation, the definition leaves far too much unspecified. An agent cannot determine what the enriched result looks like, how multiple lookups compose, or how the mode parameters interact.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 4%: only source_filepath and lookup_filepaths items carry descriptions, leaving roughly 22 parameters documented by title alone. The phrase 'one or more lookup workbooks' faintly echoes that lookup_filepaths is a list, but the description adds nothing about join_type, match_mode, or the select/limit parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description pairs the specific verb 'Enrich' with the resource 'workbook dataset' and clarifies that the enrichment comes from matching rows in lookup workbooks, so it reads as a join/lookup operation. It is distinguishable from siblings such as union_tables or aggregate_table, though it never names an alternative explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this instead of union_tables, query_table, or bulk_filter_workbooks, and no prerequisites or exclusions. The agent must infer the tool's role from the name and description alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_named_rangeCDestructive
Delete a workbook-level or sheet-scoped named range.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| dry_run | No | ||
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| scope_sheet | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, so the safety profile is carried structurally. The description adds only the scope distinction and says nothing about irreversibility, error behavior when the name is absent, or what a dry run reports — the key behavioral affordances an agent needs for a destructive call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the verb and its object appear immediately. Nothing is redundant or padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation with four parameters, 25% schema coverage, and no output schema, the description is too thin. It omits dry_run, missing-range behavior, and confirmation/error semantics, leaving the agent to guess on the risky parts of the call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 25% (only filepath is documented), so the description must compensate. It partially explains scope_sheet by contrasting 'workbook-level' versus 'sheet-scoped', but leaves 'name' matching semantics and especially 'dry_run' — the most important parameter for a destructive tool — entirely unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (delete a named range) and adds that both workbook-level and sheet-scoped ranges can be targeted. It does not explicitly route against siblings like create_named_range, inspect_named_range, or list_named_ranges, but 'named range' is specific enough that confusion is unlikely.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description never says when to use this versus list_named_ranges/inspect_named_range first, nor any preconditions (must the range exist, must the sheet exist, does a dry run need to precede it). Usage is only inferable from the verb itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_rangeCDestructive
Delete a range of cells and shift remaining cells.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | ||
| end_cell | Yes | ||
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| sheet_name | Yes | ||
| start_cell | Yes | ||
| shift_direction | No | up |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The destructiveHint annotation already flags this as a destructive operation. The description adds useful behavioral context by saying remaining cells shift, but it does not explain the shift_direction option, the dry_run option, or whether the deletion is reversible.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single efficient sentence with the core action front-loaded. It does not waste words, though its brevity contributes to gaps in usage and parameter guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a destructive mutation tool with six parameters, low schema coverage, and no output schema. The description omits important details about shift direction, dry-run behavior, cell address format, and when to choose this tool over row/column deletion siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 17%, with just filepath documented in the schema. The description does not explain start_cell, end_cell, sheet_name, shift_direction, or dry_run, so it fails to compensate for the sparse schema documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: delete a range of cells. It also notes that remaining cells shift, which clarifies the effect. It is clear on its own but does not distinguish itself from sibling tools such as delete_sheet_rows or delete_sheet_columns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to use this tool versus alternatives like delete_sheet_rows, delete_sheet_columns, or delete_worksheet. It also provides no exclusions or prerequisites for range deletion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_sheet_columnsCDestructive
Delete one or more columns starting at the specified column.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | ||
| dry_run | No | ||
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| start_col | Yes | ||
| sheet_name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, so the safety profile is covered; the description adds nothing beyond it. It doesn't say that remaining columns shift left, that data in the deleted columns is unrecoverable, or that a `dry_run` option exists to preview the effect.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. It is efficient, though the brevity is a byproduct of omission rather than disciplined editing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A destructive, 5-parameter mutation tool with no output schema and 20% parameter coverage needs more: irreversibility, dry_run behavior, and the column-shift side effect are all absent. An agent could call it correctly on syntax but not safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 20% (only `filepath` is documented), so the description carries most of the burden. It does explain `start_col` and `count` ('one or more columns starting at ...'), but leaves `sheet_name` and critically `dry_run` completely unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete ... columns') plus the positional semantics ('starting at the specified column'), which distinguishes it from insert_columns and delete_sheet_rows. It stops short of naming alternatives explicitly, but the operation is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus delete_range, delete_sheet_rows, or insert_columns, and no prerequisites (e.g., worksheet protection, whether the sheet must be unprotected). The one decision that matters most for a destructive tool — whether to dry-run first — is never mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_sheet_rowsCDestructive
Delete one or more rows starting at the specified row.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | ||
| dry_run | No | ||
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| start_row | Yes | ||
| sheet_name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already disclose destructiveHint=true, so the destructive nature is covered. The description adds useful scope by saying it deletes one or more rows starting at start_row, but it does not explain irreversibility, whether dry_run previews changes, or any permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no wasted words. However, for a destructive five-parameter tool, that brevity leaves significant omissions, so it is concise but arguably too sparse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and a destructive operation, the description should clarify dry_run behavior, required filepath/sheet_name context, and consequences of deletion. It leaves those gaps despite annotations only covering destructiveness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 20%, and the description compensates only partially by implying that count and start_row define a contiguous row deletion. It does not clarify dry_run, sheet_name, or how filepath should be supplied beyond the schema's filepath note.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: delete rows, with scope 'starting at the specified row' and 'one or more rows.' It distinguishes itself from delete_sheet_columns by operating on rows, but it does not explicitly name or contrast sibling tools such as delete_range or insert_rows.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to use this tool versus alternatives like delete_range, delete_sheet_columns, or insert_rows. It also omits prerequisites or conditions such as confirming a destructive operation or using dry_run first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_worksheetCDestructive
Delete worksheet from workbook.
| Name | Required | Description | Default |
|---|---|---|---|
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| sheet_name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The destructiveHint annotation already flags this as a write/destroy operation. The description adds nothing further: it doesn't say deletion is irreversible, whether data in the sheet is lost, whether it works on the last remaining sheet, or whether the file on disk is modified. For a destructive operation, that is a meaningful gap even with annotations present.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The single sentence is front-loaded and free of waste, but it is under-specified rather than concise — brevity here comes at the cost of missing behavioral and parameter detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A destructive, two-parameter tool with no output schema and half its parameters undocumented in the schema needs the description to carry more: irreversibility, path handling expectations, and the meaning of sheet_name. Almost all of that is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%: filepath is well documented in the schema, but sheet_name has no schema description at all. The description never mentions either parameter, so it does not compensate for the undocumented sheet_name (the worksheet tab to remove).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Delete worksheet from workbook" names a specific verb and resource, so the basic action is unambiguous. But it adds nothing beyond the tool name and title ("Delete Worksheet"), and does not distinguish it from siblings like delete_range, delete_named_range, or delete_sheet_rows that also destroy content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this versus delete_range, delete_sheet_rows, or rename_worksheet, and no prerequisites such as whether the workbook must be saved or the sheet unprotected. The agent must infer all conditions for use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
describe_datasetCRead-only
Summarize a worksheet or native Excel table for agent-friendly orientation.
| Name | Required | Description | Default |
|---|---|---|---|
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| header_row | No | ||
| sheet_name | No | ||
| table_name | No | ||
| sample_rows | No | ||
| read_boundary_mode | No | default |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already establishes that this is a safe read operation, so the description does not need to restate that. It adds that the tool produces a summary for orientation, but it omits behavioral details such as how sample_rows is used, what the summary contains, or how sheet_name and table_name are resolved.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no wasted words. It is appropriately concise, though the phrase 'agent-friendly orientation' is somewhat vague.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a six-parameter read tool with only one documented parameter, no output schema, and many overlapping sibling tools. The description does not provide enough context about output, parameter behavior, or tool selection to be complete for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 17%, with just the filepath parameter documented. The description hints that the tool works with either a worksheet or a native Excel table, but it does not explain header_row, sample_rows, read_boundary_mode, or the precedence between sheet_name and table_name, so it does not compensate for the low schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource: 'Summarize a worksheet or native Excel table.' It is clear enough to distinguish this from raw data-reading tools, but it does not differentiate itself from close siblings such as describe_sheet_layout, get_workbook_metadata, or profile_workbook.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'for agent-friendly orientation' implies a use case, but there is no explicit guidance on when to choose this tool over alternatives. No sibling tools are named, and no when-not-to-use conditions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
describe_sheet_layoutCRead-only
Return a structural worksheet layout summary for safe dashboard-style edits.
| Name | Required | Description | Default |
|---|---|---|---|
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| sheet_name | Yes | ||
| sample_limit | No | ||
| free_canvas_cols | No | ||
| free_canvas_rows | No | ||
| free_canvas_limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already tells the agent this is a safe read, and the description's "safe" adds nothing beyond that. It does not disclose what the summary contains, how the free-canvas sampling behaves, or any limits, so almost no behavioral context is added on top of structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence that is front-loaded and wastes no words, but its brevity is under-specification rather than efficiency. There is room to spend words on the return shape and parameters without bloat.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Six parameters, no output schema, and 17% schema coverage mean the description has to explain both inputs and what the layout summary reports. It does neither, leaving the agent unable to predict the response or the effect of the free-canvas and sample settings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 17% – only filepath is documented. Five parameters (sheet_name, sample_limit, free_canvas_cols, free_canvas_rows, free_canvas_limit) have no meaning given anywhere, and the description supplies none of the missing semantics. With low coverage the description carries the burden and fails entirely.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Return a structural worksheet layout summary" states a verb and resource, but "structural layout summary" is opaque about what is actually returned (dimensions? merged cells? occupied regions?). It also fails to differentiate from nearby siblings like describe_dataset, get_workbook_metadata, or inspect_workbook_contract, which an agent could plausibly pick instead.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"for safe dashboard-style edits" implies the workflow (inspect before laying out a dashboard), which is genuine but indirect usage guidance. There are no explicit when-not conditions and no named alternatives, so the agent must infer the pre-flight positioning itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
detect_circular_dependenciesCRead-only
Detect circular workbook formula dependencies, including self-references.
| Name | Required | Description | Default |
|---|---|---|---|
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| sample_limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe non-mutating operation, so the description need not re-establish that. It adds the useful scope detail that self-references count as circular, but says nothing about whether the scan covers the whole workbook or a single sheet, how results are reported, or cost on large files.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler and the key scope qualifier placed immediately. Its brevity is close to under-specification rather than elegance, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of explaining the return shape (list of cycles? paths? cells?) and it does not. Combined with an undocumented sample_limit and no statement of scan scope, an agent cannot fully predict what a call yields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50%: filepath is well documented in the schema, but sample_limit has no description anywhere. The tool description says nothing about what sample_limit controls or that its default of 25 bounds the reported cycles, leaving a real gap the description should have closed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (detect) plus resource (circular workbook formula dependencies) and an explicit scope extension (including self-references). It does not, however, distinguish itself from nearby diagnostic siblings such as validate_formula_syntax, inspect_formula, or audit_workbook, which an agent could plausibly reach for instead.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no when-to-use context, no prerequisites, and no routing to alternatives. It never says whether this is the right tool for a full audit versus a single-formula check, even though validate_formula_syntax and audit_workbook are available siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
diff_workbooksBRead-only
Diff two workbook files and report structural changes plus sampled cell-value changes.
| Name | Required | Description | Default |
|---|---|---|---|
| sample_limit | No | ||
| after_filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| before_filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| include_cell_changes | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe, non-mutating operation. The description adds one genuine behavioral trait beyond annotations: cell-value changes are "sampled" rather than exhaustive, which explains why results may be partial. It does not state whether both workbooks must be open, what the sampling default is, or how the diff handles renamed/added sheets.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the resource and the two output categories appear immediately. Nothing is redundant with the title or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of explaining return shape, yet it only broadly characterizes results as structural plus sampled value changes without saying how changes are grouped or reported. For a two-file comparison tool with 4 parameters, this is adequate but leaves an agent guessing about the result format.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50%: the two filepath parameters are documented (server-path conventions, absolute vs relative), but sample_limit and include_cell_changes have no schema descriptions at all. The description's word "sampled" hints at sample_limit's purpose but never explains what is counted, the default of 25, or what include_cell_changes=false suppresses, so the description fails to compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ("Diff") with a clear resource ("two workbook files") and states the output categories ("structural changes plus sampled cell-value changes"). No sibling tool performs a file-to-file diff, so an agent can distinguish it from inspect_workbook_contract or explain_recipe_delta, though the description never names that distinction explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus the many inspection siblings (inspect_workbook_contract, profile_workbook, audit_workbook), nor on prerequisites such as needing both files accessible server-side. The only usage context lives in the schema descriptions for the filepath parameters, not in the tool description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
evaluate_workbook_scenariosADestructive
Compare explicit alternatives read-only, or commit one exact verified outcome.
scenario_set requires version=1, a Recipe v1 (only sum/count; output is never
written), key_fields, guards=[{metric, scope: overall|each_group, min?, max?}],
and scenarios=[{id, updates: [{key: {...}, values: {...}}]}]. Bounds are inclusive
exact comparisons. Each-group checks include all baseline/candidate groups;
missing baseline groups and empty coverage fail. No optimization or forecasting.
One native table, existing keys/literal updates only, no formulas/key changes.
Commit requires the identical set, selected_scenario id, scenario_token and
expected_workbook_sha256 from comparison; source drift requires a new comparison.
Full metric checks run again on the saved workbook under ChangeSet rollback.
Limits: 5 alternatives, 8 sum/count metrics, 20 guards, 50000 source cells,
1000 targets/49 column spans per alternative, 256KB JSON, sample_limit 1-5.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | compare | |
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| sample_limit | No | ||
| scenario_set | Yes | ||
| scenario_token | No | ||
| selected_scenario | No | ||
| expected_workbook_sha256 | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations supply only destructiveHint=true, so the description carries the real burden and does: it discloses that comparison never writes output, that commit re-runs full metric checks on the saved workbook under ChangeSet rollback, that stale source requires re-comparison, and it enumerates hard limits (5 alternatives, 8 metrics, 20 guards, 50000 cells, 256KB JSON, sample_limit 1-5). The write behavior on commit is consistent with destructiveHint=true, not contradictory.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The two-mode framing is front-loaded, and despite the telegraphic, spec-like style every clause carries load: the guard semantics, the commit prerequisites, the rollback re-validation, and the limits all affect correct invocation. It is dense but proportionate to a nested-object tool; minor deduction for the terse phrasing making some constraints harder to parse than they need to be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must imply what the agent gets back, and it does enough by indicating that comparison yields a scenario_token and workbook SHA-256 that commit consumes. For a 7-parameter tool with a deeply nested scenario_set, the documented contract, failure modes, and limits are close to complete; only the concrete shape of the comparison result remains implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 14% (just filepath), so the description must compensate, and it largely does: it spells out scenario_set's required shape (version=1, Recipe v1 restricted to sum/count, key_fields, guards with metric/scope/min/max, scenarios with id/updates), defines bounds as inclusive exact comparisons, and pins sample_limit to 1-5. The remaining gap is the mode parameter, whose accepted values ('compare'/'commit') are only implied by the first sentence rather than stated.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific verb and resource pair with an explicit two-mode split: 'Compare explicit alternatives read-only, or commit one exact verified outcome.' That is far more specific than a tautology, and the scope (scenario sets over a workbook) is unambiguous. It stops short of 5 because it never names or contrasts the nearest sibling workflows (run_workbook_recipe, apply_workbook_changeset) that an agent might otherwise reach for.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear conditions for each mode: compare is read-only and needs only a scenario_set; commit requires 'the identical set, selected_scenario id, scenario_token and expected_workbook_sha256 from comparison,' and source drift forces a new comparison. It also excludes a class of use cases ('No optimization or forecasting'), which is genuine when-not guidance. It loses a point for not routing to or away from any named alternative tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
explain_formula_cellBRead-only
Explain a formula cell's direct references, upstream formula chain, and downstream dependents.
| Name | Required | Description | Default |
|---|---|---|---|
| cell | Yes | ||
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| max_depth | No | ||
| sheet_name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe read, so the description's burden is lower. It adds value by disclosing the analysis scope (direct refs plus upstream and downstream traversal), which is genuine context beyond the annotation. It says nothing about traversal cost on large workbooks, how cycles are handled, or what the explanation output looks like.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler, and the three analysis outputs are listed in a logical order. It is arguably undersized for a four-parameter traversal tool, but nothing in it is wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must carry return-value information, and it does partially by naming the three result categories. It still leaves max_depth behavior, cycle handling, and output shape unspecified, which is a meaningful gap for a graph-traversal explainer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 25% – only filepath carries documentation. The description never mentions cell, sheet_name, or max_depth, so it fails to compensate. max_depth is especially consequential (it bounds the upstream chain walk) and is completely unexplained in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb (Explain) and resource (formula cell) and enumerates the three things it returns: direct references, upstream formula chain, downstream dependents. That is far more informative than the bare name. It does not, however, contrast itself against close siblings such as inspect_formula, analyze_range_impact, or detect_circular_dependencies, so an agent must infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this tool versus the many adjacent inspection tools in the sibling list. No prerequisites, no exclusions, and no alternative is named. The agent is left to guess between this and inspect_formula or detect_circular_dependencies.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
explain_recipe_deltaARead-only
Explain sum/count changes by source identity, without modifying either file.
Recompute one shared Recipe v1 on two distinct .xlsx source versions. Requires
nonblank unique key_fields (exact headers) on every source data row, even if
excluded by recipe filters. Supports at most 8 metrics, all sum/count.
Returns added/removed/updated contributions, group changes and bounded physical
source-row examples. Numeric evidence uses exact decimal strings. Recipe float
differences are explicit numeric_adjustment values, not business explanations.
Optional metric selects one exact output alias; group must give all group_by
fields with exact literal values. All calculations/checks remain complete;
sample_limit (1-10) only bounds examples and omitted contributions are reported.
Pin both source sha256 values and recipe_sha256 from a previous response for
repeatable drilldown. The explanation_token is an integrity fingerprint, not
authorization or a commit token. Does not validate saved report cells, infer
historical recipe definitions, evaluate formulas or establish business causes.
Limits per source: 50,000 table cells, 64 columns, 10,000 recomputed result cells.
| Name | Required | Description | Default |
|---|---|---|---|
| group | No | ||
| metric | No | ||
| recipe | Yes | ||
| key_fields | Yes | ||
| sample_limit | No | ||
| after_filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| before_filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| expected_after_sha256 | No | ||
| expected_before_sha256 | No | ||
| expected_recipe_sha256 | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and the description reinforces it ('without modifying either file'), then adds material context the annotations can't carry: hard limits (50,000 cells, 64 columns, 10,000 result cells per source), exact-decimal numeric evidence, the distinction between numeric_adjustment and business explanation, and the clarification that explanation_token is an integrity fingerprint, not authorization or a commit token.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then organized into prerequisites, outputs, optional-parameter behavior, pinning, and limits. It is dense for a 10-parameter tool and several sentences pack two or three clauses with semicolons, but almost nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex tool with no output schema it still describes the return shape (added/removed/updated contributions, group changes, bounded source-row examples, omitted contributions reported) and enumerates operational limits. The remaining gap is that the required `recipe` object — a free-form nested structure — has no field-level guidance anywhere, which is a real risk given 20% schema coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 20%, so the description must compensate, and it does for nearly every parameter: key_fields must be exact headers present and unique on every row, metric selects one exact output alias, group must supply all group_by fields with exact literal values, sample_limit is bounded 1-10 and only affects examples, and the expected_*_sha256 parameters are described via the pin-from-previous-response guidance. Only the shape of the nested recipe object remains unspecified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource plus scope: 'Explain sum/count changes by source identity, without modifying either file' and 'Recompute one shared Recipe v1 on two distinct .xlsx source versions.' It implicitly separates itself from diff_workbooks and run_workbook_recipe by requiring two source versions plus a shared recipe, but it never names an alternative explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear preconditions (nonblank unique key_fields on every row, at most 8 sum/count metrics, sha256 pinning from a previous response for repeatable drilldown) and an explicit exclusion list: does not validate saved report cells, infer historical recipes, evaluate formulas, or establish business causes. It stops short of naming a sibling to use instead when those exclusions apply.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_free_canvasCRead-only
Suggest free worksheet slots for charts or dashboard blocks.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| width | No | ||
| height | No | ||
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| min_cols | No | ||
| min_rows | No | ||
| sheet_name | Yes | ||
| origin_cell | No | A1 | |
| search_rows | No | ||
| padding_rows | No | ||
| search_columns | No | ||
| padding_columns | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe read, and 'Suggest' is consistent with that. Beyond the annotation the description adds nothing: it does not define what counts as 'free' (empty cells, merged regions, padded gaps) or how candidates are ranked, which is the core behavioral question for this tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler, so nothing is wasted. But at 12 parameters and 8% schema coverage, this level of brevity is under-specification rather than effective concision.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter tool with almost no schema descriptions and no output schema, the description should explain search semantics, sizing constraints, and what a returned 'slot' looks like. It covers none of that, leaving an agent unable to invoke it correctly without guessing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 8% (only filepath is documented), and the description explains none of the 12 parameters. The meaning of width/height vs min_cols/min_rows, origin_cell, search_rows/search_columns, and padding_rows/padding_columns is left entirely to bare property names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Suggest free worksheet slots') plus the intended use case ('charts or dashboard blocks'), so the agent knows what it returns. It does not differentiate itself from the closest sibling, describe_sheet_layout, which likely overlaps in layout-awareness.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The use case implies when it is useful (before placing a chart or dashboard block), but there is no explicit when-to-use/when-not guidance, no prerequisites (workbook open, sheet exists), and no mention of alternatives such as describe_sheet_layout.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
format_rangeCDestructive
Apply formatting to a range of cells. Colors accept RRGGBB, #RRGGBB, AARRGGBB, or #AARRGGBB.
| Name | Required | Description | Default |
|---|---|---|---|
| bold | No | ||
| italic | No | ||
| dry_run | No | ||
| bg_color | No | ||
| end_cell | No | ||
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| alignment | No | ||
| font_size | No | ||
| underline | No | ||
| wrap_text | No | ||
| font_color | No | ||
| protection | No | ||
| sheet_name | Yes | ||
| start_cell | Yes | ||
| merge_cells | No | ||
| border_color | No | ||
| border_style | No | ||
| number_format | No | ||
| include_changes | No | ||
| conditional_format | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true, so the safety profile is partly covered. But the description never warns that applying formatting overwrites existing cell formatting, never explains what `dry_run` previews, and never mentions whether `include_changes` returns a diff — all material for a 20-parameter mutation tool. The color-syntax note is useful but is parameter-level detail, not behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, action front-loaded before the format detail. The efficiency is good, though the brevity edges into under-specification for a tool this large.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A 20-parameter destructive mutation with 5% schema coverage, no output schema, and several nested-object params (protection, conditional_format) is not adequately explained by two sentences. An agent could invoke it, but would be guessing on most of the surface area and on the dry-run/change-reporting workflow.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 5% across 20 parameters, so the description carries nearly the full burden and mostly fails it. It clarifies color string formats (RRGGBB / #RRGGBB / AARRGGBB / #AARRGGBB) for bg_color, font_color, and border_color, but leaves alignment, number_format, border_style, protection, conditional_format, merge_cells, dry_run, and include_changes entirely unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Apply formatting to a range of cells") that an agent can act on immediately. However, it does nothing to distinguish this from the near-identical sibling `format_ranges`, so an agent has no basis for choosing between the singular and plural variants.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no prerequisites, and no mention of when to prefer `format_ranges`, `copy_range`, or `read_range_formatting` instead. The `dry_run` parameter strongly implies a preview workflow but the description never says to preview before applying, which is exactly the kind of guidance a destructive tool needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
format_rangesBDestructive
Apply formatting to multiple ranges in a single workbook pass. Colors accept RRGGBB, #RRGGBB, AARRGGBB, or #AARRGGBB.
| Name | Required | Description | Default |
|---|---|---|---|
| ranges | Yes | ||
| dry_run | No | ||
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| sheet_name | Yes | ||
| include_changes | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, and the description adds the useful note that all ranges are applied in one pass. However, it never says that existing formatting is overwritten, what dry_run actually previews, or what include_changes returns — the operationally relevant details for a destructive mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero padding, with the core action front-loaded and the format constraint following. Nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description should explain return/preview behavior for a destructive tool, and it does not. Combined with an undocumented ranges item structure and two undocumented flags, an agent can call it but cannot confidently predict the payload shape or effects.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 20% (filepath only), so the description must carry the load. It adds genuine value by listing accepted color encodings (RRGGBB, #RRGGBB, AARRGGBB, #AARRGGBB), but the central 'ranges' array is a bare object with additionalProperties:true and no documented item shape, and dry_run/include_changes are left unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Apply formatting to multiple ranges') and scopes it to 'a single workbook pass'. The word 'multiple' implicitly distinguishes it from the single-range sibling format_range, though the sibling is never named.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer this is the batch alternative to format_range. There is no explicit when-to-use, no when-not, and no mention of the sibling it competes with or of prerequisites such as sheet existence or protection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
freeze_panesCDestructive
Set or clear worksheet freeze panes.
| Name | Required | Description | Default |
|---|---|---|---|
| cell | No | ||
| dry_run | No | ||
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| sheet_name | Yes | ||
| include_changes | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The destructiveHint annotation already flags that this tool changes worksheet state, and the description aligns with that by mentioning set or clear. However, it adds little behavioral context: it does not explain what is destroyed, how clearing works, or what dry_run and include_changes do.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no wasted words. It is appropriately concise, though its brevity contributes to the broader underspecification of the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a five-parameter mutation tool with only 20% schema description coverage and no output schema, the description is too thin. It omits how to clear panes, what cell format to use, and what dry_run or include_changes change about behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 20%, so the description must compensate for undocumented parameters, but it provides no parameter-level meaning. It does not explain that cell may control the freeze position or that a null/empty cell may clear panes, and it is silent on dry_run and include_changes.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: setting or clearing worksheet freeze panes. It is clear enough to distinguish this tool from most siblings, though it does not clarify how freeze panes differ from other worksheet layout tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance on when to use this tool versus alternatives, nor any prerequisites. The only usage signal is the phrase 'set or clear,' which implies mutation but leaves the choice conditions unstated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_data_validation_infoBRead-only
Get all data validation rules in a worksheet.
This tool helps identify which cell ranges have validation rules
and what types of validation are applied.
Args:
filepath: Path to Excel file
sheet_name: Name of worksheet
Returns:
JSON string containing all validation rules in the worksheet
| Name | Required | Description | Default |
|---|---|---|---|
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| sheet_name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already establishes that this is a safe read operation. The description adds that it returns a JSON string containing all validation rules, but it does not describe error behavior, empty worksheets, permission needs, or output structure in any depth.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loads the core purpose before listing arguments and return value. The middle sentence is somewhat redundant with the opening, but the overall structure is efficient and easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool, the description gives enough to understand the basic operation and that the result is a JSON string. However, without an output schema it could do more to describe the returned validation-rule structure, and it leaves the overlap with inspect_data_validation_rules unresolved.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 50%. The filepath parameter is well described in the schema, but sheet_name has no schema description and the tool description only restates it as 'Name of worksheet', which adds no meaningful semantic detail. The description does not compensate for the missing parameter guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb and resource: get all data validation rules in a worksheet. It also explains that the result identifies validated cell ranges and validation types. However, it does not distinguish itself from the very similar sibling tool inspect_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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by saying it helps identify which ranges have validation rules and what validation types are applied. There is no explicit when-to-use guidance, no exclusions, and no comparison to alternatives such as inspect_data_validation_rules or validate_excel_range.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_merged_cellsCRead-only
Get merged cells in a worksheet.
| Name | Required | Description | Default |
|---|---|---|---|
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| sheet_name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe read, so the description is not required to carry the safety burden, but it adds nothing beyond that: no indication of what the return looks like (cell ranges? addresses?), whether unmerged sheets return empty, or how merged regions are scoped. Effectively a restatement of the name.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short, front-loaded sentence with no filler. It errs toward under-specification rather than verbosity, but every word present earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no description of the result shape, an agent cannot know whether this returns region coordinates, addresses, or a count. For a two-parameter read tool with annotations covering safety, the description should at least sketch the return value.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%: filepath carries detailed server-path guidance while sheet_name is bare. The description's phrase 'in a worksheet' weakly signals that sheet_name scopes the query, but adds no format or validity details, so it only marginally compensates for the undocumented parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('Get merged cells in a worksheet') that clearly identifies a read operation on merge metadata. It is distinguishable from the sibling merge_cells/unmerge_cells by the 'get' verb, though it never names those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No statement of when to call this versus alternatives such as describe_sheet_layout, read_range_formatting, or unmerge_cells. An agent must infer usage from the name and the fact that a sheet_name is required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_workbook_metadataARead-only
Get workbook metadata; sheets lists TABS, not native table names.
Table inventory is not included. A missing table name in sheets does NOT mean
the table is absent. Use list_tables without sheet_name to verify named sources.
| Name | Required | Description | Default |
|---|---|---|---|
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| include_ranges | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so safety is covered; the description adds genuinely useful context beyond that — it discloses what the output does NOT contain (table inventory) and warns against a specific false inference. It does not describe return shape or cost/latency, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The critical disambiguation is front-loaded in the first clause and the warning about missing table names follows immediately. Three short sentences, no filler, though the formatting is slightly choppy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no annotations beyond readOnlyHint, the description carries the burden of describing what 'metadata' returns, yet it only covers the sheets field and omits include_ranges entirely. An agent can avoid the main pitfall but still doesn't know what it will receive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50%: filepath is richly documented in the schema, but include_ranges has no description anywhere, and the tool description adds nothing about either parameter. Since half the parameters are undocumented both places, the description should have explained what include_ranges yields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get workbook metadata') and immediately clarifies that 'sheets' means tab names, not native tables — a distinction no sibling name conveys. It stops short of saying what else the metadata contains (dimensions, properties, counts), so the scope is only partially pinned down.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit negative rule ('a missing table name in sheets does NOT mean the table is absent') plus the corrective action ('Use list_tables without sheet_name to verify named sources'). It does not address when to prefer list_all_sheets or describe_sheet_layout, leaving a routing gap among similar-sounding siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_worksheet_protectionCRead-only
Get worksheet protection status and option flags.
| Name | Required | Description | Default |
|---|---|---|---|
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| sheet_name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so safety is covered. The description adds only that the result includes option flags, but does not say which flags, what an unprotected sheet returns, or what happens with an invalid sheet name — limited added value against the annotation baseline.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. It is efficient, though arguably under-specified rather than maximally useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description carries the burden of explaining return values — yet 'option flags' is left undefined (protect contents? protect objects? password-protected?). Combined with undocumented sheet_name, an agent cannot fully anticipate the response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%: filepath is documented in the schema, but sheet_name has no description anywhere. The tool description offers no parameter guidance to compensate for that gap (e.g., that sheet_name must match an existing sheet).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (get worksheet protection status) plus what is returned (option flags). It is clear which resource it targets, though it never names the write counterpart set_worksheet_protection that an agent could confuse it with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance is given: nothing says to call this before set_worksheet_protection or to check protection before attempting writes. The read-only nature is implied by the name but the alternative tool is never mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
insert_columnsCDestructive
Insert one or more columns starting at the specified column.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | ||
| dry_run | No | ||
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| start_col | Yes | ||
| sheet_name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only flag destructiveHint=true; the description adds nothing about the key behavioral consequence that existing cells shift right and referencing formulas may change. It also never mentions the available dry_run safeguard or default count of 1, both of which materially affect how an agent should call a destructive mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero waste, but for a 5-parameter destructive tool it is under-specified rather than tight. Brevity here costs correctness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, sparse schema docs, and only a destructiveHint annotation, the description should carry far more: sheet targeting, shift semantics, dry_run usage, and indexing conventions. It leaves all of that to guesswork.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 20% (only filepath is documented), so the description must compensate and does not: start_col's indexing base (0- vs 1-based), count's default of 1, and dry_run's purpose are all left unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Insert ... columns') and its insertion point ('starting at the specified column'), which clearly separates it from sibling delete_sheet_columns and insert_rows. It omits the worksheet/file scope, but the resource is unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus insert_rows, delete_sheet_columns, or write_data_to_excel, and no mention of prerequisites such as sheet protection or whether formulas in shifted columns are adjusted. The agent must infer all routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
insert_rowsCDestructive
Insert one or more rows starting at the specified row.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | ||
| dry_run | No | ||
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| start_row | Yes | ||
| sheet_name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The destructiveHint=true annotation already signals a mutating operation, and the description adds the key insertion semantics (rows are inserted at a position, so surrounding content shifts). However, it does not disclose what happens to formatting/formulas/merged cells below the insertion point, nor the meaning of dry_run, which matters for a destructive tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the anchor ('starting at the specified row') comes after the action. It is efficient, though the brevity is partly under-specification rather than pure economy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive 5-parameter mutation with no output schema and near-zero schema description coverage, the description omits dry_run, count semantics, and the fate of content at and below the insertion point. An agent cannot safely or precisely invoke it from what is given.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 20%: only filepath is documented. The description does nothing to explain start_row, sheet_name, count, or the safety-relevant dry_run flag, so four of five parameters rely on bare titles and defaults.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description pairs a specific verb ('Insert') with a specific resource ('rows') and states scope ('one or more') plus the anchor ('starting at the specified row'). This distinguishes it from delete_sheet_rows and insert_columns, though it never names a sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this versus append_table_rows, write_data_to_excel, or append_excel_table_rows, nor any prerequisite or exclusion. The agent must infer the choice from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspect_conditional_format_rulesBRead-only
Inspect worksheet conditional formatting rules with stable rule indexes.
| Name | Required | Description | Default |
|---|---|---|---|
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| sheet_name | Yes | ||
| broken_only | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already establishes that this is a safe read operation. The description adds that rule indexes are stable, which is useful behavioral context for follow-up operations, but it does not explain what 'stable' means, whether broken rules are included by default, or what the return shape looks like.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no filler. It efficiently states the operation and the key trait of stable rule indexes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and low parameter description coverage, the description is too sparse for an inspection tool. It omits parameter semantics, return structure, and how stable indexes should be used with related mutation tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33%: filepath is documented, but sheet_name and broken_only are not. The description mentions 'worksheet' but adds no meaning for the parameters, especially the broken_only filtering option.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: inspecting worksheet conditional formatting rules. Adding 'stable rule indexes' clarifies the nature of the output and distinguishes it from a mutation like remove_conditional_format_rules, though it does not explicitly name alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance on when to use this tool versus siblings such as remove_conditional_format_rules, read_range_formatting, or inspect_data_validation_rules. Usage is only implied by the verb 'Inspect'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspect_data_validation_rulesCRead-only
Inspect worksheet data validation rules with stable rule indexes.
| Name | Required | Description | Default |
|---|---|---|---|
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| sheet_name | Yes | ||
| broken_only | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe read. The description adds the useful behavioral fact that rule indexes are stable (implying they can be referenced later, e.g. for removal), but says nothing about scope, pagination, or what happens when no rules exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short, front-loaded sentence with no filler. It is arguably over-terse for a tool with an undocumented filter parameter, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema and an undocumented boolean filter mean the agent has no way to know what broken_only does or what the returned rule objects look like. Given an overlapping sibling tool (get_data_validation_info), the definition leaves real gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 33%: filepath is documented in the schema, but sheet_name and especially broken_only (a filtering flag whose semantics matter) are undocumented in either place. The description contributes only 'worksheet', which implies sheet_name and adds nothing for broken_only.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb 'inspect' plus resource 'worksheet data validation rules', with the added qualifier 'stable rule indexes' that hints at what the output contains. It does not explicitly name the near-duplicate sibling get_data_validation_info, so differentiation is only partial.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this tool versus get_data_validation_info or remove_data_validation_rules, despite those being obvious alternatives. An agent must infer usage entirely from the name and the phrase 'stable rule indexes'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspect_formulaARead-only
Inspect a formula string for functions, references, and risky signals.
| Name | Required | Description | Default |
|---|---|---|---|
| formula | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds some context beyond the readOnlyHint annotation by specifying what is inspected, but it does not disclose what the output looks like, what counts as a 'risky signal', or how errors are handled. The annotation already covers safety, and the description adds a modest layer of behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence, front-loaded with the action and object, and contains no redundant words. It is appropriately short and to the point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter, read-only tool, the description gives a basic understanding of the tool's function. However, the lack of an output schema and the vague term 'risky signals' leave gaps about the return format and the precise nature of the analysis, so it is not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has no description for the 'formula' parameter (0% coverage), so the description must compensate. However, it only states 'formula string', which essentially repeats the parameter name and type without adding format examples or acceptable values. This adds minimal semantic value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific verb 'Inspect' and the resource 'a formula string', and enumerates what is examined: 'functions, references, and risky signals'. This distinguishes it from siblings like validate_formula_syntax and apply_formula, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool—when you need to analyze a formula for functions, references, and risky signals—but it does not provide explicit context about when not to use it or mention alternative tools. The use case is inferable but not explicitly delineated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspect_named_rangeBRead-only
Inspect a named range, including scope, destinations, and broken-reference signals.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| scope_sheet | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe read, so the description's added value is disclosing the content of the inspection — scope, destinations, and broken-reference signals — which is useful since there is no output schema. It stops short of saying what happens when the name is missing or how errors are reported.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the inspected aspects are listed compactly. It is efficient but so terse that it omits routing and parameter context rather than wasting words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, 3-parameter tool with no output schema, the description covers what is examined but omits error behavior for an unknown name and the meaning of scope_sheet. Adequate minimum, with clear gaps around parameter and failure semantics.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33%: filepath is well documented in the schema, but name and scope_sheet have no descriptions anywhere. The description does not compensate — it never explains what scope_sheet selects or how name resolution behaves (workbook-scoped vs sheet-scoped).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Inspect a named range") and enumerates what is examined: scope, destinations, broken-reference signals. This clearly separates it from list_named_ranges or delete_named_range, though it never names a sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this versus list_named_ranges (bulk listing) or when a range should be inspected instead. The deep-dive intent is only inferable from the list of inspected aspects, leaving the agent to guess.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspect_workbook_contractARead-only
Read-only full bounded native-table contract check; never infer business meaning.
Contract v1 requires version=1, name, source={table_name, optional sheet_name},
row_grain (a declaration), key_fields (logical names), and fields=[{name,
headers: [approved exact alternatives], type: string|number|integer|boolean,
nullable?: false, meaning?, allowed_values?, min?, max?}]. Optional min_rows
defaults to 1; filters use logical field names and Recipe predicates. Missing
or multiple matching headers are unresolved, never automatically selected.
Checks all source rows BEFORE filtering, excluding native totals. Declared
meanings are not verified facts. No coercion, formulas, dates, joins or code.
Limits: 32KB JSON, 32 fields, 8 aliases/field, 8 key fields, 20 filters,
50000 table cells/64 columns; sample_limit 1-5 affects row examples only.
Pass the same contract as workbook_contract to run_workbook_recipe to enforce
it in preview/commit; this inspection alone does not guard other tools.
Recovery: omit sample_limit for default 3 (never use Recipe's 10 here).
recipe_input_fields lists the exact logical names to use in Recipe inputs;
bindings values are physical headers for inspection, not Recipe field names.
For {name: "net", headers: ["NetSales"]}, use metrics.field="net", not
"NetSales". For {name: "currency", headers: ["Currency"]}, use
group_by=["currency"]. Metric as="Revenue" is an output label, not remapped.
Follow next_action: unresolved/violated requires an owner decision, not a
changed contract or filtered-out violation. Reuse the supplied filepath;
do not construct an absolute path by prefixing the client working directory.
| Name | Required | Description | Default |
|---|---|---|---|
| contract | Yes | ||
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| sample_limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true; the description adds substantial behavior beyond that: checks all source rows BEFORE filtering, excludes native totals, no coercion/formulas/dates/joins/code, missing or multiple header matches are left unresolved rather than auto-selected, declared meanings are not verified, and sample_limit affects only row examples. It also spells out hard limits (32KB JSON, 32 fields, 8 aliases/field, 8 key fields, 20 filters, 50000 cells/64 columns) and the recovery behavior for sample_limit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Nearly every sentence carries non-redundant information, but the whole thing is delivered as one unbroken run-on block that mixes contract schema, limits, naming rules, and recovery advice with no headings or front-loaded structure. An agent must parse ~250 words linearly to find the contract spec it needs first.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and a nested free-form contract object, the description does the heavy lifting: limits, resolution semantics, next_action handling, and filepath rules are all present. The main residual gap is the return payload itself — next_action, recipe_input_fields, and bindings are referenced but their structure and values are never described, so the agent learns how to call it far better than how to read the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 33% and the contract parameter is an undescribed free-form object, so the description has to carry the load — and it does, enumerating the contract v1 shape: version=1, name, source.table_name/sheet_name, row_grain, key_fields, fields with headers/type/nullable/meaning/allowed_values/min/max, plus min_rows defaulting to 1 and logical-name filter syntax. It also disambiguates sample_limit (default 3 here vs Recipe's 10) and clarifies the logical-vs-physical naming distinction with concrete examples (metrics.field="net" not "NetSales").
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+scope: a read-only, bounded contract check over a native Excel table, with an explicit constraint ('never infer business meaning'). It distinguishes itself from the enforcement path by naming run_workbook_recipe and clarifying that inspection alone does not guard other tools. It does not, however, differentiate itself from adjacent read/diagnostic siblings such as describe_dataset, profile_workbook, or read_excel_as_table.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives real routing guidance: pass this contract as workbook_contract to run_workbook_recipe to enforce it in preview/commit, and follow next_action on unresolved/violated rather than silently changing the contract or filtering violations out. It also tells the agent to reuse the supplied filepath instead of prefixing cwd. No explicit exclusion against other inspection siblings, so not a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_all_sheetsARead-only
List all sheets in a workbook with row/column counts. Quick overview before reading data.
| Name | Required | Description | Default |
|---|---|---|---|
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already declares the safety profile, so the description's main added value is that results include row/column counts — useful output context, especially since no output schema exists. It doesn't say whether hidden sheets or charts-only sheets are included, or how large workbooks behave.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, with the operation stated first and the usage hint second. Nothing could be removed without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with full schema coverage and a read-only annotation, the definition is nearly sufficient; it even sketches the return content. It stops short of noting the result shape or how it differs from other workbook-overview tools, which would fully close the gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter with 100% schema description coverage, and that schema text already covers the tricky path-rooting rules. The description adds nothing about filepath semantics, which is acceptable at this coverage level but is the baseline rather than a contribution.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List all sheets in a workbook') and adds the payload ('with row/column counts'). It doesn't differentiate from nearby siblings such as get_workbook_metadata, describe_sheet_layout, or list_tables, so an agent can't tell exactly which overview tool to pick from the text alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Quick overview before reading data' implies a workflow position, which is real but minimal guidance. There are no explicit when-not conditions and no named alternatives among the many sibling listing/metadata tools, so selection against those remains inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_chartsCRead-only
List embedded charts in a workbook or worksheet.
| Name | Required | Description | Default |
|---|---|---|---|
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| sheet_name | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already declares the safety profile, so the description's only real obligation is to add context such as what is returned or whether both chart sheets and embedded charts are covered. It adds none of that, effectively restating the name. No mention of whether output includes chart names, anchors, or types.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler. Nothing could be cut, though the size reflects under-specification rather than tightness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description should say what a listed chart entry looks like (name, sheet, type, position) — it does not. For a listing tool whose entire value is the returned collection, this is a significant omission.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%: filepath is richly documented in the schema, sheet_name is not. The phrase 'in a workbook or worksheet' does imply that omitting sheet_name scans the whole workbook and supplying it narrows to one sheet, which is modest but genuine added meaning. Baseline 3 fits.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List embedded charts') and scopes it to a workbook or worksheet. It contrasts adequately with the create_chart/create_chart_from_series siblings, though it does not distinguish itself from other inspection tools like get_workbook_metadata.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use guidance, no prerequisites, and no named alternative (e.g., 'use get_workbook_metadata for a full inventory'). The agent must infer that this is a read-first step before chart manipulation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_named_rangesBRead-only
List workbook defined names and their destinations.
| Name | Required | Description | Default |
|---|---|---|---|
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already establishes safety. The description adds that destinations are returned alongside names, which is useful context, but it omits behavioral details such as whether all names are included or how empty workbooks are handled.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no filler. Every word contributes directly to identifying the tool's purpose and output.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only listing tool with a fully documented single parameter and a readOnlyHint annotation, the description is largely sufficient. It could more explicitly say it lists workbook-level defined names, but no critical information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single filepath parameter is thoroughly documented in the schema. The description adds no additional parameter semantics beyond what the schema already provides, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb ('List') and resource ('workbook defined names') and states what is returned ('their destinations'). It is clear, but it does not explicitly distinguish itself from sibling tools like inspect_named_range or create_named_range.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives such as inspect_named_range. The listing intent is implied, but no conditions, exclusions, or alternatives are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tablesARead-only
Map native table names to worksheet tabs and ranges; these names are distinct.
Omit sheet_name to search the whole workbook, especially after a missing-tab
error. Table and worksheet names may differ; neither name implies the other.
| Name | Required | Description | Default |
|---|---|---|---|
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| sheet_name | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe read, so the burden is lower. The description adds real behavioral context (table names and sheet names are independent, so a missing tab may simply mean no table is registered there), but says nothing about the shape of the result, ordering, or handling of workbooks with no tables.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core mapping behavior before the parameter guidance. Minor redundancy between "these names are distinct" and "neither name implies the other," but nothing that wastes meaningful space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read-only listing tool with no output schema, the description covers purpose, the key naming gotcha, and the sheet_name default comprehensively. The only shortfall is that it doesn't state what the listing contains per table (range/ref), which an agent must infer from the opening clause.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%: filepath is well documented in the schema, while sheet_name has no schema description at all. The description compensates for that gap by explaining what omitting sheet_name does (whole-workbook search) and what its absence implies operationally, which is exactly the missing semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ("Map native table names to worksheet tabs and ranges") and clarifies the mapping nature of the output. It distinguishes the tool conceptually from a plain sheet lister by stressing that table and worksheet names are distinct, though it doesn't name the sibling tools it differs from (e.g. list_all_sheets, list_named_ranges).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives one concrete usage trigger — omit sheet_name to search the whole workbook, especially after a missing-tab error — which is genuinely actionable. However, there is no explicit guidance on when to prefer this over adjacent tools like read_excel_table, query_table, or list_all_sheets, leaving the main routing decision implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
merge_cellsCDestructive
Merge a range of cells.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | ||
| end_cell | Yes | ||
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| sheet_name | Yes | ||
| start_cell | Yes | ||
| include_changes | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true but the description never explains why: that non-anchor cell contents are discarded on merge, and what dry_run or include_changes would show. For a destructive mutation with low annotation detail (only a hint and a title), the description adds no behavioral context at all.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short, front-loaded sentence with zero waste, but the brevity tips into under-specification rather than disciplined concision. Nothing extraneous, yet almost nothing useful either.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A 6-parameter destructive tool with no output schema, 17% schema coverage, and two undocumented optional flags. Given that complexity, a single-sentence description leaves out exactly the details an agent would need before calling it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 17% – only filepath carries a description, and that one is essentially a path-resolution policy. The description says nothing about the start_cell/end_cell coordinate format, what dry_run previews, or what include_changes controls, so it fails to compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
A specific verb ('merge') plus a specific resource ('a range of cells') makes the basic operation unambiguous. It does not, however, distinguish itself from the closely related siblings unmerge_cells and get_merged_cells, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no prerequisites (e.g. sheet protection or existing merges), and no mention of unmerge_cells as the inverse operation. The agent is left to infer the entire usage context from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
plan_workbook_repairsCRead-only
Turn workbook audit findings into prioritized next steps for SheetForge workflows.
| Name | Required | Description | Default |
|---|---|---|---|
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| header_row | No | ||
| sample_limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true is consistent with a planning tool, but the description adds nothing beyond it: it doesn't say whether the tool runs the audit itself or consumes prior results, what the prioritized plan looks like, or that nothing is written to the workbook. With no output schema, this is a meaningful gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no waste, but its brevity stems from under-specification rather than efficiency.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema and minimal annotations, so the description should carry the burden of explaining inputs-to-output behavior for a 3-parameter tool. It explains neither the return value (a plan? a report?) nor the two undocumented parameters, leaving the agent unable to predict the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 33%: filepath is well documented in-schema, but header_row and sample_limit are undocumented anywhere. The description provides zero parameter guidance and doesn't explain how sample_limit affects the plan output.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The verb phrase 'Turn workbook audit findings into prioritized next steps' describes a planning/advice operation, which distinguishes it loosely from the mutating sibling apply_workbook_repairs. However, it never says where 'audit findings' come from (the tool takes only a filepath, not findings), leaving the actual operation ambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this versus audit_workbook, apply_workbook_repairs, or apply_workbook_changeset, which are the obvious alternatives in this dense sibling set. The mention of 'SheetForge workflows' hints at context but gives no actionable selection criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
profile_workbookBRead-only
Return a compact workbook inventory with sheets, tables, charts, and layout state.
| Name | Required | Description | Default |
|---|---|---|---|
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, so safety is covered. The word 'compact' hints at the depth/verbosity tradeoff, but the description does not say how much detail each section contains, whether it is a single-pass read cost, or how it relates to deeper inspection tools.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence with zero waste; the resource and its contents come before anything else.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description should convey the shape and depth of the returned inventory. It names the sections but not their granularity, and it omits routing against the several sibling tools that return overlapping metadata, which leaves the agent guessing on a fairly crowded toolset.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Single required parameter with 100% schema description coverage, so the baseline is 3. The description adds nothing about the filepath semantics, but the schema already carries the path-resolution rules.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Return) and resource (workbook inventory) and enumerates the sections included: sheets, tables, charts, layout state. However, it does not distinguish itself from overlapping siblings such as get_workbook_metadata, describe_sheet_layout, list_tables, or list_charts, leaving the agent unsure where this differs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus alternatives, no prerequisites, and no exclusions. The agent is left to infer that this is a broad overview tool rather than a targeted one.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_tableCRead-only
Filter, project, sort, and limit worksheet or table data. Filters support eq/neq/ne, comparisons, string matching, blank checks, and in/not_in with value or values.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| select | No | ||
| filters | No | ||
| sort_by | No | ||
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| row_mode | No | arrays | |
| sort_desc | No | ||
| header_row | No | ||
| sheet_name | No | ||
| table_name | No | ||
| infer_schema | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already covers the safety profile, so the bar is lower. The description adds genuine capability context by enumerating the supported filter operators, but it says nothing about how limit interacts with filters, what row_mode does to the result shape, or whether infer_schema changes typing behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the primary operations front-loaded and no filler. The second sentence is information-dense but stays on topic.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter tool with no output schema, the description omits too much: result shape (affected by row_mode), sheet_name/table_name exclusivity, header_row semantics, and the structure of filter objects. An agent can form an intent but not a reliably correct call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 9% (only filepath is documented), so the description must carry the other ten parameters and it does not. It clarifies the filter vocabulary but never gives the filter object structure (key/op/value), and row_mode, header_row, sheet_name vs table_name, sort_desc, and infer_schema are left entirely undefined in both schema and prose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb set (filter, project, sort, limit) and the resource (worksheet or table data), which is more precise than the sibling read_excel_table or read_data_from_excel. It never contrasts itself with those read/aggregate siblings, so an agent must guess whether query_table, read_excel_as_table, or aggregate_table is the right entry point.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use statement, no exclusions, and no mention of the obvious alternatives (read_excel_table, read_excel_as_table, search_in_sheet, aggregate_table) in a sibling list of 70+ tools. Usage is only implied by the verb list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
quick_readARead-only
Read a compact table from an explicit sheet or the first workbook sheet.
Can return either array rows or object-shaped records, plus optional schema
hints inferred from the returned rows.
sheet_name is a worksheet tab, NOT a native table name. For named tables use
read_excel_table(table_name=...); list_tables verifies the containing worksheet.
| Name | Required | Description | Default |
|---|---|---|---|
| end_col | No | ||
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| max_rows | No | ||
| row_mode | No | arrays | |
| start_col | No | A | |
| start_row | No | ||
| header_row | No | ||
| sheet_name | No | ||
| infer_schema | No | ||
| include_headers | No | ||
| read_boundary_mode | No | default |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already covers the safety profile, so the description's added value is the return-shape disclosure: array rows vs object-shaped records, plus optional inferred schema hints. That is meaningful context for a tool with no output schema. It does not mention error behavior, row-limit defaults, or how read_boundary_mode affects results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core capability in the first sentence, then the return-shape note, then the disambiguation caveat. Three tight blocks with no filler, though the parenthetical tool-call syntax in the final sentence is slightly informal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output side is adequately covered and the sheet-vs-table distinction is handled, but for an 11-parameter read tool with near-zero schema descriptions and no output schema, the range/header/limit parameters that determine what data actually comes back go unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 9% (only filepath is documented), so the description must compensate for 11 parameters, and it only clarifies sheet_name, row_mode's two output flavors, and infer_schema. start_col, end_col, start_row, header_row, max_rows, include_headers, and read_boundary_mode are left entirely unexplained in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: read a compact table from an explicit sheet or the first workbook sheet. It clearly distinguishes itself from read_excel_table by name, but does not distinguish itself from the other read siblings such as read_data_from_excel or read_excel_as_table, which an agent would also need to choose between.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes named-table reads to read_excel_table(table_name=...) and notes list_tables verifies the containing worksheet, which is real when-to-use guidance. It also clears up an ambiguity (sheet_name is a worksheet tab, not a native table name). It lacks any when-not guidance relative to the other plain-read siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_data_from_excelARead-only
Read data from Excel worksheet with cell metadata including validation rules.
Args:
filepath: Path to Excel file
sheet_name: Worksheet tab name, NOT a native table name; list_tables maps tables to tabs
start_cell: Starting cell (default A1)
end_cell: Ending cell (optional, auto-expands if not provided)
max_rows: Optional maximum number of rows to return from the starting row
max_cols: Optional maximum number of columns to return from the starting column
cursor: Optional continuation token returned by an earlier range read
preview_only: Whether to return preview only
compact: Whether to omit default validation metadata for smaller responses
values_only: Whether to return a 2D value grid without per-cell metadata
Returns:
JSON string containing either structured cell data with validation metadata
or a plain 2D value grid when values_only=True.
| Name | Required | Description | Default |
|---|---|---|---|
| cursor | No | ||
| compact | No | ||
| end_cell | No | ||
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| max_cols | No | ||
| max_rows | No | ||
| sheet_name | Yes | ||
| start_cell | No | A1 | |
| values_only | No | ||
| preview_only | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description adds real behavioral detail: end_cell auto-expands when omitted, cursor is a continuation token from an earlier range read, compact suppresses default validation metadata, and values_only changes the return shape. It does not discuss size limits or what happens on invalid ranges, keeping it below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded summary sentence followed by a scannable Args list and a Returns note; no padding. The one weak line is the tautological preview_only entry, but overall it is efficiently sized for a 10-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the explicit Returns section covering both the structured cell form and the 2D grid is important and present. What is missing is concrete behavior for preview_only and any pagination/truncation semantics beyond the cursor token.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 10%, so the description must compensate, and it largely does: every one of the 10 params gets an explanatory line, including the non-obvious ones (sheet_name vs table name, end_cell auto-expansion, cursor continuation, compact metadata omission). preview_only is described tautologically ('Whether to return preview only'), leaving one real gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read data from Excel worksheet') plus the distinguishing payload ('cell metadata including validation rules'). It does not explicitly differentiate from close siblings like read_excel_table, quick_read, or read_excel_as_table, so an agent must infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the description (range reads with metadata, optional values-only mode), and it usefully warns that sheet_name is a tab, not a table, routing to list_tables. However there is no explicit 'use this instead of quick_read/read_excel_as_table when…' guidance despite several overlapping siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_excel_as_tableARead-only
Read Excel data as a compact table with headers and rows or record objects.
sheet_name is a worksheet TAB, not a native table. For an approved named
table use read_excel_table(table_name=...); list_tables maps tables to tabs.
Much more context-efficient than read_data_from_excel for structured data,
with optional inferred schema hints for downstream steps.
| Name | Required | Description | Default |
|---|---|---|---|
| compact | No | ||
| end_col | No | ||
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| max_rows | No | ||
| row_mode | No | arrays | |
| start_col | No | A | |
| start_row | No | ||
| header_row | No | ||
| sheet_name | Yes | ||
| infer_schema | No | ||
| include_headers | No | ||
| read_boundary_mode | No | default |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so safety is covered; the description adds value beyond that by disclosing the output shape (headers + rows vs record objects) and the context-efficiency tradeoff versus read_data_from_excel, plus optional schema hints. It does not cover error behavior (missing file, bad range) or truncation via max_rows, so not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads what it returns, then the tab-vs-table gotcha, then the sibling routing, then the efficiency rationale — a logical order. Slightly dense with parenthetical asides, but no filler sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter, no-output-schema tool, the description covers the routing and output-shape questions well but leaves most range/pagination behavior unexplained, which matters for an agent deciding how to page large sheets. Adequate but with clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 8% across 12 parameters, so this description must compensate. It does clarify the critical sheet_name semantics and implicitly explains compact, row_mode ('arrays' vs record objects), include_headers, and infer_schema, but the six range/boundary parameters (start_col, end_col, start_row, max_rows, header_row, read_boundary_mode) get no meaning from either schema or description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read Excel data as a compact table with headers and rows or record objects') and explicitly distinguishes itself from two siblings: read_excel_table (named tables) and read_data_from_excel. An agent can route correctly without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the exact disambiguation rule ('sheet_name is a worksheet TAB, not a native table'), names the alternative for approved named tables, points to list_tables for mapping, and states when this beats read_data_from_excel (structured data, context efficiency). When-to-use and alternatives are both explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_excel_tableARead-only
Read a native Excel table by its table name, not by a worksheet tab name.
Use the exact table_name from list_tables. Omit sheet_name when unknown;
if supplied, it must be the table's containing worksheet tab, not the table name.
Supports compact table payloads, object-shaped record output, and optional
inferred schema hints.
| Name | Required | Description | Default |
|---|---|---|---|
| compact | No | ||
| end_col | No | ||
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| max_rows | No | ||
| row_mode | No | arrays | |
| start_col | No | ||
| start_row | No | ||
| sheet_name | No | ||
| table_name | Yes | ||
| infer_schema | No | ||
| include_headers | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already covers the safety profile, so the bar is lower. The description adds that output can be compact payloads, object-shaped records, or schema hints, but those mirror the compact/row_mode/infer_schema parameters rather than disclosing behavior beyond them, and nothing is said about paging or size limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the table-vs-tab distinction that matters most. Little waste, though the closing sentence enumerates output modes that the schema already names as parameters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Eleven parameters, no output schema, and near-zero schema coverage mean the description should explain column/row addressing (start_col/end_col string format) and how max_rows interacts with start_row. Those gaps would plausibly cause malformed calls, and the description does not close them.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 9% (filepath alone is documented), so the description must carry the load. It adds meaning for compact, row_mode ('object-shaped record output'), and infer_schema ('inferred schema hints'), but leaves start_row, start_col, end_col, max_rows, and include_headers entirely unglossed, including the accepted column format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource and draws the critical distinction up front: read a native Excel table by table name, not by a worksheet tab name. That contrast alone separates it from sheet/range-oriented siblings like read_data_from_excel and read_excel_as_table.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent to list_tables to obtain the exact table_name and tells it to omit sheet_name when unknown, with a clear constraint on what sheet_name means if provided. It stops short of naming when to prefer this over query_table or read_excel_as_table, so a 4 rather than 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_range_formattingCRead-only
Read a compact formatting summary for a worksheet range.
| Name | Required | Description | Default |
|---|---|---|---|
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| range_ref | Yes | ||
| sheet_name | Yes | ||
| sample_limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe non-mutating read, so the description's burden is lighter. It adds that the result is 'compact' — a summary rather than a full formatting dump — which is genuinely useful context, but it never says what is summarized (number formats, fills, borders?) or how the compacting works.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence with zero filler — nothing to trim. Its weakness is under-specification rather than verbosity, but as pure structure it is efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description must explain what a 'formatting summary' returns and how sample_limit affects it; it does neither. For a 4-parameter tool with 25% schema coverage, an agent is left guessing about the response shape and two of the inputs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 25%: sheet_name and range_ref are bare strings and sample_limit has a default of 10 with no explanation. The description's 'compact ... summary' hints at why a sample limit exists, but it never mentions sampling, sample size, or the accepted range_ref syntax, so it fails to compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read a compact formatting summary for a worksheet range'), which clearly separates it from data-reading siblings like read_data_from_excel or query_table. It does not, however, name or contrast itself against the adjacent formatting/inspection tools (format_range, inspect_conditional_format_rules, describe_sheet_layout).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to reach for this tool versus alternatives such as read_data_from_excel (values) or describe_sheet_layout (structure). The word 'formatting' only implies the use case; nothing tells the agent what problem this solves or when not to call it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_conditional_format_rulesBDestructive
Remove worksheet conditional formatting rules by index or remove all broken ones.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | ||
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| sheet_name | Yes | ||
| broken_only | No | ||
| rule_indexes | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, so the safety profile is carried by structured data. The description adds the two removal scopes, but leaves the most important behavioral question unanswered: what happens when neither rule_indexes nor broken_only is set — does it wipe all rules on the sheet? Dry-run behavior is also undisclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single compact sentence with the action and both selection modes front-loaded; nothing wasted, but the compression is partly under-specification rather than density.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A destructive, multi-param mutation tool with no output schema and thin parameter documentation needs more: the default/omitted-parameter behavior, the dry_run flag, and whether indexes refer to the order returned by inspect_conditional_format_rules are all missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 20%, and the description semantically maps to just two params ('by index' -> rule_indexes, 'broken ones' -> broken_only). It says nothing about dry_run or sheet_name/filepath handling, and nothing about whether the two selectors combine or conflict.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Remove worksheet conditional formatting rules') plus the two selection modes (by index / broken only). It is clearly distinguishable from the read-side sibling inspect_conditional_format_rules, though that contrast is not made explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The two modes imply when each applies ('by index' vs 'remove all broken ones'), but there is no guidance on when to prefer this over inspect_conditional_format_rules first, no prerequisites, and no mention of when to use dry_run before a destructive removal.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_data_validation_rulesBDestructive
Remove worksheet data validation rules by index or remove all broken ones.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | ||
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| sheet_name | Yes | ||
| broken_only | No | ||
| rule_indexes | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The destructiveHint=true annotation already carries the safety profile, and the description adds the useful scoping detail that removal can be limited to broken rules. However, it never mentions the dry_run parameter, which is the main reversibility/preview mechanism for a destructive tool, and it does not say what happens to dependent cells or invalid indexes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence with no filler and the two modes front-loaded. It is efficient, though the one-line form leaves no room for the operational caveats an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, 5-parameter mutation tool with no output schema and 20% schema coverage, the description is thin: dry_run, the interaction between rule_indexes and broken_only, and the result of a failed index are all unaddressed. It does not give an agent enough to call it safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 20% (only filepath is documented), so the description must compensate. It partially does: 'by index' maps to rule_indexes and 'broken ones' maps to broken_only. But dry_run is entirely unexplained, and nothing clarifies precedence when rule_indexes and broken_only are both supplied.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Remove worksheet data validation rules') plus the two operating modes (by index, or all broken ones). It is clearly distinguishable from siblings like inspect_data_validation_rules and remove_conditional_format_rules by resource, though it does not name them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The two modes imply usage: pass indexes to target specific rules, or target broken ones. But there is no explicit when-to-use guidance, no mention of when to prefer inspection first, and the dry_run safety path is never surfaced as a recommended first step.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rename_worksheetCDestructive
Rename worksheet in workbook.
| Name | Required | Description | Default |
|---|---|---|---|
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| new_name | Yes | ||
| old_name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, but the description adds no behavioral context such as conflicts with existing sheet names, effects on formulas referencing the old name, or error conditions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is concise and front-loaded, but the single sentence mostly restates the tool name and does not earn its place with useful detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with sparse annotations, low schema description coverage, and no output schema, the description leaves too much unsaid about inputs and side effects.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 33%, with old_name and new_name undocumented in the schema. The description implies a rename mapping but does not explain the parameters or clarify their required semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Rename worksheet'. An agent can distinguish it from create/delete/copy worksheet siblings by the operation, though the description does not explicitly contrast alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides no guidance on when to use this tool versus siblings such as copy_worksheet or delete_worksheet, and no prerequisites or exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_workbook_recipeADestructive
Preview or commit a reusable JSON recipe without echoing intermediate rows.
Recipe v1 requires version=1, source={table_name, optional sheet_name},
group_by=[exact header names], metrics=[{op, field, as}], and
output={sheet_name, range_ref, optional allow_overwrite=false}.
Optional filters use query_table operators; optional checks support unique_key
(fields), row_count (min/max), and sum_matches (source_field/output_field).
count metrics omit field. Other metrics: sum, avg, min, max, count_non_null,
count_distinct. Only literal finite JSON cells in referenced fields are supported.
Optional workbook_contract enforces Contract v1: source selectors must match,
ALL Recipe input references must use contract fields[].name, NEVER physical
fields[].headers. Copy names from inspection.recipe_input_fields (binding keys).
Example: net bound to NetSales -> metrics=[{op:"sum",field:"net",as:"Revenue"}];
currency bound to Currency -> group_by=["currency"]. The as label stays Revenue.
This also applies to filters.field, unique_key.fields and sum_matches.source_field.
Contract field errors return bounded details.examples with Recipe JSON-pointer
paths and exact replace_with names where known: fix the Recipe references only,
keep workbook_contract unchanged, then make a NEW preview before commit.
Contract filters are mandatory
AND predicates. All contract rows are checked before filtering and again on
the saved workbook. Repeat the identical contract on commit; changed contracts
invalidate recipe tokens. Declared meanings are not verified business truth.
Output is one reserved rectangle in the same workbook, fully replaced including
blank padding. Occupied output requires allow_overwrite=true; table/merge overlap
is rejected. Preview first, then commit the unchanged recipe with recipe_token
and expected_workbook_sha256 from preview. A verified snapshot is always enabled.
Limits: 50,000 source cells, 64 source columns, 10,000 output cells; sample_limit 1-10.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | preview | |
| recipe | Yes | ||
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| recipe_token | No | ||
| sample_limit | No | ||
| workbook_contract | No | ||
| expected_workbook_sha256 | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only carry destructiveHint=true; the description fills in extensive behavior beyond that: the output rectangle is 'fully replaced including blank padding,' occupied output needs allow_overwrite=true, table/merge overlap is rejected, contract changes invalidate recipe tokens, a snapshot is always enabled, and 'declared meanings are not verified business truth.' Hard limits (50k source cells, 64 columns, 10k output cells, sample_limit 1-10) are also disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, but the body is a dense unfragmented block of run-on sentences and parenthetical asides. Most content earns its place given the recipe DSL's complexity, but bullet-less prose with rapid topic shifts reduces scannability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a nested-object tool with no output schema, it covers the critical call-path details: recipe construction, contract enforcement, token/sha handoff, overwrite semantics, error shape (details.examples with JSON-pointer paths), and limits. It doesn't describe what a preview actually returns structurally (only that sample_limit controls sampling), leaving a small gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 14% (only filepath is documented), so the description must compensate, and it largely does: it spells out the v1 recipe shape (version, source, group_by, metrics with op/field/as, output, filters, checks) and explains recipe_token and expected_workbook_sha256 as coming from preview, plus sample_limit 1-10. It leaves the mode enum's default and full meaning implicit and only references filters/checks as 'query_table operators' without detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb pair (preview/commit) and a specific resource (a reusable JSON recipe that writes to a reserved output rectangle in a workbook). The 'without echoing intermediate rows' clause adds a distinguishing trait. It doesn't explicitly say how it differs from sibling aggregate_table or query_table, keeping it at 4.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit workflow: 'Preview first, then commit the unchanged recipe with recipe_token and expected_workbook_sha256 from preview.' Also prescribes the error-recovery sequence ('fix the Recipe references only, keep workbook_contract unchanged, then make a NEW preview'). However, it never says when to reach for this tool versus aggregate_table/query_table, so no explicit alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_in_sheetCRead-only
Search for cells matching a value in a worksheet.
| Name | Required | Description | Default |
|---|---|---|---|
| exact | No | ||
| query | Yes | ||
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| sheet_name | Yes | ||
| max_results | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe read, so the description owes no safety disclosure. Beyond that it adds nothing: no indication of what matches look like (cell addresses vs values), case sensitivity, cost/limits on scanning, or what exact=false changes. The single sentence is essentially a restatement of the title.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short, front-loaded sentence with zero redundancy, but the brevity is under-specification rather than economy – it leaves obvious questions unanswered given a five-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With five parameters, four undocumented, and no output schema, the definition should at minimum explain matching mode and result shape. Instead, an agent cannot tell whether results are cell addresses, values, or ranges, nor how exact=false modifies matching.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 20% – only filepath is documented. The query, sheet_name, exact (default true), and max_results (default 50) parameters have no schema descriptions, and the description does not compensate: it never explains matching semantics for exact, what max_results truncation means, or whether query is typed as string/number/regex.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (search) and resource (cells matching a value in a worksheet), so an agent knows exactly what the operation does. It does not, however, distinguish itself from nearby read-oriented siblings such as query_table, read_data_from_excel, or quick_read.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no signal about when to prefer this over the many other read/query siblings, nor any prerequisites or exclusions. An agent must infer usage purely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_autofilterCDestructive
Set worksheet autofilter for an explicit or inferred range.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | ||
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| range_ref | No | ||
| sheet_name | Yes | ||
| include_changes | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only supply destructiveHint=true; the description adds nothing about that risk. It does not say whether an existing autofilter is replaced, whether data is altered or just a view is set, or what dry_run and include_changes do behaviorally.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. It is efficient, though the brevity comes at the cost of the missing details flagged elsewhere.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive 5-parameter mutation tool with no output schema and 80% undocumented schema coverage, one sentence is inadequate. An agent cannot tell what the tool changes, what dry_run returns, or how the inferred range is determined.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 20% (filepath is the sole documented parameter). The description implies range_ref is optional by saying the range may be "inferred," but says nothing about sheet_name, dry_run, or include_changes, leaving most parameters undocumented in both places.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb plus resource ("Set worksheet autofilter") and notes the range can be explicit or inferred, which tells an agent what the tool acts on. It does not distinguish itself from any sibling, but no sibling is an obvious near-duplicate here.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus applying a filter through other means, no preconditions (does the sheet need data? must it be unprotected?), and no mention of dry_run as a safe preview path. The only hint is that the range may be inferred, which is usage-adjacent but not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_column_widthsCDestructive
Set explicit widths for one or more worksheet columns.
| Name | Required | Description | Default |
|---|---|---|---|
| widths | Yes | ||
| dry_run | No | ||
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| sheet_name | Yes | ||
| include_changes | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, so the agent knows this mutates. The description adds nothing beyond that: it doesn't say existing widths are overwritten, whether protected sheets are rejected, or that dry_run/include_changes exist for previewing and reporting effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence with no filler. It is efficient, though its brevity here reflects under-specification rather than tight writing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter destructive mutation with no output schema and a nested object parameter, the description leaves out the widths format, the dry_run behavior, and what happens to previously set widths. Not enough for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 20% (just filepath). The critical 'widths' object is undocumented — no example like {"A": 20} or unit semantics — and dry_run and include_changes appear only as bare titles with defaults. The description compensates for none of this.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Set explicit widths ... worksheet columns'), which is clear on its own. It does not distinguish itself from the obvious sibling autofit_columns, which sets widths indirectly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to choose this over autofit_columns, no preconditions (e.g., sheet existence, protection), and no mention of the provided dry_run parameter as a safe-preview path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_print_areaCDestructive
Set or clear worksheet print area.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | ||
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| range_ref | No | ||
| sheet_name | Yes | ||
| include_changes | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, so the description's main job would be adding context such as what clearing removes, whether the action is reversible, or how dry_run behaves. It adds almost none of that, only noting the dual set/clear behavior. That duality is a real behavioral fact but it is left unexplained in terms of trigger or consequence.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence with no filler, so nothing is wasted. But the brevity comes from under-specification rather than tight editing; the definition is too thin for a five-parameter mutation tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, five-parameter mutation with no output schema and a dry_run flag, the agent needs to know how a dry run reports its would-be changes and how ranges map to the print area. Neither is covered, so an agent must guess at the tool's real contract.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 20% (filepath alone is documented), so the description must carry the load for range_ref, sheet_name, dry_run, and include_changes — yet it names none of them. At best, 'or clear' faintly implies range_ref can be null to remove the print area, but that is never stated and the other four parameters get no semantic help.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb pair and resource: setting or clearing a worksheet's print area. An agent can tell what it mutates without opening the schema. It does not differentiate itself from neighbors such as set_print_titles, which is a similar-sounding sibling an agent could confuse it with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus set_print_titles or other layout tools, and no stated prerequisites. The set-versus-clear distinction is only implicit in the word 'or' — the description never says that omitting the range clears the print area.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_print_titlesBDestructive
Set, preserve, or clear repeating print title rows and columns.
| Name | Required | Description | Default |
|---|---|---|---|
| rows | No | ||
| columns | No | ||
| dry_run | No | ||
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| sheet_name | Yes | ||
| include_changes | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The destructiveHint annotation already flags that this is a destructive operation, and the description adds useful mode information by mentioning set, preserve, and clear. However, it does not explain what is destroyed when clearing, how dry_run or include_changes affect behavior, or whether changes are reversible.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no filler, so it is maximally concise and well structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter destructive mutation tool with no output schema and low schema description coverage, the one-sentence description is too sparse. It states the broad purpose but leaves key parameters and behavioral details unexplained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 17%, so the description needs to compensate for undocumented parameters. It only maps conceptually to rows and columns and says nothing about accepted string formats, null semantics, dry_run, or include_changes.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: setting, preserving, or clearing repeating print title rows and columns. It is clearly distinct from set_print_area, but it does not explicitly name alternatives or sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies that the tool is used for print title rows and columns, but it gives no explicit guidance on when to choose it over siblings such as set_print_area or freeze_panes. It also omits prerequisites and when-not-to-use conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_row_heightsCDestructive
Set explicit heights for one or more worksheet rows.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | ||
| heights | Yes | ||
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| sheet_name | Yes | ||
| include_changes | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, and the description adds only the word 'explicit', which hints at overriding existing sizing. It does not explain what dry_run previews, what include_changes returns, whether existing heights are replaced or merged, or whether the operation requires an unprotected sheet.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no wasted words. Brevity is achieved, though partly through under-specification rather than tight editing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, 5-parameter tool with a nested object and no output schema, one sentence is far from sufficient. Nothing tells the agent how heights are keyed, what units apply, or what the dry-run/changeset options do.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 20% (only filepath documented), so the description must compensate. It does imply that 'heights' is a row-to-height mapping via 'one or more worksheet rows', but dry_run and include_changes remain completely undefined in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear specific verb (set) plus resource (row heights) with scope (one or more rows). However it gives no differentiation from closely related siblings like set_column_widths or autofit_columns, so an agent must infer which tool applies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no exclusions, and no mention of alternatives such as autofit_columns or format_range. The agent must infer entirely from the tool name that this sets manual heights rather than auto-sizing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_worksheet_protectionCDestructive
Enable or disable worksheet protection with optional capability flags.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | ||
| enabled | No | ||
| options | No | ||
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| password | No | ||
| sheet_name | Yes | ||
| include_changes | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare destructiveHint=true, so the description carries most of the burden. It does not say that disabling strips existing protection from the sheet, whether a password is required to unprotect, what the capability flags actually govern, or that dry_run previews the effect.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. It is tight, but the brevity comes at the cost of the missing detail noted elsewhere.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter mutating tool with a password field, a dry-run flag, and no output schema, the description is far too thin. An agent cannot tell what the tool returns, how protection interacts with an existing password, or what dry_run changes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 14% across 7 parameters, so the description must compensate and largely does not. 'Optional capability flags' gestures at the options object, but enabled, password, dry_run, and include_changes are left entirely to bare schema titles.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: enable or disable worksheet protection, plus the notion of capability flags. An agent can tell what the tool does, though it is not distinguished from the sibling get_worksheet_protection (the read counterpart).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use, when-not, or prerequisite guidance. It never points to get_worksheet_protection for inspecting current protection state, nor does it explain when dry_run should be used before a real change.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_worksheet_visibilityCDestructive
Set worksheet visibility to visible, hidden, or veryHidden.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | ||
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| sheet_name | Yes | ||
| visibility | Yes | ||
| include_changes | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The destructiveHint annotation already flags this as a mutation, but the description adds no behavioral context. It does not explain what hidden or veryHidden means in practice, whether visible restores prior state, how protected workbooks behave, or what dry_run changes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no filler. It is efficiently structured, though its brevity contributes to the completeness gaps scored elsewhere.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive worksheet mutation with no output schema and weak parameter documentation, the description is too thin. It does not cover dry-run semantics, side effects, or the meaning of include_changes, leaving an agent without enough context for safe invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description clarifies the visibility values, which is useful because the schema defines no enum for that parameter. However, with 5 parameters and only 20% schema description coverage, it leaves sheet_name format, dry_run, and include_changes unexplained, so it does not compensate for the low coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb ('Set') and resource ('worksheet visibility'), and lists the allowed visibility states. It is distinguishable from siblings such as delete_worksheet or set_worksheet_protection, but it does not explicitly contrast them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides no when-to-use guidance, no prerequisites, and no alternatives. An agent must infer from the tool name alone that this is the tool for changing visibility rather than deleting or protecting a sheet.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suggest_read_strategyCRead-only
Recommend the best SheetForge read tool for the requested workbook target.
| Name | Required | Description | Default |
|---|---|---|---|
| goal | No | ||
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| header_row | No | ||
| sheet_name | No | ||
| table_name | No | ||
| sample_rows | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true is already declared, so the description only needs to add behavior — but it does not say whether this tool actually opens/parses the workbook (and at what cost) or just reasons over the arguments, nor how the recommendation is returned. For a 'strategy' tool, the distinction between inspecting the file versus returning a static suggestion is the single most important behavioral fact, and it is missing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. It is efficiently written, though the brevity contributes to the specification gaps noted elsewhere rather than being 'complete and tight'.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Six parameters at 17% coverage, no output schema, and only a readOnly annotation — the description is far too thin for a tool whose whole value is explaining which reader to pick and why. It never says how the recommendation should be interpreted or whether the caller is expected to re-invoke the suggested tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 17% — just filepath is documented; goal, header_row, sheet_name, table_name, and sample_rows are bare. The description mentions only an abstract 'workbook target' and adds no meaning for goal (what kind of goal phrasing helps), sample_rows (why 25), or header_row.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Recommend') and object ('best SheetForge read tool for the requested workbook target'), so an agent knows this is a router/advisor rather than a reader. It does not name the candidate read tools (quick_read, read_excel_as_table, read_range_formatting) or say what signal the recommendation is based on, so it is clear but undifferentiated from the many read siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to call this instead of directly calling quick_read, describe_dataset, or read_excel_table, and no prerequisites or exclusions. The agent must infer the 'call me first when unsure which reader to use' pattern from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
union_tablesCRead-only
Union comparable worksheet or table data across multiple workbook files.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| select | No | ||
| sort_by | No | ||
| row_mode | No | arrays | |
| dedupe_on | No | ||
| filepaths | Yes | ||
| sort_desc | No | ||
| header_row | No | ||
| sheet_name | No | ||
| table_name | No | ||
| schema_mode | No | strict | |
| infer_schema | No | ||
| source_sample_limit | No | ||
| include_source_columns | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already establishes that this is a safe read operation, so the description does not need to cover safety. However, it says nothing about important behavior for a 14-parameter operation: strict versus inferred schema handling, what happens when source schemas differ, or how deduplication and error cases behave.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no filler. It is structurally efficient, though its brevity leaves substantial gaps that are penalized elsewhere.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 14-parameter tool with no output schema, this description is far too sparse. It does not explain how schema alignment works, what 'comparable' means in practice, or how the many options affect the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is effectively 0%, and the description explains none of the 14 parameters. It vaguely implies file inputs and worksheet/table sources, but gives no meaning for limit, select, sort_by, row_mode, dedupe_on, schema_mode, infer_schema, header_row, or include_source_columns.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Union') and resource ('worksheet or table data across multiple workbook files'), making the core operation clear. It does not explicitly distinguish itself from siblings such as cross_workbook_lookup or aggregate_table, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no when-to-use guidance, no exclusions, and no alternatives. An agent cannot tell from this text when unioning is preferable to cross_workbook_lookup, query_table, or aggregate_table.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unmerge_cellsCDestructive
Unmerge a range of cells.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | ||
| end_cell | Yes | ||
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| sheet_name | Yes | ||
| start_cell | Yes | ||
| include_changes | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, so the safety profile is known, but the description adds nothing beyond that: it does not say what happens to the underlying values or formatting (only the top-left cell's content is typically kept), nor does it explain the dry_run or include_changes options that mitigate that risk.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with no filler and the action front-loaded. Its brevity is more under-specification than verbosity, which is penalized elsewhere, so structure itself is fine.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation with 6 parameters, 17% schema coverage and no output schema, the description should at least cover the dry_run escape hatch and data-loss semantics. It leaves an agent without enough to call this safely or correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 17% — only filepath is documented, and even that lives in the schema, not the description. The description's phrase 'a range of cells' weakly implies start_cell/end_cell but says nothing about sheet_name, dry_run, or include_changes, leaving most of the 6 parameters unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Unmerge a range of cells'), which is unambiguous. However, it does not differentiate from the close siblings merge_cells and get_merged_cells, so the agent gets no routing signal from the text itself.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this versus merge_cells or when to inspect existing merges with get_merged_cells first. It also gives no precondition such as the range actually containing merged cells.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_rows_by_keyCDestructive
Update existing table rows using a named key column.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | ||
| updates | Yes | ||
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| header_row | No | ||
| key_column | Yes | ||
| sheet_name | Yes | ||
| include_changes | No | ||
| expected_structure_token | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare destructiveHint=true, but the description does not explain what is destroyed or overwritten, how unmatched keys are handled, what dry_run does, or what include_changes and expected_structure_token control. For an 8-parameter destructive mutation, this leaves important behavior opaque.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The sentence is concise and front-loaded, but it is too thin for a destructive tool with eight parameters. Conciseness is achieved at the cost of necessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given eight parameters, low schema coverage, destructive behavior, and no output schema, the description is not complete enough. It omits key semantics around updates structure, dry-run behavior, change reporting, and structure-token validation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 13%, and the description explains only the concept of a key column. It adds no meaning for updates, filepath, sheet_name, header_row, dry_run, include_changes, or expected_structure_token, leaving most parameters undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Update') and resource ('existing table rows') with the key mechanism ('using a named key column'). However, it does not distinguish this tool from nearby siblings such as upsert_excel_table_rows or apply_table_patch.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance on when to use this tool versus alternatives, no mention of prerequisites, and no exclusions. The agent must infer its role from the name and sibling list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upsert_excel_table_rowsCDestructive
Update matching rows in a native Excel table and append missing keys.
| Name | Required | Description | Default |
|---|---|---|---|
| rows | Yes | ||
| dry_run | No | ||
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| key_column | Yes | ||
| sheet_name | No | ||
| table_name | Yes | ||
| include_changes | No | ||
| allow_structure_change | No | ||
| expected_structure_token | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, and the description is consistent with that. However, it discloses nothing about the safety machinery in the schema: dry_run preview, allow_structure_change, and expected_structure_token are all opt-in behaviors an agent must know about before mutating a workbook. For a destructive 9-param mutation, that is a major omission.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the core behavior leads. It is concise to the point of under-specification, but that is penalized in other dimensions rather than here.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Nine parameters, 11% schema coverage, no output schema, and a destructive annotation — the description supplies none of the guardrail or key-matching context an agent needs to call this safely. Substantially incomplete for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 11% — only filepath is documented. The description alludes to key-based matching but never names key_column, and says nothing about rows shape, dry_run, sheet_name, include_changes, allow_structure_change, or expected_structure_token. With 8 of 9 parameters undocumented, the description fails to compensate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource pair ('Update matching rows in a native Excel table') and adds the upsert twist ('append missing keys'), which meaningfully separates it from append_excel_table_rows and update_rows_by_key. It stops short of naming those siblings explicitly, so an agent must infer the distinction from the word 'upsert'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The upsert semantics imply when to use it (mixed insert/update workloads), but there is no explicit when-not or pointer to append_excel_table_rows / update_rows_by_key for the pure-append or pure-update cases. Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_excel_rangeCRead-only
Validate if a range exists and is properly formatted.
| Name | Required | Description | Default |
|---|---|---|---|
| end_cell | No | ||
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| sheet_name | Yes | ||
| start_cell | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true is consistent with the description, but beyond that nothing is disclosed: it doesn't say whether an invalid range raises an error or returns a falsy result, whether an out-of-used-range but syntactically valid cell counts as 'exists', or anything about cost. Essentially restates the tool name.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. It is efficient, though its brevity is partly under-specification rather than tight writing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and 75% of parameters undocumented, the description should explain the result shape (boolean? message?) and the end_cell-omitted behavior, but it explains neither. An agent cannot predict what it will get back or how to act on it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 25% (filepath is the only documented parameter), so the description must compensate and does not. It never explains what start_cell/end_cell refer to (A1 notation?) or that end_cell is optional/null and presumably means a single-cell range, nor what sheet_name scoping implies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('validate') and resource ('range') plus the two things checked: existence and formatting. This distinguishes it from sibling readers/mutators like read_range_formatting or inspect_workbook_contract, though 'properly formatted' is left undefined.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to call this versus the many sibling readers (read_data_from_excel, quick_read, read_range_formatting) or what to do with a negative result. The agent must infer both the trigger condition and the follow-up action.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_formula_syntaxBRead-only
Validate Excel formula syntax without applying it.
| Name | Required | Description | Default |
|---|---|---|---|
| cell | Yes | ||
| formula | Yes | ||
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| sheet_name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is non-mutating, so 'without applying it' is largely redundant with the annotation. The description adds nothing about what validation produces (boolean vs. error message), whether validation is contextual to the given cell/sheet, or whether the file must exist first.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler or repetition. It is efficient, though the terseness contributes to the gaps noted in the other dimensions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Four required parameters, no output schema, and a mutation-adjacent workflow ('validate before apply') — yet the description says nothing about return values (pass/fail shape, error detail) or the sheet/cell context requirement. For this parameter profile the description should carry far more.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 25% — just filepath is documented — and the description supplies zero parameter meaning. It does not explain the non-obvious requirement that sheet_name and cell give the reference context needed to validate relative/A1 references, which is the key semantic an agent would otherwise have to guess.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (validate Excel formula syntax) and the qualifier 'without applying it' implicitly separates it from the write-side sibling apply_formula. It does not name inspect_formula or explain_formula_cell, so the boundary with those read-side formula tools is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Without applying it' hints at the check-before-apply workflow but never states when to prefer this over apply_formula or inspect_formula. The agent must infer that this is a pre-flight gate rather than a diagnostic/explanation tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
write_data_to_excelCDestructive
Write data to Excel worksheet.
Excel formula will write to cell without any verification.
PARAMETERS:
filepath: Path to Excel file
sheet_name: Name of worksheet to write to
data: List of lists containing data to write to the worksheet, sublists are assumed to be rows
start_cell: Cell to start writing to, default is "A1"| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | ||
| dry_run | No | ||
| filepath | Yes | Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing. | |
| sheet_name | Yes | ||
| start_cell | No | A1 | |
| include_changes | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The destructiveHint annotation already signals mutation. The description adds a useful warning that 'Excel formula will write to cell without any verification,' but it does not explain overwrite behavior, whether existing data is replaced, what dry_run does, or other operational details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded: a one-line purpose followed by a warning and compact parameter notes. Every part is relevant, though it could be slightly better organized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive 6-parameter write tool with no output schema and low schema description coverage, the description leaves important gaps: dry_run and include_changes are undocumented, overwrite semantics are unstated, and return behavior is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 17%, and the description omits two parameters entirely: dry_run and include_changes. It does add useful meaning for data ('list of lists... sublists are assumed to be rows'), but that partial compensation is insufficient given the low schema coverage and missing safety-related parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Write data to Excel worksheet.' It is clear what the tool does, though it does not explicitly differentiate itself from siblings such as append_table_rows, upsert_excel_table_rows, or apply_formula.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like append_table_rows, upsert_excel_table_rows, or apply_formula. It also lacks prerequisites or exclusions.
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.
82 tool updates
v0.14.0- Changed
aggregate_table1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
analyze_range_impact1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
append_excel_table_rows1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
append_table_rows1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
apply_formula1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Added
apply_table_patch - Changed
apply_workbook_changeset2 fields changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing." - changed
Input schema / properties / snapshot_filepath / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "description": "Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing.", + "type": "string" + }, + { + "type": "null" + } +]
- Changed
apply_workbook_repairs1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
audit_workbook1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
autofit_columns1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
bulk_aggregate_workbooks1 field changed- added
Input schema / properties / filepaths / items / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
bulk_filter_workbooks1 field changed- added
Input schema / properties / filepaths / items / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
copy_range1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
copy_worksheet1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
create_chart1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
create_chart_from_series1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
create_named_range1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
create_pivot_table1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
create_table1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
create_workbook1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
create_workbook_snapshot2 fields changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing." - added
Input schema / properties / snapshot_filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
create_worksheet1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
cross_workbook_lookup2 fields changed- added
Input schema / properties / lookup_filepaths / items / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing." - added
Input schema / properties / source_filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
delete_named_range1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
delete_range1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
delete_sheet_columns1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
delete_sheet_rows1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
delete_worksheet1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
describe_dataset1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
describe_sheet_layout1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
detect_circular_dependencies1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
diff_workbooks2 fields changed- added
Input schema / properties / after_filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing." - added
Input schema / properties / before_filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Added
evaluate_workbook_scenarios - Changed
explain_formula_cell1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Added
explain_recipe_delta - Changed
find_free_canvas1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
format_range1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
format_ranges1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
freeze_panes1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
get_data_validation_info1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
get_merged_cells1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
get_workbook_metadata1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
get_worksheet_protection1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
insert_columns1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
insert_rows1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
inspect_conditional_format_rules1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
inspect_data_validation_rules1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
inspect_named_range1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Added
inspect_workbook_contract - Changed
list_all_sheets1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
list_charts1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
list_named_ranges1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
list_tables1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
merge_cells1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
plan_workbook_repairs1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
profile_workbook1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
query_table1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
quick_read1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
read_data_from_excel1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
read_excel_as_table1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
read_excel_table1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
read_range_formatting1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
remove_conditional_format_rules1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
remove_data_validation_rules1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
rename_worksheet1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Added
run_workbook_recipe - Changed
search_in_sheet1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
set_autofilter1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
set_column_widths1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
set_print_area1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
set_print_titles1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
set_row_heights1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
set_worksheet_protection1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
set_worksheet_visibility1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
suggest_read_strategy1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
union_tables1 field changed- added
Input schema / properties / filepaths / items / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
unmerge_cells1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
update_rows_by_key1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
upsert_excel_table_rows1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
validate_excel_range1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
validate_formula_syntax1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
- Changed
write_data_to_excel1 field changed- added
Input schema / properties / filepath / descriptionAdded value: +"Reuse supplied server path; NEVER prepend client cwd. Rooted: relative OK; unrooted stdio: absolute, ask if missing."
1 tool update
v0.10.0- Added
apply_workbook_changeset
5 tool updates
v0.9.0- Changed
create_workbook1 field changed- added
Input schema / properties / sheet_nameAdded value: +{ + "default": "Sheet1", + "title": "Sheet Name", + "type": "string" +}
- Added
create_workbook_snapshot - Changed
describe_dataset1 field changed- added
Input schema / properties / read_boundary_modeAdded value: +{ + "default": "default", + "title": "Read Boundary Mode", + "type": "string" +}
- Changed
quick_read1 field changed- added
Input schema / properties / read_boundary_modeAdded value: +{ + "default": "default", + "title": "Read Boundary Mode", + "type": "string" +}
- Changed
read_excel_as_table1 field changed- added
Input schema / properties / read_boundary_modeAdded value: +{ + "default": "default", + "title": "Read Boundary Mode", + "type": "string" +}
76 tool updates
v0.8.0- First observed
aggregate_table - First observed
analyze_range_impact - First observed
append_excel_table_rows - First observed
append_table_rows - First observed
apply_formula - First observed
apply_workbook_repairs - First observed
audit_workbook - First observed
autofit_columns - First observed
bulk_aggregate_workbooks - First observed
bulk_filter_workbooks - First observed
copy_range - First observed
copy_worksheet - First observed
create_chart - First observed
create_chart_from_series - First observed
create_named_range - First observed
create_pivot_table - First observed
create_table - First observed
create_workbook - First observed
create_worksheet - First observed
cross_workbook_lookup - First observed
delete_named_range - First observed
delete_range - First observed
delete_sheet_columns - First observed
delete_sheet_rows - First observed
delete_worksheet - First observed
describe_dataset - First observed
describe_sheet_layout - First observed
detect_circular_dependencies - First observed
diff_workbooks - First observed
explain_formula_cell - First observed
find_free_canvas - First observed
format_range - First observed
format_ranges - First observed
freeze_panes - First observed
get_data_validation_info - First observed
get_merged_cells - First observed
get_workbook_metadata - First observed
get_worksheet_protection - First observed
insert_columns - First observed
insert_rows - First observed
inspect_conditional_format_rules - First observed
inspect_data_validation_rules - First observed
inspect_formula - First observed
inspect_named_range - First observed
list_all_sheets - First observed
list_charts - First observed
list_named_ranges - First observed
list_tables - First observed
merge_cells - First observed
plan_workbook_repairs - First observed
profile_workbook - First observed
query_table - First observed
quick_read - First observed
read_data_from_excel - First observed
read_excel_as_table - First observed
read_excel_table - First observed
read_range_formatting - First observed
remove_conditional_format_rules - First observed
remove_data_validation_rules - First observed
rename_worksheet - First observed
search_in_sheet - First observed
set_autofilter - First observed
set_column_widths - First observed
set_print_area - First observed
set_print_titles - First observed
set_row_heights - First observed
set_worksheet_protection - First observed
set_worksheet_visibility - First observed
suggest_read_strategy - First observed
union_tables - First observed
unmerge_cells - First observed
update_rows_by_key - First observed
upsert_excel_table_rows - First observed
validate_excel_range - First observed
validate_formula_syntax - First observed
write_data_to_excel
TDQS
Scored across 83 tools
The server has many functionally overlapping tools, especially read paths such as read_data_from_excel, read_excel_as_table, quick_read, read_excel_table, query_table, and describe_dataset. Validation and append/update operations also have similar boundaries, and while some descriptions clarify intended use, an agent would still need lots of context to pick correctly.
Most names follow a snake_case verb_noun convention such as create_worksheet, delete_named_range, and set_column_widths. There are minor deviations and confusingly similar pairs like append_table_rows vs append_excel_table_rows and update_rows_by_key vs upsert_excel_table_rows, but the overall pattern is readable and consistent.
With 83 tools, the surface is extremely large for an Excel MCP server and includes many specialized one-off operations. Even though Excel is a broad domain, this count far exceeds a well-scoped toolset and creates substantial selection overhead.
The server covers a wide range of workbook operations, including reads, writes, formatting, tables, charts, named ranges, protection, layout, recipes, and auditing. However, lifecycle gaps remain for some objects, notably no visible creation for conditional formatting rules and limited create/update/delete coverage for charts, pivot tables, and native tables.
Maintenance
Related MCP Connectors
Let AI agents read, check and edit Excel models. Open a workbook or drop in one MCP config. Either way: typed cells, a formula dependency graph, and a verification certificate. Deterministic — no OCR, no model guessing at your numbers.
An agent-first office suite Claude & ChatGPT read and write over one MCP URL.
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
Open-source Zapier/n8n alternative as an MCP server: agents build, run and debug your workflows.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA Model Context Protocol server that enables AI agents to create, read, and modify Excel workbooks without requiring Microsoft Excel installation.MIT
- AlicenseBqualityDmaintenanceMCP server for semantic spreadsheet operations that lets LLMs create and edit Excel workbooks by describing spreadsheet intent.42MIT
- AlicenseNot gradedqualityBmaintenanceMCP server for Excel-compatible formula evaluation and workbook operations, enabling agents to open, inspect, mutate, recalculate, and save .xlsx files in-memory over stdio.284 npmApache 2.0
- AlicenseNot gradedqualityDmaintenanceA Model Context Protocol (MCP) server that lets you manipulate Excel files without needing Microsoft Excel installed. Create, read, and modify Excel workbooks with your AI agent.MIT