Skip to main content
Glama

tablestakes

PyPI version Python versions CI License

An MCP server that gives LLMs clean, surgical access to tables trapped in messy HTML.

The Problem

Tools like GitBook, Notion exports, and CMS platforms collapse tables into single-line HTML when syncing to Markdown files. The result looks like this in your editor:

<table><thead><tr><th width="520.11">Requirement</th><th width="122.07">Priority</th><th>Priority 1-2-3</th></tr></thead><tbody><tr><td><strong>1.1</strong> Agent sees only their Salesforce-assigned cases <strong>in the currently selected organization</strong> (case is "assigned" when SF <code>Case.OwnerId</code> matches the agent's linked SF user ID)...</td><td>Must</td><td>1</td></tr></tbody></table>

This is unreadable for humans and unreliable for LLMs. Models struggle to parse collapsed HTML tables, frequently hallucinate cell boundaries, and cannot edit them without corrupting the structure.

tablestakes fixes this. It sits between the LLM and the file, converting tables to clean pipe format on read and writing back in the original format on save — preserving GitBook compatibility, HTML attributes, and inline formatting.

Related MCP server: tablekit-mcp

What the LLM Sees

Discovery — scan a 26-table document in one call:

26 tables

T0 pipe 5r 3c v:485f65f7b470 [Cross-Domain Dependencies]
  A:Integration | B:Source | C:Requirements

T2 gitbook 18r 3c v:77a9495fd328 [Case List]
  A:Requirement | B:Priority | C:Priority 1-2-3

T7 gitbook 3r 4c v:d9a9a45a370f [Attachments]
  A:Requirement | B:Priority | C:Dependency | D:Priority 1-2-3

Read — collapsed HTML becomes a clean pipe table:

v:d9a9a45a370f gitbook 3r 4c [Attachments]
A:Requirement | B:Priority | C:Dependency | D:Priority 1-2-3
| Requirement | Priority | Dependency | Priority 1-2-3 |
| --- | --- | --- | --- |
| **5.1** View inbound attachments in-app... | Must | — | 1 |
| **5.2** Send outbound attachments... | Must | Blocked on SF API | 1 |
| **5.3** Attachment file size limits... | Should | — |  |

Write — surgical cell edit, version-checked:

v:5749c94ffb1f

14 characters. The file is updated, GitBook HTML format preserved, width attributes intact.

Token Efficiency

Baseline: Claude Code's built-in Read + Edit tools operating on the same file. Measured on a synthetic 18-row, 4-column table with realistic requirement-style content (bold IDs, inline emphasis, mixed-length cells).

Operation

Read + Edit

tablestakes

Savings

list_tables (26 HTML tables)

~28,400 tokens

~2,500 tokens

91%

read_table (18-row HTML)

~1,100 tokens

~690 tokens

39%

read_table (18-row GFM)

~780 tokens

~690 tokens

11%

Cell edit (18-row HTML)

~35 tokens

~27 tokens

23%

Cell edit (18-row GFM)

~99 tokens

~27 tokens

73%

10-edit workflow (HTML)

~1,470 tokens

~960 tokens

35%

Where the savings come from:

  • Read (HTML): collapsed HTML tags (<td>, <tr>, <th>, <strong>, width="...") are pure overhead. Pipe tables carry the same information without markup. The Read tool also adds cat -n line-number prefixes.

  • Read (GFM): modest savings from stripping line-number prefixes and surrounding document context. The table content itself is already clean.

  • Write: the Edit tool requires old_string (enough context to be unique in the file) + new_string (the modified version), both generated as output tokens. For GFM, old_string is the entire row line (~190 chars). tablestakes needs only {"row": 0, "column": "B", "value": "Should"} (~18 tokens).

  • Discovery: without tablestakes, the LLM reads the entire file to find tables. list_tables returns a compact index — metadata + 1 preview row per table.

  • Compact pipe tables with no column padding. Per the ImprovingAgents benchmark, GFM pipe tables achieve the best token-to-accuracy ratio: 1.24x CSV cost at 51.9% QA accuracy, beating JSON (2.08x, 52.3%) and YAML (1.88x, 54.7%).

Tokenizer: tiktoken cl100k_base (GPT-4). Claude uses a different tokenizer, but relative comparisons hold. The benchmark script (script.py) constructs tables programmatically and generates tablestakes output using the actual converter code — no hardcoded strings.

Read baseline: simulate_read_tool() wraps file content in cat -n format (line-number prefix per line), matching what Claude Code's Read tool returns. The full file (document text + table) enters the LLM context.

Write baseline: for each cell edit, the script computes the minimum unique old_string by expanding leftward from the target <td> until the substring is unique in the file. new_string is the same context with the cell value replaced. This is a best-case scenario for the Edit tool — a human might include more context than the minimum.

list_tables baseline: 26 copies of an 18-row GitBook HTML table in a markdown document. Naive = Read the full file (~28k tokens). tablestakes = list_tables output with preview_rows=0..3:

preview_rows

Tokens

Savings

0 (metadata only)

~1,230

96%

1 (default)

~2,530

91%

2

~3,510

88%

3

~4,420

84%

Reproduce: uv run --with tiktoken python scripts/script.py

Quick Start

Claude Code:

claude mcp add tablestakes -- uvx tablestakes

Codex CLI:

codex mcp add tablestakes -- uvx tablestakes

Gemini CLI:

gemini mcp add tablestakes -- uvx tablestakes

Or install from PyPI directly: pip install tablestakes

Add the following JSON to your client's MCP config file:

{
  "mcpServers": {
    "tablestakes": {
      "command": "uvx",
      "args": ["tablestakes"]
    }
  }
}

Client

Config file

Cursor

.cursor/mcp.json

Windsurf

~/.codeium/windsurf/mcp_config.json

Claude Desktop

claude_desktop_config.json

Tools

Discovery & Read

Tool

Purpose

list_tables(file_path, preview_rows=1)

Scan file, return all tables with metadata + preview

read_table(file_path, table_index)

Full table normalized to pipe format + version hash

Cell, Row & Column Operations

Tool

Purpose

update_cells(file_path, table_index, version, updates)

Batch {row, column, value} patches

insert_row(file_path, table_index, version, position, values)

Insert row at position (-1 to append)

delete_row(file_path, table_index, version, row_index)

Remove row by index

insert_column(file_path, table_index, version, name, ...)

Insert column with default value

delete_column(file_path, table_index, version, column)

Remove column

rename_column(file_path, table_index, version, old_name, new_name)

Rename header

replace_table(file_path, table_index, version, new_content)

Full table replacement from pipe input

create_table(file_path, content, position, format)

Create new table from pipe input (default: HTML)

All write tools require a version hash from read_table — optimistic concurrency that prevents stale overwrites without locks.

Supported Table Formats

Format

Read

Write

Round-trip

GFM pipe tables

Pass-through

In-place edit

Lossless

GitBook collapsed HTML

HTML → pipe

Pipe → collapsed HTML

Preserves width, data-*, inline formatting

General HTML tables

HTML → pipe or pretty HTML

Reconstructs HTML

Preserves structure

While GitBook is the primary motivation, tablestakes works with any Markdown document containing HTML tables — CMS exports, Notion dumps, wiki migrations, or hand-written HTML in .md files.

Column Addressing

Columns can be referenced by:

  • Letter: "A", "B", "AA" (bijective base-26, like Excel)

  • Name: "Priority" (must be unique)

  • Composite: "B:Priority" (for disambiguation)

  • Index: "0", "1" (0-based)

Development

make init      # First-time setup: venv + deps + pre-commit hooks
make check     # All checks: format + lint + typecheck + test
make test      # Run tests only
make test-cov  # Tests with coverage report

License

Apache-2.0


mcp-name: io.github.oborchers/tablestakes

Available Tools

11 tools
create_tableA

Create a new table in a Markdown file. Provide content as a pipe table.

The table is written in the specified format: "html" (default, collapsed single-line HTML suitable for GitBook) or "pipe" (GFM pipe table).

No version hash needed — this creates, not edits.

On success returns v:{hash} of the new table. Use this hash with read_table and write tools to edit the table immediately. On error returns JSON with "error" and "message" fields.

Args: file_path: Absolute path to the Markdown file. Created if it doesn't exist. content: Table in pipe format (header row + delimiter + data rows). Example: "| Name | Age |\n| --- | --- |\n| Alice | 30 |" position: 1-based line number to insert AFTER. -1 appends (default). 0 inserts at top. format: "html" (default) or "pipe". HTML produces collapsed single-line GitBook-compatible output. GitBook will auto-add width/data-* attributes on sync.

ParametersJSON Schema
NameRequiredDescriptionDefault
formatNohtml
contentYes
positionNo
file_pathYes

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations provided, the description carries the full disclosure burden and succeeds: it states the success return format (v:{hash}), the error format (JSON with error/message), the side effect that file_path is created if missing, position insertion semantics, and format-specific output behavior (collapsed single-line GitBook HTML). This exceeds what typical descriptions disclose.

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 the purpose sentence, then a clean Args block. The only waste is minor redundancy: the format distinction ('html' vs 'pipe' with collapsed single-line output) appears twice, once in prose and once in the format parameter docs.

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, no annotations, and 0% schema coverage, the description covers everything an agent needs: purpose, all four parameters, success/error return shapes, side effects, and post-creation editing workflow. There is no meaningful gap for a create-tool of this complexity.

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 fully compensate — and it does. Every parameter gets real meaning: file_path includes the auto-create behavior, content includes a concrete pipe-table example, position explains 1-based-after semantics with -1 and 0 special cases, and format explains the enum values' behavioral difference.

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 states a specific verb+resource ('Create a new table in a Markdown file'), and the description further distinguishes this from the edit family with 'No version hash needed — this creates, not edits' while naming read_table and write tools as the follow-up. An agent can clearly separate this from replace_table, insert_row, and update_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 gives clear workflow context: use this to create (no version hash needed), then use the returned hash with read_table and write tools for editing. It explains when the hash matters and contrasts create-vs-edit, but it does not explicitly name sibling tools as 'use this instead when X' — e.g., it never says to prefer replace_table for existing tables.

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

delete_columnA

Delete a column. Requires version hash from read_table.

On success returns ONLY v:{new_hash}. On error returns JSON with "error" and "message" fields.

Args: file_path: Absolute path to the Markdown file. table_index: 0-based table index from list_tables. version: 12-char hex hash from read_table (after "v:"). column: Column letter ("A"), name ("Priority"), or composite ("B:Priority").

ParametersJSON Schema
NameRequiredDescriptionDefault
columnYes
versionYes
file_pathYes
table_indexYes

TDQS

A4.6/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It clearly states the success return format ('v:{new_hash}') and error format (JSON with error and message fields), which is important for an agent to interpret results. It also implies destructive action via 'delete' but does not explicitly state that the operation is irreversible or any permission requirements. The optimistic concurrency mechanism via version is transparent, adding value beyond the 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 efficiently structured: a one-line summary, then return behavior, then a parameter list. It front-loads the essential purpose and prerequisites, and every sentence adds value. There is no fluff or redundancy, and the format is scannable for an agent.

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 4 required parameters, no output schema, and no annotations, this description covers all essential aspects: purpose, preconditions (version hash), parameter semantics, and return format. It also implies error handling. While it does not enumerate edge cases (e.g., stale version, non-existent column), the error JSON mention covers general failures. Given the tool's complexity and the lack of structured metadata, the description is comprehensive and sufficient for correct 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?

Schema description coverage is 0%, so the description must fully compensate for missing parameter documentation. It does this admirably: file_path is defined as 'Absolute path to the Markdown file,' table_index as '0-based table index from list_tables,' version as '12-char hex hash from read_table (after "v:"),' and column as 'Column letter ("A"), name ("Priority"), or composite ("B:Priority").' This level of detail far exceeds what the schema provides and gives the agent precise instructions for each argument.

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, specific verb and object: 'Delete a column.' It also specifies the required dependency on a version hash from read_table, which distinguishes it from sibling tools like insert_column and rename_column. The distinction is clear and 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?

The description explicitly states the prerequisite of obtaining a version hash from read_table, which guides the agent on when to call this tool (after read_table). It does not explicitly state when not to use it or mention alternatives like insert_column or rename_column, but the verb 'delete' and the parameter details strongly imply the use case. A brief mention of alternative tools would push this to a 5.

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

delete_rowA

Delete a row. Requires version hash from read_table.

On success returns ONLY v:{new_hash}. On error returns JSON with "error" and "message" fields.

Args: file_path: Absolute path to the Markdown file. table_index: 0-based table index from list_tables. version: 12-char hex hash from read_table (after "v:"). row_index: 0-based data row index to delete (header row is NOT counted).

ParametersJSON Schema
NameRequiredDescriptionDefault
versionYes
file_pathYes
row_indexYes
table_indexYes

TDQS

A4.6/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden, and it does well by specifying success output (`v:{new_hash}`), error output shape, and the requirement for a version hash. It could further disclose permanence/irreversibility or version-conflict behavior, but the provided details are substantive and actionable.

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 well-organized: one-line purpose, two concise behavior notes, then a clean Args list. Every sentence adds necessary information, and the critical success/error format is front-loaded before parameter details.

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 delete operation with no output schema and no annotations, the description covers purpose, prerequisites, all parameter semantics, success response, and error response. An agent has enough information to invoke the tool correctly and interpret the result without guessing.

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 Args block is essential and fully compensates. Each parameter gets meaningful detail: file_path is absolute, table_index is 0-based and sourced from list_tables, version is a 12-char hex hash from read_table, and row_index explicitly excludes the header row. This goes 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: "Delete a row." It then clarifies the row is in a Markdown file at a given path and table index, which distinguishes it from siblings like delete_column and insert_row. An agent can immediately understand what action this tool performs.

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 contextual requirements: the caller must supply a version hash from read_table and a table index from list_tables. It does not explicitly name alternatives or state when not to use it, but the prerequisites and operation type 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.

insert_columnA

Insert a new column. Requires version hash from read_table.

All existing rows are populated with default_value (empty string if omitted).

On success returns ONLY v:{new_hash}. On error returns JSON with "error" and "message" fields.

Args: file_path: Absolute path to the Markdown file. table_index: 0-based table index from list_tables. version: 12-char hex hash from read_table (after "v:"). name: Header text for the new column. default_value: Value for all existing rows (default: empty string). position: 0-based column index for insertion. -1 appends to the right (default).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
versionYes
positionNo
file_pathYes
table_indexYes
default_valueNo

TDQS

A4.8/5.0
Behavior5/5

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

No annotations are provided, so the description carries the full burden. It discloses the version hash requirement (optimistic concurrency), that existing rows are populated with default_value (empty string if omitted), and specifies the exact return format on success (`v:{new_hash}`) and error (JSON with 'error' and 'message'). It also explains the position parameter behavior, including the -1 append default. This is thorough and transparent.

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 efficiently structured: it leads with the core action, then prerequisites, defaults, return format, and a parameter list. Every sentence contributes value – no filler or redundancy. The layout is easy to scan and front-loaded with the most critical constraints.

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 6-parameter tool with no output schema and no annotations, the description covers all necessary context: prerequisites (version hash), behavior for existing rows, return format on success and error, and explicit semantics for every parameter. An agent has everything needed to call 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?

Schema description coverage is 0% – the schema provides no parameter descriptions. The description compensates fully by explaining each parameter: file_path as absolute path, table_index as 0-based from list_tables, version as 12-char hex hash after 'v:', name as header text, default_value as value for existing rows (default empty string), and position as 0-based index with -1 append right. This adds substantial meaning 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 states 'Insert a new column' – a specific verb and resource. It also mentions the requirement of a version hash from read_table, distinguishing it from sibling operations like insert_row, delete_column, and rename_column. The purpose is unambiguous and clearly differentiated.

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 states 'Requires version hash from read_table', which establishes the prerequisite context and implies when to use the tool (after a read). It explains position semantics and defaults, but does not name alternative tools or explicitly state when not to use it. This is clear context, though not exhaustive exclusions.

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

insert_rowA

Insert a new row. Requires version hash from read_table.

Provide values as a dict mapping column identifiers to cell content. Column identifiers: letter ("A"), name ("Priority"), or composite ("B:Priority"). Omitted columns default to empty string.

On success returns ONLY v:{new_hash}. On error returns JSON with "error" and "message" fields.

Args: file_path: Absolute path to the Markdown file. table_index: 0-based table index from list_tables. version: 12-char hex hash from read_table (after "v:"). position: 0-based row index for insertion. Use -1 to append at the end. values: Dict mapping column identifiers to cell values. Example: {"Name": "Alice", "B": "30", "C:City": "NYC"}

ParametersJSON Schema
NameRequiredDescriptionDefault
valuesYes
versionYes
positionYes
file_pathYes
table_indexYes

TDQS

A4.6/5.0
Behavior4/5

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

With no annotations provided, the description carries the behavioral disclosure burden and does so well: it states that omitted columns default to empty strings, that success returns only 'v:{new_hash}', and that errors return a structured JSON payload. It also reveals the optimistic-concurrency requirement by requiring the version hash.

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 action, then organized into a clear Args block. Every sentence contributes useful information, and the example values dict is compact but highly informative.

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 five required parameters, no annotations, and no output schema, the description covers all essential invocation details: parameter semantics, return format, error format, and prerequisite calls. An agent has enough information to call this tool correctly and interpret its result.

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 fully explain parameters, and it does. It defines absolute paths, 0-based indexing, the 12-char hex hash format, the -1 append convention, and gives a rich example of the values dict with three accepted column identifier forms.

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 the specific verb-resource pair 'Insert a new row', which clearly distinguishes the tool from row-mutating siblings like update_cells and delete_row, and from insert_column. The scope is unambiguous: adding a single row to a 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 gives concrete context for when to use the tool: it requires a version hash from read_table and a table index from list_tables, establishing a clear workflow dependency. It does not explicitly name alternatives or state when not to use it, but the prerequisites and insertion semantics are sufficiently clear.

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

list_tablesA

List all tables in a Markdown file with column descriptors and row previews.

Prefer this over grep for discovering table structure — returns column names, row counts, formats, and version hashes. Use search_tables to find specific data across tables.

Output format per table: T{index} {format} {rows}r {cols}c v:{hash} [{section heading}] {column descriptors as A:Name | B:Age | ...} row0: {first row cell values}

Use table_index (the number after T) with read_table and write tools.

Args: file_path: Absolute path to the Markdown file. preview_rows: Number of data rows to preview (default 1, 0 for none).

ParametersJSON Schema
NameRequiredDescriptionDefault
file_pathYes
preview_rowsNo

TDQS

A4.7/5.0
Behavior4/5

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

With no annotations, the description bears the full disclosure burden and does well: it documents the exact per-table output format (T-index, format, row/col counts, version hash, column names, row preview) so the agent knows what to expect. It stops short of explicitly stating the operation never modifies the file or describing error behavior (e.g., missing file, empty table list), which would round it out.

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?

Purpose and usage guidance are front-loaded, followed by a compact output-format spec and param docs; every section earns its place. The format block is essential because there is no output schema to spell out the return contract, and it is presented efficiently.

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 two-parameter read-only tool with no annotations or output schema, the description covers purpose, output contract, cross-tool usage, and parameter semantics thoroughly, making it callable without consulting siblings. Small gaps: no error/edge-case handling and no explicit non-mutation statement, but neither blocks correct 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?

Schema coverage is 0%, and the description fully compensates: file_path is given the added requirement of being an absolute path, and preview_rows is explained as the number of data rows to preview with default and 0-means-none semantics — both beyond the schema's bare type/default fields.

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 ('List all tables in a Markdown file'), then names what the output contains (column descriptors, row previews). It differentiates from siblings by directing data-lookup use to search_tables and positioning itself over grep for structure discovery.

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 states when to prefer this tool ('Prefer this over grep for discovering table structure') and routes to the alternative ('Use search_tables to find specific data across tables'). Also instructs that the returned table_index feeds read_table and write tools, making cross-tool flow clear.

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

read_tableA

Read a full table as a clean pipe table with version hash.

Prefer this over reading files directly — handles HTML tables, preserves inline formatting, and returns the version hash needed for any edit.

First line of output is metadata: v:{hash} {format} {rows}r {cols}c [{section}] Extract the 12-char hex hash after "v:" (e.g. "a1b2c3d4e5f6") and pass it as the version argument to any write tool.

If a write returns STALE_READ, call read_table again for a fresh version.

Args: file_path: Absolute path to the Markdown file. table_index: 0-based table index from list_tables (the number after T).

ParametersJSON Schema
NameRequiredDescriptionDefault
file_pathYes
table_indexYes

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations, the description carries the full burden—and it delivers: it discloses the exact output format, the metadata line structure, the 12-char hash extraction rule, and what to do on STALE_READ. This goes well beyond a generic 'reads a table' statement.

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 the core purpose, then metadata format, then stale-read handling, then arguments. It is somewhat long, but every sentence carries useful information and the structure is logical. Slightly tighter phrasing could earn 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 two-parameter read tool with no output schema and no annotations, the description is complete: it explains output format, how to use the returned hash, how to recover from version conflicts, and what each parameter means. Nothing needed to call the 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 coverage is 0%, so the description must compensate—and it fully does. file_path is defined as 'Absolute path to the Markdown file' and table_index as '0-based table index from list_tables (the number after T).' Both parameters are given meaning and context 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 states a specific verb+resource: 'Read a full table as a clean pipe table with version hash.' It distinguishes itself from siblings by emphasizing it is the read operation ('Prefer this over reading files directly') and by covering what other table tools do not (HTML tables, inline formatting, version hash).

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 explicitly says to prefer this over reading files directly and gives a concrete use case ('returns the version hash needed for any edit'). It also provides recovery guidance for STALE_READ. However, it does not explicitly contrast with sibling search_tables or clarify when search would be more appropriate than a full read, so the guidance is clear but not exhaustive.

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

rename_columnA

Rename a column header. Row data is unchanged. Requires version from read_table.

On success returns ONLY v:{new_hash}. On error returns JSON with "error" and "message" fields.

Args: file_path: Absolute path to the Markdown file. table_index: 0-based table index from list_tables. version: 12-char hex hash from read_table (after "v:"). old_name: Current column identifier: letter ("A"), name, or composite ("B:Priority"). new_name: New header text for the column.

ParametersJSON Schema
NameRequiredDescriptionDefault
versionYes
new_nameYes
old_nameYes
file_pathYes
table_indexYes

TDQS

A4.6/5.0
Behavior4/5

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

With no annotations present, the description carries the full behavioral disclosure burden. It does this well by specifying exact success output (`v:{new_hash}`), error output format, the requirement for a fresh version hash, and the guarantee that row data is unchanged. It could add more about reversibility or effects on references, but the provided transparency is above average.

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 behavior, then gives success/error behavior, then lists parameters in a clean Args block. Every sentence carries useful information and there is no filler 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?

Given there is no output schema and no annotations, the description covers the essentials completely: operation semantics, prerequisites, parameter meanings, and return/error formats. An agent has enough detail to call this tool correctly without needing to open sibling tool definitions.

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 fully compensate, and it does. Every parameter is explained: file_path, table_index, version with its 12-char hex hash format, old_name with accepted forms, and new_name. This adds meaning well beyond the bare schema property names.

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 and resource: 'Rename a column header.' It clearly distinguishes the operation from row-level edits by noting 'Row data is unchanged,' and the header focus separates it from insert/delete column siblings without requiring the agent to infer anything.

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 use: it renames a column header, leaves row data alone, and requires a version from read_table. It does not explicitly name alternatives or say when not to use it, but the 'Row data is unchanged' caveat and prerequisite guidance make the intended scenario clear.

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

replace_tableA

Replace an entire table with new content. Requires version from read_table.

Provide new_content as a pipe table string (header row + delimiter + data rows). The server writes back in the ORIGINAL file format: pipe stays pipe, GitBook HTML stays GitBook HTML (attributes preserved).

On success returns ONLY v:{new_hash}. On error returns JSON with "error" and "message" fields.

Args: file_path: Absolute path to the Markdown file. table_index: 0-based table index from list_tables. version: 12-char hex hash from read_table (after "v:"). new_content: Full pipe table string including header and delimiter rows.

ParametersJSON Schema
NameRequiredDescriptionDefault
versionYes
file_pathYes
new_contentYes
table_indexYes

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and succeeds: it specifies success return format ('v:{new_hash}'), error format (JSON with 'error' and 'message'), and a notable side effect (preserving the original file format, including GitBook HTML attributes). It also implies concurrency control by requiring a version hash.

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 lean and front-loaded: action, key prerequisite, input format, and behavior, followed by a readable argument list. No unnecessary 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?

Given there is no output schema and no annotations, the description covers all essential information: parameter requirements, expected input format, return and error behavior, and file format handling. An agent has everything needed to invoke 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 provides zero descriptions, but the Args section explains every parameter in detail: file_path is an absolute Markdown path, table_index is a 0-based index from list_tables, version is a 12-char hex hash after 'v:', and new_content is a full pipe table string. This fully compensates for the schema's lack of 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 opens with a specific action and resource: 'Replace an entire table with new content.' It distinguishes this tool from sibling operations like update_cells or insert_row by scope, and reinforces the Markdown context by mentioning pipe tables and GitBook HTML preservation.

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 explicit prerequisites: version must come from read_table and table_index from list_tables, which defines the intended workflow. It does not name sibling alternatives, but the phrase 'entire table' and the requirement to provide full new content make the usage context clear enough for an agent to select it correctly.

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

search_tablesA

Search for rows matching a value across one or all tables in a file.

Returns matching rows with table index, row index, and version hash so you can immediately follow up with a write tool. Prefer this over grep for table data — it understands column structure and handles HTML tables.

Two search modes (regex overrides pattern if both given):

  • pattern: case-insensitive substring match (simple, no escaping needed)

  • regex: full regex via re.search (e.g. D 1\.\d+ for sub-items)

If neither pattern nor regex is provided, returns all rows.

Args: file_path: Absolute path to the Markdown file. pattern: Case-insensitive substring to match in cell values. regex: Regular expression to match in cell values (overrides pattern). table_index: Search a specific table (0-based), or -1 for all tables. column: Restrict search to a column (letter, name, or composite). Empty string searches all columns.

ParametersJSON Schema
NameRequiredDescriptionDefault
regexNo
columnNo
patternNo
file_pathYes
table_indexNo

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations, the description carries the full burden, and it delivers: it discloses the two search modes, the precedence rule ('regex overrides pattern'), case-insensitive behavior, the all-rows fallback, and the returned fields including version hash for follow-up writes.

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 detailed but well-organized into purpose, return value, usage guidance, mode semantics, and parameter explanations. Every sentence adds functional value, and the most important behavior is front-loaded.

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 five parameters, no output schema, and no annotations, this description is remarkably complete. It explains what the tool returns, how modes interact, what each parameter means, and when to use the tool, leaving no critical gap for an agent to call it correctly.

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

Parameters5/5

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

Schema description coverage is 0%, so the detailed Args section is essential. It adds real meaning beyond the schema: 'Absolute path to the Markdown file,' '0-based' table indexing, and 'letter, name, or composite' for column selection.

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 starts with a precise verb and resource: 'Search for rows matching a value across one or all tables in a file.' It further clarifies the return payload (matching rows with table index, row index, version hash), making it easy to distinguish from sibling read/write 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 usage context: 'Prefer this over grep for table data — it understands column structure and handles HTML tables' and explains how it fits into a write workflow. It explicitly names grep as an alternative, though it does not directly compare itself to sibling tools like read_table.

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

update_cellsA

Batch-update cells. Requires version hash from read_table.

Each update is {row, column, value} where:

  • row: 0-based data row index (header row is NOT counted)

  • column: letter ("A"), name ("Priority"), or composite ("B:Priority")

  • value: new cell content (Markdown inline formatting supported)

On success returns ONLY v:{new_hash}. On error returns JSON: {"error": "STALE_READ"|"EDIT_ERROR"|..., "message": "..."}. If STALE_READ: call read_table again for current version, then retry.

Args: file_path: Absolute path to the Markdown file. table_index: 0-based table index from list_tables. version: 12-char hex hash from read_table (after "v:", e.g. "a1b2c3d4e5f6"). updates: List of {row: int, column: str, value: str} objects.

ParametersJSON Schema
NameRequiredDescriptionDefault
updatesYes
versionYes
file_pathYes
table_indexYes

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations, the description carries full behavioral disclosure. It specifies the exact success return format, the error JSON shape, the STALE_READ recovery workflow, row indexing semantics, and accepted column formats.

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 structured with a short summary followed by bullet point format definitions, return behavior, and per-argument explanations. Every section adds necessary operational detail without 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?

Given no annotations and no output schema, the description covers the full calling context: prerequisites, argument semantics, success and error responses, retry logic, and data indexing rules. An agent can invoke and recover from failures without external knowledge.

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 compensates fully. It explains every parameter in Args, adds semantic detail absent from the schema, and precisely documents version as a 12-char hex hash and column as letter/name/composite.

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 'Batch-update cells,' a specific verb and resource that clearly states the operation. It also names the prerequisite version hash and the update object shape, distinguishing it from sibling tools like insert_row and replace_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 conveys when to use this tool: after reading a table to obtain a version hash. It includes explicit retry guidance for STALE_READ errors but does not explicitly contrast the tool with siblings or state when not to use it.

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. 11 tool updatesv0.1.0
    • First observedcreate_table
    • First observeddelete_column
    • First observeddelete_row
    • First observedinsert_column
    • First observedinsert_row
    • First observedlist_tables
    • First observedread_table
    • First observedrename_column
    • First observedreplace_table
    • First observedsearch_tables
    • First observedupdate_cells

TDQS

A4.7/5.0

Scored across 11 tools

Disambiguation5/5

Each tool targets a distinct operation: reading, listing, searching, creating/replacing tables, and row/column/cell mutations. Potential overlap between list_tables and read_table is resolved by their clearly different purposes (preview metadata vs full content).

Naming Consistency5/5

All tools follow a consistent action_noun snake_case pattern: update_cells, insert_row, delete_row, list_tables, read_table, etc. Verb choice is predictable and the pattern makes the operation and target clear at a glance.

Tool Count5/5

With 11 tools, the server is well-scoped for Markdown table management. Each tool covers a meaningful operation without redundancy, and the count sits comfortably within the ideal range.

Completeness4/5

The surface covers table CRUD, row insertion/deletion, column insertion/deletion/renaming, cell updates, searching, and reading. A notable minor gap is the lack of a delete_table tool, though replace_table can approximate it in some cases.

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Converts, aligns, reshapes, and inspects tabular data across Markdown, CSV, TSV, JSON, and HTML with CJK-aware alignment and deterministic transformations, entirely offline and without file access.
    4
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables deterministic reconstruction of complex tables from OCR bounding-box payloads, recovering multi-column layouts, merged headers, and grid hierarchies. It also supports formula consistency auditing and sensitive PII redaction for document processing pipelines.
    7
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables converting Markdown and HTML tables into structured JSON records with automatic column type inference and format normalization. It also offers supporting web-agent primitives such as DOM semantic pruning, form field auto-mapping, and execution trajectory evaluation, all via a zero-dependency MCP server.
    7
    MIT