tablestakes

Ler e editar tabelas HTML/Markdown em documentos sincronizados com GitBook por meio de ferramentas MCP.

Documentação

tablestakes

PyPI version Python versions CI License

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çãoLeitura + EdiçãotablestakesEconomia
list_tables (26 tabelas HTML)~28.400 tokens~2.500 tokens91%
read_table (HTML de 18 linhas)~1.100 tokens~690 tokens39%
read_table (GFM de 18 linhas)~780 tokens~690 tokens11%
Edição de célula (HTML de 18 linhas)~35 tokens~27 tokens23%
Edição de célula (GFM de 18 linhas)~99 tokens~27 tokens73%
Fluxo de 10 edições (HTML)~1.470 tokens~960 tokens35%

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 linha cat -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_tables retorna 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_rowsTokensEconomia
0 (apenas metadados)~1.23096%
1 (padrão)~2.53091%
2~3.51088%
3~4.42084%

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"]
    }
  }
}
ClienteArquivo de configuração
Cursor.cursor/mcp.json
Windsurf~/.codeium/windsurf/mcp_config.json
Claude Desktopclaude_desktop_config.json

Ferramentas

Descoberta e Leitura

FerramentaFinalidade
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

FerramentaFinalidade
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

FormatoLeituraEscritaRound-trip
Tabelas pipe GFMPass-throughEdição in-placeSem perdas
HTML colapsado GitBookHTML → pipePipe → HTML colapsadoPreserva width, data-*, formatação inline
Tabelas HTML geraisHTML → pipe ou HTML bonitoReconstrói HTMLPreserva 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