Files
claude-plugins/wordpress/skills/mcp-seriously-simple-podcasting/SKILL.md
T
ealmeida 82c800bfe0 feat(wordpress): novas skills seriously-simple-podcasting + mcp-seriously-simple-podcasting
Documenta as 14 tools do MCP dedicado (mcp-seriously-simple-podcasting, porta 3203) para
episódios/shows/definições de show em emanuelalmeida.pt, complementado pela skill de
conhecimento seriously-simple-podcasting (achado central: REST nativo do plugin é
escrita-capaz para episódios mas read-only para definições de show).
2026-08-19 06:14:32 +01:00

5.2 KiB

name, description, layer
name description layer
mcp-seriously-simple-podcasting MCP dedicado (HTTP StreamableHTTP local, ligação `seriously-simple-podcasting` em ~/.claude.json, porta 3203) para o Seriously Simple Podcasting em emanuelalmeida.pt (produção, 39 episódios reais em 8 shows) — episódios (CPT `podcast`), shows/séries (taxonomia `series`) e definições de show (título, owner, categorias iTunes, explicit/complete). Escritas sempre via bootstrap WordPress (`wp_insert_post`/`wp_update_post`/`wp_insert_term`/`update_option`), nunca SQL directo. Usar quando "episódio podcast", "criar episódio", "show podcast", "definições de show", "categoria itunes", "feed rss emanuelalmeida", "apagar episódio", "estatísticas podcast", ou qualquer gestão de conteúdo de podcast em emanuelalmeida.pt. wiki

/mcp-seriously-simple-podcasting — MCP dedicado Seriously Simple Podcasting (emanuelalmeida.pt)

Projecto em /media/ealmeida/Dados/Dev/mcp-seriously-simple-podcasting/ (TypeScript, SDK MCP oficial, StreamableHTTP). O REST API nativo do plugin é escrita-capaz para episódios mas read-only para definições de show (wp/v2/series só regista get_callback, achado confirmado lendo Rest_Api_Controller::create_api_series_fields()) — por isso este MCP usa um único mecanismo consistente para tudo (episódios e shows): o bootstrap WordPress completo via wp eval, nunca REST nem SQL directo para escritas.

Zona-alvo: emanuelalmeida.pt (produção), 39 episódios reais em 8 shows.

Arquitectura — sem tocar no filesystem do servidor

Leituras: SQL directo via $wpdb (rápido, tipado). Escritas: SEMPRE pelas funções nativas do WordPress (wp_insert_post/wp_update_post/wp_delete_post, wp_insert_term/wp_delete_term, wp_set_post_terms, update_post_meta, update_option) — nunca INSERT/UPDATE directo, para preservar hooks de feed/permalinks/sanitização nativa. Ambas correm por SSH via wp eval, com o corpo PHP + dados de entrada codificados em base64 dentro de uma variável de ambiente remota — nunca ficheiros escritos/apagados no servidor, o que evitaria deliberadamente o GATE 5.1 de mutação de infra-estrutura. Ver src/wp-bridge.ts (runPhp()) — mesmo mecanismo do mcp-fluent-crm.

Tools (14)

Leitura (7): ssp_list_episodes (filtros série/estado/pesquisa), ssp_get_episode, ssp_list_series, ssp_get_series_settings (corrige o bug do REST nativo para explicit/complete), ssp_get_stats, ssp_get_feed_url, ssp_get_itunes_categories (referência estática, sem chamada SSH).

Escrita (7): ssp_create_episode, ssp_update_episode, ssp_delete_episode (trash por omissão, force=true apaga permanentemente), ssp_set_episode_series, ssp_create_series, ssp_update_series_settings, ssp_delete_series (destructive — ver guarda abaixo).

Guardas de segurança

  • ssp_update_series_settings/ssp_create_series validam category/category2/category3 e subcategory/subcategory2/subcategory3 contra a lista oficial Apple Podcasts antes de qualquer chamada SSH (rejeita categoria inexistente ou par categoria/subcategoria incoerente com erro accionável).
  • ssp_delete_series recusa remover um show com episódios associados sem force=true — mas atenção: a contagem usada (term->count) só reflecte episódios publicados; um show só com episódios em draft passa como "vazio" mesmo tendo conteúdo associado. Confirmar sempre com ssp_list_episodes({series_id, status: 'any'}) antes de forçar a remoção.
  • ssp_delete_episode por omissão move para o lixo (recuperável); force=true apaga permanentemente.

Fora do v1 (decisão deliberada)

Gestão da ligação Castos/hosting (não aplicável — desligada neste site), upload directo de ficheiros de áudio (o plugin só aceita URL, sem endpoint de upload próprio — usar Media Library via ferramentas WordPress genéricas e passar o URL resultante), CRUD de tags normais (post_tag) — usar ferramentas WordPress genéricas para isso, o CPT podcast é standard.

Credenciais

.env local (WP_SSH_HOST=server, WP_PATH=/home/ealmeida/emanuelalmeida.pt), não versionado. Sem tokens/API keys — a autenticação é a própria sessão SSH root já configurada em ~/.ssh/config.

Verificação

Construído e testado ponta-a-ponta contra a zona real 19-08-2026: todas as 14 tools exercitadas manualmente (incl. guarda de categoria inválida e guarda de show com episódio publicado) + 13/13 evaluations automatizadas (npm run eval:ci), que criam e limpam os seus próprios artefactos (__mcp_eval__) sem tocar em dados reais. Deploy como processo hub persistente (mcp-seriously-simple-podcasting, porta 3203, http://127.0.0.1:3203/mcp), registado em ~/.claude.json como seriously-simple-podcasting.

Skills relacionadas

  • seriously-simple-podcasting — conhecimento profundo do plugin: arquitectura CPT/taxonomia, achado central do REST nativo (episódios escrita-capaz, shows read-only), schema de wp_options das definições de show (com o gotcha explicit/complete), categorias iTunes, feed RSS, wp-admin — consultar antes de desenhar uma integração ou entender um comportamento que este MCP não cobre.