Skip to main content
Glama
KitchenSink4AI

io.github.nometalalchemist/kitchensink4xl

๐Ÿ”Œ KitchenSink4XL

Tests PyPI License: AGPL-3.0

Landing page ยท llms.txt (machine-readable capability manifest for agents and LLM crawlers)

Everything plus the kitchen sink for Microsoft Excel: the .xlsx MCP server that never hands your AI a number it cannot back up. 129 workbook operations across 67 tools, a lite core that opens at about 14,500 tokens, and a safety core that backs up before every change and verifies every save.

New here? Start with the Quickstart.

The number that looks right and isn't

Here is the dirty secret of every tool that reads Excel files: a spreadsheet remembers its answers, not its thinking. When something changes upstream, the old answers just sit there, looking exactly like real numbers. Most AI tools will read one anyway and confidently report it, and you will make a decision based on it. This server refuses to bluff. Every number it hands your AI comes with the truth attached: freshly calculated, remembered from the last save, or missing, with the affected cells named. And when it really matters, it asks Excel itself to recalculate and prove it.

Related MCP server: Excel MCP Server

What happens to column F when you insert column D

Insert one column in a real workbook and you find out how much of a spreadsheet lives to the right of where you clicked. Formulas, totals, charts, that table on sheet three that quietly feeds the summary: all of them have opinions about where their cells just went.

Most tools do the cheap version: move the cells, save the file, hope. The damage never shows up when the edit runs. It shows up three days later, in a meeting, in the one total that quietly stopped including its last row.

This server moves everything that should move, and checks the result against what Excel itself would have done. When an edit cannot be done safely, it says no out loud instead of guessing quietly. A refusal costs you a minute. A quiet guess costs you the deal.

Two numbers that matter

  • 129 workbook operations, 67 tools. Many tools here are action multiplexers, so the tool count undersells the surface: manage_worksheet alone performs seven distinct operations, manage_table nine, validate runs nine correctness batteries. The operations figure comes from scripts/count_operations.py, which reads the dispatch values each tool actually validates, out of committed source, and never from hand-math. Its docstring carries the counting definition and what is deliberately excluded. A committed snapshot (scripts/operations_snapshot.json) plus a guard test make a drifting figure a test failure rather than a marketing decision.

  • Tiered loading: starts at about 14.5k tokens, scales to everything. A fresh session loads the 40-tool lite core and turns on capability packs only when a task needs them, with one enable_tools call. Load every pack and the full surface measures about 24,200 tokens. All figures come from scripts/measure_surface.py; see Context cost.

The packs

The stock is arranged in capability packs, the way a good shop groups what belongs together. A session opens on the lite core and switches on the pack a job needs with one call. Numbers below come straight from scripts/measure_surface.py, never hand-counted.

Pack

Tools

Approx tokens

What it carries

lite (startup)

40

~14.5k

The everyday bench: an anchored grid view of the workbook, labeled reads of cells and ranges, server-side query and aggregation, formula write and audit, structural row and column edits that carry their references, sort and filter with Excel's own ranking, tables, formatting, import and export, backups, diagnostics, and the enable_tools switchboard

design

9

~4.1k

Named cell styles, a format painter, a style-bloat audit, conditional formatting, data validation, images, charts, the full table lifecycle (columns, totals, resize, banding), and named ranges including LAMBDA definitions and a cleanup pass

io

9

~2.8k

Page layout and print setup, headers and footers, advisory protection, legacy comments, multi-sheet export, and the read-side inspectors: external links, VBA, existing pivot tables, and data connections

com

11

~2.8k

Drives a private hidden Excel instance, never your open session: real recalculation, real pivot tables, goal seek, PDF export, sheet render to image, format conversion, real encryption, sparklines, true autofit, an opens-clean check, and an honest status report

Full surface

69

~24.2k

Everything (67 workbook tools plus enable_tools / disable_tools)

Quickstart: start lite, enable what you need

A session begins with the lite core. When a task needs more, the agent turns on the pack by name:

enable_tools(["design"])        # styles, conditional formatting, charts, names
enable_tools(["com"])           # real recalculation, real pivots, PDF export

The lite core carries no degraded stand-ins, so the lazy path is a dead end on purpose: a refusal for out-of-scope work names the exact pack and the exact call that unlocks it. Power users who want everything loaded from the start can pin it with KS4XL_MODE=full in the server environment, or a comma-separated pack list. Administrators can lock the selection with KS4XL_PACK_POLICY=locked.

Against the rest of the aisle

Feature grids flatter everybody. Here it is instead as the requests an agent actually gets:

"Hey, could youโ€ฆ"

๐Ÿ”Œ KitchenSink4XL

haris-musa (openpyxl), 4,155โ˜…โ€ 

The rest of the aisle*

"Insert a column in the middle, keep every formula pointing where it should."

โœ” formulas, tables, named ranges, charts and cross-sheet links all follow, checked against Excel's own recalculation

โœ˜ nothing in the docs says otherwise, and openpyxl, the library underneath, states plainly that it does not maintain formulas, tables or charts when rows and columns move

Excel does the shifting itself, on Windows, with the workbook closed and the application running

"Is this total current, or left over from the last save?"

โœ” every value labeled calculated, cached or absent, and the stale cells named by address

โœ˜ reads return the formula string; there is no way to get even the cached value

the COM server recalculates with Excel's own engine, but the value comes back with no freshness marking of any kind

"Sort it the way Excel would sort it, blanks and all."

โœ” numbers, then text case-insensitively, then FALSE, TRUE, errors, blanks last, both directions, checked cell for cell against Excel

โœ˜ no sort tool

Excel's own sort, with the application running

"Write a LAMBDA the file can still open afterward."

โœ” modern functions and their declared parameters prefixed correctly; 80 formulas across every documented family opened with no repair prompt

n/d, and no Excel MCP server surveyed documents the modern functions either way, as support or as a limitation

n/d

"Read the big workbook without torching my context window."

โœ” compact reads, a grid view, and server-side query and aggregation so the rows stay on the server

โœ˜ no pagination and no token budgeting anywhere in the docs; with no end cell given it reads the whole used range

the Go server pages reads by cell count, 4,000 cells at a time by default

"Recalculate it for real and prove it."

โœ” a private hidden Excel does the arithmetic and the result comes back labeled calculated, never mixed in with cached values

โœ˜ no recalculation tool, and the documentation never raises the subject

real recalculation on the COM server, which asks for Windows, an installed Excel, an interactive desktop and the workbook closed first

Capability survey as of 2026-09-04, compiled from public repositories, documentation, and issue trackers. n/d: not documented in the sources surveyed, which is not a claimed absence. The most popular Excel MCP server is haris-musa/excel-mcp-server, 25 tools on openpyxl, last released 2026-04-12; its own open issues #94 and #118 ask for computed values instead of formula text. openpyxl's documentation states that it does not manage dependencies such as formulae, tables and charts when rows or columns are inserted or deleted. * The rest of the aisle: negokaz/excel-mcp-server (Go, seven tools, paginated reads, live editing on Windows), sbroenne/mcp-server-excel (C#, 31 tools over 326 operations driving the real Excel application, the capability ceiling, but Windows with Excel and exclusive access to the file, and no file-based tier). Two newer servers, PSU3D0/agent-spreadsheet and logisky/logisheets-mcp, embed real calculation engines and are worth watching. Microsoft ships no Excel MCP server, and Claude for Excel is an Office add-in rather than an MCP server. โ€  Star counts read from the GitHub API on 2026-09-04, shown for context: stars say how long a shelf has been in view, not what is on it. Corrections welcome: open an issue.

Requirements

  • Python 3.12+ (developed on 3.14)

  • Most of this server needs no Excel installed at all and runs on any computer. The parts that ask Excel to do the work want Windows with Excel on it, and they open their own private copy, so the workbook you have on screen is never touched.

Install

Pick the line that describes you. Most people are the first one.

First launch through uvx downloads and builds the environment and can take 20 to 30 seconds before the server answers; every launch after that starts in about two. If a client reports a timeout on first install, launch once from a terminal and try again.

Using Claude Desktop? One double-click.

Download kitchensink4xl.mcpb from the latest release and double-click it, or drag it into the Claude Desktop window. Desktop adds it as an extension and the sink is connected. Nothing to type, nothing to configure. One-time requirement: uv on your PATH (pip install uv), which the bundle uses to start the server. If Desktop does not pick the file up on a double-click, use Settings > Extensions > Advanced settings > Install extension.

The extension's settings page offers two switches. Verify every save with Excel turns on the deep check, where a real hidden Excel has to open the saved file cleanly or the backup is restored; it is off by default because it costs a round trip through Excel on every write. Limit the server to one folder confines every path the server touches, reads included, to a directory you pick.

Using Claude Code? Paste this.

claude mcp add xl -s user -- uvx kitchensink4xl

One line in a terminal and you are done. It fetches and runs the server for you, so there is nothing to install first.

Install the package and point any MCP client at the executable:

pip install kitchensink4xl
{"mcpServers": {"xl": {"command": "kitchensink4xl", "env": {"KS4XL_MODE": "lite"}}}}

The mode is "lite" (the default), "full", or a comma-separated pack list. The xl-mcp executable is an equivalent entry point. The installed package is named xlsx_mcp, so a client that wants an interpreter and a module instead of a console script can run python -m xlsx_mcp. python -m xlsx_mcp.server starts the same server and is what releases before 1.1 support. Running from a clone works the same way; point the command at the xl-mcp executable in the clone's virtual environment:

Windows:

git clone https://github.com/KitchenSink4AI/KitchenSink4XL
cd KitchenSink4XL
python -m venv .venv
.venv\Scripts\pip install -e ".[com]"
claude mcp add xl -s user -- <absolute-path>\.venv\Scripts\xl-mcp.exe

macOS and Linux:

git clone https://github.com/KitchenSink4AI/KitchenSink4XL
cd KitchenSink4XL
python3 -m venv .venv
.venv/bin/pip install -e ".[com]"
claude mcp add xl -s user -- <absolute-path>/.venv/bin/xl-mcp

The COM pack is an optional extra, pip install kitchensink4xl[com], and it is a no-op off Windows. On Windows the COM dependency often arrives transitively with the base install; installing with [com] is the guaranteed route either way, and harmless to repeat. With no install at all: uvx kitchensink4xl.

Environment variables the server reads:

Variable

What it does

KS4XL_MODE

Startup surface: lite (default), full, or a comma-separated pack list

KS4XL_PACK_POLICY

auto (default) or locked, which fixes the surface at startup

KS4XL_ALLOWED_ROOTS

Path sandbox: an os.pathsep-separated list of directories

KS4XL_VERIFY_COM

1 makes the deep Excel verification the default for every save

KS4XL_VALIDATE_COM

1 routes validate's structure check through Excel's own verdict

KS4XL_COM_TIMEOUT

Bounds how long a COM call may take

KS4XL_UPDATE_CHECK

off turns the update check off completely: no network call, no cache file (the older KS4XL_NO_UPDATE_CHECK=1 still works)

Update check. The server looks for a newer release on PyPI only when you call get_server_info, never at startup and never on a timer, at most one request every seven days, capped at two seconds. The check is a single plain HTTPS GET to pypi.org that sends nothing but the request itself. A failed check is reported with its reason rather than hidden. Set KS4XL_UPDATE_CHECK=off to turn it off completely (the older KS4XL_NO_UPDATE_CHECK=1 still works). The server never downloads or installs anything.

Context cost (measured)

Most MCP servers move into your AI's context like a hoarder: everything, up front, whether the job needs it or not. This one starts light and only unpacks a shelf when the work calls for it. Here is the bill, measured by scripts/measure_surface.py:

On the meter

Tools

Tokens

When it draws

Lite core

40

~14.5k

From the first message of every session

Design pack

9

~4.1k

Only after enable_tools

Layout plus inspection pack (io)

9

~2.8k

Only after enable_tools

COM pack

11

~2.8k

Only after enable_tools, and only on Windows with Excel

Everything switched on

69

~24.2k

KS4XL_MODE=full, if you want it all up front

No other Excel MCP server surveyed publishes what its own tool definitions cost to load. The figures above come from a measuring script that ships with the source, so you can check them yourself. Clients that defer tool schemas until first use pay close to zero until a tool is actually called.

Safety model

  • Automatic timestamped backup before every mutation, in two rotating slots in a hidden .ks4xl-backups/ folder next to the workbook. manage_backups lists, restores, and prunes them. Exclude that folder from cloud sync tools: the slots churn on every edit and sync clients can hold locks that slow saves down. The backup slots hold what this server changed, and only that. An edit made in Excel or any other program is never captured, so prev restores the state before the last change made here, not before the last change made anywhere.

  • Filter-hidden rows: query_range, export_range, and the aggregates read every row in the range, including rows an autofilter is hiding. Excel's own SUBTOTAL skips hidden rows; these functions do not, and a filtered sheet can therefore sum differently here than in Excel's own status bar.

  • Saves are atomic and validated; a failed operation leaves the original byte-identical.

  • A round-trip hazard scan runs before a mutating save. Parts the writer cannot preserve are named to the caller, and a loss is refused unless the caller explicitly allows the specific classes the gate named.

  • Verify-after-write, with restore-from-backup on failure. verify_com=true on any mutating call adds the deep check: the produced file has to open in a real hidden Excel with no repair prompt, or the backup goes back and the save refuses. KS4XL_VERIFY_COM=1 makes that the default for every save.

  • Structural edits are checked against an independent expectation of Excel's own behavior for formulas, tables, named ranges, charts, and cross-sheet references.

  • Formula text is never inferred from a leading = character; cell type decides, so text that merely looks like a formula is not re-armed as one on copy, move, sort, or reference rewrite.

  • Ambiguous targets are refused with the candidates listed, never guessed.

  • The COM tier opens its own hidden instance, journals process IDs, and leaves no orphan Excel processes behind.

Sandboxing (opt-in)

Off by default: with nothing configured, the server reads and writes wherever you point it. Set KS4XL_ALLOWED_ROOTS to a list of directories separated by the OS path separator (; on Windows, : elsewhere) and every path the server touches must resolve inside one of them. Reads are gated as well as writes, since a read outside the sandbox exfiltrates workbook content just as surely as a write plants it. The containment check runs on canonicalized paths, so ..\ traversal, symlink and junction escapes, short names, case tricks, and lookalike sibling directories are all caught. A blocked call refuses with a typed error naming the offending path and the allowed roots before any file is opened.

Testing

1,294 tests in tests/unit, plus a separate local COM gate battery that drives a real Excel. On top of the suite, this release went through the family's gauntlet:

  • Adversarial rounds through the raw MCP transport. Roughly 600 tool calls across six waves against scratch workbooks, every call journaled. Thirteen findings confirmed and fixed, each with a regression test.

  • A live COM stress round. Nine phases, roughly 600 executor operations including a 200-operation endurance soak, more than 40 distinct Excel processes, all of it unattended with nobody available to dismiss a dialog. Zero critical, zero high, six lower findings, all fixed. It verified 87 properties that held, among them serialization under twelve concurrent submits and zero lost updates under eight concurrent writers on one workbook.

  • A numbers-safety gate. 61 checks against a real Excel covering insert and delete of rows and columns, sort, move, merge, and an insert-plus-delete composition, each compared against Excel's own recalculation.

  • A formula-fidelity gate. 80 formulas across every documented function family, written through all four writers, opened with zero repair prompts and 80 of 80 correct values.

  • A discoverability gate. Six fresh agents starting from the 40-tool lite surface found the right pack six times out of six.

  • The author's own field testing, running the tools in insane mode against the installed build from a separate window, which is where the last round of fixes came from.

Zero corruptions across the fixture corpus. That corpus is committed in-tree because the hazard, fidelity and adversarial tests need real Excel-authored workbooks (pivots, slicers, shapes, x14 conditional formatting) that openpyxl cannot author, and every fixture is scrubbed of authoring identity by a test-guarded pass. The corruption figure is the build record's, not a script's output; the script-derived numbers here are the test count and the surface measurements.

Young, and tested like it isn't

This is the newest sink in the family, and it shipped through the hardest gauntlet we have ever run: adversarial rounds through the raw protocol, ground-truth checks against Excel's own arithmetic, interrupted-save torture, and a final round built around one question: can any sequence of operations ruin the only copy of a workbook a business depends on. Every finding was fixed before this release. What it has not had yet is a long life in strangers' spreadsheets, and numbers earn trust in the field. The safety net is structural: a backup before every change, saves that verify before they replace your file, and honest labels on every number it hands you. If Excel is where you live, bring your ugliest workbook to the service counter and tell us what broke.

  • ๐Ÿ”ง Found a dead circuit? Something glitched, refused, or came back with the wrong number. Never attach a private workbook; rebuild the structure with placeholder data. Before filing: ask your AI to run get_server_info and paste the output here; it is designed to be safe to share.

  • ๐Ÿ”Œ Missing an outlet? An Excel capability the sink should also have. Describe the real task behind it and it goes on the workbench.

Engineered not to corrupt

Atomic saves. Automatic backups before every change. And one extra wire, because this is a spreadsheet: before a release ships, every kind of edit is checked against Excel's own math. The wiring gets inspected before the power goes on.

Provided as-is, without warranty of any kind, per the license; the engineering above is simply how seriously your workbooks are taken. Keep backups. (It makes them for you.)

Known limits

  • com_render_sheet needs a real desktop. Rendering a sheet to an image goes through Excel's clipboard, and a hidden Excel started in a non-interactive session has no window station to copy through, so the call fails there. It works from a normal signed-in desktop session, which is where anyone actually uses it. Every other COM tool runs fine unattended.

  • One user, one machine. This is a desktop tool, not a shared service. The server runs on your computer, over stdio, under your own account, and the COM tier drives an Excel that belongs to your Windows session. Two people cannot point at one installation, and it is not something to stand up on a server for a team.

  • Deleting or renaming a sheet does not rewrite references. That is Excel's own behavior, and it is documented on the tool: formulas and defined names pointing at a deleted sheet break to #REF! when Excel opens the file. Audit references first when in doubt.

  • Cached values go stale after a file-tier write. Writing through the file tier cannot recompute anything, so a cell downstream of your edit keeps its old cached number until Excel recalculates. That is exactly what the labels are for, and recalculate in the COM pack is the fix.

  • Some MCP clients drop a tool's schema when a pack is disabled and do not pick it back up on re-enable, even though the server announces the change both ways. If a re-enabled tool comes back as "no such tool", refresh the tool list on the client side.

License

AGPL-3.0. Free for individuals and personal use, and it stays that way.

Companies building it into their own products need a commercial license, with terms worked out case by case. Open an issue and we will talk it through.


Not affiliated with or endorsed by Microsoft Corporation. Microsoft and Excel are trademarks of Microsoft Corporation. KitchenSink4XL works with Microsoft Excel files; the trademarks are used nominatively to describe that compatibility, and no Microsoft logos or trade dress are used.

Available Tools

40 tools
apply_editsA

Apply many addressed edits as ONE atomic batch. edits is a list of {op, location, ...}: set_value {value}, set_formula {formula}, clear {what: contents|formats|all}, write_range {data: 2D array}. location is any location object, including a stale-checked get_grid_view anchor.

Every location is resolved and every op validated BEFORE anything is written, so a single bad edit refuses the whole batch and the file stays byte-for-byte unchanged. The batch then takes ONE backup (prev/anchor slots in .ks4xl-backups), does ONE atomic save, and runs ONE verify-after-write, which restores from the backup if the produced file fails to read back as intended. Formula edits are normalized and flag recalculation; each write_range op honors the 200,000-cell ceiling. A hazardous workbook refuses unless allow_loss is true; refuses while the file is open in Excel. Returns the count of edits applied and cells touched.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
editsYesEdits applied as ONE atomic batch: {op, location, ...}.
backupNo
allow_lossNo
verify_comNo

TDQS

A4.7/5.0
Behavior5/5

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

With only readOnlyHint=false in annotations, the description carries the behavioral burden and does so thoroughly. It discloses pre-validation before any write, single-backup and single-save semantics, verify-after-write with restore, formula recalculation, the 200,000-cell ceiling, hazardous-workbook refusal via allow_loss, Excel-lock refusal, and the returned counts.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence earns its place. It front-loads the purpose and op list, then layers atomicity, safety, limits, and return values in a logical order. There is no filler or redundant restatement.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity, sparse annotations, and no output schema, the description is remarkably complete. It tells the agent what happens on partial failure, how backups and verification work, what constraints apply, and what the return value reports, leaving no critical calling decision unexplained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 substantially by explaining the nested edits structure, each op's payload, location semantics (including stale-checked get_grid_view anchors), and allow_loss behavior. It does not explicitly describe the path, backup, or verify_com parameters, but the core complex parameter is well covered.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a precise verb ('apply'), a specific resource ('edits'), and a defining characteristic ('ONE atomic batch'). It also enumerates the four op types, making the tool's scope unmistakable and clearly distinct from single-edit siblings like set_cell, write_range, and clear_range.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'many addressed edits as ONE atomic batch' clearly indicates when to use this tool: when multiple edits must commit together. It does not explicitly name alternatives such as set_cells or write_range or state when not to use it, so it stops short of a full when/when-not routing guide.

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

audit_formulasA
Read-only

Read-only formula intelligence for a range, one sheet (sheet alone), or the whole workbook (no scope): the formula list plus five safety reports. external_references flags formulas reaching into other workbooks; volatile lists always-recalculating functions (NOW, RAND, OFFSET, INDIRECT and kin); missing_cached_values names formula cells with NO stored result, which read as blank to every non-Excel consumer until a recalculation; error_cells catches #REF!, #NAME?, and the other error literals in cached results or formula text; and cross_sheet_dependencies summarizes which sheets' formulas depend on which. Each list is capped with exact counts and a truncated flag. Use it before and after structural edits, and to judge whether cached values can be trusted. Read-only; works while the file is open in Excel.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
sheetNo
locationNo

TDQS

A4.3/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true, and the description aligns with and enriches that by adding substantial behavioral context: it works while the file is open, lists are capped with counts and a truncated flag, missing cached values read as blank to non-Excel consumers until recalculation, and it enumerates exactly what each of the five reports catches. This goes well 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but dense and well-organized, front-loading the scope and core deliverable before enumerating the five reports and usage guidance. Every section adds value, though 'Read-only' appears at both the start and the end, a small redundancy that could be trimmed for conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex tool with no output schema, the description covers the main behaviors, report semantics, truncation behavior, scope selection, and safe usage context. It stops short of describing the exact response envelope or how the counts/truncated flag are structured per report, which would be useful for parsing results, but it is sufficient for selecting and invoking the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It partially does by describing the three scopes: a range, one sheet (sheet alone), or the whole workbook (no scope), which maps conceptually to location, sheet, and omitting both. However, it does not explicitly explain the path parameter or describe the expected format/shape of location (e.g., A1 notation or object form), leaving notable ambiguity for parameter construction.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool as a read-only formula intelligence audit that produces a formula list plus five named safety reports, across three explicit scopes (range, sheet, workbook). It distinguishes itself from siblings like read_range, set_formula, and diagnose_workbook by focusing specifically on formula auditing and safety analysis.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit usage context: 'Use it before and after structural edits, and to judge whether cached values can be trusted.' It also notes it works while the file is open in Excel. However, it does not name alternatives or state when not to use this tool versus diagnose_workbook or read_range, so it stops short of full routing guidance.

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

clear_filterA

Remove the autofilter from a sheet and unhide the rows it hid, the reverse of set_filter. location or sheet picks the sheet; the sheet's active autofilter range is used when location is omitted. A sheet with no autofilter refuses (NOT_FOUND) rather than silently no-opping. Returns how many rows were unhidden. A hazardous workbook refuses unless allow_loss is true. Auto-backup: prev/anchor slots in .ks4xl-backups; atomic verified save. Refuses while open in Excel.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
sheetNo
backupNo
locationNo
allow_lossNo
verify_comNo

TDQS

A4.5/5.0
Behavior5/5

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

Annotations only declare readOnlyHint=false, so the description carries the behavioral burden and exceeds it. It discloses error behavior (NOT_FOUND on no autofilter), return value (rows unhidden), loss protection semantics, auto-backup specifics (prev/anchor slots, atomic verified save), and a concurrency restriction (refuses while open in Excel). This is rich, non-obvious behavior an agent needs to know.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence carries distinct information: core action, sheet selection, error policy, return value, safety guard, backup mechanism, and lock-out condition. The main purpose is front-loaded, followed by supporting details without fluff or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutating tool with no output schema and six parameters, the description covers the critical operational aspects: error modes, safety gates, backup behavior, row-count return, and Excel lock. An agent can predict outcomes and avoid dangerous invocations from the description alone.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It explains location/sheet selection, allow_loss, and implies backup behavior with the auto-backup note, but it does not clarify the exact semantics of the backup boolean or verify_com parameter at all. Since two of six parameters remain ambiguous, the compensation is partial.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource ('Remove the autofilter from a sheet') plus the concrete side effect ('unhide the rows it hid'). It explicitly frames itself as the reverse of set_filter, which distinguishes it from sibling filtering tools. No ambiguity remains about what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear operational context: how the sheet is selected, what happens when no autofilter exists, and preconditions like hazardous workbook handling and Excel-open refusal. It names set_filter as the counterpart, implying when this tool is the appropriate choice, though it does not enumerate alternatives or contrast with sibling tools explicitly.

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

clear_rangeA

Clear a cell or range: what='contents' removes values and formulas, 'formats' resets styles to default, 'all' does both. Neither removes merges, conditional formats, validations, comments, or hyperlinks; those have their own manage tools. Addressed by a location object. A hazardous workbook refuses unless allow_loss is true. Auto-backup: prev/anchor slots in .ks4xl-backups (backup=false skips rotation); atomic verified save, restored on failed verify. Refuses while open in Excel.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
whatNocontents
sheetNo
backupNo
locationYes
allow_lossNo
verify_comNo

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the single readOnlyHint=false annotation, the description discloses substantial behavior: destructive scope per 'what' mode, non-removal of merges/conditional formats/validations/comments/hyperlinks, refusal for hazardous workbooks unless allow_loss is true, auto-backup rotation behavior, atomic verified save with restore-on-failure, and refusal while open in Excel. This is far above typical annotation coverage and contains no contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense yet efficient: five sentences, each earning its place by covering a distinct facetโ€”core operation, exclusions, location, safety/allow_loss, backup/verification, and Excel lock. It is front-loaded with the primary action and most important parameter, with no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with seven parameters and no output schema, the description covers the critical operational semantics well: what is cleared, what is not, destructive safeguards, backup, and lock behavior. Still, verify_com and sheet semantics are left to inference, and there is no mention of return behavior, leaving a minor completeness gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the burden of explaining parameters. It adds meaningful semantics for what ('contents', 'formats', 'all'), backup (skips rotation when false), allow_loss (hazardous workbook refusal), and location (addressed by a location object). However, path, sheet, and verify_com are not explained, so compensation is strong but incomplete.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Clear a cell or range,' then defines the exact variants via the 'what' parameter. It also distinguishes the tool from sibling operations by explicitly stating what it does not remove (merges, conditional formats, validations, comments, hyperlinks), which prevents confusion with dedicated management tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when this tool is appropriate and explicitly says that certain artifacts are not handled because 'those have their own manage tools.' It does not name specific sibling tools or contrast with write_range/set_cell, but the scope and exclusions are concrete enough to guide selection.

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

copy_rangeA

Copy a source rectangle to a destination anchor (location objects, may name different sheets). what is 'all', 'values', 'formulas', or 'formats'. The destination is overwritten; the source is buffered first, so an overlapping paste is safe. Relative refs in copied formulas shift by the paste offset like an Excel copy unless adjust_formulas is false; absolute ($) anchors stay put. A hazardous workbook refuses unless allow_loss is true. Auto-backup to .ks4xl-backups; atomic verified save. Refuses while open in Excel.

ParametersJSON Schema
NameRequiredDescriptionDefault
destYesWhere the result lands (its top-left cell).
pathYes
whatNoall
sheetNo
backupNo
sourceYesThe range to read from.
allow_lossNo
verify_comNo
adjust_formulasNo

TDQS

A4.3/5.0
Behavior5/5

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

With only readOnlyHint=false in annotations, the description carries the full behavioral burden and does so excellently. It discloses that the destination is overwritten, the source is buffered for safe overlap, formula references shift like Excel, allow_loss gates hazardous workbooks, backups are auto-created, saving is atomic/verified, and the operation refuses while the workbook is open in Excel. This all aligns with readOnlyHint=false; no contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose and dense with high-value behavioral details; there is no filler. The minor grammatical break after the first sentence and the slightly crowded list of safety caveats keep it from being perfectly polished, but it remains appropriately sized for the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutating 9-parameter tool with no output schema, the description covers the most consequential behaviors comprehensively. However, it still leaves `sheet`, `verify_com`, and the backup-disable path under-specified, and it does not describe the return shape, so the definition is not fully complete on its own.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 22%, so the description compensates meaningfully by explaining the `what` values, `adjust_formulas` behavior, `allow_loss` gating, backup/atomic-save behavior, and source/dest as location objects that may name different sheets. It leaves some parameters like `sheet`, `verify_com`, and the exact semantics of `backup` only partially explained, so it is not fully compensating.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific operation ('Copy a source rectangle to a destination anchor') and explicitly lists the optional content values ('all', 'values', 'formulas', 'formats'). This makes it clearly distinct from sibling operations like move_range or write_range, even without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides strong situational context: overlapping paste is safe, formulas adjust unless disabled, hazardous workbooks require allow_loss, and the tool refuses while Excel has the file open. However, it never explicitly directs the agent to prefer this over siblings like move_range or clear_range, so the when-to-use guidance remains mostly implied.

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

copy_workbookA

Copy a workbook file byte-for-byte from src to dst, so nothing in the original is re-serialized or degraded (charts, shapes, macros, and queries all carry over intact). An existing dst is left untouched unless overwrite is true, in which case dst is FIRST rotated into its .ks4xl-backups prev slot and then replaced (restore source='prev' brings it back). Returns the destination path. Use this to branch a working copy before a risky batch of edits.

ParametersJSON Schema
NameRequiredDescriptionDefault
dstYes
srcYes
overwriteNo

TDQS

A4.7/5.0
Behavior5/5

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

With only readOnlyHint=false in annotations, the description carries the behavioral burden and excels: it explains the byte-for-byte guarantee, the overwrite flow with backup rotation into .ks4xl-backups, the restore path via source='prev', and the return value. This gives the agent a precise model of side effects and safety.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense yet efficient. Each sentence earns its place: the preservation guarantee, the overwrite/backup behavior, the return value, and the recommended use case. It is front-loaded with the core purpose and avoids filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having no output schema, the description states the return value ('Returns the destination path'). It also covers the key edge case (overwrite) and the typical use scenario. For a 3-parameter copy tool, nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate. It does: 'from src to dst' clarifies both parameters as source and destination paths, and overwrite semantics are fully described including backup rotation and restore behavior. The only minor gap is not explicitly stating that src/dst are file paths, though 'destination path' appears in the return value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Copy a workbook file byte-for-byte from src to dst.' It further distinguishes itself from sibling tools by emphasizing whole-file preservation and the branch-before-edits use case, which clearly separates it from copy_range or create_workbook.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly recommends using this tool 'to branch a working copy before a risky batch of edits,' providing clear context. It does not explicitly name alternatives or state when not to use it, but the 'byte-for-byte whole workbook' framing strongly implies the boundary against range-level or create operations.

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

create_tableA

Turn a range into an Excel table (ListObject) named name. With header true the first row supplies the column names (deduplicated); style is a built-in style; row_stripes and col_stripes toggle banding. totals maps columns to a function (sum, average, count, min, max...). Refuses an overlap with an existing table, and a name already taken by a table or defined name. Hazardous workbooks refuse unless allow_loss is true. Auto-backup to .ks4xl-backups; atomic verified save. Refuses while open in Excel.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
pathYes
sheetNo
styleNoTableStyleMedium9
backupNo
headerNo
totalsNo
locationYes
allow_lossNo
totals_rowNo
verify_comNo
col_stripesNo
row_stripesNo

TDQS

A4.1/5.0
Behavior5/5

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

Beyond the readOnlyHint=false annotation, the description discloses refusal conditions (overlap, name conflicts, hazardous workbooks, file open in Excel), the behavior of allow_loss, auto-backup to .ks4xl-backups, and atomic verified saving. This is substantial behavioral context that meaningfully goes 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core purpose, followed by dense but relevant behavioral details. Every sentence adds information about how the tool behaves or what the agent must account for. There is no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description provides rich safety and behavior context, but given no output schema, only a single annotation, and 0% schema coverage over 13 parameters, it is not fully complete. An agent still lacks clear semantics for locating the target range/file and for return/verification outcomes. It is above average but not exhaustive enough for a high score.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description carries a heavy burden. It explains header deduplication, style, row/col stripes, totals mapping, backup, and allow_loss. However, it leaves several important parameters undocumented: path, sheet, location, totals_row, and verify_com. The compensation is good but incomplete for a 13-parameter tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Turn a range into an Excel table (ListObject) named name.' It clearly distinguishes this from siblings by focusing on table creation rather than generic write/format operations. The scope is unambiguous and actionable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

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 a range should become a structured Excel table with styling, totals, and safety guarantees. However, it does not explicitly contrast it with alternatives like write_range or format_cells, nor does it state when not to use it. The usage context is discernible but not explicit.

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

create_workbookA

Create a new .xlsx workbook at path with the given sheet names (default a single 'Sheet1'). Sheet names must be unique, at most 31 characters, and may not start or end with an apostrophe (Excel refuses to open such a file); the parent directory must already exist. An existing file at path is left untouched unless overwrite is true, in which case it is FIRST rotated into its .ks4xl-backups prev slot and then replaced (restore source='prev' brings it back). Returns the file path and the sheets created.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
sheetsNo
overwriteNo

TDQS

A4.6/5.0
Behavior5/5

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

The description goes well beyond the readOnlyHint annotation by explaining exact side effects: existing files are untouched unless overwrite is true, overwrite first rotates the file into a .ks4xl-backups prev slot, and restore source='prev' recovers it. It also discloses validation constraints around sheet names and parent directory existence, giving the agent full awareness of consequences.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence earns its place: first the core creation action, then the sheet-name constraints and directory prerequisite, then overwrite/backup behavior and return value. There is no filler or repetition of schema defaults.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with three parameters, no output schema, and only readOnlyHint false as annotation, the description provides a complete picture: input semantics, defaults, validations, side effects, backup rotation, and return value. An agent has enough information to invoke it safely and correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries full responsibility for explaining parameters. It covers path, sheets (default to a single 'Sheet1', uniqueness, 31-character limit, apostrophe restriction), and overwrite (false leaves existing file untouched, true triggers backup rotation), providing meaning far beyond the raw schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Create a new .xlsx workbook at path with the given sheet names.' It also adds concrete details about defaults, overwrite behavior, and return values, which make the tool's purpose unmistakable and distinguish it from siblings like copy_workbook.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly implies the tool is for creating new workbooks, but it does not explicitly name alternatives or state when not to use it. There is no 'use X instead' guidance relative to sibling tools, so the usage context is inferable rather than explicit.

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

diagnose_workbookA
Read-only

The round-trip hazard scan surfaced as a health readout: which fragile parts the workbook holds (slicers, shapes, embedded objects, Power Query, VBA, and the rest), whether a file-based openpyxl edit would drop any of them, the routing recommendation for a surgical versus a structural edit, and a light integrity summary (sheet counts, formula-cell count, keep_vba). This is how you check a workbook is safe to edit before mutating it.

What to do with the verdict: hazards never block reads; a would-lose verdict means every mutating tool will refuse unless you route through Excel (com pack) or pass allow_loss:true (an explicit, backed-up acceptance of the loss). A clean verdict means file-based edits are round-trip safe. Content with no part of its own is covered too: the scan reads each worksheet's extLst, so x14 conditional formats (data bars, icon sets), sparkline groups and slicer lists come back as a would-lose verdict like any other drop-risk hazard. Limit: the extLst walk looks at the worksheet's top level, and an extension openpyxl drops from anywhere else is caught at save time by openpyxl's own load warning rather than here. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes

TDQS

A4.4/5.0
Behavior5/5

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

The description goes well beyond the readOnlyHint annotation by explaining what the scan reads (worksheet extLst), what it does not catch (openpyxl drops from elsewhere caught later by its own warning), and what the side effects are. It explicitly states 'Read-only' and clarifies that hazards never block reads, making the tool's non-destructive behavior unambiguous.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is lengthy but well-structured into what the scan produces, how to act on the verdict, and known limitations. Almost every sentence carries useful information, though the opening metaphor 'surfaced as a health readout' and the final 'Read-only' are somewhat redundant with the rest of the text. It is appropriate for the complexity, but slightly less concise than it could be.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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 carries the burden of explaining return values and does so effectively: it lists the hazard categories, the would-lose verdict, the routing recommendation, and the integrity summary. It also covers exception cases (content without its own part) and limitations, giving an agent enough context to call the tool and interpret results correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the description provides no additional meaning for the single required 'path' parameter. While 'path' is somewhat self-explanatory given the tool name and workbook focus, the description does not compensate for the low schema coverage as required, leaving format, location, or supported file type unspecified.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool as a round-trip hazard scan for workbooks, listing the specific types of fragile parts it checks (slicers, shapes, Power Query, VBA, etc.) and the verdicts it produces. It distinguishes itself from siblings like get_workbook_metadata or validate by centering on 'is this workbook safe to edit before mutating it.' The verb 'diagnose' plus the concrete hazard-scan scope makes the purpose unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says when to use it: 'before mutating' a workbook. It then gives actionable interpretation of the verdict: hazards never block reads, a would-lose verdict blocks mutating tools unless routed through Excel or allow_loss:true, and a clean verdict means file-based edits are safe. This is strong when-to-use and how-to-respond guidance.

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

disable_toolsA

Disable previously enabled tool packs for this session and reclaim their context; the lite core always stays on. Idempotent. The result reports the packs just disabled, the approximate tokens removed, and the remaining surface. packs takes the same names as enable_tools (its description carries the menu) or ['everything']. Calling a tool from a disabled pack does not dead-end: the refusal names the owning pack and the exact enable_tools call to turn it back on. Refuses when the host pins the surface with KS4XL_PACK_POLICY=locked.

ParametersJSON Schema
NameRequiredDescriptionDefault
packsYes

TDQS

A4.8/5.0
Behavior5/5

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

Discloses idempotency, the result content (disabled packs, tokens removed, remaining surface), the non-dead-end behavior when calling a disabled tool, and the refusal under KS4XL_PACK_POLICY=locked. This goes well beyond the sparse readOnlyHint=false annotation and fully describes what will happen.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four dense sentences with no wasted words. The primary action and effect are front-loaded, and the cross-reference to enable_tools keeps the description lean while preserving necessary detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the minimal input schema, no output schema, and sparse annotations, the description covers the action, parameter vocabulary, return value, failure modes, and idempotency. The full pack menu is intentionally delegated to enable_tools, which is appropriate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With schema coverage at 0% and no enum values, the description must compensate for the 'packs' parameter. It does so by saying packs takes the same names as enable_tools or ['everything'], giving the agent concrete value guidance. This exceeds the baseline for undocumented params.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Disable previously enabled tool packs for this session and reclaim their context.' It clearly distinguishes this from enable_tools and other siblings by focusing on disabling and context reclamation rather than any other operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains how to specify packs via enable_tools' naming convention and the 'everything' special value, and it notes the locked-policy refusal condition. It doesn't explicitly contrast with alternatives because it is the only disabling tool, but the usage context is clear.

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

enable_toolsA

Enable optional tool packs mid-session (sessions start lite). Idempotent; reports tokens added. packs = names below or ['everything']; disable_tools reverses it. Refuses under KS4XL_PACK_POLICY=locked. Task map: conditional formatting, data validation, named styles, images, charts, advanced table ops, named ranges -> design; page layout, headers/footers, protection, comments, whole-file export, external links, VBA, pivot and connection info -> io; recalculate, real pivots, PDF, render, convert, encrypt, autofit, sparklines, goal seek -> com. Packs:

  • design (~4.1k): workbook design and rich features: named cell styles, format painter, style-bloat audit, conditional formatting, data validation, images, charts (create/list/delete), advanced table lifecycle (columns, totals, resize, banding), and named ranges (define, scope, LAMBDA, cleanup)

  • io (~2.8k): page layout and print, headers/footers, advisory protection, legacy comments, multi-sheet export, and the read-side inspectors: external links, VBA, existing pivots, data connections

  • com (~2.8k): drives a private hidden Excel instance (Windows + Excel required): real pivot tables, fidelity recalculation, goal seek, PDF export, sheet render to image, format conversion, real encryption, sparklines, true autofit, opens-clean validation, and honest status; never touches your open Excel session

ParametersJSON Schema
NameRequiredDescriptionDefault
packsYes

TDQS

A5/5.0
Behavior5/5

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

Beyond the readOnlyHint=false annotation, the description discloses idempotency, token reporting, policy-based refusal, and that the 'com' pack operates on a private hidden Excel instance and never touches the user's open session. These are valuable behavioral traits not inferable from the schema or annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every section earns its place: the opening sentence states purpose, the middle covers behavior and alternatives, and the task map plus pack definitions are essential for parameter selection. The structure is front-loaded and scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With only a minimally typed schema, no enums, no output schema, and one required parameter, the description carries the full burden and meets it: it defines all valid inputs, explains behavior, lists prerequisites, and provides enough detail for an agent to use the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema only says 'packs' is an array of strings with 0% documentation coverage. The description fully compensates by listing the exact accepted pack names ('design', 'io', 'com'), the special value 'everything', and detailed contents for each pack, making it clear what values to pass.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Enable optional tool packs mid-session.' It clearly distinguishes itself from its inverse sibling disable_tools and explains the pack model, so an agent can immediately understand what the tool accomplishes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says when to use it ('sessions start lite' and mid-session enablement), names the reversing alternative (disable_tools), provides a task-to-pack mapping for choosing the right pack, and notes the locked-policy refusal condition. This gives the agent clear decision guidance.

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

export_rangeB

Export a range, table, or sheet to CSV, TSV, or JSON. location defaults to the true used range; {table} exports a table. values is cached | formula | both; the result states the mode used. out_file writes a file; otherwise text returns inline. The target is guarded: never the source workbook, a workbook extension, a reserved device name, or .ks4xl-backups; an existing file needs overwrite, which keeps a .bak first. Filter-hidden rows export like any other row. Multi-sheet is export_file, io pack. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
fmtNocsv
pathYes
sheetNo
headerNo
valuesNocached
recordsNo
locationNo
out_fileNo
overwriteNo

TDQS

B3.2/5.0
Behavior1/5

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

Annotations set readOnlyHint to false, but the description ends with 'Read-only.' This is a direct contradiction. Additionally, the description itself notes 'out_file writes a file,' so even internally the read-only claim is misleading. The guard and backup details are useful, but the contradiction forces a score of 1.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but well-organized: purpose first, then defaults, mode options, output behavior, file-safety guards, hidden-row handling, and the multi-sheet caveat. Every sentence carries information, though the packed style reduces skimmability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers defaults, mode reporting, file overwrite/backup behavior, target guard restrictions, and hidden-row behavior, which is strong for a tool with no output schema. However, the unclear meaning of the required 'path' parameter and the unaddressed header/records semantics leave it below complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must explain parameters. It covers location, values, out_file, overwrite, and fmt implicitly, but leaves path, sheet, header, and records unexplained. Path is required, making this a significant gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening clause states a specific verb ('Export'), resource ('a range, table, or sheet'), and target formats ('CSV, TSV, or JSON'), making the tool's function immediately distinct from read, copy, or import siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives some context by noting that multi-sheet exports are handled elsewhere ('Multi-sheet is export_file, io pack') and that out_file vs inline text changes the result, but it never explicitly states when to prefer export_range over read_range or get_cells, nor lists alternatives.

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

find_cellsA
Read-only

Search cell values and/or formulas across a workbook, sheet, or range and return EVERY match with its unambiguous address (the plural sibling of the single-target search location selector). match is exact, contains, or regex (timeout-guarded, so a pathological pattern refuses instead of hanging); look_in is values, formulas, or both; a formula cell's searchable value is its last cached one. Results page with limit and offset and report the total match count. Read-only; works while the file is open in Excel.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
limitNo
matchNocontains
queryYes
sheetNo
offsetNo
look_inNovalues
locationNo
match_caseNo

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description discloses several meaningful behaviors: exact/contains/regex matching with a timeout guard, look_in semantics, use of a formula cell's last cached value, paging via limit/offset, total match count reporting, and that it works while the file is open in Excel. No annotation contradiction exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every clause earns its place, starting with the core purpose and then layering parameter behavior, paging, and read-only status. It uses a compact structure with no filler or repeated schema information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 9-parameter tool with no output schema, the description covers the operational essentials: scope, match modes, look_in behavior, formula-cache caveat, paging, total count, and safety. It leaves some gaps, such as the exact response shape beyond 'unambiguous address' and match_case/path details, 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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description must carry parameter meaning, and it does for match, look_in, limit/offset, and scope. It also clarifies the query and workbook/sheet/range context. However, match_case is not described, and path is only implied by 'across a workbook', leaving a couple of parameters under-specified.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: searching cell values and/or formulas across a workbook, sheet, or range and returning every match with an unambiguous address. It also positions itself as the plural sibling of a single-target search selector, which helps distinguish it from more targeted lookup tools. This is a clear, actionable purpose statement.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when to use the tool: when multiple matches are needed and when searching across a workbook, sheet, or range. It references a single-target sibling, implying the alternative for one-match lookups, though it does not name that sibling or provide explicit when-not-to-use conditions. This is strong context but not a fully explicit routing rule.

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

format_cellsA

Apply formatting to a range, merging onto the existing style so unspecified attributes are preserved. number_format is an Excel format code; font is {name, size, bold, italic, underline, strike, color}; fill is {color} or {pattern, fg, bg}; border is {style, color, sides}; alignment is {horizontal, vertical, wrap_text, text_rotation, indent}; colors are hex. Named styles and conditional formats: design pack. Hazard-gated (allow_loss overrides); auto-backup; atomic verified save. Refuses while open in Excel.

ParametersJSON Schema
NameRequiredDescriptionDefault
fillNo
fontNo
pathYes
sheetNo
backupNo
borderNo
locationYes
alignmentNo
allow_lossNo
verify_comNo
number_formatNo

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the readOnlyHint=false annotation, the description discloses material behavioral traits: it is hazard-gated with allow_loss as an override, performs auto-backup, uses an atomic verified save, and refuses to run while the file is open in Excel. This substantially informs risk assessment during invocation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but highly efficient. Every sentence conveys needed information: the merge behavior, the format code representations, hazard handling, backup behavior, and operational constraints. It front-loads the core purpose and keeps supporting detail compact.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex 11-parameter tool with no output schema and no per-parameter schema descriptions, this is a thorough definition. It covers formatting object structures, safety overrides, persistence behavior, and a concurrency constraint. The main gaps are the undocumented verify_com parameter and the absence of any guidance on return values or verification steps after the atomic save.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description takes on the documentation burden and does so well for most formatting parameters: it explains number_format, font, fill, border, alignment, and hex colors. It does not fully explain every parameter such as verify_com or the exact accepted shape of location, so the compensation is strong but not complete.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Apply formatting to a range'. It further distinguishes this tool from simple cell writes by explicitly stating it merges onto the existing style and preserves unspecified attributes, which makes its role among the large sibling set clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context: this is the tool for range formatting with style merging, not for raw cell values or structural operations. It does not explicitly name alternatives or state when-not-to-use, so it falls short of a 5, but the scope is clear enough for an agent to avoid the most obvious mis-routings.

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

get_cellsA
Read-only

Read many individually addressed cells in one call, the scatter complement to the rectangular read_range. cells is a list of A1 strings or location objects, each resolving to ONE cell (1,000-cell ceiling); values is cached, formula, or both, and every returned value carries the honest label (cached, absent, formula, value), so a formula with no cached value is never passed off as blank. Read-only; works while the file is open in Excel.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
cellsYesIndividually addressed cells: A1 strings or location objects, each resolving to ONE cell.
sheetNo
valuesNocached

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only provide readOnlyHint, but the description adds substantial behavioral detail: the 1,000-cell ceiling, the values options (cached, formula, both), the honest result labels (cached, absent, formula, value), and the guarantee that formulas without cached values are not misrepresented as blank. This is far beyond what annotations convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but well organized: the core purpose is front-loaded, and every clause contributes either scope, limits, return semantics, or runtime context. There is no filler or repetition of annotation data.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only scatter read with no output schema, the description covers the operation's scope, limits, alternative, return labeling behavior, and runtime conditions. An agent has enough context to select and invoke the tool correctly without guessing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds real semantic value for the main parameters: cells must resolve to exactly one cell and has a 1,000-cell ceiling, while values accepts cached, formula, or both. However, the path and sheet parameters are not described, leaving a minor gap given the low schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific operation: reading many individually addressed cells in one call. It names the resource type (cells), the addressing mechanism (A1 strings or location objects), and explicitly positions itself as the scatter complement to read_range, distinguishing it from siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly contrasts with read_range ('scatter complement to the rectangular read_range'), giving the agent a clear rule for when to choose this tool over a sibling. It also adds context that the tool is read-only and works while the file is open in Excel.

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

get_grid_viewA
Read-only

A compact, token-efficient projection of a sheet or range: the true used range, a markdown table with A1 addressing (column letters across the top, row numbers down the side), formula and merged-cell markers, dimensions, and the hazard summary, so an agent can see the grid without a per-cell JSON dump.

location defaults to the sheet's used range. values='cached' shows last calculated values with formula cells marked (the florin character U+0192 marks a formula with no cached value); 'formula' shows the formula strings. The view paginates with max_rows and max_cols (caps 200 and 100) and reports truncated flags so the caller knows when to page. formula_cells maps addresses to their formula strings; merged ranges intersecting the view are listed. The result's anchor is a token for the shown rectangle: {"anchor": token} addresses it in any positional tool, refusing STALE_ANCHOR if the region changed since this view; cells inside stay plain A1. Read-only; works while the file is open in Excel. Pair it with apply_edits to edit what you see.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
sheetNo
valuesNocached
locationNo
max_colsNo
max_rowsNo

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description discloses pagination caps (200 and 100), truncated flags, the U+0192 marker for formulas with no cached value, anchor-token behavior with STALE_ANCHOR, and compatibility with files open in Excel. These are meaningful behavioral details not present in annotations or schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but front-loaded: the first sentence states the purpose and output shape, and subsequent sentences expand only on behaviors an agent must know. There is no filler and no repetition of structured schema information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only view tool with no output schema, the description explains the output shape, pagination, value modes, markers, anchor semantics, and a natural follow-up tool. An agent has enough information to invoke it correctly and interpret the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description carries the burden and explains location defaulting to the used range, values='cached' versus 'formula' behavior, and max_rows/max_cols caps. However, path and sheet parameters are left implicit, so it does not fully compensate for the absence of schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific operationโ€”a compact grid-view projection of a sheet or rangeโ€”and enumerates exactly what is returned: used range, markdown table with A1 addressing, formula and merged-cell markers, dimensions, and hazard summary. It also contrasts itself with a per-cell JSON dump, making its niche clear among read-oriented siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It is clearly positioned as the way to 'see the grid without a per-cell JSON dump,' and it explicitly warns that it is read-only, which rules out edit use cases. The pairing instruction with apply_edits gives a concrete alternative workflow, though it does not explicitly name other read tools to avoid.

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

get_server_infoA
Read-only

Report the KitchenSink4XL server build: version, the active tool surface (enabled tool count and approximate token bill), the optional packs, the host platform and Python, and config, which carries the install settings a user otherwise cannot confirm arrived: whether path sandboxing is on with how many roots (a count, never the paths), and whether saves deep-verify through Excel. A read-only orient call that needs no workbook and touches no file; use it to confirm the server is up and see which packs are loaded.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description adds meaningful behavioral context: it is a read-only orientation call, touches no file, requires no workbook, reports a count of sandbox roots rather than the paths themselves, and gives an approximate token bill. This is rich transparency that helps the agent set expectations and avoid safety missteps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two well-organized sentences front-load the purpose and enumerate details without redundancy. The explanatory clause about config 'carrying install settings a user otherwise cannot confirm arrived' earns its place by clarifying why those fields matter.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a no-input, read-only server-info tool, the description is complete: it covers safety, operational use, and the full set of reported information. No output schema exists, so the explicit list of return fields is essential and present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so parameter semantics are not applicable; the schema coverage is trivially 100%. The description appropriately focuses on the output payload instead, which is exactly what an agent needs to know for an inputless call.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Report the KitchenSink4XL server build.' It enumerates exactly what is reported (version, tool surface, packs, platform, Python, config), and the server-level scope clearly distinguishes it from all workbook- and range-focused siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says to use this tool 'to confirm the server is up and see which packs are loaded,' and it provides a when-not condition: it 'needs no workbook and touches no file,' so an agent knows not to route workbook-scoped calls here. This is actionable selection guidance.

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

get_tableA
Read-only

Read a table's data by its name (case-insensitive). columns projects a subset; values is cached | formula | both (the honest calc story); records true returns row objects keyed by column name. Returns the table ref, the column names, and the data rows without the header or totals row; filter or page big tables with query_range and a {table} location. Advanced table ops (columns, totals, resize, banding): manage_table (design pack). Read-only; nothing is written.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
pathYes
valuesNocached
columnsNoTable column names to project.
recordsNo

TDQS

A4.7/5.0
Behavior5/5

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

readOnlyHint=true is independently reinforced by 'Read-only; nothing is written,' and the description adds substantial behavior beyond the annotation: case-insensitive matching, the cached/formula/both semantics ('the honest calc story'), and the disclosure that returned rows exclude the header and totals row. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One dense paragraph that front-loads the core purpose and packs each clause with distinct information: parameter semantics, return shape, sibling routing, and safety. Every sentence earns its place; the quirky parenthetical 'the honest calc story' and the trailing 'Read-only' reaffirmation are minor stylistic noise rather than waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the return-value burden and meets it (table ref, column names, rows, header/totals exclusions), and the low schema coverage is compensated in prose. Remaining gaps are error behavior for missing tables and the precise shape of the table ref/location identifier.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 20% (only columns has a schema description), but the description decodes values ('cached | formula | both'), columns ('projects a subset'), records ('row objects keyed by column name'), and name (case-insensitive). Only the required path parameter is left implicit, inferable from the '{table} location' routing remark.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ('Read a table's data by its name') and adds a distinguishing qualifier (case-insensitive). The return-shape sentence โ€” 'table ref, column names, data rows without the header or totals row' โ€” makes it unambiguous that this reads whole table data, separating it from location-based siblings like read_range, get_grid_view, and get_cells.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes big-table filtering/paging to query_range with a {table} location, and advanced table ops (columns, totals, resize, banding) to manage_table. The by-name scoping implicitly distinguishes it from location-based reads, giving an agent clear routing conditions without opening sibling schemas.

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

get_workbook_metadataA
Read-only

Read a workbook's structure without opening it for edit: every sheet with its visibility state, TRUE used range (value-bearing bounds, not the often wrong stored dimension), dimensions, and merged-cell count, plus defined names, tables, the active sheet, and a round-trip hazard summary (whether an openpyxl edit would drop fragile parts). The orient-before-editing call. Read-only; works while the file is open in Excel.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes

TDQS

A4.5/5.0
Behavior5/5

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

Annotations provide readOnlyHint=true and the description reinforces this while adding substantial behavioral detail: it computes TRUE used range rather than stored dimensions, reports a round-trip hazard summary for openpyxl edits, and works while the file is open in Excel. No contradiction exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, then provides a dense but well-organized list of returned metadata, and ends with concise usage context. Every sentence contributes meaningful information without filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by enumerating all major return categories and operational caveats (read-only, works while open, hazard summary). An agent has sufficient information to invoke the tool correctly and interpret its results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has one required 'path' parameter with 0% description coverage, so the description must compensate. It indirectly implies the parameter is the workbook path by describing the operation, and adds the important note that it works on files open in Excel. However, it never explicitly defines the path format or expected input, offering only partial compensation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Read a workbook's structure without opening it for edit' and enumerates the exact metadata returned (sheets, visibility, used range, dimensions, merged count, defined names, tables, active sheet, hazard summary). This clearly distinguishes it from cell-level tools like read_range or get_cells.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description positions the tool as 'The orient-before-editing call' and notes it works read-only while the file is open in Excel, giving clear when-to-use context. It does not explicitly name sibling alternatives or when-not conditions, so it stops short of a 5.

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

get_workflowsA
Read-only

Recommended tool sequences for common multi-step spreadsheet tasks, each step naming the tool, the rationale, and the pack it lives in (lite is always on; enable_tools loads the rest). Call with no task to list the available tasks (merge-workbooks, report-build, data-cleanup, formatting-audit-and-fix, safe-edit-of-rich-workbook, migrate-from-incumbent); call with task='' for that task's step-by-step recipe and notes. Steps naming COM-tier tools that have not shipped yet are marked forthcoming rather than pretended present. Pure guidance: reads nothing, changes nothing.

ParametersJSON Schema
NameRequiredDescriptionDefault
taskNo

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description explicitly states 'Pure guidance: reads nothing, changes nothing', which fully communicates the tool's side-effect profile. It also discloses that COM-tier tools that have not shipped are marked as forthcoming rather than pretended present, adding honesty about content reliability.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence earns its place: purpose, invocation modes, task values, pack behavior, status honesty, and safety. The structure front-loads the core purpose and then clearly separates list mode from recipe mode, making it easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only guidance tool with one optional parameter and no output schema, the description fully covers what the agent receives in each mode, which task names are valid, and that the tool has no side effects. Nothing essential is missing for correct selection and invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has no parameter descriptions, but the description fully compensates by explaining the null/default behavior, listing valid task names, and specifying what happens with each invocation. An agent can correctly pass the task parameter without needing extra schema documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that this tool returns recommended tool sequences for common multi-step spreadsheet tasks, and it distinguishes between listing available tasks and retrieving a step-by-step recipe. It also separates this tool from sibling spreadsheet operations by labeling it 'Pure guidance', so an agent can understand exactly what it is without inspecting other definitions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit invocation patterns: call with no task to list available tasks, or call with task='<name>' for a recipe. It also enumerates valid task names, which strongly guides an agent on when and how to use the tool. It does not explicitly state when not to use it, but the call patterns and purpose make the intended usage clear.

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

import_dataA

Import CSV, TSV, or JSON into a sheet at an anchor. Pass source (inline text) or source_file (a path); fmt auto-detects from the extension. location is the top-left anchor (default A1). A cell whose text begins with =, +, -, or @ is written as TEXT to block formula injection unless formulas is true. An import past the 200,000-cell write ceiling refuses rather than dropping rows. A hazardous workbook refuses unless allow_loss is true. Auto-backup to .ks4xl-backups; atomic verified save. Refuses while open in Excel.

ParametersJSON Schema
NameRequiredDescriptionDefault
fmtNoauto
pathYes
sheetNo
backupNo
headerNo
sourceNo
encodingNoutf-8
formulasNo
locationNo
delimiterNo
allow_lossNo
verify_comNo
source_fileNo

TDQS

A4.4/5.0
Behavior5/5

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

The description discloses formula-injection blocking, the 200,000-cell write ceiling refusal, hazardous-workbook refusal, auto-backup, atomic verified save, and refusal while open in Excel. This is far beyond the minimal readOnlyHint=false annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but each sentence carries operational value, from source selection to safety limits and concurrent open refusal. It is appropriately sized for a 13-parameter import tool and front-loads the core purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

It covers the main workflow and most edge cases comprehensively, which matters given the sparse annotations and absent output schema. It is not fully complete because the required path parameter is unexplained and success/error return behavior is not stated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

It usefully explains source vs source_file, fmt, location, formulas, and allow_loss. However, the required 'path' parameter is never described, and header, delimiter, encoding, backup, sheet, and verify_com are left to inference despite 0% schema description coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Import CSV, TSV, or JSON into a sheet at an anchor.' This clearly differentiates the tool from write_range or export_range by identifying the input formats and the anchor concept.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear invocation guidance: use source for inline text or source_file for a path, fmt auto-detects from extension, and location defaults to A1. It doesn't explicitly name alternatives or exclusion conditions, so it stops short of a 5.

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

manage_backupsA

Manage the automatic backups in the hidden .ks4xl-backups folder next to each mutated workbook: two rotating slots per file, prev (state before the most recent mutation) and anchor (session start). action='list': slot files with sizes and mtimes plus orphaned slot folders; give path for one workbook or directory for a folder. action='restore': overwrite path with source 'prev' or 'anchor'; the current content rotates into prev FIRST so a restore is itself undoable, the payload is validated as a real workbook before the atomic replace, and files open in Excel refuse. action='purge': delete backups; scope is 'orphans' (slot folders whose workbook is gone) or 'slots' (one workbook's pair); dry_run defaults to TRUE and only reports. action='snapshot': save a permanent DTG-stamped copy, YYYYMMDD_HHMM_, optional label and dest_dir; snapshots are never rotated and no purge scope touches them. LIMIT, stated loudly: prev holds the state before the LAST mutation this server made, so damage that lands AFTER the last save (crash, disk, another program) costs that final edit; only a snapshot habit covers it. Lost or corrupt file? get_workflows task='recover-workbook' is the walkthrough.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNo
labelNo
scopeNo
actionYes
sourceNo
dry_runNo
dest_dirNo
directoryNo

TDQS

A5/5.0
Behavior5/5

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

Annotations only provide readOnlyHint=false, but the description discloses critical behavioral details beyond that: restore rotates current content into prev first so it is undoable, payloads are validated before atomic replace, Excel-open files refuse, dry_run defaults to TRUE and only reports, and snapshots are exempt from rotation and purge. It also candidly states the 'LIMIT' of prev coverage. This is excellent transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Although the description is dense, every sentence carries meaningful information: storage location, rotation slots, action semantics, safety behavior, default dry_run, limits, and routing to recovery. It is front-loaded with the core concept before diving into actions, and the 'LIMIT, stated loudly' section is a deliberate and effective structure for emphasizing the tool's coverage gap.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 8 parameters, no output schema, no enums, and 0% schema coverage, this description is remarkably complete. It explains all actions, parameters, defaults, safety mechanisms, edge cases (orphans, Excel-open files), the rotation limit, and the correct sibling for recovery. Nothing essential for an agent to select and invoke this tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must explain all parameters, and it does. It maps path/directory for list, source for restore, scope for purge, dry_run, label, and dest_dir for snapshot. Each parameter's role is described in context, compensating fully for the empty schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear verb and resource: 'Manage the automatic backups in the hidden .ks4xl-backups folder next to each mutated workbook.' It enumerates the four actions (list, restore, purge, snapshot) with concrete effects, and distinguishes itself from the recovery sibling by pointing to get_workflows task='recover-workbook' for lost/corrupt files. This is far more than a vague or tautological statement.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit context for each action, including scope, source, dry_run behavior, and snapshot permanence. It also names the alternative tool and the exact condition for using it: 'Lost or corrupt file? get_workflows task=\"recover-workbook\" is the walkthrough.' This directly guides an agent on when not to use this tool.

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

manage_worksheetA

Manage the worksheet lifecycle. action is one of: add (new_name, optional index), delete (sheet), rename (sheet, new_name), copy (sheet, optional new_name), reorder (sheet, index as 0-based target), hide (sheet, state 'hidden' or 'very_hidden'), unhide (sheet). The workbook always keeps at least one VISIBLE sheet, so deleting or hiding the last visible one refuses.

Consequence worth knowing: delete does NOT rewrite references, so formulas and defined names that pointed at the deleted sheet break to #REF! when Excel opens the file (Excel's own behavior); rename likewise does not rewrite cross-sheet formula text. Audit references first when in doubt. A hazardous workbook refuses unless allow_loss is true. Auto-backup: prev/anchor slots in .ks4xl-backups (backup=false skips rotation); atomic verified save, restored on failed verify. Refuses while open in Excel.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
indexNo
sheetNo
stateNo
actionYes
backupNo
new_nameNo
allow_lossNo
verify_comNo

TDQS

A4.5/5.0
Behavior5/5

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

With only readOnlyHint=false in annotations, the description carries the burden and exceeds it. It discloses that delete and rename do not rewrite references (leading to #REF!), describes the auto-backup rotation and atomic verified save, the one-visible-sheet invariant, the allow_loss hazardous-workbook gate, and the refusal while open in Excel. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but front-loaded with the action-to-parameter mapping, then adds high-value safety and backup caveats. Every sentence carries information, though the single-paragraph format and length could have been slightly improved with clearer separation of the action list and behavioral cautions.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 9-parameter, multi-action mutation tool with no output schema and almost no annotation support, the description is impressively complete: it covers allowed actions, per-action parameters, refusal conditions, reference-breaking consequences, backup behavior, and loss protection. The only noticeable gap is the undefined verify_com parameter, and return values are not mentioned.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description maps actions to their relevant parameters (e.g., add uses new_name and optional index; delete uses sheet; reorder uses sheet and a 0-based index). It also explains backup=false skips rotation and allow_loss gates hazardous workbooks. However, verify_com is not explained, and path is only implicit.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a clear resource and function ('Manage the worksheet lifecycle') and immediately enumerates the specific actions: add, delete, rename, copy, reorder, hide, unhide. This makes it distinctly about worksheets rather than workbook-level tools like create_workbook or copy_workbook.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear operational context: deleting/hiding the last visible sheet refuses, hazardous workbooks require allow_loss=true, and the tool refuses while the workbook is open in Excel. It also advises auditing references first. It does not explicitly name alternative sibling tools or state when-not-to-use, so it misses a full 5.

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

modify_grid_structureA

Insert or delete rows or columns at a position and REWRITE EVERY REFERENCE so the workbook stays coherent: formulas on every sheet (cross-sheet refs included), defined names, data validations, conditional-format ranges, table refs, and merged ranges all shift with the edit. action is insert_rows, delete_rows, insert_cols, or delete_cols; at is the 1-based row number or column letter where the edit starts (a cell like 'B7' or a location object also works, using its top-left); count edits that many at once.

Whole-column spans like =SUM(B:B) and whole-row spans like $1:$2 shift on their own axis; an edit on the other axis leaves them alone (Excel's behavior). A reference wholly inside a deleted band becomes #REF! and the new-#REF! count is reported, never hidden; an insert that would push value-bearing cells off the grid edge refuses. Returns per-kind rewrite counts. A hazardous workbook refuses unless allow_loss is true. Auto-backup: prev/anchor slots in .ks4xl-backups (backup=false skips rotation); atomic verified save, restored on failed verify; the prev slot is the undo for a delete. Refuses while open in Excel.

ParametersJSON Schema
NameRequiredDescriptionDefault
atYesWhere the insert or delete starts: a 1-based row number (5), a column letter ('B'), an A1 cell ('B7', whose row or column is used), or a location object.
pathYes
countNo
sheetNo
actionYes
backupNo
allow_lossNo
verify_comNo

TDQS

A4.5/5.0
Behavior5/5

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

Annotations only say readOnlyHint=false, so the description carries the full burden. It discloses extensive behavior: reference rewriting across sheets, defined names, validations, conditional formats, tables, and merges; axis-specific handling of whole-column/row spans; #REF! results and their reporting; refusal conditions; per-kind rewrite counts; auto-backup rotation; atomic verified save with restoration; and undo semantics via the prev slot. This is exceptional transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long, but every sentence adds meaningful behavioral or parameter information. It is front-loaded with the core purpose and reference-rewriting guarantee, followed by parameter and safety details. It could be organized into bullet points for readability, but there is no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity, minimal schema descriptions, no output schema, and only readOnlyHint=false, the description covers most of what an agent needs: exact actions, positional inputs, refusal conditions, return type, backup, and save verification. Gaps remain for the sheet and verify_com parameters, which are not mentioned at all, and the exact output structure is only summarized.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 13%, and the description compensates well: it explains action values, the various forms of at (row number, column letter, A1 cell, location object), count semantics, backup skipping, and allow_loss behavior. It does not explain sheet, verify_com, or path, but the key parameters are substantially enriched beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Insert or delete rows or columns at a position' and immediately adds the defining behavior 'REWRITE EVERY REFERENCE so the workbook stays coherent.' This clearly distinguishes it from sibling tools like apply_edits or set_dimensions by emphasizing the global reference-rewriting effect.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when the tool applies: inserting/deleting rows or columns with actions enumerated, and it explicitly states when the tool refuses (hazardous workbook without allow_loss, workbook open in Excel, insert pushing cells off grid). It does not explicitly name alternative tools or when-not conditions relative to siblings, but the operation-specific context is strong.

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

move_rangeA

Move a rectangle to a new anchor on the same sheet, rewriting every formula, name, conditional format, validation, table ref, and merge that pointed into the source so references follow the cells (Excel move semantics). A cross-sheet destination refuses (copy_range then clear_range instead); cells at the destination are overwritten. A hazardous workbook refuses unless allow_loss is true. Auto-backup to .ks4xl-backups; atomic verified save. Refuses while open in Excel.

ParametersJSON Schema
NameRequiredDescriptionDefault
destYesWhere the result lands (its top-left cell).
pathYes
sheetNo
backupNo
sourceYesThe range to read from.
allow_lossNo
verify_comNo

TDQS

A4.6/5.0
Behavior5/5

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

The description reveals extensive behavioral details beyond the minimal readOnlyHint: false annotation: rewriting all reference types, overwriting destination cells, refusing hazardous workbooks without allow_loss, auto-backup, atomic verified save, and Excel lock refusal. There is no contradiction with the annotation; the mutation implied by 'move' aligns with readOnlyHint false.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence earns its place: purpose first, then reference-rewriting behavior, then constraints and fallback, then safety and persistence details. No filler or redundant restatement of the name or input schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex mutation tool with no output schema and minimal annotations, the description is impressively complete: it covers same-sheet scope, overwrite semantics, cross-sheet alternative, hazard handling, backup, save verification, and Excel lock refusal. The only notable omission is what the tool returns after a successful move, plus a couple of parameters (verify_com) remain ambiguous.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 29%, so the description must compensate for the missing parameter documentation. It does add context for allow_loss ('hazardous workbook refuses unless allow_loss is true') and backup ('Auto-backup'), and implies the sheet parameter via 'same sheet', but path, sheet, and verify_com remain largely unexplained. The description partially compensates but does not fully resolve the parameter semantics gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Move a rectangle to a new anchor on the same sheet' with Excel move semantics. It clearly distinguishes this from copy_range and clear_range by naming them as alternatives. The purpose is unambiguous and immediately scoped.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says cross-sheet destinations are refused and instructs to use copy_range then clear_range instead. It also states hazard conditions, allow_loss behavior, and refusal while open in Excel, giving an agent concrete conditions for when to use this tool versus alternatives.

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

query_rangeA
Read-only

Filter, project, sort, paginate, and aggregate a range SERVER-SIDE so an agent reads only the rows and columns it needs instead of a whole sheet.

location defaults to the sheet's true used range. With header=true the first row names the columns (otherwise the A1 letter does). where is a list of {column, op, value} predicates joined by match ('all' or 'any'); ops: eq, ne, gt, ge, lt, le, contains, startswith, endswith, regex, in, not_in, is_blank, not_blank. columns projects a subset; order_by is a list of {column, dir} specs (unknown directions refuse); offset and limit page; distinct dedupes. aggregate is a list of {column, func} (count, count_nonblank, count_distinct, sum, avg, min, max, first, last), optionally per group_by (records=true emits objects).

Semantics: predicates read CACHED and literal values (uncalculated formulas read as blank; recalc for exact results); gt/ge/lt/le compare numerically when both sides coerce, else case-folded text; blanks never satisfy ordered comparisons; regex is timeout-guarded. Aggregates follow Excel: sum/avg/min/max consume NUMERIC cells only (text and booleans ignored even when text looks numeric; exclusions are reported); count is the RAW row count, unlike Excel COUNT; min/max fall back to text when no numbers exist. Filter-hidden rows are read and aggregated like any other row, unlike SUBTOTAL; use where to drop them. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
limitNo
matchNoall
sheetNo
whereNoFilter predicates, {column, op, value}, joined by match.
headerNo
offsetNo
valuesNocached
columnsNoColumns to project: header names, letters, or 1-based numbers.
recordsNo
distinctNo
group_byNoOne column to group by, or several.
locationNo
order_byNoSort specs, {column, dir}; unknown directions refuse.
aggregateNoAggregations, {column, func}, optionally per group_by.

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description discloses cached-value reads, formula handling, comparison coercion rules, regex timeout guarding, Excel-compatible aggregate semantics, and treatment of hidden rows. This is substantial behavioral context that annotations alone do not provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but organized into purpose, parameter tour, and semantics sections, with the core value proposition front-loaded. Some enum lists duplicate the schema, but they are presented compactly and are useful in prose; the density justifies the length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 15-parameter query tool with no output schema, the description covers operations, edge cases, and behavioral semantics thoroughly. The main gap is the default return shapeโ€”it only states records=true emits objectsโ€”so an agent must infer the non-records response format.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 33%, but the description compensates by explaining the where predicate shape and ops, column references, columns projection, order_by behavior, offset/limit, distinct, aggregate functions, group_by, records, and location/header defaults. It maps nearly every parameter to semantics beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence names a specific verb setโ€”filter, project, sort, paginate, and aggregateโ€”attached to a range, and frames it as server-side subsetting so an agent avoids reading a whole sheet. This clearly distinguishes it from siblings like read_range and get_table.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly establishes the use case: when an agent needs only the rows and columns it needs rather than the whole sheet. It does not name alternative tools or explicit when-not-to-use conditions, so it misses the top tier, but the context is clear enough for tool selection.

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

read_rangeA
Read-only

Read a cell or range addressed by a location object (cell, range, r1c1, name, table, used_range, region, search, or a grid-view anchor; sheet picks the sheet when the location does not, default active). values controls the honest calc story: 'cached' returns the last calculated values, 'formula' the formula strings, 'both' pairs each value with a label (cached, absent, formula, value). A formula cell with no cached value is labelled 'absent', never passed off as blank. Read-only; page large ranges with query_range.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
sheetNo
valuesNocached
locationYes

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description explains how the values parameter shapes results (cached/formula/both), what labels are returned, and that formula cells without cached values are labelled 'absent' rather than blank. This is meaningful behavioral disclosure that the schema and annotations do not provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense and front-loaded; the main verb and resource are first, followed by the most behaviorally significant parameter. The prose is compact given the number of location modes and values modes, though the phrase 'honest calc story' is a mild flourish.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a no-output-schema read tool with a complex location input, it covers the main invocation semantics: addressing modes, sheet default, values modes, and the large-range alternative. It does not spell out the exact return shape for 'both' or the path parameter, but it is sufficient for calling the tool correctly in common cases.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description compensates by explaining values in detail, enumerating location object kinds, and describing sheet resolution. The path parameter is left unexplained, and exact location object shapes are not specified, so it is not a full substitute for schema documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a precise operation ('Read a cell or range') and scopes it via the location-object addressing modes. It also distinguishes itself by telling the agent to use query_range for large ranges, so it does not read as a generic read tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states when to use the tool (for any addressed cell/range read) and explicitly routes large ranges to query_range. It also clarifies sheet fallback behavior. It could be stronger by stating exclusions against get_cells or export_range, but the core selection context is present.

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

replace_cellsA

Find-and-replace across a workbook, sheet, or range. match is exact (whole cell), contains (literal substring), or regex (timeout-guarded; backreferences like \1 work in replace). look_in 'values' rewrites literal cells, 'formulas' rewrites formula text (the cell stays a formula, normalized), 'both' does both. dry_run=true previews every change without touching the file; a real run validates the whole plan first, applies it as ONE batch, and reports cells changed and occurrences replaced. A replaced value that parses as a number is written as a number; replacement text beginning with =, +, -, or @ is written as TEXT to block formula injection unless formulas is true. A hazardous workbook refuses unless allow_loss is true. Auto-backup to .ks4xl-backups; atomic verified save. Refuses while open in Excel.

ParametersJSON Schema
NameRequiredDescriptionDefault
findYes
pathYes
matchNocontains
sheetNo
backupNo
dry_runNo
look_inNovalues
replaceYes
formulasNo
locationNo
allow_lossNo
match_caseNo
verify_comNo

TDQS

A4.6/5.0
Behavior5/5

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

With only readOnlyHint=false provided, the description carries the full behavioral burden and does so thoroughly. It discloses dry-run semantics, one-batch atomic application, formula injection prevention, number coercion, hazardous-workbook refusal, auto-backup, and refusal while open in Excel. This far exceeds what annotations alone provide, and it does not contradict them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but front-loaded with the core purpose, and every clause adds relevant behavioral or safety detail. There is no filler or repetition of schema fields, making the length appropriate for a tool with 13 parameters and no schema descriptions.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex mutating tool with no output schema, sparse annotations, and zero parameter descriptions, this definition is nearly complete: it covers calling modes, safety constraints, return reporting, and failure conditions. The main gaps are the undocumented match_case and verify_com behaviors and the precise format accepted by the location parameter.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description compensates strongly by explaining match modes, look_in behavior, dry_run, formulas, allow_loss, backup, and replacement-value safety rules. However, match_case and verify_com are not explained, and the exact syntax of the 'location' range object is left unspecified.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb phrase, 'Find-and-replace across a workbook, sheet, or range,' which clearly identifies the operation and scope. This distinguishes it from siblings like find_cells (search-only) and set_cells (single-cell writes), so the agent can select the right tool without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when this tool applies: bulk find-and-replace over a workbook, sheet, or range, with modes for matching, lookup targets, and dry runs. It does not explicitly name alternatives or state 'use X instead,' but the scope and behavior are specific enough to make the intended usage obvious.

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

set_cellA

Write a single cell addressed by a location object. A string beginning with '=' is ALWAYS stored as a formula (there is no literal escape), normalized so modern functions do not land as #NAME? and flagged to recalculate on open; anything else is a literal. A hazardous workbook refuses unless allow_loss is true. Auto-backup: prev/anchor slots in .ks4xl-backups (backup=false skips rotation); atomic verified save, restored on failed verify. Refuses while open in Excel.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
sheetNo
valueYesA cell value: text, a number, a boolean, or null to clear. A string beginning with '=' is stored as a formula.
backupNo
locationYes
allow_lossNo
verify_comNo

TDQS

A4.4/5.0
Behavior5/5

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

The description goes far beyond the sparse readOnlyHint=false annotation. It discloses formula normalization, the lack of literal escapes for strings beginning with '=', recalculation flags, hazardous workbook refusal, backup rotation behavior, atomic verified saves with rollback, and refusal while the workbook is open in Excel. This is rich, non-obvious 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence adds necessary operational detail. The core purpose is front-loaded, followed by formula behavior, safety caveats, backup semantics, and the Excel lock refusal. There is no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with 7 parameters and no output schema, the description covers most critical behavior: formulas, backups, allow_loss, and workbook lock. It does not explain verify_com or return/verification outcomes, but the atomic-verified-save mention partially covers the verification concept. Overall it is strong but not fully exhaustive.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 14%, so the description carries heavy weight. It does add meaning for value ('=' means formula, otherwise literal), location, backup=false skip behavior, and allow_loss. However, it leaves verify_com unexplained and does not clarify path or sheet semantics, so it only partially compensates for the low schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Write a single cell addressed by a location object,' which names the exact action, target resource, and scope. It clearly distinguishes this tool from range-oriented siblings like write_range or set_cells by emphasizing a single cell.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when to use this tool: writing a single cell, including formula/literal handling and safety conditions like allow_loss and Excel lock refusal. It does not explicitly name sibling alternatives or state 'use X instead for ranges,' but the single-cell framing is a solid implicit guide.

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

set_cellsA

Write many individually addressed cells as ONE atomic batch, the scatter complement to write_range. cells is a list of {cell, value} items (cell is an A1 string or a location object resolving to one cell; 1,000-cell ceiling); every address is resolved BEFORE anything is written, so one bad item refuses the whole batch untouched. '=' strings become formulas, normalized. A hazardous workbook refuses unless allow_loss is true. Auto-backup to .ks4xl-backups; atomic verified save. Refuses while open in Excel.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
cellsYesScatter writes, {cell, value}; every address resolves before anything is written.
sheetNo
backupNo
allow_lossNo
verify_comNo

TDQS

A4.6/5.0
Behavior5/5

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

With only readOnlyHint=false in annotations, the description carries the full behavioral burden and does so excellently. It discloses atomicity, pre-resolution of all addresses, whole-batch refusal on any bad item, formula normalization, hazardous-workbook refusal unless allow_loss is true, auto-backup, atomic verified save, and refusal while open in Excel. This goes far 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the purpose, then packs essential operational details into tight, information-dense sentences. Every sentence earns its place: atomicity, cell addressing rules, formula handling, hazard protection, backup behavior, and Excel-lock refusal. No filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex write operation with a single weak annotation and no output schema, the description covers the critical context: atomic semantics, failure behavior, formula handling, hazard gating, backup, and operating constraints. It does not describe the return value or success signal, and a few parameters remain unexplained, but the core behaviors needed for correct invocation are well covered.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 17%, so the description must compensate. It adds meaningful semantics for the cells parameter: lists of {cell, value}, A1 string or location object, 1,000-cell ceiling, and pre-resolution behavior. It also explains formula behavior for value strings and ties allow_loss to hazardous workbooks. However, path, sheet, and verify_com receive no explanatory treatment, so compensation is strong but not complete.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Write many individually addressed cells as ONE atomic batch.' It also explicitly names write_range as the contrast ('scatter complement'), and the emphasis on 'many' and 'atomic batch' distinguishes it from the sibling set_cell. An agent can identify this tool correctly without inspecting the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly frames when this tool is appropriate: writing many individually addressed cells in a single atomic scatter operation, and it names write_range as the alternative concept. It does not explicitly state when not to use it versus set_cell, but the context makes the intended use clear.

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

set_dimensionsA

Set column widths and row heights, hide rows or columns, group them into collapsible outline levels, and service an autofit request. column_widths maps column letters or indices to widths in Excel character units; row_heights maps row numbers to heights in points; autofit_columns sizes columns to content as a best-effort APPROXIMATION (true autofit needs Excel via the com pack).

Grouping is Excel's outline: group_rows and group_columns take spans of {start, end, level 1-7, collapsed}, the collapse bracket a budget or financial model is built around; ungroup_rows and ungroup_columns clear a span's level and unhide it; outline_summary {below, right} says which side the total sits on. Read the current outline back from get_workbook_metadata, which reports it per sheet when a sheet has one. A hazardous workbook refuses unless allow_loss is true. Auto-backup to .ks4xl-backups; atomic verified save. Refuses while open in Excel.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
sheetNo
backupNo
hide_rowsNo1-based row numbers.
allow_lossNo
group_rowsNoOutline spans, {start, end, level 1-7, collapsed}. Rows take numbers, columns take letters or numbers.
verify_comNo
row_heightsNo
hide_columnsNoColumn letters, e.g. ['A', 'C'].
ungroup_rowsNoOutline spans, {start, end, level 1-7, collapsed}. Rows take numbers, columns take letters or numbers.
column_widthsNo
group_columnsNoOutline spans, {start, end, level 1-7, collapsed}. Rows take numbers, columns take letters or numbers.
autofit_columnsNoColumn letters, e.g. ['A', 'C'].
outline_summaryNo
ungroup_columnsNoOutline spans, {start, end, level 1-7, collapsed}. Rows take numbers, columns take letters or numbers.

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the readOnlyHint=false annotation, the description discloses significant behavioral traits: autofit_columns is a best-effort approximation and true autofit requires Excel via the COM pack, hazardous workbooks refuse unless allow_loss is true, auto-backup to .ks4xl-backups occurs, saves are atomic and verified, and the tool refuses while the workbook is open in Excel. This is exactly the kind of value that annotations alone do not provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but well organized: the main operation is front-loaded, then parameter units and grouping semantics are explained, and finally safety/backup behavior is stated. Every sentence adds operational detail; there is no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex 15-parameter mutation tool with no output schema, the description covers the essential operational context: parameter semantics, grouping behavior, autofit limitations, safety safeguards, backup behavior, and Excel lock refusal. It also names get_workbook_metadata as the companion for reading outline state, which closes the main contextual loop an agent needs.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With only 47% schema description coverage, the description compensates well: column_widths are in Excel character units, row_heights are in points, grouping spans are {start, end, level 1-7, collapsed}, outline_summary determines which side the total sits on, and ungroup clears a span's level and unhides it. These details map directly to the schema parameters and add meaning that the bare schema does not convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource scope: 'Set column widths and row heights, hide rows or columns, group them into collapsible outline levels, and service an autofit request.' It clearly identifies the tool's domain as workbook layout/dimensions, which distinguishes it from sibling tools focused on cell values or content formatting.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when this tool applies, including sizing, hiding, grouping, outline summary, and autofit. It explicitly points to get_workbook_metadata for reading the current outline, which helps an agent know where to fetch related state. It does not enumerate negative cases or direct the agent to alternative tools for content formatting, but the usage context is strong.

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

set_filterA

Apply an autofilter over a range whose first row is the header, and actually hide the non-matching rows: an .xlsx stores filter CRITERIA, not hidden state, so criteria (a list of {column, op, value}, ops as in query_range, combined as AND) are evaluated here over cached and literal values; a row whose tested cell holds an uncalculated formula stays visible with a warning. A hazardous workbook refuses unless allow_loss is true. Auto-backup to .ks4xl-backups; atomic verified save. Refuses while open in Excel.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
sheetNo
backupNo
criteriaNoAutofilter criteria, {column, op, value}, combined as AND. Rows that fail are actually hidden, since .xlsx stores criteria and not state.
locationYes
allow_lossNo
verify_comNo

TDQS

A4/5.0
Behavior5/5

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

With only readOnlyHint=false provided, the description carries the full burden of behavioral disclosure and does so richly. It explains cached/literal evaluation, formula rows staying visible with a warning, refusal of hazardous workbooks unless allow_loss=true, auto-backup with atomic verified save, and refusal while the workbook is open in Excel.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but tightly structured: the core behavior is front-loaded, followed by caveats and safety details. Each clause contributes non-obvious context, and nothing feels redundant or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 7-parameter destructive write with no output schema, the description covers many non-obvious behaviors, from formula warnings to backup and Excel locking. However, it leaves the meaning of the required location parameter and the optional verify_com parameter unexplained, and it does not state what the tool returns, so some gaps remain.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 14%, and the required location parameter is essentially unexplained beyond its type union. The description adds useful meaning for criteria and allow_loss, but it does not clarify location, sheet, or verify_com, so it only partially compensates for the schema gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb, resource, and outcome: 'Apply an autofilter over a range whose first row is the header, and actually hide the non-matching rows.' It clearly distinguishes the tool's behavior from related operations by emphasizing actual row-hiding, and it even references query_range for operator semantics.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the main use case: applying filter criteria and hiding rows because .xlsx stores criteria, not hidden state. However, it never explicitly says when to prefer set_filter over clear_filter or query_range, and it gives no when-not-to-use guidance.

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

set_formulaA

Write a formula to a single cell, or fill a range where each cell gets the formula with its relative references shifted by that cell's offset (Excel copy semantics; absolute $ anchors stay put). Formulas are normalized so modern functions do not land as #NAME?, and the workbook is flagged to recalculate on its next open; stored cached results stay stale until then (the recalculate tool in the com pack populates them). Auto-backup to .ks4xl-backups; atomic verified save. Refuses while open in Excel.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
sheetNo
backupNo
formulaYes
locationYes
allow_lossNo
verify_comNo

TDQS

A4.2/5.0
Behavior5/5

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

With only readOnlyHint=false in annotations, the description carries the full burden and does so richly: formula normalization, #NAME? avoidance, workbook recalculation flagging, stale cached results, auto-backup, atomic verified save, and refusal while open in Excel. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but information-packed, with the core purpose front-loaded and each clause adding behavioral context. It is slightly long and run-on in the middle, but no sentence is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 7-parameter tool with no schema descriptions and no output schema, this is reasonably complete for the required parameters and safety behavior. However, the semantics of allow_loss and verify_com remain unexplained, leaving real invocation gaps for an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema has 0% description coverage, so the description must compensate. It explains formula semantics and location (cell or range) well, and backup behavior is mentioned, but optional parameters such as allow_loss and verify_com are never given meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: writing a formula to a single cell or filling a range. It also defines the distinctive Excel copy semantics (relative references shift, absolute anchors stay), which clearly separates it from generic value-writing siblings like set_cell and write_range.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly identifies the intended use case: any operation that writes formulas to cells/ranges. It adds contextual constraints (refuses while open in Excel, recalculate behavior via a companion tool), though it does not explicitly name sibling alternatives or state 'use set_cell for static values'.

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

set_mergeA

Merge or unmerge cell ranges, or list every merge. action is merge (location is the multi-cell range), unmerge (location must be the exact stored merged range), or list (read-only, one sheet or the whole workbook). Excel merge semantics: only the top-left value survives, so a merge whose absorbed cells hold values REFUSES until you pass confirm_data_loss=true, then reports exactly which values were discarded; overlapping an existing merge refuses. Unmerge keeps the surviving top-left value and leaves the rest blank. For the mutating actions: a hazardous workbook refuses unless allow_loss is true; auto-backup to prev/anchor slots in .ks4xl-backups; atomic verified save. Refuses while open in Excel.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
sheetNo
actionYes
backupNo
locationNo
allow_lossNo
verify_comNo
confirm_data_lossNo

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the minimal readOnlyHint=false annotation, the description fully discloses dangerous behaviors: only the top-left value survives, data-loss refusals require confirm_data_loss=true, overlapping merges refuse, hazardous workbooks require allow_loss, auto-backup occurs, saves are atomic, and the tool refuses while open in Excel.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence adds actionable operational detail: action modes, merge value semantics, safety flags, backup behavior, and lockout condition. It is front-loaded with the core purpose and contains no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex, 8-parameter mutation tool with no output schema, the description covers the essential invocation decisions and failure modes, so an agent can call it reasonably safely. Minor gaps remain around verify_com and the exact return value of the list mode, but the critical behavioral context is present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must explain parameters itself. It compensates well by explaining the action values, location semantics, confirm_data_loss, allow_loss, and backup behavior. However, verify_com and the exact output format for the list action are left to inference.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Merge or unmerge cell ranges, or list every merge' โ€“ a specific verb and resource with three distinct modes. It further differentiates this tool from sibling cell-manipulation tools by naming exact merge semantics and behavior.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly explains when to use each action: merge, unmerge, or list, including the precise location requirements for unmerge. It also lists refusal conditions such as overlapping merges and Excel locking, but it does not explicitly contrast this tool with alternatives like write_range or set_cells.

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

set_viewA

Set sheet-view state in one call: freeze panes (freeze='B2' locks the rows above and columns left of it; 'clear' removes), split panes (split={x, y} positions in points, exclusive with freeze), gridlines and headings visibility, zoom (10 to 400 percent), the active selection (an A1 cell or range), and the sheet tab color (6-digit hex or 'clear'). Unset parameters keep their current values; sheet defaults to the active sheet. Auto-backup to .ks4xl-backups; atomic verified save. Refuses while open in Excel.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
zoomNo
sheetNo
splitNo
backupNo
freezeNo
headingsNo
gridlinesNo
selectionNo
tab_colorNo
allow_lossNo
verify_comNo

TDQS

A4.6/5.0
Behavior5/5

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

With only readOnlyHint:false in annotations, the description carries the full burden and succeeds. It discloses auto-backup behavior, atomic verified save, refusal while the workbook is open in Excel, defaulting logic, and precise semantics for freeze, split, zoom, and tab color. There is no contradiction with the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but well-organized: purpose is front-loaded, and each clause adds necessary detail about parameter behavior, defaults, and side effects. No filler or redundant restating of the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 12-parameter mutating tool with no output schema, the description is remarkably complete: it covers the view-state semantics, default behavior, backup safety, atomic save, and the Excel-lock refusal. The only meaningful gaps are the undocumented allow_loss and verify_com parameters and the lack of explicit return/result information.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It explains most parameters: freeze, split, gridlines, headings, zoom, selection, tab_color, and sheet defaults. However, path, allow_loss, and verify_com are not semantically explained, so it does not fully cover all 12 parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb-resource pair, 'Set sheet-view state in one call', and enumerates the exact aspects it controls: freeze, split, gridlines, headings, zoom, selection, and tab color. This clearly distinguishes it from siblings like get_grid_view or format_cells even without naming alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when to use the tool: a one-call batch for multiple view settings, with unset parameters keeping current values and sheet defaulting to the active sheet. It also notes the split/freeze exclusivity. It does not explicitly name alternative tools, but the context is sufficient for correct routing.

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

set_workbook_propertiesA

Set core document properties (title, author, subject, keywords, category, comments) and calc settings: calc_mode ('auto', 'autoNoTable', 'manual'), full_calc_on_load, and iterative calculation (iterative_calc with max_iterations and max_change bounds for circular references). Only given parameters change; with none it reports current values read-only. Manual mode means no recalc on Excel open, so caches go stale; the result says so. Auto-backup; atomic verified save. Refuses while open in Excel.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
titleNo
authorNo
backupNo
subjectNo
categoryNo
commentsNo
keywordsNo
calc_modeNo
allow_lossNo
max_changeNo
verify_comNo
iterative_calcNo
max_iterationsNo
full_calc_on_loadNo

TDQS

A4.6/5.0
Behavior5/5

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

The annotations only provide readOnlyHint=false, so the description carries the burden of disclosing behavior. It details partial read-only behavior with no parameters, the staleness consequence of manual calc mode, auto-backup, atomic verified save, and refusal while the workbook is open in Excel. This goes well beyond the formal annotations and gives an agent concrete expectations of side effects and safeguards.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but efficient; every clause adds operational knowledge. It is front-loaded with the main purpose, then gives mode behavior, a warning, safety guarantees, and an error condition, all in a compact form. There is no filler or redundant wording.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no output schema and minimal annotations, the description covers the essential operation semantics, read-only reporting mode, side effects, persistence guarantees, and the open-in-Excel refusal. Missing details are limited to advanced parameter meanings (allow_loss, verify_com) and any explicit return-value description, but the overall context is sufficiently rich for an agent to select and invoke the tool correctly in most scenarios.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description compensates substantially by naming the property parameters, listing calc_mode enum values, and explaining the meaning of iterative_calc, max_iter iterations, and max_change. It also ties backup to auto-backup behavior. However, some parameters like allow_loss and verify_com are not explained, and path is only implicit, so the coverage is strong but incomplete for a 15-parameter tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Set') and clearly identifies the resource: core document properties (title, author, subject, keywords, category, comments) and calc settings. It lists exact property families and calc settings, and distinguishes this workbook-level tool from siblings like set_cell or set_formula by focusing on metadata and calculation configuration.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when to use the tool: when needing to change workbook properties or calc settings, and notes the read-only reporting mode when no parameters are passed. However, it does not explicitly name alternative tools or state when not to use it, relying on the purpose statement rather than direct exclusions.

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

sort_rangeA

Sort a range or table body by one or more keys, writing the rows back reordered. keys is a list of {column, order}: header name, letter, or 1-based index; asc or desc; later keys break ties. has_header keeps the first row put. Moved formulas shift relative refs (Excel semantics); keys compare cached values, warning when uncalculated. Filter-hidden rows stay pinned and unsorted, as in Excel. Hazardous workbooks need allow_loss. Auto-backup (prev is the undo); atomic verified save. Refuses while open in Excel.

ParametersJSON Schema
NameRequiredDescriptionDefault
keysYesSort keys, {column, order}; later keys break ties.
pathYes
sheetNo
backupNo
locationYes
allow_lossNo
has_headerNo
verify_comNo

TDQS

A4.4/5.0
Behavior5/5

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

Beyond the readOnlyHint=false annotation, the description discloses many behavioral traits: rows are written back, formulas shift with Excel semantics, hidden rows stay pinned, uncalculated values produce warnings, hazardous workbooks require allow_loss, auto-backup is the undo mechanism, saving is atomic and verified, and the tool refuses while open in Excel. This is rich, non-obvious 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single dense paragraph with the core purpose front-loaded. Every sentence adds a distinct fact about operation, parameter semantics, safety, or edge-case behavior. There is no filler or repetition of schema details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutating tool with no output schema and low schema coverage, this description is unusually complete: it covers key syntax, in-place mutation, formula behavior, filtered rows, safety flags, backup/undo, and file-lock refusal. The main gaps are the exact form of the required location parameter and the meaning/use of verify_com, plus the absence of any return/result contract.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 13%, so the description must compensate for weak schema documentation. It does explain the central keys parameter well: list of {column, order}, header name/letter/1-based index, asc/desc, and tie-breaking. It also clarifies has_header and allow_loss. However, the required location parameter is only vaguely tied to 'range or table body' without stating accepted string/object forms, and sheet, path, and verify_com are not meaningfully explained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific action and resource: 'Sort a range or table body by one or more keys, writing the rows back reordered.' This clearly distinguishes it from read, fetch, and other mutation tools. It also specifies the kind of target (range or table body) and the in-place reordering behavior.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly conveys when to use this tool: when rows need to be reordered in place by one or more keys. It also gives practical context such as hidden-row behavior and safety requirements. It does not explicitly name alternatives or state when not to use it, which prevents a 5.

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

validateA
Read-only

Run read-only correctness checks and return one report. checks (default ['structure', 'references', 'calc_staleness']): structure (package opens clean, sheet integrity), references (#REF!/#NAME? and the other error cells), names (broken defined names), merges (overlapping or orphaned merged ranges), tables (duplicate names, broken refs, overlaps), formatting_bloat (the audit_styles counters against the 64,000-format ceiling), hazards (the round-trip scan as a check), external_links (links reported, not repaired), calc_staleness (formulas lacking cached values, which read as blank outside Excel). Returns {passed, results: {check: {passed, findings}}}; findings keep the underlying ops' shapes where those exist, and passed=false means findings, not a failed call. Read-only, always; repairs live in the editing tools. Works while the file is open in Excel.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
checksNo

TDQS

A4.8/5.0
Behavior5/5

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

The annotation readOnlyHint=true is reinforced and expanded: 'Read-only, always' plus 'passed=false means findings, not a failed call.' It also discloses important behavior like working while the file is open and external links being reported but not repaired, which goes well 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every sentence carries necessary information: the main purpose is front-loaded, the check list is compactly parenthesized, and the return semantics and read-only behavior are stated without filler. The length is justified by the absence of enums in the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema and minimal input schema, the description provides everything needed: parameter values, default behavior, return shape, the meaning of passed=false, and operating constraints. There are no significant gaps for an agent selecting or invoking this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description fully compensates. It explains the required path parameter implicitly, lists every valid check name with a one-line meaning, and states the default check set. Without this, an agent would have no idea what values 'checks' accepts.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource: 'Run read-only correctness checks and return one report.' It then enumerates exactly which checks are included, which distinguishes it from sibling editing/diagnostic tools and makes its purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly frames when to use the tool: for read-only correctness validation, and it explicitly says 'repairs live in the editing tools,' so an agent knows not to use this for fixes. It does not name a specific sibling alternative, but the context is clear enough that this is the validation entry point.

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

write_rangeA

Write a 2D block of values and formulas anchored at the location's top-left cell. data is a list of row lists and must be RECTANGULAR: ragged rows refuse (pad short rows with null, which clears those cells); content outside the block is never touched. Formula strings ('=...') are normalized and flag recalculation. Grid limits and the 200,000-cell write ceiling apply. A hazardous workbook refuses unless allow_loss is true. Auto-backup to .ks4xl-backups; atomic verified save. Refuses while open in Excel.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataYesRows of cell values, rectangular: every row the same length.
pathYes
sheetNo
backupNo
locationYes
allow_lossNo
verify_comNo

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the readOnlyHint=false annotation, the description discloses substantial behavioral details: ragged rows are refused, null clears cells, formulas are normalized and trigger recalculation, grid limits and a 200,000-cell ceiling apply, hazardous workbooks require allow_loss, auto-backup and atomic verified save occur, and the tool refuses while open in Excel. This is far beyond the annotation and gives agents accurate expectations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact yet dense, front-loading the core purpose before detailing data constraints, limits, safety, and refusal conditions. Each sentence adds a distinct piece of behavioral information without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is comprehensive for a mutating tool with no output schema: it covers the write semantics, data shape, safety, backup, and refusal cases. Minor gaps remain around the exact form of location and the sheet/verify_com parameters, but the core invocation requirements are clearly sufficient for an agent to proceed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With schema description coverage at only 14%, the description compensates for the most complex parameters: data must be rectangular and ragged rows refuse, null clears, location anchors the block at its top-left cell, and allow_loss gates hazardous workbooks. It does not add semantics for path, sheet, or verify_com, but the critical failure-prone parameters are well covered.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Write a 2D block of values and formulas anchored at the location's top-left cell.' It specifies the block write scope and differentiates itself from single-cell siblings like set_cell by emphasizing the 2D block and 'content outside the block is never touched.'

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly establishes when this tool is appropriate: for writing rectangular blocks of values/formulas anchored at a cell, with explicit constraints such as refusing ragged rows and refusing in hazardous workbooks unless allow_loss is true. It does not explicitly name sibling alternatives (e.g., set_cell for single cells), so it stops short of full exclusion guidance.

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.

  1. 40 tool updatesv1.2.0
    • Changedapply_edits1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedaudit_formulas1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedclear_filter1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedclear_range1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedcopy_range1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedcopy_workbook1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedcreate_table1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedcreate_workbook1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changeddiagnose_workbook1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changeddisable_tools1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedenable_tools1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedexport_range1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedfind_cells1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedformat_cells1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedget_cells1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedget_grid_view1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedget_server_info1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedget_table1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedget_workbook_metadata1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedget_workflows1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedimport_data1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedmanage_backups1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedmanage_hyperlink1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedmanage_worksheet1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedmodify_grid_structure1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedmove_range1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedquery_range1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedread_range1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedreplace_cells1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedset_cell1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedset_cells1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedset_dimensions1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedset_filter1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedset_formula1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedset_merge1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedset_view1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedset_workbook_properties1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedsort_range1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedvalidate1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedwrite_range1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
  2. 27 tool updatesv1.1.0
    • Changedapply_edits4 fields changed
      • addedInput schema / properties / edits / description
        Added value: +"Edits applied as ONE atomic batch: {op, location, ...}."
      • addedInput schema / properties / edits / items / properties
        Added value: +{
        +  "data": {
        +    "description": "Rows of cell values, rectangular: every row the same length.",
        +    "items": {
        +      "items": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "description": "A cell value: text, a number, a boolean, or null to clear. A string beginning with '=' is stored as a formula."
        +      },
        +      "type": "array"
        +    },
        +    "type": "array"
        +  },
        +  "formula": {
        +    "type": "string"
        +  },
        +  "location": {
        +    "anyOf": [
        +      {
        +        "type": "string"
        +      },
        +      {
        +        "type": "object"
        +      }
        +    ]
        +  },
        +  "op": {
        +    "enum": [
        +      "set_value",
        +      "set_formula",
        +      "clear",
        +      "write_range"
        +    ],
        +    "type": "string"
        +  },
        +  "value": {
        +    "anyOf": [
        +      {
        +        "type": "string"
        +      },
        +      {
        +        "type": "number"
        +      },
        +      {
        +        "type": "boolean"
        +      },
        +      {
        +        "type": "null"
        +      }
        +    ],
        +    "description": "A cell value: text, a number, a boolean, or null to clear. A string beginning with '=' is stored as a formula."
        +  },
        +  "what": {
        +    "enum": [
        +      "contents",
        +      "formats",
        +      "all"
        +    ],
        +    "type": "string"
        +  }
        +}
      • addedInput schema / properties / edits / items / required
        Added value: +[
        +  "op",
        +  "location"
        +]
      • addedInput schema / properties / edits / items / type
        Added value: +"object"
    • Changedaudit_formulas2 fields changed
      • addedInput schema / properties / location / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedInput schema / properties / location / title
        Removed value: -"Location"
    • Changedclear_filter2 fields changed
      • addedInput schema / properties / location / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedInput schema / properties / location / title
        Removed value: -"Location"
    • Changedclear_range1 field changed
      • addedInput schema / properties / location / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "object"
        +  }
        +]
    • Changedcopy_range4 fields changed
      • addedInput schema / properties / dest / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "object"
        +  }
        +]
      • addedInput schema / properties / dest / description
        Added value: +"Where the result lands (its top-left cell)."
      • addedInput schema / properties / source / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "object"
        +  }
        +]
      • addedInput schema / properties / source / description
        Added value: +"The range to read from."
    • Changedcreate_table1 field changed
      • addedInput schema / properties / location / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "object"
        +  }
        +]
    • Changedexport_range2 fields changed
      • addedInput schema / properties / location / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedInput schema / properties / location / title
        Removed value: -"Location"
    • Changedfind_cells2 fields changed
      • addedInput schema / properties / location / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedInput schema / properties / location / title
        Removed value: -"Location"
    • Changedformat_cells1 field changed
      • addedInput schema / properties / location / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "object"
        +  }
        +]
    • Changedget_cells2 fields changed
      • addedInput schema / properties / cells / description
        Added value: +"Individually addressed cells: A1 strings or location objects, each resolving to ONE cell."
      • addedInput schema / properties / cells / items / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "object"
        +  }
        +]
    • Changedget_grid_view2 fields changed
      • addedInput schema / properties / location / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedInput schema / properties / location / title
        Removed value: -"Location"
    • Changedget_table2 fields changed
      • changedInput schema / properties / columns / anyOf
        Previous value: -[
        -  {
        -    "items": {},
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "type": "string"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / columns / description
        Added value: +"Table column names to project."
    • Changedimport_data2 fields changed
      • addedInput schema / properties / location / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedInput schema / properties / location / title
        Removed value: -"Location"
    • Changedmanage_hyperlink2 fields changed
      • addedInput schema / properties / location / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedInput schema / properties / location / title
        Removed value: -"Location"
    • Changedmodify_grid_structure2 fields changed
      • addedInput schema / properties / at / anyOf
        Added value: +[
        +  {
        +    "minimum": 1,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "object"
        +  }
        +]
      • addedInput schema / properties / at / description
        Added value: +"Where the insert or delete starts: a 1-based row number (5), a column letter ('B'), an A1 cell ('B7', whose row or column is used), or a location object."
    • Changedmove_range4 fields changed
      • addedInput schema / properties / dest / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "object"
        +  }
        +]
      • addedInput schema / properties / dest / description
        Added value: +"Where the result lands (its top-left cell)."
      • addedInput schema / properties / source / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "object"
        +  }
        +]
      • addedInput schema / properties / source / description
        Added value: +"The range to read from."
    • Changedquery_range13 fields changed
      • changedInput schema / properties / aggregate / anyOf
        Previous value: -[
        -  {
        -    "items": {},
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "properties": {
        +        "column": {
        +          "anyOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "minimum": 1,
        +              "type": "integer"
        +            }
        +          ],
        +          "description": "A column: a header name, a column letter, or a 1-based number."
        +        },
        +        "func": {
        +          "enum": [
        +            "count",
        +            "count_nonblank",
        +            "count_distinct",
        +            "sum",
        +            "avg",
        +            "min",
        +            "max",
        +            "first",
        +            "last"
        +          ],
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "column",
        +        "func"
        +      ],
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / aggregate / description
        Added value: +"Aggregations, {column, func}, optionally per group_by."
      • changedInput schema / properties / columns / anyOf
        Previous value: -[
        -  {
        -    "items": {},
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "minimum": 1,
        +          "type": "integer"
        +        }
        +      ]
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / columns / description
        Added value: +"Columns to project: header names, letters, or 1-based numbers."
      • addedInput schema / properties / group_by / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "minimum": 1,
        +    "type": "integer"
        +  },
        +  {
        +    "items": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "minimum": 1,
        +          "type": "integer"
        +        }
        +      ],
        +      "description": "A column: a header name, a column letter, or a 1-based number."
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / group_by / description
        Added value: +"One column to group by, or several."
      • removedInput schema / properties / group_by / title
        Removed value: -"Group By"
      • addedInput schema / properties / location / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedInput schema / properties / location / title
        Removed value: -"Location"
      • changedInput schema / properties / order_by / anyOf
        Previous value: -[
        -  {
        -    "items": {},
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "properties": {
        +        "column": {
        +          "anyOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "minimum": 1,
        +              "type": "integer"
        +            }
        +          ],
        +          "description": "A column: a header name, a column letter, or a 1-based number."
        +        },
        +        "dir": {
        +          "enum": [
        +            "asc",
        +            "desc"
        +          ],
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "column"
        +      ],
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / order_by / description
        Added value: +"Sort specs, {column, dir}; unknown directions refuse."
      • changedInput schema / properties / where / anyOf
        Previous value: -[
        -  {
        -    "items": {},
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "properties": {
        +        "column": {
        +          "anyOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "minimum": 1,
        +              "type": "integer"
        +            }
        +          ],
        +          "description": "A column: a header name, a column letter, or a 1-based number."
        +        },
        +        "op": {
        +          "enum": [
        +            "eq",
        +            "ne",
        +            "gt",
        +            "ge",
        +            "lt",
        +            "le",
        +            "contains",
        +            "startswith",
        +            "endswith",
        +            "regex",
        +            "in",
        +            "not_in",
        +            "is_blank",
        +            "not_blank"
        +          ],
        +          "type": "string"
        +        },
        +        "value": {
        +          "anyOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "type": "number"
        +            },
        +            {
        +              "type": "boolean"
        +            },
        +            {
        +              "type": "null"
        +            },
        +            {
        +              "items": {
        +                "anyOf": [
        +                  {
        +                    "type": "string"
        +                  },
        +                  {
        +                    "type": "number"
        +                  },
        +                  {
        +                    "type": "boolean"
        +                  }
        +                ]
        +              },
        +              "type": "array"
        +            }
        +          ],
        +          "description": "the value to compare against; type follows the column"
        +        }
        +      },
        +      "required": [
        +        "column",
        +        "op"
        +      ],
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / where / description
        Added value: +"Filter predicates, {column, op, value}, joined by match."
    • Changedread_range1 field changed
      • addedInput schema / properties / location / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "object"
        +  }
        +]
    • Changedreplace_cells2 fields changed
      • addedInput schema / properties / location / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedInput schema / properties / location / title
        Removed value: -"Location"
    • Changedset_cell3 fields changed
      • addedInput schema / properties / location / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "object"
        +  }
        +]
      • addedInput schema / properties / value / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / value / description
        Added value: +"A cell value: text, a number, a boolean, or null to clear. A string beginning with '=' is stored as a formula."
    • Changedset_cells4 fields changed
      • addedInput schema / properties / cells / description
        Added value: +"Scatter writes, {cell, value}; every address resolves before anything is written."
      • addedInput schema / properties / cells / items / properties
        Added value: +{
        +  "cell": {
        +    "anyOf": [
        +      {
        +        "type": "string"
        +      },
        +      {
        +        "type": "object"
        +      }
        +    ]
        +  },
        +  "value": {
        +    "anyOf": [
        +      {
        +        "type": "string"
        +      },
        +      {
        +        "type": "number"
        +      },
        +      {
        +        "type": "boolean"
        +      },
        +      {
        +        "type": "null"
        +      }
        +    ],
        +    "description": "A cell value: text, a number, a boolean, or null to clear. A string beginning with '=' is stored as a formula."
        +  }
        +}
      • addedInput schema / properties / cells / items / required
        Added value: +[
        +  "cell"
        +]
      • addedInput schema / properties / cells / items / type
        Added value: +"object"
    • Changedset_dimensions11 fields changed
      • changedInput schema / properties / autofit_columns / anyOf
        Previous value: -[
        -  {
        -    "items": {},
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "type": "string"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / autofit_columns / description
        Added value: +"Column letters, e.g. ['A', 'C']."
      • addedInput schema / properties / group_columns
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "properties": {
        +          "collapsed": {
        +            "type": "boolean"
        +          },
        +          "end": {
        +            "anyOf": [
        +              {
        +                "type": "string"
        +              },
        +              {
        +                "type": "integer"
        +              }
        +            ]
        +          },
        +          "level": {
        +            "maximum": 7,
        +            "minimum": 1,
        +            "type": "integer"
        +          },
        +          "start": {
        +            "anyOf": [
        +              {
        +                "type": "string"
        +              },
        +              {
        +                "type": "integer"
        +              }
        +            ]
        +          }
        +        },
        +        "required": [
        +          "start"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Outline spans, {start, end, level 1-7, collapsed}. Rows take numbers, columns take letters or numbers."
        +}
      • addedInput schema / properties / group_rows
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "properties": {
        +          "collapsed": {
        +            "type": "boolean"
        +          },
        +          "end": {
        +            "anyOf": [
        +              {
        +                "type": "string"
        +              },
        +              {
        +                "type": "integer"
        +              }
        +            ]
        +          },
        +          "level": {
        +            "maximum": 7,
        +            "minimum": 1,
        +            "type": "integer"
        +          },
        +          "start": {
        +            "anyOf": [
        +              {
        +                "type": "string"
        +              },
        +              {
        +                "type": "integer"
        +              }
        +            ]
        +          }
        +        },
        +        "required": [
        +          "start"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Outline spans, {start, end, level 1-7, collapsed}. Rows take numbers, columns take letters or numbers."
        +}
      • changedInput schema / properties / hide_columns / anyOf
        Previous value: -[
        -  {
        -    "items": {},
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "type": "string"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / hide_columns / description
        Added value: +"Column letters, e.g. ['A', 'C']."
      • changedInput schema / properties / hide_rows / anyOf
        Previous value: -[
        -  {
        -    "items": {},
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "minimum": 1,
        +      "type": "integer"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / hide_rows / description
        Added value: +"1-based row numbers."
      • addedInput schema / properties / outline_summary
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedInput schema / properties / ungroup_columns
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "properties": {
        +          "collapsed": {
        +            "type": "boolean"
        +          },
        +          "end": {
        +            "anyOf": [
        +              {
        +                "type": "string"
        +              },
        +              {
        +                "type": "integer"
        +              }
        +            ]
        +          },
        +          "level": {
        +            "maximum": 7,
        +            "minimum": 1,
        +            "type": "integer"
        +          },
        +          "start": {
        +            "anyOf": [
        +              {
        +                "type": "string"
        +              },
        +              {
        +                "type": "integer"
        +              }
        +            ]
        +          }
        +        },
        +        "required": [
        +          "start"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Outline spans, {start, end, level 1-7, collapsed}. Rows take numbers, columns take letters or numbers."
        +}
      • addedInput schema / properties / ungroup_rows
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "properties": {
        +          "collapsed": {
        +            "type": "boolean"
        +          },
        +          "end": {
        +            "anyOf": [
        +              {
        +                "type": "string"
        +              },
        +              {
        +                "type": "integer"
        +              }
        +            ]
        +          },
        +          "level": {
        +            "maximum": 7,
        +            "minimum": 1,
        +            "type": "integer"
        +          },
        +          "start": {
        +            "anyOf": [
        +              {
        +                "type": "string"
        +              },
        +              {
        +                "type": "integer"
        +              }
        +            ]
        +          }
        +        },
        +        "required": [
        +          "start"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Outline spans, {start, end, level 1-7, collapsed}. Rows take numbers, columns take letters or numbers."
        +}
    • Changedset_filter3 fields changed
      • changedInput schema / properties / criteria / anyOf
        Previous value: -[
        -  {
        -    "items": {},
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "properties": {
        +        "column": {
        +          "anyOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "minimum": 1,
        +              "type": "integer"
        +            }
        +          ],
        +          "description": "A column: a header name, a column letter, or a 1-based number."
        +        },
        +        "op": {
        +          "enum": [
        +            "eq",
        +            "ne",
        +            "gt",
        +            "ge",
        +            "lt",
        +            "le",
        +            "contains",
        +            "startswith",
        +            "endswith",
        +            "regex",
        +            "in",
        +            "not_in",
        +            "is_blank",
        +            "not_blank"
        +          ],
        +          "type": "string"
        +        },
        +        "value": {
        +          "anyOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "type": "number"
        +            },
        +            {
        +              "type": "boolean"
        +            },
        +            {
        +              "type": "null"
        +            },
        +            {
        +              "items": {
        +                "anyOf": [
        +                  {
        +                    "type": "string"
        +                  },
        +                  {
        +                    "type": "number"
        +                  },
        +                  {
        +                    "type": "boolean"
        +                  }
        +                ]
        +              },
        +              "type": "array"
        +            }
        +          ],
        +          "description": "the value to compare against; type follows the column"
        +        }
        +      },
        +      "required": [
        +        "column",
        +        "op"
        +      ],
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / criteria / description
        Added value: +"Autofilter criteria, {column, op, value}, combined as AND. Rows that fail are actually hidden, since .xlsx stores criteria and not state."
      • addedInput schema / properties / location / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "object"
        +  }
        +]
    • Changedset_formula1 field changed
      • addedInput schema / properties / location / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "object"
        +  }
        +]
    • Changedset_merge2 fields changed
      • addedInput schema / properties / location / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedInput schema / properties / location / title
        Removed value: -"Location"
    • Changedsort_range5 fields changed
      • addedInput schema / properties / keys / description
        Added value: +"Sort keys, {column, order}; later keys break ties."
      • addedInput schema / properties / keys / items / properties
        Added value: +{
        +  "column": {
        +    "anyOf": [
        +      {
        +        "type": "string"
        +      },
        +      {
        +        "minimum": 1,
        +        "type": "integer"
        +      }
        +    ],
        +    "description": "A column: a header name, a column letter, or a 1-based number."
        +  },
        +  "order": {
        +    "enum": [
        +      "asc",
        +      "desc"
        +    ],
        +    "type": "string"
        +  }
        +}
      • addedInput schema / properties / keys / items / required
        Added value: +[
        +  "column"
        +]
      • addedInput schema / properties / keys / items / type
        Added value: +"object"
      • addedInput schema / properties / location / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "object"
        +  }
        +]
    • Changedwrite_range4 fields changed
      • addedInput schema / properties / data / description
        Added value: +"Rows of cell values, rectangular: every row the same length."
      • addedInput schema / properties / data / items / items / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / data / items / items / description
        Added value: +"A cell value: text, a number, a boolean, or null to clear. A string beginning with '=' is stored as a formula."
      • addedInput schema / properties / location / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "object"
        +  }
        +]
  3. 40 tool updatesv1.0.0
    • First observedapply_edits
    • First observedaudit_formulas
    • First observedclear_filter
    • First observedclear_range
    • First observedcopy_range
    • First observedcopy_workbook
    • First observedcreate_table
    • First observedcreate_workbook
    • First observeddiagnose_workbook
    • First observeddisable_tools
    • First observedenable_tools
    • First observedexport_range
    • First observedfind_cells
    • First observedformat_cells
    • First observedget_cells
    • First observedget_grid_view
    • First observedget_server_info
    • First observedget_table
    • First observedget_workbook_metadata
    • First observedget_workflows
    • First observedimport_data
    • First observedmanage_backups
    • First observedmanage_hyperlink
    • First observedmanage_worksheet
    • First observedmodify_grid_structure
    • First observedmove_range
    • First observedquery_range
    • First observedread_range
    • First observedreplace_cells
    • First observedset_cell
    • First observedset_cells
    • First observedset_dimensions
    • First observedset_filter
    • First observedset_formula
    • First observedset_merge
    • First observedset_view
    • First observedset_workbook_properties
    • First observedsort_range
    • First observedvalidate
    • First observedwrite_range

TDQS

A3.9/5.0

Scored across 40 tools

Disambiguation4/5

Most tools follow a clear action+resource pattern and the detailed descriptions separate rectangular reads from scatter reads, grid views from queries, and single-cell writes from batch edits. A few close pairs (set_cell/set_cells/set_formula, get_table/read_range/query_range) still rely heavily on descriptions to avoid misselection.

Naming Consistency5/5

All tools use a consistent snake_case verb_noun convention (get_*, set_*, clear_*, manage_*, create_*), with clear resource terms like range, cell, table, worksheet, and workbook. The bare 'validate' is the only slight outlier and does not break the overall pattern.

Tool Count2/5

40 tools is well above the 25+ threshold and makes the surface heavy, even though the optional pack mechanism and detailed descriptions mitigate the cognitive load. Several tools are near-variants (set_cell/set_cells/write_range/apply_edits) that could arguably be consolidated.

Completeness4/5

The core spreadsheet lifecycle is well covered: workbook create/copy/metadata, worksheet lifecycle, range read/write/clear/copy/move, query/find/replace, formatting, filters, merges, hyperlinks, and backup management. Minor gaps remainโ€”no delete_workbook, no table deletion/resize in the static list, and advanced features (charts, protection, recalc) are only reachable through pack descriptions via enable_tools.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers