tablestakes
Ler e editar tabelas HTML/Markdown em documentos sincronizados com GitBook por meio de ferramentas MCP.
Documentação
tablestakes
Um servidor MCP que dá aos LLMs acesso limpo e cirúrgico a tabelas presas em HTML bagunçado.
O Problema
Ferramentas como GitBook, exportações do Notion e plataformas CMS colapsam tabelas em HTML de linha única ao sincronizar com arquivos Markdown. O resultado fica assim no seu 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>
Isso é ilegível para humanos e não confiável para LLMs. Modelos têm dificuldade em analisar tabelas HTML colapsadas, frequentemente alucinam limites de células e não conseguem editá-las sem corromper a estrutura.
tablestakes resolve isso. Ele fica entre o LLM e o arquivo, convertendo tabelas para o formato pipe limpo na leitura e gravando de volta no formato original ao salvar — preservando compatibilidade com GitBook, atributos HTML e formatação inline.
O que o LLM Vê
Descoberta — escaneie um documento com 26 tabelas em uma única chamada:
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
Leitura — HTML colapsado vira uma tabela pipe limpa:
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 | — | |
Escrita — edição cirúrgica de célula, com verificação de versão:
v:5749c94ffb1f
14 caracteres. O arquivo é atualizado, o formato HTML do GitBook é preservado, atributos width intactos.
Eficiência de Tokens
Linha de base: ferramentas integradas de Leitura + Edição do Claude Code operando no mesmo arquivo. Medido em uma tabela sintética de 18 linhas e 4 colunas com conteúdo realista de requisitos (IDs em negrito, ênfase inline, células de comprimentos variados).
| Operação | Leitura + Edição | tablestakes | Economia |
|---|---|---|---|
list_tables (26 tabelas HTML) | ~28.400 tokens | ~2.500 tokens | 91% |
read_table (HTML de 18 linhas) | ~1.100 tokens | ~690 tokens | 39% |
read_table (GFM de 18 linhas) | ~780 tokens | ~690 tokens | 11% |
| Edição de célula (HTML de 18 linhas) | ~35 tokens | ~27 tokens | 23% |
| Edição de célula (GFM de 18 linhas) | ~99 tokens | ~27 tokens | 73% |
| Fluxo de 10 edições (HTML) | ~1.470 tokens | ~960 tokens | 35% |
De onde vêm as economias:
-
Leitura (HTML): tags HTML colapsadas (
<td>,<tr>,<th>,<strong>,width="...") são puro overhead. Tabelas pipe carregam a mesma informação sem marcação. A ferramenta de Leitura também adiciona prefixos de número de linhacat -n. -
Leitura (GFM): economias modestas ao remover prefixos de número de linha e contexto do documento ao redor. O conteúdo da tabela em si já é limpo.
-
Escrita: a ferramenta de Edição exige
old_string(contexto suficiente para ser único no arquivo) +new_string(a versão modificada), ambos gerados como tokens de saída. Para GFM,old_stringé a linha inteira (~190 caracteres). tablestakes precisa apenas de{"row": 0, "column": "B", "value": "Should"}(~18 tokens). -
Descoberta: sem tablestakes, o LLM lê o arquivo inteiro para encontrar tabelas.
list_tablesretorna um índice compacto — metadados + 1 linha de pré-visualização por tabela. -
Tabelas pipe compactas sem preenchimento de colunas. De acordo com o benchmark ImprovingAgents, tabelas pipe GFM alcançam a melhor relação token-precisão: 1,24x o custo de CSV com 51,9% de precisão em QA, superando JSON (2,08x, 52,3%) e YAML (1,88x, 54,7%).
Detalhes do experimento
Tokenizador: tiktoken cl100k_base (GPT-4). Claude usa um tokenizador diferente, mas as comparações relativas se mantêm. O script de benchmark (script.py) constrói tabelas programaticamente e gera a saída do tablestakes usando o código real do conversor — sem strings codificadas.
Linha de base de Leitura: simulate_read_tool() envolve o conteúdo do arquivo no formato cat -n (prefixo de número de linha por linha), correspondendo ao que a ferramenta de Leitura do Claude Code retorna. O arquivo completo (texto do documento + tabela) entra no contexto do LLM.
Linha de base de Escrita: para cada edição de célula, o script calcula o old_string único mínimo expandindo para a esquerda a partir do <td> alvo até que a substring seja única no arquivo. new_string é o mesmo contexto com o valor da célula substituído. Este é um cenário de melhor caso para a ferramenta de Edição — um humano pode incluir mais contexto do que o mínimo.
Linha de base de list_tables: 26 cópias de uma tabela HTML GitBook de 18 linhas em um documento markdown. Ingênuo = Ler o arquivo inteiro (~28k tokens). tablestakes = saída de list_tables com preview_rows=0..3:
preview_rows | Tokens | Economia |
|---|---|---|
| 0 (apenas metadados) | ~1.230 | 96% |
| 1 (padrão) | ~2.530 | 91% |
| 2 | ~3.510 | 88% |
| 3 | ~4.420 | 84% |
Reproduzir: uv run --with tiktoken python scripts/script.py
Início Rápido
Claude Code:
claude mcp add tablestakes -- uvx tablestakes
Codex CLI:
codex mcp add tablestakes -- uvx tablestakes
Gemini CLI:
gemini mcp add tablestakes -- uvx tablestakes
Ou instale diretamente do PyPI: pip install tablestakes
Outros clientes (Cursor, Windsurf, Claude Desktop)
Adicione o seguinte JSON ao arquivo de configuração MCP do seu cliente:
{
"mcpServers": {
"tablestakes": {
"command": "uvx",
"args": ["tablestakes"]
}
}
}
| Cliente | Arquivo de configuração |
|---|---|
| Cursor | .cursor/mcp.json |
| Windsurf | ~/.codeium/windsurf/mcp_config.json |
| Claude Desktop | claude_desktop_config.json |
Ferramentas
Descoberta e Leitura
| Ferramenta | Finalidade |
|---|---|
list_tables(file_path, preview_rows=1) | Escanear arquivo, retornar todas as tabelas com metadados + pré-visualização |
read_table(file_path, table_index) | Tabela completa normalizada para formato pipe + hash de versão |
Operações de Célula, Linha e Coluna
| Ferramenta | Finalidade |
|---|---|
update_cells(file_path, table_index, version, updates) | Patches em lote de {row, column, value} |
insert_row(file_path, table_index, version, position, values) | Inserir linha na posição (-1 para anexar) |
delete_row(file_path, table_index, version, row_index) | Remover linha por índice |
insert_column(file_path, table_index, version, name, ...) | Inserir coluna com valor padrão |
delete_column(file_path, table_index, version, column) | Remover coluna |
rename_column(file_path, table_index, version, old_name, new_name) | Renomear cabeçalho |
replace_table(file_path, table_index, version, new_content) | Substituição completa da tabela a partir de entrada pipe |
create_table(file_path, content, position, format) | Criar nova tabela a partir de entrada pipe (padrão: HTML) |
Todas as ferramentas de escrita exigem um hash version de read_table — concorrência otimista que previne sobrescritas desatualizadas sem locks.
Formatos de Tabela Suportados
| Formato | Leitura | Escrita | Round-trip |
|---|---|---|---|
| Tabelas pipe GFM | Pass-through | Edição in-place | Sem perdas |
| HTML colapsado GitBook | HTML → pipe | Pipe → HTML colapsado | Preserva width, data-*, formatação inline |
| Tabelas HTML gerais | HTML → pipe ou HTML bonito | Reconstrói HTML | Preserva estrutura |
Embora GitBook seja a motivação principal, tablestakes funciona com qualquer documento Markdown contendo tabelas HTML — exportações de CMS, dumps do Notion, migrações de wiki ou HTML escrito à mão em arquivos .md.
Endereçamento de Colunas
Colunas podem ser referenciadas por:
- Letra:
"A","B","AA"(base-26 bijetiva, como Excel) - Nome:
"Priority"(deve ser único) - Composto:
"B:Priority"(para desambiguação) - Índice:
"0","1"(baseado em 0)
Desenvolvimento
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
Licença
Apache-2.0
mcp-name: io.github.oborchers/tablestakes