9.0 KiB
name, description, layer
| name | description | layer |
|---|---|---|
| mcp-tablepress | MCP dedicado (node stdio, ligação `tablepress` em ~/.omp/agent/mcp.json) para gerir tabelas TablePress em descomplicar.pt via WP-CLI/SSH — listar tabelas, ler/exportar (CSV/HTML/JSON) 1 tabela completa (dados+options+visibilidade), configurações globais do plugin, actualizar dados (substituição total) ou nome/descrição de 1 tabela. Único MCP com o mapeamento completo de armazenamento do TablePress (option `tablepress_tables`, CPT `tablepress_table`, post meta `_tablepress_table_options`/`_tablepress_table_visibility`). Usar quando "tabela tablepress", "tablepress mcp", "exportar tabela tablepress", "editar dados tabela wordpress", "tablepress_table", "tablepress_tables option", "shortcode table id". | wiki |
/mcp-tablepress — MCP dedicado ao TablePress
Projecto em /media/ealmeida/Dados/Dev/mcp-tablepress/ (TypeScript, SDK MCP oficial, stdio). Sem
código PHP novo no WordPress — cada tool executa wp eval com um snippet PHP estático (nunca
interpolado com dados externos) sobre o WP-CLI já instalado em server.descomplicar.pt. Toda a
entrada/saída viaja em JSON dentro de um envelope base64 por stdin/stdout — nunca interpolada na
linha de comando remota nem no código-fonte PHP.
Não há skill de conhecimento separada para o TablePress — esta skill é a única documentação, incluindo o mapeamento completo de armazenamento (abaixo).
Âmbito
Ler, exportar e editar tabelas TablePress (dados, nome/descrição) e ler as configurações globais
do plugin. Fora do âmbito v1 (risco de perda de dados sem reversão fácil): apagar tabela,
criar tabela nova de raiz, editar options/visibility de uma tabela (só dados/metadados de
texto), editar tablepress_user_options (preferências por-utilizador do editor, não são
"configurações globais").
Site conhecido
Confirmado por wp plugin list --format=json em todos os 8 sites reais do bundle (19-08-2026):
só descomplicar.pt (produção) tem o TablePress instalado e activo (v3.3.3). Os outros 7
(emanuelalmeida, starter, ccv, care, ecommerce-demo, e-commerce, ecommerce) não o
têm. tablepress_list_sites devolve a lista com notas por site; qualquer tool aceita também um
path absoluto directo para uma instalação futura noutro site.
Mapeamento de armazenamento (confirmado por leitura do código-fonte do plugin)
TablePress não guarda arrays PHP nativos em wp_options — grava sempre
wp_json_encode($value, JSON_UNESCAPED_SLASHES) como string plana dentro da option
(classes/class-wp_option.php, comentário do próprio autor: "Wraps the WordPress Options API, so
that (especially) arrays are stored as JSON, instead of being serialized by PHP"). Confirmado
empiricamente: wp option get tablepress_tables (sem --format) devolve
{"last_id":1,"table_post":{"1":49571}} cru; com --format=json devolve
"{\"last_id\":1,\"table_post\":{\"1\":49571}}" — dupla codificação, corrompe qualquer escrita
subsequente. Por isso este MCP nunca usa wp option get/update --format=json nem wp post meta get/update --format=json — todas as leituras/escritas passam por wp eval com
get_option()/json_decode()/wp_json_encode()/update_option() do lado PHP.
| Onde | O quê | Formato |
|---|---|---|
Option tablepress_tables |
{"last_id": int, "table_post": {"<table_id>": <post_id>}} — mapa entre o ID lógico da tabela (o usado no shortcode [table id=X /]) e o post_id do WordPress |
String JSON plana |
Option tablepress_plugin_options |
Config global: plugin_options_db_version, table_scheme_db_version, tablepress_version, custom_css/custom_css_minified/use_custom_css, message_donation_nag, etc. |
String JSON plana |
Option tablepress_user_options |
Preferências por-utilizador do editor (largura de coluna, menu admin) — fora do âmbito deste MCP | String JSON plana, chave por-utilizador via TablePress_WP_User_Option |
Post CPT tablepress_table |
1 post por tabela. post_title=nome, post_excerpt=descrição, post_content=matriz de dados (array<array<string>>) codificada em JSON, post_author, post_modified=última modificação |
post_content é uma string JSON plana (não serialização WP) |
Post meta _tablepress_table_options |
Options de renderização da tabela: table_head/table_foot (nº de linhas), alternating_row_colors, print_name/print_description, use_datatables e sub-opções DataTables, extra_css_classes, datatables_custom_commands |
String JSON plana |
Post meta _tablepress_table_visibility |
{"rows": [1,1,0,...], "columns": [1,1,...]} — 1/0 por linha/coluna (1=visível) |
String JSON plana |
Gotcha de slashing (confirmado por leitura de models/model-post.php): wp_insert_post()/
wp_update_post() assumem input já "slashed" (aplicam wp_unslash() internamente) — o TablePress
faz sempre wp_slash() antes de chamar essas funções, e update_post_meta()/add_post_meta()
igual. Este MCP replica exactamente esse padrão em wpcli.ts (wp_slash() no conteúdo/título/
excerpt antes de wp_update_post()), confirmado empiricamente por um round-trip byte-a-byte (ver
Verificação) — sem isto, backslashes literais (\uXXXX do JSON, \n/\\ em células) seriam
corrompidos.
Não existe comando WP-CLI custom (wp help tablepress confirma "not a registered command" na
v3.3.3) — todo o acesso é via wp eval.
Tools (8)
| Tool | Read-only | Uso |
|---|---|---|
tablepress_list_sites |
sim | Aliases conhecidos, path WP, nota de estado do TablePress |
tablepress_get_status |
sim | Instalado/activo/versão — wp plugin list filtrado |
tablepress_list_tables |
sim | Todas as tabelas: ID lógico, nome, descrição, nº linhas/colunas, estado, última modificação |
tablepress_get_table |
sim | 1 tabela completa: data (matriz), options (renderização), visibility (linhas/colunas visíveis) — chamar antes de tablepress_update_table_data |
tablepress_get_global_options |
sim | tablepress_plugin_options completa (versões, custom CSS global, avisos) |
tablepress_export_table |
sim | Exporta 1 tabela em csv/html/json — réplica exacta de TablePress_Export::export_table() (mesma protecção contra CSV injection: prefixa ' a células =+-@ com chamadas de função perigosas) |
tablepress_update_table_data |
não | Substituição total de data (nunca merge — enviar a matriz completa). Invalida a cache de output da tabela (tablepress_c_<md5(id)> transients) |
tablepress_update_table_meta |
não | Actualiza name/description (pelo menos um), sem tocar em dados/options/visibility |
Segurança
Allowlist rígida: só as 2 options (tablepress_tables, tablepress_plugin_options), o CPT
tablepress_table e os 2 post meta fields listados acima — nenhum outro dado do WordPress é
tocado. Cada snippet PHP em wpcli.ts é uma constante estática hardcoded (nunca interpolada com
table_id, data, name ou description); todo o input variável viaja em JSON dentro de um
envelope base64 por stdin, decodificado remotamente com base64 -d antes de chegar ao wp eval —
nunca na linha de comando. tablepress_update_table_data valida no cliente (zod) que a matriz é
rectangular (todas as linhas com o mesmo nº de colunas da primeira) antes de enviar.
Verificação
Construído e testado ponta-a-ponta contra produção (19-08-2026, único site com o plugin: a tabela ID 1, post 49571, "WiP Comparativo de Planos", 41 linhas × 6 colunas):
tablepress_get_statusconfirmouinstalled:true, active:true, version:"3.3.3".tablepress_list_tablesdevolveu a tabela real com 41 linhas/6 colunas, confirmado cruzando com a leitura directa de_tablepress_table_visibility(arrays com 41/6 entradas).tablepress_get_tabledevolveudata/options/visibilityidênticos aos lidos directamente porwp post get --field=post_contentewp post meta getfora do MCP.tablepress_get_global_optionsdevolveu a optiontablepress_plugin_optionsbyte-a-byte igual à leitura directa (custom_css, versões, etc.).tablepress_export_table(formatocsv) produziu output correcto com Unicode (emojis 🚀/✅, acentuação PT) preservado.- Escrita
tablepress_update_table_data: lida a matriz actual viatablepress_get_table, escrita de volta com o valor já-corrente (round-trip idempotente), e opost_contentbruto lido por SSH directo antes/depois deu md5 idêntico (2c97a8e5...) — confirma que a codificação JSON e owp_slash()não alteram o conteúdo real. - Escrita
tablepress_update_table_meta: mesmo teste comname/descriptionjá-correntes —post_title/post_excerptlidos por SSH directo antes/depois idênticos, epost_content/_tablepress_table_optionsconfirmados intactos (a escrita de metadados não tocou nos dados).
Skills relacionadas
Nenhuma skill de conhecimento separada existe para o TablePress — este documento cobre tudo. Ver
wp-cli para o padrão geral de gestão WordPress via WP-CLI/SSH usado por este MCP.