Skip to main content
Glama
eschaq

Excel MCP Server

by eschaq

apply_filter

Read-onlyIdempotent

Filter spreadsheet rows by column conditions (eq, contains, regex, null, etc.) and return matching rows.

Instructions

Filter rows by column conditions (eq, ne, gt, gte, lt, lte, between, contains, not_contains, startswith, endswith, regex, in, not_in, is_null, not_null) and return the matching rows.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
pathYesPath to the spreadsheet file (absolute, or relative to the first allowed directory)
limitNoMax rows to return (max 5000)
matchNoRows must match all conditions, or anyall
sheetNoSheet name. Defaults to the first sheet.
columnsNoOnly return these columns. Defaults to all.
conditionsYesConditions to test each row against
header_rowNo1-based row holding column names; 0 means no header (columns named A, B, C...)

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observedv0.1.0

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already establish readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is fully covered elsewhere. The description adds that matched rows are returned (rather than an aggregate or count, which matters against get_summary_stats), but it says nothing about the 500-row default limit, the 5000 cap, or behavior on non-matching/empty results.

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 front-loaded sentence states the action and its operand types with no preamble. The long parenthetical operator list consumes most of the sentence and duplicates the schema enum verbatim, but it does let an agent gauge capability without opening 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 read-only filtering tool with complete schema descriptions and full annotation coverage, the definition is close to sufficient: action, operands, and return shape ('matching rows') are all stated. The absence of any note on the default/capped row limit is the only real gap, and no output schema exists to carry it.

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 100%, including per-operator value formatting ([low, high] for between, list for in, ISO dates) and the limit cap, so the schema already carries parameter meaning. The description's operator list merely mirrors the schema enum and adds no semantics the schema lacks; the baseline 3 applies.

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 description pairs a specific verb (filter) with a specific resource (rows) and enumerates the supported comparison operators, so the agent knows exactly what operation it performs. It stops short of differentiating from siblings like search or get_sheet_data, which also retrieve row data, so the boundary between them must be inferred.

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

Usage Guidelines2/5

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

There is no statement of when to reach for apply_filter versus search, get_sheet_data, or read_spreadsheet, nor any prerequisite or exclusion guidance. The only usable signal is 'return the matching rows,' which is a restatement of purpose rather than a routing rule.

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