mcpField
T
tablestakes

tablestakes

ローカル
github.com/oborchers生産性14 日前に更新

tablestakes について

tablestakesは、Markdown文書内の表をLLMが読み書きするためのMCPサーバーで、GitBook同期で生じるHTML表にも対応します。読み取り時は表を簡潔なパイプ形式にし、書き戻し時には元の形式や属性を保ちます。

主な機能

  1. 01文書を走査して表を一覧表示
  2. 02パイプ形式で表を読み取り
  3. 03セルの一括更新
  4. 04行や列の挿入・削除
  5. 05バージョンハッシュで古い書き込みを防止
  6. 06HTML形式とインライン装飾を保持

活用シーン

  1. 01GitBook同期文書の表を確認
  2. 02Markdown表の指定セルを更新
  3. 03HTML表を含むCMSやNotionのエクスポートを編集

MCP 対応

GFM、GitBookの折りたたみHTML、一般的なHTML表の検出、読み取り、編集ツールをMCPクライアントに提供します。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"oborchers-tablestakes": {
"command": "uvx",
"args": [
"tablestakes"
]
}
}
}
起動コマンドuvx tablestakes

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
pypitablestakes1.1.0

ツール

11

掲載時のツール一覧 · 2 週間前に更新

パラメーター型必須説明
updatesarrayはい{row: int, column: str, value: str} オブジェクトのリスト。
versionstringはいread_table から返される 12 桁の 16 進数ハッシュ("v:" の後、例:"a1b2c3d4e5f6")。
file_pathstringはいMarkdown ファイルの絶対パスです。
table_indexintegerはいlist_tables の 0 始まりのテーブルインデックスです。

詳細

tablestakes

PyPI version Python versions CI License

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 + Edittablestakes削減率
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,23096%
1(デフォルト)約2,53091%
2約3,51088%
3約4,42084%

再現方法: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 Desktopclaude_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 の折りたたみ HTMLHTML → パイプ形式パイプ形式 → 折りたたみ HTMLwidth、data-*、インライン書式を保持
一般的な HTML テーブルHTML → パイプ形式または整形済み HTMLHTML を再構築構造を保持

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

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。