tablestakes

Lee y edita tablas HTML/Markdown en documentos sincronizados con GitBook mediante herramientas MCP.

Documentación

tablestakes

PyPI version Python versions CI License

Un servidor MCP que brinda a los LLM acceso limpio y quirúrgico a tablas atrapadas en HTML desordenado.

El problema

Herramientas como GitBook, exportaciones de Notion y plataformas CMS colapsan las tablas en HTML de una sola línea al sincronizar con archivos Markdown. El resultado se ve así en tu 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>

Esto es ilegible para los humanos y poco fiable para los LLM. Los modelos tienen dificultades para analizar tablas HTML colapsadas, con frecuencia alucinan los límites de las celdas y no pueden editarlas sin corromper la estructura.

tablestakes arregla esto. Se sitúa entre el LLM y el archivo, convirtiendo las tablas a un formato pipe limpio al leer y escribiendo de vuelta en el formato original al guardar — preservando la compatibilidad con GitBook, los atributos HTML y el formato en línea.

Lo que ve el LLM

Descubrimiento — escanea un documento de 26 tablas en una sola llamada:

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

Lectura — el HTML colapsado se convierte en una tabla pipe limpia:

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 | — |  |

Escritura — edición quirúrgica de celdas, con verificación de versión:

v:5749c94ffb1f

14 caracteres. El archivo se actualiza, el formato HTML de GitBook se conserva, los atributos width intactos.

Eficiencia de Tokens

Línea base: las herramientas integradas de Lectura + Edición de Claude Code operando sobre el mismo archivo. Medido en una tabla sintética de 18 filas y 4 columnas con contenido realista de estilo requisito (IDs en negrita, énfasis en línea, celdas de longitud mixta).

OperaciónLectura + EdicióntablestakesAhorro
list_tables (26 tablas HTML)~28,400 tokens~2,500 tokens91%
read_table (HTML de 18 filas)~1,100 tokens~690 tokens39%
read_table (GFM de 18 filas)~780 tokens~690 tokens11%
Edición de celda (HTML de 18 filas)~35 tokens~27 tokens23%
Edición de celda (GFM de 18 filas)~99 tokens~27 tokens73%
Flujo de trabajo de 10 ediciones (HTML)~1,470 tokens~960 tokens35%

De dónde provienen los ahorros:

  • Lectura (HTML): las etiquetas HTML colapsadas (<td>, <tr>, <th>, <strong>, width="...") son pura sobrecarga. Las tablas pipe llevan la misma información sin marcado. La herramienta de lectura también añade prefijos de número de línea cat -n.

  • Lectura (GFM): ahorros modestos al eliminar prefijos de número de línea y contexto circundante del documento. El contenido de la tabla ya está limpio.

  • Escritura: la herramienta de edición requiere old_string (suficiente contexto para ser único en el archivo) + new_string (la versión modificada), ambos generados como tokens de salida. Para GFM, old_string es la línea completa de la fila (~190 caracteres). tablestakes solo necesita {"row": 0, "column": "B", "value": "Should"} (~18 tokens).

  • Descubrimiento: sin tablestakes, el LLM lee todo el archivo para encontrar tablas. list_tables devuelve un índice compacto — metadatos + 1 fila de vista previa por tabla.

  • Tablas pipe compactas sin relleno de columnas. Según el benchmark ImprovingAgents, las tablas pipe GFM logran la mejor relación token-precisión: 1.24x costo CSV con 51.9% de precisión QA, superando a JSON (2.08x, 52.3%) y YAML (1.88x, 54.7%).

Detalles del experimento

Tokenizador: tiktoken cl100k_base (GPT-4). Claude usa un tokenizador diferente, pero las comparaciones relativas se mantienen. El script de benchmark (script.py) construye tablas programáticamente y genera la salida de tablestakes usando el código real del convertidor — sin cadenas codificadas.

Línea base de lectura: simulate_read_tool() envuelve el contenido del archivo en formato cat -n (prefijo de número de línea por línea), coincidiendo con lo que devuelve la herramienta de lectura de Claude Code. El archivo completo (texto del documento + tabla) entra en el contexto del LLM.

Línea base de escritura: para cada edición de celda, el script calcula el old_string único mínimo expandiendo hacia la izquierda desde el <td> objetivo hasta que la subcadena sea única en el archivo. new_string es el mismo contexto con el valor de la celda reemplazado. Este es un escenario de mejor caso para la herramienta de edición — un humano podría incluir más contexto que el mínimo.

Línea base de list_tables: 26 copias de una tabla HTML de GitBook de 18 filas en un documento markdown. Ingenuo = Leer el archivo completo (~28k tokens). tablestakes = salida de list_tables con preview_rows=0..3:

preview_rowsTokensAhorro
0 (solo metadatos)~1,23096%
1 (predeterminado)~2,53091%
2~3,51088%
3~4,42084%

Reproducir: uv run --with tiktoken python scripts/script.py

Inicio 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

O instala desde PyPI directamente: pip install tablestakes

Otros clientes (Cursor, Windsurf, Claude Desktop)

Añade el siguiente JSON al archivo de configuración MCP de tu cliente:

{
  "mcpServers": {
    "tablestakes": {
      "command": "uvx",
      "args": ["tablestakes"]
    }
  }
}
ClienteArchivo de configuración
Cursor.cursor/mcp.json
Windsurf~/.codeium/windsurf/mcp_config.json
Claude Desktopclaude_desktop_config.json

Herramientas

Descubrimiento y Lectura

HerramientaPropósito
list_tables(file_path, preview_rows=1)Escanea el archivo, devuelve todas las tablas con metadatos + vista previa
read_table(file_path, table_index)Tabla completa normalizada a formato pipe + hash de versión

Operaciones de Celda, Fila y Columna

HerramientaPropósito
update_cells(file_path, table_index, version, updates)Parches por lotes {row, column, value}
insert_row(file_path, table_index, version, position, values)Insertar fila en posición (-1 para añadir al final)
delete_row(file_path, table_index, version, row_index)Eliminar fila por índice
insert_column(file_path, table_index, version, name, ...)Insertar columna con valor predeterminado
delete_column(file_path, table_index, version, column)Eliminar columna
rename_column(file_path, table_index, version, old_name, new_name)Renombrar encabezado
replace_table(file_path, table_index, version, new_content)Reemplazo completo de tabla desde entrada pipe
create_table(file_path, content, position, format)Crear nueva tabla desde entrada pipe (predeterminado: HTML)

Todas las herramientas de escritura requieren un hash version de read_table — concurrencia optimista que evita sobrescrituras obsoletas sin bloqueos.

Formatos de Tabla Soportados

FormatoLecturaEscrituraIda y vuelta
Tablas pipe GFMPaso directoEdición en el lugarSin pérdida
HTML colapsado de GitBookHTML → pipePipe → HTML colapsadoConserva width, data-*, formato en línea
Tablas HTML generalesHTML → pipe o HTML bonitoReconstruye HTMLConserva la estructura

Aunque GitBook es la motivación principal, tablestakes funciona con cualquier documento Markdown que contenga tablas HTML — exportaciones de CMS, volcados de Notion, migraciones de wiki, o HTML escrito a mano en archivos .md.

Direccionamiento de Columnas

Las columnas se pueden referenciar por:

  • Letra: "A", "B", "AA" (base-26 biyectiva, como Excel)
  • Nombre: "Priority" (debe ser único)
  • Compuesto: "B:Priority" (para desambiguación)
  • Índice: "0", "1" (basado en 0)

Desarrollo

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

Licencia

Apache-2.0


mcp-name: io.github.oborchers/tablestakes