MCP Tool: wiki_delete_page — Hard-delete de drafts wiki
MCP Tool: wiki_delete_page
Tool MCP del supercontexto CreaRack Pro que realiza el hard-delete real de una página wiki en estado draft: elimina la fila de bib_wiki_pages en D1 y (por defecto) también borra el .md del repo vía GitHub Contents API. Introducida en el pulido sesión 17 como reemplazo del fallback que usaba wiki_archive_page.
Resumen rápido
| Campo | Valor |
|---|---|
| Nombre | wiki_delete_page |
| Handler | wikiDeletePage() en functions/api/mcp/handlers/wiki.ts |
| Guard | Solo status = 'draft'. Rechaza active / stale / archived. |
| D1 | DELETE FROM bib_wiki_pages WHERE slug = ? AND status = 'draft' |
| Repo | ghDeleteFile() → DELETE /repos/{owner}/{repo}/contents/{path} |
| Log | INSERT INTO bib_wiki_log (operation='delete', ...) |
| LOGGED_TOOLS | Sí — action: 'delete', entity_type: 'wiki_page' |
Parámetros
| Parámetro | Tipo | Requerido | Default | Descripción |
|---|---|---|---|---|
slug | string | ✅ | — | Slug del draft a borrar |
reason | string | ❌ | 'deleted' | Razón del borrado (queda en bib_wiki_log) |
actor | string | ❌ | 'unknown' | Quién borra (edu|dani|agent-xxx) |
delete_file | boolean | ❌ | true | Si true, borra también el .md vía GitHub API |
Comportamiento detallado
1. Guard de status
Antes de cualquier operación, la función consulta bib_wiki_pages por slug. Si la página:
- no existe → devuelve
{ error: "Page '...' not found" } - status ≠ draft → devuelve
{ error: "... only drafts can be deleted. Use wiki_archive_page for active/stale pages." }
2. Borrado del .md en repo (cuando delete_file: true)
Llama al helper ghDeleteFile() que:
- Obtiene el SHA actual del fichero con
getFileSha(). - Lanza
DELETE /repos/{REPO}/contents/{file_path}con el SHA y el mensaje de commitwiki: delete draft '<slug>' (<reason>). - El commit queda en git como audit trail permanente.
Si el SHA no existe (fichero ya ausente) o la API devuelve error, no aborta: continúa con el DELETE de D1 y devuelve file_warning en la respuesta.
3. DELETE en D1
DELETE FROM bib_wiki_pages WHERE slug = ? AND status = 'draft'
La condición AND status = 'draft' es redundante de seguridad ante posible race condition entre el check inicial y el DELETE.
4. Log en bib_wiki_log
Siempre se inserta una fila con operation = 'delete' independientemente del resultado del borrado del fichero.
Respuesta de la tool
{
"deleted": true,
"slug": "<slug>",
"file_deleted": true,
"file_warning": null,
"rows_affected": 1
}
deleted:truesirows_affected > 0en D1.file_deleted:truesi el.mdfue eliminado del repo con éxito.file_warning: string con el error si el borrado del.mdfalló (la D1 se borró igualmente).
Diferencia vs wiki_archive_page
wiki_archive_page | wiki_delete_page | |
|---|---|---|
| Acción | Cambia status → archived | Borra la fila de D1 |
| Fichero .md | Lo deja intacto | Lo borra (por defecto) |
| Reversible | Sí (status se puede cambiar) | No |
| Scope | active / stale / archived | Solo draft |
| Audit trail | Campo status en D1 | Commit de borrado en git + fila en bib_wiki_log |
Regla: usar
wiki_delete_pageúnicamente para drafts que no deben existir. Para retirar páginas activas, usarwiki_archive_page.
Contexto de implementación
Antes del pulido sesión 17, la skill wiki-delete usaba wiki_archive_page como fallback (marcaba la página como archived pero no borraba la fila D1 ni el .md). El commit 2db6309 implementó el hard-delete real con tres cambios coordinados:
wiki.ts: funciónwikiDeletePage+ helperghDeleteFile+validOpsampliado con'delete'.tools.ts: declaración dewiki_delete_pageen el arrayTOOLS.index.ts: registro enLOGGED_TOOLS(action: 'delete').SKILL.md: pasos 5-6 reescritos para invocar la tool real.
Variables de entorno requeridas
| Variable | Uso |
|---|---|
env.GH_PAT | Token PAT de GitHub para llamar a la Contents API |
Si GH_PAT no está disponible, el borrado del .md se omite silenciosamente y file_warning refleja la ausencia.
Véase también
- [[entity—mcp—skill—wiki-delete]]