tablestakes について
tablestakesは、Markdown文書内の表をLLMが読み書きするためのMCPサーバーで、GitBook同期で生じるHTML表にも対応します。読み取り時は表を簡潔なパイプ形式にし、書き戻し時には元の形式や属性を保ちます。
主な機能
- 01文書を走査して表を一覧表示
- 02パイプ形式で表を読み取り
- 03セルの一括更新
- 04行や列の挿入・削除
- 05バージョンハッシュで古い書き込みを防止
- 06HTML形式とインライン装飾を保持
活用シーン
- 01GitBook同期文書の表を確認
- 02Markdown表の指定セルを更新
- 03HTML表を含むCMSやNotionのエクスポートを編集
MCP 対応
GFM、GitBookの折りたたみHTML、一般的なHTML表の検出、読み取り、編集ツールをMCPクライアントに提供します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
11掲載時のツール一覧 · 2 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| updates | array | はい | {row: int, column: str, value: str} オブジェクトのリスト。 |
| version | string | はい | read_table から返される 12 桁の 16 進数ハッシュ("v:" の後、例:"a1b2c3d4e5f6")。 |
| file_path | string | はい | Markdown ファイルの絶対パスです。 |
| table_index | integer | はい | list_tables の 0 始まりのテーブルインデックスです。 |
詳細
tablestakes
HTML が乱雑で扱いにくい状態になった表に、LLM がクリーンかつ的確にアクセスできるようにする MCP サーバーです。
問題
GitBook、Notion のエクスポート、CMS プラットフォームなどのツールは、Markdown ファイルへの同期時に表を 1 行の 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>
これは人間には読みづらく、LLM にとっても信頼性に欠けます。モデルは、まとめられた HTML の表の解析に苦労し、セルの境界を頻繁に誤って推測します。また、構造を壊さずに編集することもできません。
tablestakes がこの問題を解決します。 LLM とファイルの間に位置し、読み込み時に表をクリーンなパイプ形式に変換し、保存時には元の形式で書き戻します。これにより、GitBook との互換性、HTML 属性、インライン書式を維持できます。
LLM に表示される内容
検出 — 26 個の表を含むドキュメントを 1 回の呼び出しでスキャンします。
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
読み込み — 1 行にまとめられた 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 ツールを使用します。現実的な要件形式の内容(太字の ID、インラインの強調、さまざまな長さのセル)を含む、合成した 18 行・4 列の表で測定しました。
| 操作 | Read + Edit | tablestakes | 削減率 |
|---|---|---|---|
list_tables(HTML テーブル 26 個) | 約28,400トークン | 約2,500トークン | 91% |
read_table(HTML、18 行) | 約1,100トークン | 約690トークン | 39% |
read_table(GFM、18 行) | 約780トークン | 約690トークン | 11% |
| セル編集(HTML、18 行) | 約35トークン | 約27トークン | 23% |
| セル編集(GFM、18 行) | 約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 を使わない場合、LLM は表を見つけるためにファイル全体を読み取ります。
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 ツールが返す内容を再現します。ファイル全体(ドキュメントのテキストと表)が LLM のコンテキストに入ります。
書き込みのベースライン:セルを編集するたびに、スクリプトは対象の <td> から左方向に範囲を広げ、ファイル内で部分文字列が一意になる最小の old_string を計算します。new_string はセルの値を置き換えた同じコンテキストです。これは Edit ツールにとって最良のケースです。人間が使用する場合は、最小限の範囲より多くのコンテキストを含めることもあります。
list_tables のベースライン:Markdown ドキュメントに GitBook 形式の HTML テーブル(18 行)を 26 個配置します。単純な方法では、ファイル全体を読み取ります(約28kトークン)。tablestakes の場合は、preview_rows=0..3 を指定した list_tables の出力を使用します。
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"」(Excel と同様の全単射 26 進法) - 名前:「
"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 サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。