Skip to main content
Glama

Server Details

AI access to Quadratic spreadsheets: open files, run Python/SQL, query connected databases.

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
100.0% over 84 days
Last Tested
Transport
Streamable HTTP · MCP 2025-06-18
URL
Repository
quadratichq/quadratic-mcp-plugin
GitHub Stars
0
ChatGPT
–
Claude
–

TDQS

A4.4/5.0

Scored across 9 tools

Disambiguation4/5

The set cleanly partitions by resource (files metadata, spreadsheet cells, document blocks, slide deck, auth), so an agent can map intent to tool. Minor friction: files_read vs read_data both sound like 'reading', and read_data contains an action also called read_data plus an overlapping get_cell_data action, which adds a bit of selection ambiguity even though the descriptions disambiguate.

Naming Consistency4/5

A clear pattern of paired read/write tools exists: doc_read/doc_write, slide_read/slide_write, files_read/files_write. Deviations are the spreadsheet pair read_data/write_data (verb-first instead of noun-first) and the bare 'auth' tool, which break the otherwise consistent ordering but remain readable.

Tool Count5/5

Nine tools is a well-scoped surface for a multi-surface product, with one auth tool and one read/write pair per resource (files, sheets, docs, slides). The density lives in the action parameters, which is the intended aggregation model rather than redundant tools.

Completeness4/5

Lifecycle coverage is strong: auth (login/logout/token), file create/open/close/list/info, and full read/write for spreadsheets, documents and presentations including batching. Gaps exist around file-level management — no delete, rename, move, or sharing/permission operations — but core editing workflows are complete.

Available Tools

9 tools
authA
Destructive
Inspect

Authenticate the MCP session with Quadratic.

Actions: • login() — Start an OAuth device authorization flow. Returns a URL the user must open in a browser to authorize. The flow is completed by confirm_login. • confirm_login(device_code) — Complete an in-progress login by polling for user authorization. If the response indicates the user has not yet authorized, this action can be called again with the same device_code to continue polling. confirm_login is idempotent: if a later tool call reports "Not authenticated on this connection", call confirm_login again with the same device_code to re-establish auth (some clients use a new session per request, so the session that ran the tool may differ from the one that logged in). • set_token(token, email?) — Set a JWT directly (used when the OAuth device flow is not available). • logout() — Clear saved authentication for the current session.

NameRequiredDescriptionDefault
actionYesAction to perform: login, confirm_login, set_token, or logout
paramsNoParameters for the action (see tool description)

TDQS

A5/5.0
Behavior5/5

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

The description richly discloses behavior beyond annotations: login returns a URL, confirm_login is idempotent and can be polled repeatedly, set_token directly sets a JWT, and logout clears saved auth. It also explains the nuance that some clients use new sessions per request, which is critical for effective use. This does not contradict the annotations (destructiveHint=true aligns with logout; idempotentHint=false is clarified per-action).

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 well-structured with a short opening sentence followed by a bulleted list of actions. Each bullet is concise, information-dense, and directly relevant. No fluff or repetition; every sentence contributes to understanding.

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 (multiple actions, async polling, session nuances) and the generic schema, the description is remarkably complete. It covers all actions, their parameters, step-by-step flow, idempotent behavior, and error recovery. No output schema exists, but the description clarifies expected inputs and key outputs like the login URL.

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 only provides generic 'action' and 'params' fields. The description compensates fully by specifying the arguments for each action: login() takes no params, confirm_login(device_code) requires a device code, set_token(token, email?) takes a token and optional email, and logout() takes none. This is essential guidance that the schema does not provide.

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 'Authenticate the MCP session with Quadratic'—a specific verb and resource. It then enumerates four distinct actions (login, confirm_login, set_token, logout), making the tool's purpose unambiguous and clearly distinct from sibling file/data tools.

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?

Explicit usage guidance is provided for each action: use login for OAuth device flow, confirm_login to complete/poll authorization, set_token when OAuth is unavailable, and logout to clear auth. It also instructs when to re-call confirm_login (on 'Not authenticated' errors) due to session differences, offering concrete when-to-use and alternative guidance.

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

doc_readA
Read-onlyIdempotent
Inspect

Read-only queries on the open document (a file whose kind is DOC). No data is modified. Safe to auto-approve. Open the document first with files_write(open_file). Call as {"action": "", "params": {...}}.

Blocks are named by a path "." (e.g. "0.3") and carry a hash; doc_write needs the hash to change or delete a block.

Actions: • doc_outline() — Headings with their paths and hashes, plus block count, word count and block types. Start here for long documents. • read_doc(format?, from?, limit?) — Blocks in order, each {path, hash, type, content}. format: "markdown" (default) or "json" (ProseMirror JSON). Paginate with from (default 0) and limit (default 200, max 1000); next_from is null on the last page. • search_doc(query, limit?, case_sensitive?, whole_word?, regex?) — Text matches, each with the block's path and hash and a snippet. • context() — The full guide to documents: block model, Markdown support, placeholders, batches.

NameRequiredDescriptionDefault
actionYesAction to perform: read_doc, doc_outline, or search_doc
paramsNoParameters for the action (see tool description)

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the readOnlyHint and idempotentHint annotations, the description discloses the required open-file prerequisite, pagination defaults and limits, the next_from null condition, and the block path/hash model. These are substantial behavioral details an agent needs before calling.

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 read-only scope and prerequisite, then organized into a scannable action list. The detail is proportionate to a multi-action tool and no sentence is wasted.

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 explains the shape of each action's return values, including block paths, hashes, pagination fields, and search snippets. It gives enough context for an agent to invoke and interpret the tool without further documentation.

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?

Although the schema has full description coverage, it only generically describes action and params. The description compensates by documenting each action name and its parameters, including defaults, formats, pagination arguments, and search options.

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-only queries on the open DOC document. It distinguishes itself from doc_write by noting that no data is modified and from files_read by scoping to files whose kind is DOC.

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 prerequisites (open the document first with files_write(open_file)) and recommends doc_outline as the starting point for long documents. It lacks an explicit statement naming doc_write as the alternative for modifications, though the read-only framing implies it.

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

doc_writeA
Destructive
Inspect

Edits to the open document (a file whose kind is DOC). Edits apply live for anyone viewing the document. Requires edit access. Call as {"action": "", "params": {...}}.

Read the document first (doc_read): paths shift as blocks are added or removed, and replace_blocks / delete_blocks must pass each block's hash from that read — if a block changed since, the edit is refused and nothing changes. Every edit returns the paths and hashes of the blocks it wrote, and saved: false if it hadn't been confirmed yet (it is still applied).

content is Markdown by default (headings, emphasis, links, lists, quotes, code, tables, images, ---), or ProseMirror JSON with format: "json". Keep any <qd-node .../> placeholders from read_doc when writing content back; they stand for footnotes, comments and other content Markdown can't express.

Actions: • append(content, format?) — Add blocks at the end. • insert_blocks(position, path?, hash?, content, format?) — position: "start", "end", "before" or "after"; before/after need the anchor block's path. • replace_blocks(blocks, content, format?) — Replace consecutive blocks in one section; blocks: [{path, hash}, ...]. • delete_blocks(blocks) — Delete consecutive blocks in one section; blocks: [{path, hash}, ...]. • find_replace(find, replace, case_sensitive?, whole_word?, regex?) — Replace text throughout; replacements keep the formatting of the text they replace. • batch(operations) — Up to 100 edits as one all-or-nothing change: {"operations": [{"action": "", "params": {...}}, ...]}. Paths in later operations refer to the document as earlier ones left it.

NameRequiredDescriptionDefault
actionYesAction to perform: insert_blocks, replace_blocks, delete_blocks, find_replace, append, or batch
paramsNoParameters for the action (see tool description). For batch: {operations: [{action, params}, ...]}

TDQS

A4.9/5.0
Behavior5/5

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

Goes well past the annotations by disclosing that edits apply live to concurrent viewers, that edit access is required, that stale block hashes cause a refusal with no partial change, and that responses carry the written paths/hashes plus a saved:false signal that still means applied. The batch atomicity and 100-operation cap are non-obvious traits an agent must know before calling.

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?

Front-loaded with the key constraints, then bulleted actions, with no filler sentences. It is dense and long, but each sentence carries required behavior (hash staleness, qd-node placeholders, saved:false). Minor cost: the read_doc reference conflicts with the actual sibling name doc_read, which briefly blurs the pointer.

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 destructive, non-idempotent, multi-action mutation tool with no output schema, the description covers prerequisites, failure modes, return payload, and content-format preservation. Nothing an agent needs in order to call it correctly appears to be 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?

The schema only defines a bare action string and an opaque params blob, so the description carries the real load: it documents every action's signature, the position enum for insert_blocks, the {path, hash} shape for replace_blocks/delete_blocks, the find_replace flags, and the batch operations envelope. This is meaning the schema does not supply.

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?

States a specific verb and resource ('Edits to the open document') and immediately scopes it to files whose kind is DOC, which separates it from slide_write, files_write and write_data. The action list makes the concrete operations available 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 Guidelines5/5

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

Explicit sequencing is given: read with doc_read first, then pass block paths and hashes because paths shift. It also names the routing alternative by implication (doc_read) and explains when to use batch versus individual actions (up to 100 edits as one all-or-nothing change).

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

files_readA
Read-onlyIdempotent
Inspect

Read-only file metadata operations on Quadratic files the user has access to. No data is modified. Requires authentication.

Files are spreadsheets (kind GRID, edited with read_data / write_data), documents (kind DOC, edited with doc_read / doc_write) or presentations (kind SLIDE, edited with slide_read / slide_write).

Actions: • list_files(kinds?) — List accessible files with their kind. kinds: ["GRID"], ["DOC"] or ["SLIDE"] limits the list to those kinds. • get_file_info(file_id) — Get metadata for a single file, including its kind and web URL.

NameRequiredDescriptionDefault
actionYesAction to perform: list_files or get_file_info
paramsNoParameters for the action (see tool description)

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so the safety profile is covered. The description adds useful context — 'No data is modified' and 'Requires authentication' — but says nothing about pagination or result caps on list_files, how an inaccessible or non-existent file_id is reported, or what the response looks like. With annotations carrying the safety burden, this is adequate but not rich.

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?

It is front-loaded with a one-line scope statement, then a kind taxonomy, then a bulleted action list — easy to scan and appropriately sized for a two-action tool. There is minor duplication: 'No data is modified' restates readOnlyHint, and the kind-to-tool mapping appears twice in slightly different form.

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 read-only metadata tool with no output schema, the description covers the scope, both actions, the kind filter and the authentication requirement, which is enough to invoke it correctly. The remaining gap is insufficient disclosure of return details — the description mentions kind and web URL for get_file_info but not what list_files returns per entry or whether results are limited.

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 is only a generic action/params envelope with an untyped params object, so the description is the sole source of parameter meaning. It supplies the actual accepted action strings and the shape of their arguments, including the concrete kinds values ('["GRID"]', '["DOC"]', '["SLIDE"]') and the semantics of file_id. Without this text an agent could not construct a valid 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 states a specific verb and resource ('Read-only file metadata operations on Quadratic files') and enumerates the two concrete actions, list_files and get_file_info, with their arguments. It also maps file kinds to the sibling tools that edit them (GRID→read_data/write_data, DOC→doc_read/doc_write, SLIDE→slide_read/slide_write), so an agent can separate this metadata tool from the content-editing siblings without opening a 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?

It clearly frames the context: use this to discover or inspect file metadata, and use the per-kind tools to read or write content. The kinds filter is explained as a way to limit listing to GRID, DOC or SLIDE. What's missing is an explicit 'when not to use' statement — e.g. that this returns metadata only and never content, so an agent must chain to read_data/doc_read/slide_read after resolving an id.

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

files_writeA
Destructive
Inspect

File management operations that create or modify state: create a new file, open an existing file to start an editing session, or close a session. Requires authentication.

Actions: • open_file(file_id?, file_name?) — Open a spreadsheet, document or presentation by UUID or name and start an editing session. Returns the file's kind and web URL. Use read_data / write_data on a spreadsheet, doc_read / doc_write on a document and slide_read / slide_write on a presentation. The open is remembered for your user across MCP sessions (last open wins) — clients that use a new session per request do not need to re-open after auth(confirm_login). • create_file(file_name, team_uuid?, kind?) — Create a new blank spreadsheet (kind "GRID", the default), document (kind "DOC") or presentation (kind "SLIDE"). If team_uuid is omitted, the user's first team is used. Returns the new file's UUID and web URL; the file must be opened with open_file before it can be edited. • close_file(file_id) — Close an active editing session.

NameRequiredDescriptionDefault
actionYesAction to perform: open_file, create_file, or close_file
paramsNoParameters for the action (see tool description)

TDQS

A4.3/5.0
Behavior4/5

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

Adds substantial context beyond the annotations: authentication is required, open state persists per user across MCP sessions with last-open-wins semantics, and callers using per-request sessions need not re-open after auth(confirm_login). It also documents return values (kind, web URL, UUID) and the team defaulting behavior. It does not explain why destructiveHint=true (what closing a session loses or whether create is reversible), leaving one annotation unexplained.

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?

Front-loaded summary sentence followed by per-action bullets, which is well suited to a multiplexed tool. Each bullet carries actionable information, though the open_file bullet is dense and could be split so the sibling routing is easier to scan.

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 three-action multiplexed tool with a generic envelope schema and no output schema, the description covers prerequisites, defaults, return values, session persistence and auth. The only minor omission is what close_file returns, which an agent is unlikely to need.

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 is only a generic action/params envelope, so the description carries essentially all parameter meaning: it names file_id, file_name, team_uuid and kind per action, states kind defaults to GRID with DOC/SLIDE alternatives, and explains that an omitted team_uuid falls back to the user's first team. This is meaning the schema alone cannot provide.

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

Purpose4/5

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

The opening sentence names a specific domain (file management) and enumerates the three concrete actions: create a file, open a file to start an editing session, close a session. It is clearly different from the sibling files_read. It loses a point because bundling a non-mutating session-open under a tool named 'files_write' slightly blurs what the tool really is.

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?

Strong routing: after open_file it explicitly tells the agent to use read_data/write_data for spreadsheets, doc_read/doc_write for documents and slide_read/slide_write for presentations, and it states the prerequisite that a file must be opened before editing. It does not explicitly state when to prefer files_write over files_read, but the read/write split is obvious from the action list.

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

read_dataA
Read-onlyIdempotent
Inspect

Read-only queries on the open spreadsheet. No data is modified. Safe to auto-approve. Call as {"action": "", "params": {...}} — per-action params are listed in the Action Reference below.

Special actions (not shown in the action enum): • batch — {"action": "batch", "params": {"actions": [{"action": "", "params": {...}}, ...]}}. Runs reads in parallel; individual failures are reported per-entry without short-circuiting. • context — {"action": "context", "params": {"topic": ""}} or {"action": "context", "params": {"action": ""}}. Returns deeper docs for a topic or a single action's signature. Plural "topics" / "actions" arrays are also accepted and may be combined. Topics: python, javascript, formula, connection, validation, a1, quadratic, chart, pivot_table.

Action Reference

• get_cell_data(selection, page?, sheet_name?) — Returns cell values for a selection in A1 notation. Supports comma-separated ranges to fetch multiple areas in ONE call, including across different sheets. Examples: "A1:B10, D1:E10", "TableName, OtherTable", "'Sheet1'!A1:B10, 'Sheet2'!C1:D10". Table names are globally unique so they work without sheet prefixes. For cell ranges on other sheets use 'SheetName'!Range. Only use when you need the full dataset (aggregations, lookups, analysis). The file summary already includes sample rows. Results may be paginated — use page (0-based) for additional pages. • has_cell_data(selection, sheet_name?) — Check if any cells in a selection have data. Returns true if ANY cell contains data. Use before creating/moving tables or code to avoid spill errors. All ranges MUST be on the same sheet. • get_code_cell_value(code_cell_position?, code_cell_name?, sheet_name?) — Get full code from an existing Python, JavaScript, or connection code cell. Do NOT use for formula cells — formulas are already in get_cell_data results and the file summary. • get_text_formats(selection, page?, sheet_name?) — Get text formatting info. Use table column references for tables ("Table_Name[Column Name]"). Results may be paginated. • get_validations(sheet_name?) — Get all validations in a sheet. • get_conditional_formats(sheet_name) — Get all conditional formatting rules. Use to check existing rules before creating/updating/deleting. • text_search(query, case_sensitive?, whole_cell?, search_code?, regex?, sheet_name?) — Search for text in cell outputs. Supports regex when enabled (e.g., "\d+", "^hello", "foo|bar"). Searches cell outputs only, not code. Booleans default false. • get_sheet_info() — List all sheets and names. • get_spreadsheet_context(sheet_name?, include_errors?) — Full context snapshot of the file. • read_data(selection, sheet_name?, max_rows?) — Read cell data as compact CSV. Auto-tiers: returns all rows for small/medium data (<5000 rows), head+tail preview for large data. Preferred over get_cell_data for most reads. • outline(sheet_name?) — Structural map of the file: sheets, bounds, tables, code cells, charts, connections, errors. Use to understand file layout before reading data. • dependencies(position, sheet_name?, direction?) — Trace cell dependencies. direction: "forward" (what this cell reads), "reverse" (what depends on this cell), or "both" (default). • export_pdf(options?) — Export the file as a PDF with Excel-parity print semantics. Returns {mime_type, size_bytes, data_base64}. options is a camelCase object: {sheetIds?: [id], fileName?, pageSetup?: {paperSize ("letter"|"legal"|"tabloid"|"a3"|"a4"|"a5"|...), orientation ("portrait"|"landscape"), margins {left,right,top,bottom,header,footer} (inches), scaling ({type:"zoom",percent} or {type:"fitTo",width?,height?}), pageOrder ("downThenOver"|"overThenDown"), centerHorizontally?, centerVertically?, printGridlines?, printHeadings?, header/footer {odd:{left,center,right}, even?, first?} with Excel codes (&P page, &N total, &D date, &T time, &F file, &A sheet, &B bold)}, sheetOptions?: {"": {pageSetup?, printArea? ("A1:F20"), repeatRows? ([1,2]), repeatCols?, rowBreaks?, colBreaks?}}}. Omit options for sensible defaults (letter portrait, 100% zoom, all sheets). • list_connections(team_uuid?) — List all database connections in a team (PostgreSQL, MySQL, MS SQL, Snowflake, BigQuery, Mixpanel, Google Analytics, Plaid, etc.). Returns each connection's uuid, name, and type. team_uuid is optional — if omitted, the user's only team is used; multi-team users must pass it. Call this BEFORE get_database_schemas or set_sql_code_cell_value to discover the connection_ids and connection types you need. • get_database_schemas(connection_ids, connection_type, team_uuid) — Get table/column schemas for database connections. Always call before writing SQL. Get connection_ids from list_connections. connection_type: POSTGRES, MYSQL, MSSQL, SNOWFLAKE, BIGQUERY, COCKROACHDB, etc. • list_agent_connections(team_uuid?) — List the team's ready Agent Connections (third-party REST API bindings). Returns each connection's uuid, name, service, base URL, auth pattern, and {{SECRET_NAME}} references to use in fetch code. team_uuid is optional — if omitted, the user's only team is used; multi-team users must pass it. Reference secrets via {{SECRET_NAME}} in Python/JavaScript fetch code; the connection proxy substitutes team secret values at request time. • inspect_agent_connection(connection_id, team_uuid?) — Get the full schema (resources, endpoints, fields, docs URLs) and plan for one ready Agent Connection by uuid (from list_agent_connections). Call BEFORE writing fetch code against a connection so you don't guess at endpoints. team_uuid is optional with the same single-team fallback as list_agent_connections.

Batch: • batch(actions) — actions: [{action, params}]. Runs reads in parallel through this same tool; per-entry failures are reported in the result without short-circuiting the batch. action may be any name from this reference. Nested context items are allowed and returned alongside the reads.

NameRequiredDescriptionDefault
actionYesAction to perform: get_cell_data, has_cell_data, get_code_cell_value, get_text_formats, get_validations, get_conditional_formats, text_search, get_sheet_info, get_spreadsheet_context, read_data, outline, dependencies, export_pdf, get_database_schemas, list_connections, list_agent_connections, inspect_agent_connection, or batch
paramsNoParameters for the action (see tool description). For batch: {actions: [{action, params}, ...]}

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the readOnlyHint/idempotentHint annotations, the description adds 'Safe to auto-approve', explains batch per-entry failure without short-circuiting, pagination for large results, team_uuid fallback behavior for single-team users, and secret substitution via {{SECRET_NAME}}. These are meaningful operational disclosures.

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?

Extremely long but well-organized into sections (general, special actions, action reference, batch). Each action entry is concise and front-loaded with behavior. Some repetition (e.g., team_uuid optional note) but every sentence adds necessary operational 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 tool is a dispatcher for 18+ sub-actions with no output schema, the description is remarkably complete: it covers return shapes (e.g., list_connections returns uuid/name/type, export_pdf returns mime_type/size_bytes/data_base64), pagination, error handling, prerequisites, and optional parameter behavior. Nothing critical 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 only has 'action' and 'params' with generic descriptions. The description provides full parameter semantics for every sub-action, including A1 notation selection formats, optional parameters with defaults, regex examples, output formats for export_pdf, and connection types. This compensates entirely for schema sparsity.

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?

Description states 'Read-only queries on the open spreadsheet' with explicit 'No data is modified', clearly distinguishing from write_data sibling. It enumerates a full action reference, making the dispatcher role unambiguous. The verb+resource pairing is specific 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 Guidelines5/5

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

Provides explicit when-to-use guidance: 'Use before creating/moving tables or code to avoid spill errors', 'Call this BEFORE get_database_schemas or set_sql_code_cell_value', 'Preferred over get_cell_data for most reads', and 'Do NOT use for formula cells'. Also includes call format and special batch/context usage.

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

slide_readA
Read-onlyIdempotent
Inspect

Read-only queries on the open presentation (a file whose kind is SLIDE). No data is modified. Safe to auto-approve. Open the presentation first with files_write(open_file). Call as {"action": "", "params": {...}}.

Slides and shapes have stable ids; slide_write addresses edits by them. Shape positions and sizes (xfrm: x, y, cx, cy, rot) are in EMU (914400 per inch, 12700 per point) unless units is "in" or "pt".

Actions: • deck_outline() — Every slide's id, index, layout, title, shape count, whether it has notes and open comments, plus slide size, footer, comment count and available layouts. Start here. • read_deck(format?, units?, from?, limit?, slide_ids?) — Slides with their shapes (type sp / pic / cxnSp / tbl, xfrm, placeholder, geometry, text, fill, line, table style/column widths/row heights/cells), notes and comments, plus the theme (colors and fonts) and footer. format: "markdown" (default) or "json" (ProseMirror JSON). Paginate with from (default 0) and limit (default 50, max 500), or pass slide_ids; next_from is null on the last page. • search_deck(query, limit?, case_sensitive?, whole_word?, regex?) — Text matches across shapes, table cells and notes, each with slide id, shape id and a snippet. • read_comments(slide_id?, include_resolved?) — Comment threads (author, text, replies, resolved, anchor shape) for the deck or one slide. • context() — The full guide to presentations: slides, shapes, units, layouts, Markdown text, batches.

NameRequiredDescriptionDefault
actionYesAction to perform: read_deck, deck_outline, search_deck, or read_comments
paramsNoParameters for the action (see tool description)

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint=false, so "No data is modified. Safe to auto-approve" largely restates them. The description earns credit for disclosing behavior the annotations cannot: EMU unit semantics (914400 per inch, 12700 per point), pagination defaults and the 500 max, and that next_from is null on the last page.

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?

Front-loaded with the safety and prerequisite statements, then a scannable bulleted action list where each line does real work. It is long, but the density is justified for a six-action dispatcher; only the early repeated safety line could be trimmed against the annotations.

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 polymorphic action dispatcher with no output schema, it is largely complete: prerequisites, unit conventions, pagination contract, and per-action payload summaries (shape types sp/pic/cxnSp/tbl, notes, comments, theme, footer). It stops short of describing error or failure behavior when no presentation is open.

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 is a bare skeleton — action is just a string listing four names and params has no structure at all — so the description carries essentially all parameter meaning. It documents per-action parameters with defaults and ranges (from 0, limit 50/500, include_resolved, format markdown vs json) and clarifies that shape geometry is in EMU unless units is "in" or "pt".

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 verb family and resource: "Read-only queries on the open presentation (a file whose kind is SLIDE)," and explicitly contrasts with slide_write ("slide_write addresses edits by them"). The six actions are enumerated with one-line scopes, so an agent can distinguish this from slide_write, doc_read, and files_read 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 Guidelines4/5

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

It supplies a prerequisite ("Open the presentation first with files_write(open_file)") and a routing hint ("Start here" on deck_outline), plus a pointer to context() for the full guide. It does not state when to prefer files_read or doc_read over this tool, so the sibling routing is only partially explicit.

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

slide_writeA
Destructive
Inspect

Edits to the open presentation (a file whose kind is SLIDE). Edits apply live for anyone viewing the presentation. Requires edit access. Call as {"action": "", "params": {...}}.

Read the presentation first (slide_read deck_outline or read_deck) to get slide and shape ids. Every edit returns what it wrote (new ids, placeholder shapes, z-order) and saved: false if it hadn't been confirmed yet (it is still applied).

Text content is Markdown by default (paragraphs, - bullets with two-space nesting, 1. numbering, bold, italic, strike, , , , links), or ProseMirror JSON with format: "json". Lengths are EMU unless units is "in" or "pt". Layouts: title, obj (Title and Content, the default), secHead, twoObj, twoTxTwoObj, titleOnly, blank, objTx, picTx — names or labels.

Actions: • add_slide(layout?, after_slide_id?, index?, title?, body?, notes?, format?) — Add a slide and fill its title/body placeholders. Returns the slide id and its shapes. • delete_slides(slide_ids) / duplicate_slides(slide_ids) / move_slide(slide_id, index). • update_slide(slide_id, layout?, background?, transition?, hidden?, notes?, format?) — null clears background or transition; a new layout keeps placeholder text. reset_slide(slide_id) — Put placeholders back where the layout has them (PowerPoint's Reset). • set_text(slide_id, shape_id? | placeholder?, cell?, content, format?) — Replace a shape's text; placeholder is "title", "subtitle" or "body"; cell: {row, col} for a table. • format_text(slide_id, shape_id? | placeholder?, cell?, paragraphs?, match?, case_sensitive?, whole_word?, regex?, style) — Format text in place without retyping it. style: {bold?, italic?, underline?, strike?, superscript?, subscript?, font_family?, font_size_pt?, color?, highlight?, caps: "all" | "small"?, letter_spacing_pt?, link?, align: "left" | "center" | "right" | "justify"?, line_height?, space_before_pt?, space_after_pt?, indent_pt?, list: "none" | "bullet" | "number"?}; null clears a property. Scope with paragraphs (zero-based indices as read_deck lists them) and/or match (only the matching text; paragraph properties apply to paragraphs containing a match). Omit cell on a table to format every cell. • add_shape(slide_id, shape, geometry?, xfrm?, units?, name?, text?, format?, fill?, line?, body_pr?, src?, rows?, cols?, cells?) — shape: "text_box", "shape" (with geometry e.g. rect, ellipse, rightArrow), "connector", "picture" (src data/https URL) or "table" (rows/cols or cells text). Omit xfrm for a centered default size. • update_shape(slide_id, shape_id, xfrm?, units?, name?, geometry?, fill?, line?, body_pr?, hidden?, descr?, src?, crop?) — xfrm may be partial; null removes fill, line, descr or crop. src and crop ({l?, t?, r?, b?} fractions of each edge) are for pictures. • delete_shapes(slide_id, shape_ids) / duplicate_shapes(slide_id, shape_ids) / reorder_shapes(slide_id, shape_ids, move: "front" | "back" | "forward" | "backward"). • align_shapes(slide_id, shape_ids, alignment: "left" | "center" | "right" | "top" | "middle" | "bottom") — One shape aligns to the slide, several to each other. distribute_shapes(slide_id, shape_ids, axis: "horizontal" | "vertical") — Space three or more shapes evenly. • group_shapes(slide_id, shape_ids) — Group two or more shapes; they then share a group_id. ungroup_shapes(slide_id, shape_ids) — Dissolve the groups those shapes belong to. • edit_table(slide_id, shape_id, op: "insert_row" | "delete_row" | "insert_column" | "delete_column", at). • format_table(slide_id, shape_id, style?, first_row?, band_row?, col_widths?, row_heights?, units?, cells?, cell_fill?, cell_anchor?) — Table style (mediumStyle2Accent1, lightStyle1, themedStyle1Accent1, noStyle), header row and banding, one width per column / one height per row (the table resizes to fit), and fill or text anchor (t|ctr|b) for the given cells (default all). merge_cells(slide_id, shape_id, from, to) / split_cell(slide_id, shape_id, cell) — Merge the rectangle of cells (their text joins the top-left cell) or split a merged cell again. • find_replace(find, replace, case_sensitive?, whole_word?, regex?) — Replace text throughout; replacements keep the formatting of the text they replace. • update_presentation(slide_size_preset?, slide_size?, units?, scale_content?, theme?, footer?) — slide_size_preset is "16:9" | "4:3" | "16:10", slide_size is a custom {cx, cy}; shapes scale to the new size unless scale_content is false. theme: {name?, colors?: {dk1, lt1, dk2, lt2, accent1–accent6, hlink, folHlink}, fonts?: {major, minor}} merges into the current theme. footer: {show_slide_number?, show_date?, footer_text?} or null to remove. • add_comment(slide_id, shape_id?, x?, y?, units?, text) — Start a comment thread, anchored to a shape when shape_id is given. reply_to_comment(comment_id, text) / update_comment(comment_id, text?, resolved?) / delete_comments(comment_ids). • batch(operations) — Up to 100 edits as one all-or-nothing change: {"operations": [{"action": "", "params": {...}}, ...]}. Ids created by earlier operations aren't available to later ones in the same batch.

NameRequiredDescriptionDefault
actionYesAction to perform: add_slide, delete_slides, move_slide, duplicate_slides, update_slide, reset_slide, set_text, format_text, add_shape, update_shape, delete_shapes, duplicate_shapes, reorder_shapes, align_shapes, distribute_shapes, group_shapes, ungroup_shapes, edit_table, format_table, merge_cells, split_cell, find_replace, update_presentation, add_comment, reply_to_comment, update_comment, delete_comments, or batch
paramsNoParameters for the action (see tool description). For batch: {operations: [{action, params}, ...]}

TDQS

A4.7/5.0
Behavior5/5

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

Goes well past the annotations: it discloses that edits apply live to anyone viewing, that a mutation returns what it wrote plus 'saved: false' when unconfirmed, that null clears background/transition/fill/descr/crop, and that batch is all-or-nothing with ids from earlier operations unavailable to later ones. These are exactly the mutation semantics an agent cannot infer from destructiveHint=true alone.

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?

Front-loaded with purpose, prerequisites, and global conventions (Markdown, EMU units, layout names) before the action catalog, so an agent can stop reading early if it only needs the general rules. It is long, but the length is justified by 28 actions with no schema documentation; only minor redundancy in repeated list/dict syntax keeps it from a 5.

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 28-action polymorphic tool with no output schema, the description covers every action listed in the schema's action field and explains the return shape ('Every edit returns what it wrote (new ids, placeholder shapes, z-order)'), which substitutes for the missing output schema. Errors and live-coauthoring conflicts are the only unaddressed areas.

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 is a two-field dispatcher whose 'params' is an untyped object, so the description carries the entire burden and does so thoroughly: per-action parameter names, defaults ('obj' is the default layout, omitted xfrm centers the shape), enum values (geometry, alignment, table styles, 'front'/'back'/'forward'/'backward'), null-clearing behavior, and Markdown/ProseMirror plus EMU/in/pt content conventions.

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 and resource ('Edits to the open presentation') and narrows scope to 'a file whose kind is SLIDE', which separates it from doc_write, while slide_read is named as the read counterpart. The action list that follows makes the edit surface concrete rather than abstract.

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?

Explicitly states the prerequisite workflow ('Read the presentation first (slide_read deck_outline or read_deck) to get slide and shape ids') and the access requirement ('Requires edit access'), so an agent knows when it is eligible to call it. It also implies that batch is the route for many edits at once, but never states when *not* to use this tool relative to doc_write or when a single live edit is preferable to a batch.

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

write_dataA
Destructive
Inspect

Write operations on the open spreadsheet. Call as {"action": "", "params": {...}} — per-action params are listed in the Action Reference below. Numbers, booleans, and nulls in cell values are coerced to strings.

Special actions (not shown in the action enum): • batch — {"action": "batch", "params": {"actions": [{"action": "", "params": {...}}, ...]}}. Runs writes sequentially; errors short-circuit the batch. • context — {"action": "context", "params": {"topic": ""}} or {"action": "context", "params": {"action": ""}}. Returns deeper docs for a topic or a single action's signature. Plural "topics" / "actions" arrays are also accepted and may be combined. Topics: python, javascript, formula, connection, validation, a1, quadratic, chart, pivot_table.

Action Reference

Cell Data: • set_cell_values(top_left_position, cell_values, sheet_name?) — Sets cell values as a 2D string array (first row = headers). top_left_position: single cell in A1 notation. Don't place over existing data unless requested. Values replace existing content; use empty string to clear. For merged cells, place at the anchor (top-left) cell. Prefer this over add_data_table for tabular data; only use add_data_table when the user explicitly asks for a data table or the file already uses data tables. When writing tabular data as plain cells, format the header row afterward with set_text_formats (at least bold) so it's visually distinct — plain cells don't auto-style headers like data tables do. Don't use for formulas or code. • delete_cells(selection, sheet_name?) — Delete cell values in a selection (A1 notation). Don't delete cells referenced by code cells unless explicitly asked. To delete table columns: "TableName[Column Name]". To delete tables: "TableName". • move_cells(source_selection_rect, target_top_left_position, sheet_name?) — Move a rectangular block of cells. Target is the top-left corner (single cell). For spilled code cells, move just the anchor cell. • add_data_table(top_left_position, table_name, table_data, sheet_name?) — Adds a data table. Data tables are discouraged by default — only use when the user specifically requests a data table or the file already uses data tables; otherwise use set_cell_values. First row of table_data is headers. Leave 2 rows below and 2 columns right as spacing. All rows must have equal length (use empty strings for missing values). To convert existing data, use convert_to_table instead. To delete a table, use set_cell_values with empty string at the anchor. A single-value formula or code cell MAY be written into a data cell of an editable (imported/value) table — it's stored as in-place single-cell code computing a 1x1 result; avoid the table's name/column-header rows and read-only code-output tables/charts, and don't put multi-cell output (dataframes/charts) inside a table.

Code: • set_code_cell_value(code_cell_position, code_cell_language, code_cell_name, code_string, sheet_name?) — Sets and runs a Python or JavaScript code cell. Prefer set_formula_cell_value whenever a formula can do the task; only use code when the functionality is not available in formulas (e.g. charts, ML, correlations, complex data transforms, or web/API requests). For static data use set_cell_values. For SQL use set_sql_code_cell_value. IMPORTANT: Always reference sheet data with q.cells() — never hardcode data values. For charts, use Plotly ONLY (import plotly.express or plotly.graph_objects). Do NOT use Matplotlib/Seaborn. Name the output (no spaces/special chars, _ allowed). Placement: Estimate output size before placing. Charts default to 7 wide x 23 tall cells. Cell must be empty (avoids spill error). Leave one extra column/row gap between the code cell and nearest content. Empty sheet → A1. • set_formula_cell_value(formulas) — formulas: [{code_cell_position, formula_string, sheet_name?}]. Prefer this whenever a formula can do the task; only use set_code_cell_value when formulas can't. For basic historical stock prices use the STOCKHISTORY formula; for financial data with no formula equivalent (adjusted prices, statements, dividends, real-time/intraday, technicals, economic data) use set_code_cell_value with Python + q.financial. Don't prefix formulas with =. code_cell_position can be a single cell ("A1"), range ("A1:A10"), or collection ("A1,A2:B2"). Cell references adjust relatively (like copy-paste). Use $ for absolute references ($A$1). Place near referenced data, no extra spacing needed. Aggregations go directly below or beside data. • rerun_code(sheet_name?, selection?) — Re-run code cells. Do NOT call after set_code_cell_value, set_formula_cell_value, or set_sql_code_cell_value — those already run automatically. Only use to refresh unchanged code (e.g., external data). • set_sql_code_cell_value(code_cell_position, code_cell_name, connection_kind, sql_code_string, connection_id, sheet_name?) — Sets and runs a SQL connection code cell. connection_kind: POSTGRES, MYSQL, MSSQL, SNOWFLAKE, BIGQUERY, COCKROACHDB, MARIADB, SUPABASE, NEON, MIXPANEL, GOOGLE_ANALYTICS, PLAID, QUICKBOOKS. Always call get_database_schemas before writing SQL. Cell must be empty. Empty sheet → A1.

Import: • import_file(file_name, file_data, sheet_name?, insert_at?) — Import CSV/Excel/Parquet. file_data: base64-encoded. Extension determines format (.csv, .xlsx/.xls, .parquet/.parq/.pqt). To create a new file from an import, call files create_file first, then import_file.

Formatting: • set_text_formats(formats) — formats array: [{selection, bold?, italic?, underline?, strike_through?, text_color?, fill_color?, align?, vertical_align?, wrap?, font_size?, number_type?, currency_symbol?, numeric_decimals?, numeric_commas?, date_time?, sheet_name?}]. For table columns use table references ("Table_Name[Column Name]") instead of A1 ranges. Colors: hex ("#FF0000"), empty string to remove. align: "left"/"center"/"right". vertical_align: "top"/"middle"/"bottom". wrap: "wrap"/"clip"/"overflow". number_type: "number"/"currency"/"percentage"/"exponential" (currency requires currency_symbol, e.g. "$"). numeric_decimals: integer >= 0, number of decimal places to display (e.g. "format percents as 2 decimals" → 2). Percentages: .01 → 1%, 1 → 100%. date_time: chrono format e.g. "%Y-%m-%d". font_size: points (default 10). Set to null to clear any format. • set_borders(borders) — borders: [{selection, border_selection, color, line, sheet_name?}]. border_selection: all/inner/outer/horizontal/vertical/left/top/right/bottom/clear. line: line1 (thin)/line2 (medium)/line3 (thick)/dotted/dashed/double/clear. color: CSS color string. • merge_cells(selection, sheet_name?) — Merge a range of cells (e.g. A1:D1). All values except top-left are cleared. • unmerge_cells(selection, sheet_name?) — Unmerge merged cells overlapping the selection.

Sheets: • add_sheet(sheet_name, insert_before_sheet_name?) — Sheet names: unique, max 31 chars, no / \ ? * : [ ] • duplicate_sheet(sheet_name_to_duplicate, name_of_new_sheet) • rename_sheet(sheet_name, new_name) • delete_sheet(sheet_name) • move_sheet(sheet_name, insert_before_sheet_name?) • color_sheets(sheet_names_to_color) — [{sheet_name, color}]. color: CSS color string. • set_frozen_panes(sheet_name?, frozen_row_count, frozen_column_count) — freeze/pin rows from row 1 and columns from column 1. Use 0 to unfreeze an axis.

Tables: • convert_to_table(selection, table_name, first_row_is_column_names, sheet_name?) — Convert existing cell data to a data table. Only use when the user explicitly asks for a data table or the file already uses data tables; otherwise keep data as plain cells. Selection must NOT contain code cells or existing tables. Table name row is added above, pushing data down by one row. • table_meta(table_location, new_table_name?, show_name?, show_columns?, alternating_row_colors?, first_row_is_column_names?, sheet_name?) — Set table metadata. table_location: anchor cell (top-left, e.g. A5). • table_column_settings(table_location, column_names, sheet_name?) — column_names: [{old_name, new_name, show}]. Only include columns to change. To delete columns use delete_cells with "TableName[Column Name]".

Layout: • resize_columns(selection, size, sheet_name?) — size: "auto" (fit content), "default", or pixels (20-2000). • resize_rows(selection, size, sheet_name?) — size: "auto", "default", or pixels (10-2000). • set_default_column_width(size, sheet_name?) — size in pixels (20-2000, default 100). • set_default_row_height(size, sheet_name?) — size in pixels (10-2000, default 21). • insert_columns(column, right, count, sheet_name?) — column: letter (e.g. "C"). right: true=insert right, false=insert left. • insert_rows(row, below, count, sheet_name?) — row: number. below: true=insert below, false=insert above. • delete_columns(columns, sheet_name?) — columns: array of letters (e.g. ["A", "C"]). • delete_rows(rows, sheet_name?) — rows: array of numbers (e.g. [1, 5, 10]).

Charts (Excel-native; prefer over Plotly/Chart.js code cells for standard charts of sheet data — see the "chart" topic for details): • add_chart(chart_type, position, series, sheet_name?, title?, name?, categories?, legend?, x_axis_title?, x_axis_min?, x_axis_max?, x_axis_number_format?, y_axis_title?, y_axis_min?, y_axis_max?, y_axis_number_format?, width_cells?, height_cells?, chart_3d_rot_x?, chart_3d_rot_y?, chart_3d_perspective?, chart_3d_depth_gap?) — Adds an Excel-native chart anchored at position (single cell). chart_type: column, column_stacked, column_percent_stacked, bar, bar_stacked, bar_percent_stacked, line, line_stacked, area, area_stacked, pie, doughnut, scatter, scatter_line, bubble, radar, radar_filled, stock, column_3d, bar_3d, line_3d, area_3d, pie_3d, waterfall, funnel, histogram, pareto, box_whisker, treemap, sunburst, region_map. series: [{values, name?, bubble_sizes?, color?}] where values is one row or column of numbers in A1 ("B2:B13", table references allowed). categories: labels range (x values for scatter/bubble). Charts float over the grid (no spill errors); the anchor is nudged to free space if the cell would cover content. Returns the chart_id for update_chart/delete_chart. • update_chart(chart_id, sheet_name?, chart_type?, position?, series?, title?, name?, categories?, legend?, axis and 3d options as in add_chart) — Changes an existing chart; omitted arguments leave that part unchanged. Chart ids are returned by add_chart and listed in the file context under "Native Chart". • delete_chart(chart_id, sheet_name?) — Removes a chart.

Pivot Tables: • set_pivot_table(action, pivot_table_name?, sheet_name?, source?, destination?, rows?, columns?, values?, filters?, layout?, values_layout?, row_grand_total?, column_grand_total?, subtotal_position?) — Creates ("create"), reconfigures ("update"), or removes ("delete") a PivotTable: a live cross-tabulation that groups source rows and aggregates values, recomputing when the source changes. Prefer it over SUMIFS or a Python groupby for "totals by category" requests. Reference source columns by header name, not letter. source (create): A1 range with a header row or a table name. destination (create): "new_sheet" (default) or a top-left cell. rows/columns: [{field, label?, sort?, show_totals?, group_by?, numeric_interval?}]. values (at least one): [{field, aggregation?, name?, show_as?, number_format?, decimals?, visual?}]. filters: [{field, include?, exclude?}]. For update: null leaves an area as it is, an empty array clears it — send only the areas you're changing. pivot_table_name is required for update/delete; names are listed in the file context. The report's cells are read-only; change it with this action. See the "pivot_table" topic for details.

Validation: • add_logical_validation(selection, show_checkbox?, ignore_blank?, sheet_name?) — True/false validation with optional checkbox. • add_list_validation(selection, list_source_list?, list_source_selection?, drop_down?, ignore_blank?, sheet_name?) — list_source_list: comma-separated values ("Item 1, Item 2"). list_source_selection: A1 cell reference. Use one, not both. • remove_validation(selection, sheet_name?) — Remove all validations from the selection.

Conditional Formatting: • update_conditional_formats(sheet_name, rules) — rules: [{action, id?, selection?, type?, rule?, bold?, italic?, underline?, strike_through?, text_color?, fill_color?, apply_to_empty?, color_scale_thresholds?, auto_contrast_text?}]. action: "create"/"update"/"delete". type: "formula" (apply styles when formula is true) or "color_scale" (gradient colors). For formula type: rule examples: "A1>100", "ISBLANK(A1)", "AND(A1>=5,A1<=10)". For color_scale: thresholds: [{value_type: "min"/"max"/"number"/"percent"/"percentile", value, color}]. For table columns use table references instead of A1 ranges. For delete: only id required.

History: • undo(count?) — Default 1. • redo(count?) — Default 1.

Batch: • batch(actions) — actions: [{action, params}]. Runs writes sequentially through this same tool; errors short-circuit the batch. action may be any name from this reference. Nested context items are allowed and returned alongside the writes.

NameRequiredDescriptionDefault
actionYesAction to perform: set_cell_values, delete_cells, move_cells, add_data_table, set_code_cell_value, set_formula_cell_value, rerun_code, set_text_formats, set_borders, merge_cells, unmerge_cells, add_sheet, duplicate_sheet, rename_sheet, delete_sheet, move_sheet, color_sheets, set_frozen_panes, convert_to_table, table_meta, table_column_settings, resize_columns, resize_rows, set_default_column_width, set_default_row_height, insert_columns, insert_rows, delete_columns, delete_rows, add_logical_validation, add_list_validation, remove_validation, update_conditional_formats, add_chart, update_chart, delete_chart, set_pivot_table, set_sql_code_cell_value, import_file, undo, redo, or batch
paramsNoParameters for the action (see tool description). For batch: {actions: [{action, params}, ...]}

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare destructiveHint: true, and the description aligns with that. It adds substantial behavioral context beyond the annotations: numeric/boolean/null coercion to strings, batch short-circuiting, spill error avoidance for code cells, the requirement to call get_database_schemas before SQL, chart float behavior, pivot table read-only cells, and many other operational details. It also notes that set_code_cell_value, set_formula_cell_value, and set_sql_code_cell_value run automatically so rerun_code should not be called after them. 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.

Conciseness4/5

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

The description is extremely long, but it is necessary given the tool's breadth (40+ actions). It is well-structured with clear headings (Cell Data, Code, Import, Formatting, Sheets, Tables, etc.), action signatures, and inline notes. It front-loads the purpose and call format. While not concise in length, every sentence serves a purpose and the structure improves scannability. It earns a 4 rather than 5 only because some individual action notes are verbose and could be tightened, but overall it is appropriate for the complexity.

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 this many actions and no output schema, the description is remarkably complete. It covers all action signatures, parameter details, usage heuristics, edge cases (e.g., merged cells, spill errors, data table spacing), return values where relevant (e.g., add_chart returns chart_id), and even special behaviors like the context action for deeper docs. It gives the agent everything needed to call any action correctly without external reference. There are no significant gaps for an agent to misuse the 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?

The input schema only defines 'action' and a generic 'params' object with no per-action schema. The description carries the entire burden of parameter documentation, and it does so comprehensively: each action is listed with its exact parameter names, types, defaults, and usage notes (e.g., 'top_left_position: single cell in A1 notation', 'color: hex string', 'line: line1/line2/line3', 'size: auto/default/pixels'). Even edge cases and constraints are explained (e.g., 'sheet names: unique, max 31 chars'). This fully compensates for the schema's lack of detail.

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 first sentence clearly states 'Write operations on the open spreadsheet', immediately establishing the tool's scope and distinguishing it from read tools like read_data. It then enumerates all supported actions, leaving no ambiguity about what the tool does. The description is explicit about the verb (write) and the resource (spreadsheet).

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 provides extensive when-to-use guidance both at the tool level (write operations vs. read operations implied by sibling names) and at the action level. For example, it explicitly says 'Prefer this over add_data_table' for set_cell_values, 'only use code when functionality is not available in formulas', and 'Use STOCKHISTORY formula for basic historical stock prices'. It also gives exclusions like 'Don't use for formulas or code' for certain actions, and explains when to use batch and context. This fully equips an agent to select the right action.

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. 4 tool updates
    • Addeddoc_read
    • Addeddoc_write
    • Addedslide_read
    • Addedslide_write
  2. 1 tool update
    • Changedread_data1 field changed
      • changedInput schema / properties / action / description
        Previous value: -"Action to perform: get_cell_data, has_cell_data, get_code_cell_value, get_text_formats, get_validations, get_conditional_formats, text_search, get_sheet_info, get_spreadsheet_context, read_data, outline, dependencies, get_database_schemas, list_connections, list_agent_connections, inspect_agent_connection, or batch"New value: +"Action to perform: get_cell_data, has_cell_data, get_code_cell_value, get_text_formats, get_validations, get_conditional_formats, text_search, get_sheet_info, get_spreadsheet_context, read_data, outline, dependencies, export_pdf, get_database_schemas, list_connections, list_agent_connections, inspect_agent_connection, or batch"
  3. 1 tool update
    • Changedwrite_data1 field changed
      • changedInput schema / properties / action / description
        Previous value: -"Action to perform: set_cell_values, delete_cells, move_cells, add_data_table, set_code_cell_value, set_formula_cell_value, rerun_code, set_text_formats, set_borders, merge_cells, unmerge_cells, add_sheet, duplicate_sheet, rename_sheet, delete_sheet, move_sheet, color_sheets, set_frozen_panes, convert_to_table, table_meta, table_column_settings, resize_columns, resize_rows, set_default_column_width, set_default_row_height, insert_columns, insert_rows, delete_columns, delete_rows, add_logical_validation, add_list_validation, remove_validation, update_conditional_formats, set_sql_code_cell_value, import_file, undo, redo, or batch"New value: +"Action to perform: set_cell_values, delete_cells, move_cells, add_data_table, set_code_cell_value, set_formula_cell_value, rerun_code, set_text_formats, set_borders, merge_cells, unmerge_cells, add_sheet, duplicate_sheet, rename_sheet, delete_sheet, move_sheet, color_sheets, set_frozen_panes, convert_to_table, table_meta, table_column_settings, resize_columns, resize_rows, set_default_column_width, set_default_row_height, insert_columns, insert_rows, delete_columns, delete_rows, add_logical_validation, add_list_validation, remove_validation, update_conditional_formats, add_chart, update_chart, delete_chart, set_pivot_table, set_sql_code_cell_value, import_file, undo, redo, or batch"
  4. 1 tool update
    • Changedwrite_data1 field changed
      • changedInput schema / properties / action / description
        Previous value: -"Action to perform: set_cell_values, delete_cells, move_cells, add_data_table, set_code_cell_value, set_formula_cell_value, rerun_code, set_text_formats, set_borders, merge_cells, unmerge_cells, add_sheet, duplicate_sheet, rename_sheet, delete_sheet, move_sheet, color_sheets, convert_to_table, table_meta, table_column_settings, resize_columns, resize_rows, set_default_column_width, set_default_row_height, insert_columns, insert_rows, delete_columns, delete_rows, add_logical_validation, add_list_validation, remove_validation, update_conditional_formats, set_sql_code_cell_value, import_file, undo, redo, or batch"New value: +"Action to perform: set_cell_values, delete_cells, move_cells, add_data_table, set_code_cell_value, set_formula_cell_value, rerun_code, set_text_formats, set_borders, merge_cells, unmerge_cells, add_sheet, duplicate_sheet, rename_sheet, delete_sheet, move_sheet, color_sheets, set_frozen_panes, convert_to_table, table_meta, table_column_settings, resize_columns, resize_rows, set_default_column_width, set_default_row_height, insert_columns, insert_rows, delete_columns, delete_rows, add_logical_validation, add_list_validation, remove_validation, update_conditional_formats, set_sql_code_cell_value, import_file, undo, redo, or batch"
  5. 5 tool updates
    • First observedauth
    • First observedfiles_read
    • First observedfiles_write
    • First observedread_data
    • First observedwrite_data

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    Enables AI assistants to read and edit Excel files and perform PostgreSQL queries, streamlining data analysis workflows.
    12
    ISC
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables querying Excel and CSV files using SQL via natural language, allowing AI assistants to analyze data without manual SQL writing.
    1
    MIT
  • A
    license
    C
    quality
    C
    maintenance
    Enables conversational data analysis of Excel/CSV files through natural language queries, powered by 395 Excel functions via HyperFormula and multi-provider AI. Supports advanced analytics, bulk operations, financial modeling, and large file processing with intelligent chunking.
    35
    29 npm
    38
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents to query Excel, CSV, Parquet, and NDJSON files as SQL tables, joining data across formats and sheets and exporting results to CSV or Excel.
    1
    Apache 2.0
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.