关于 tablestakes
tablestakes 是面向 LLM 的 MCP 服务,用于读取和编辑 Markdown 文档中的表格,尤其适合 GitBook 同步产生的 HTML 表格。它将表格转换为紧凑的管道格式供读取,并在写回时保留原有格式和属性。
主要功能
- 01扫描文档并列出表格
- 02以管道格式读取表格
- 03按单元格批量修改
- 04插入或删除行列
- 05按版本哈希防止过期写入
- 06保留 HTML 格式与内联样式
适用场景
- 01检查 GitBook 同步文档中的表格
- 02更新 Markdown 表格中的指定单元格
- 03编辑含 HTML 表格的 CMS 或 Notion 导出文件
MCP 相关
该 MCP 服务向客户端提供表格发现、读取及编辑工具,可处理 GFM、GitBook 折叠 HTML 和一般 HTML 表格。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
11收录的工具列表 · 更新于 2 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| updates | array | 是 | 由 {row: int, column: str, value: str} 对象组成的列表。 |
| version | string | 是 | read_table 返回的 12 位十六进制哈希(位于 "v:" 后,例如 "a1b2c3d4e5f6")。 |
| file_path | string | 是 | Markdown 文件的绝对路径。 |
| table_index | integer | 是 | 来自 list_tables 的从 0 开始的表格索引。 |
详细介绍
tablestakes
一个 MCP 服务,为大模型提供对杂乱 HTML 中表格的清晰、精准访问。
问题
GitBook、Notion 导出文件和 CMS 平台等工具在将内容同步到 Markdown 文件时,会把表格压缩成单行 HTML。结果在编辑器中看起来是这样的:
<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>
这对人类来说难以阅读,对大模型来说也不可靠。模型难以解析压缩后的 HTML 表格,经常会幻觉出错误的单元格边界,而且无法在不破坏结构的情况下编辑它们。
tablestakes 可以解决这个问题。 它位于大模型与文件之间,读取时将表格转换为清晰的管道格式,保存时再以原始格式写回,同时保留 GitBook 兼容性、HTML 属性和内联格式。
大模型看到的内容
发现 — 一次调用即可扫描包含 26 个表格的文档:
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
读取 — 压缩后的 HTML 会变成清晰的管道表格:
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 | — | |
写入 — 经过版本检查的精准单元格编辑:
v:5749c94ffb1f
14 个字符。文件已更新,GitBook HTML 格式得到保留,width 属性也完好无损。
令牌效率
基准:Claude Code 内置的 Read + Edit 工具对同一文件进行操作。使用一个合成表格进行测量,该表格包含 18 行、4 列,并含有符合真实需求文档风格的内容(粗体 ID、行内强调、长度不一的单元格)。
| 操作 | Read + Edit | tablestakes | 节省 |
|---|---|---|---|
list_tables(26 个 HTML 表格) | ~28,400 个令牌 | ~2,500 个令牌 | 91% |
read_table(18 行 HTML) | ~1,100 个令牌 | ~690 个令牌 | 39% |
read_table(18 行 GFM) | ~780 个令牌 | ~690 个令牌 | 11% |
| 单元格编辑(18 行 HTML) | ~35 个令牌 | ~27 个令牌 | 23% |
| 单元格编辑(18 行 GFM) | ~99 个令牌 | ~27 个令牌 | 73% |
| 10 次编辑工作流(HTML) | ~1,470 个令牌 | ~960 个令牌 | 35% |
节省来自以下方面:
-
读取(HTML):折叠后的 HTML 标签(
<td>、<tr>、<th>、<strong>、width="...")都是纯粹的额外开销。管道表格无需标记即可承载相同信息。Read 工具还会添加cat -n行号前缀。 -
读取(GFM):移除行号前缀和周围文档上下文可带来适度的节省。表格内容本身已经很简洁。
-
写入:Edit 工具要求提供
old_string(足够的上下文,以确保其在文件中唯一)和new_string(修改后的版本),两者都会作为输出令牌生成。对于 GFM,old_string是整行(约 190 个字符)。tablestakes 只需{"row": 0, "column": "B", "value": "Should"}(约 18 个令牌)。 -
发现:如果没有 tablestakes,大模型需要读取整个文件才能找到表格。
list_tables会返回紧凑索引——元数据加上每个表格的 1 行预览。 -
紧凑管道表格不填充列宽。根据 ImprovingAgents 基准测试,GFM 管道表格的令牌与准确率比最佳:成本为 CSV 的 1.24 倍,QA 准确率为 51.9%;优于 JSON(2.08 倍,52.3%)和 YAML(1.88 倍,54.7%)。
实验详情
分词器:tiktoken cl100k_base(GPT-4)。Claude 使用不同的分词器,但相对比较结果仍然成立。基准测试脚本(script.py)以编程方式构建表格,并使用实际转换器代码生成 tablestakes 输出,没有硬编码字符串。
读取基准:simulate_read_tool() 将文件内容包装为 cat -n 格式(每行带有行号前缀),与 Claude Code 的 Read 工具返回内容一致。整个文件(文档文本 + 表格)都会进入大模型上下文。
写入基准:对于每次单元格编辑,脚本都会从目标 <td> 向左扩展,计算能确保子字符串在文件中唯一的最短 old_string。new_string 是替换了单元格值的相同上下文。这是 Edit 工具的最佳情况——实际使用者可能会包含比最低要求更多的上下文。
list_tables 基准:Markdown 文档中包含 26 个 18 行 GitBook HTML 表格的副本。朴素方式 = 读取整个文件(约 28k 个令牌)。tablestakes = list_tables 输出,其中 preview_rows=0..3:
preview_rows | 令牌数 | 节省 |
|---|---|---|
| 0(仅元数据) | ~1,230 | 96% |
| 1(默认) | ~2,530 | 91% |
| 2 | ~3,510 | 88% |
| 3 | ~4,420 | 84% |
复现方式:uv run --with tiktoken python scripts/script.py
快速开始
Claude Code:
claude mcp add tablestakes -- uvx tablestakes
Codex CLI:
codex mcp add tablestakes -- uvx tablestakes
Gemini CLI:
gemini mcp add tablestakes -- uvx tablestakes
也可以直接从 PyPI 安装:pip install tablestakes
其他客户端(Cursor、Windsurf、Claude Desktop)
将以下 JSON 添加到客户端的 MCP 配置文件中:
{
"mcpServers": {
"tablestakes": {
"command": "uvx",
"args": ["tablestakes"]
}
}
}
| 客户端 | 配置文件 |
|---|---|
| Cursor | .cursor/mcp.json |
| Windsurf | ~/.codeium/windsurf/mcp_config.json |
| Claude Desktop | claude_desktop_config.json |
工具
发现与读取
| 工具 | 用途 |
|---|---|
list_tables(file_path, preview_rows=1) | 扫描文件,返回所有表格的元数据和预览 |
read_table(file_path, table_index) | 将完整表格规范化为管道格式,并返回版本哈希 |
单元格、行和列操作
| 工具 | 用途 |
|---|---|
update_cells(file_path, table_index, version, updates) | 批量应用 {row, column, value} 补丁 |
insert_row(file_path, table_index, version, position, values) | 在指定位置插入行(-1 表示追加) |
delete_row(file_path, table_index, version, row_index) | 按索引删除行 |
insert_column(file_path, table_index, version, name, ...) | 插入带默认值的列 |
delete_column(file_path, table_index, version, column) | 删除列 |
rename_column(file_path, table_index, version, old_name, new_name) | 重命名表头 |
replace_table(file_path, table_index, version, new_content) | 根据管道输入完整替换表格 |
create_table(file_path, content, position, format) | 根据管道输入创建新表格(默认:HTML) |
所有写入工具都需要从 read_table 获取 version 哈希值——乐观并发机制无需锁定即可防止基于过时数据覆盖内容。
支持的表格格式
| 格式 | 读取 | 写入 | 往返转换 |
|---|---|---|---|
| GFM 管道表格 | 原样传递 | 原地编辑 | 无损 |
| GitBook 折叠 HTML | HTML → 管道 | 管道 → 折叠 HTML | 保留 width、data-*、内联格式 |
| 通用 HTML 表格 | HTML → 管道或美化后的 HTML | 重建 HTML | 保留结构 |
虽然 GitBook 是该项目的主要开发动机,但 tablestakes 适用于任何包含 HTML 表格的 Markdown 文档,包括 CMS 导出文件、Notion 转储、wiki 迁移内容,或 .md 文件中手写的 HTML。
列寻址
列可以通过以下方式引用:
- 字母:
"A"、"B"、"AA"(双射 26 进制,类似 Excel) - 名称:
"Priority"(必须唯一) - 组合形式:
"B:Priority"(用于消除歧义) - 索引:
"0"、"1"(从 0 开始)
开发
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
作者
由 Dr. Oliver Borchers 构建。他是 IU Group 的执行级 AI 与自动化合作伙伴兼 AI 工程负责人。
许可证
Apache-2.0
mcp-name: io.github.oborchers/tablestakes
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。