14 KiB
MCP Tools — Referencia Completa
Este documento es el inventario canónico de todas las tools MCP disponibles para el agente Acai. Está agrupado por categoría (archivos, módulos, registros, tablas, layout, librerías, hooks, media, navegación, proyecto, git, autenticación, docs) y describe para cada tool su propósito, parámetros clave, qué devuelve y cuándo usarla. Incluye además los workflows canónicos para las operaciones más comunes (crear módulo, editar módulo, crear funcionalidad nueva con tabla + detalle, gestionar imágenes de un módulo, editar header/footer, configurar middleware de hook). Léelo antes de cualquier tarea para elegir la secuencia correcta de tools.
Inventario por categoría
Archivos
| Tool | Acción | Notas |
|---|---|---|
acai-view |
Lee un archivo (con rango de líneas opcional) | Ahorra tokens — usa start_line/end_line |
acai-glob |
Encuentra archivos por patrón glob | template/estandar/modulos/**/index-base.tpl |
acai-grep |
Busca texto/regex en archivos | Soporta filtro por glob |
acai-write |
Crea o reescribe un archivo completo | Editar index-base.tpl compila automáticamente |
acai-line-replace |
Reemplaza un bloque de líneas validado | Preferida sobre acai-write para edits puntuales |
acai-delete |
Elimina un archivo | Destructivo — confirma primero |
Reglas:
- Rutas siempre relativas al proyecto.
- Editar
index-base.tpl→ compila automáticamente. No necesitas llamar acompile_module. - NO toques
index.tpl,index-twig.tpl,builder.json(autogenerados) ni los archivos de layout protegidos (ver08-layout-and-libraries.md).
Módulos
| Tool | Acción | Notas |
|---|---|---|
create_module |
Crea un módulo nuevo (carpeta + archivos + compile) | Alternativa a hacer acai-write manual del index-base.tpl. Genera moduleId único añadiendo sufijo aleatorio. |
compile_module |
Recompila manualmente (rescate) | Solo si los archivos generados están desincronizados. Editar index-base.tpl con tools de archivo ya compila. |
check_module |
Preview del render con datos de ejemplo | Devuelve preview (50 líneas) por defecto; fullRender:true para todo |
check_module_usage |
Lista páginas que usan el módulo | OBLIGATORIO antes de delete_module |
delete_module |
Elimina la carpeta del módulo | Destructivo. Si inUse=true, deniega — el usuario debe quitarlo de las páginas primero |
set_module_example_data |
Define datos de ejemplo para preview en el editor | Pasar valores para TODAS las variables del schema |
Registros (records)
| Tool | Acción | Notas |
|---|---|---|
list_table_records |
Lista registros con filtros, paginación | Usa fields y truncateText para ahorrar tokens |
get_record |
Obtiene un registro completo por num |
Carga uploads + relations por defecto |
create_or_update_record |
Crea o actualiza registros | Sin recordId → crea. Con recordId → actualiza. Acepta array para batch |
delete_table_records |
Elimina registros (por IDs o deleteAll) |
Destructivo permanente |
list_page_modules |
Lista módulos colocados en una página Builder | Devuelve sectionIds, posiciones, visibilidad, configVars |
add_module_to_record |
Añade módulo a una página Builder | Devuelve sectionId — úsalo en set_module_config_vars |
remove_module_from_record |
Quita módulo de la página | Por sectionId (preferido) o modulePosition |
reorder_module |
Mueve módulo a otra posición | fromPosition → toPosition |
toggle_module_visibility |
Muestra/oculta sin borrar | Por sectionId |
get_module_config_vars |
Lee valores actuales de las variables | Por tableName + recordNum + sectionId |
set_module_config_vars |
Escribe variables del módulo | Devuelve uploadFields con recordNum+fieldName listos para subir imágenes |
Tablas y campos (schema)
Ver 05-tables-and-fields.md para detalles. Tools:
| Tool | Acción |
|---|---|
list_tables |
Inventario de tablas (sin cms_) |
get_table_schema |
Schema completo. Soporta minimal:true y filterFields:"..." para ahorrar tokens |
create_table |
Crea tabla nueva. PREGUNTA al usuario sobre enlace/seoMetas antes |
update_table_metadata |
Actualiza el [meta]. newTableName renombra MySQL (destructivo) |
delete_table |
Borra tabla. Usa dryRun:true primero. dropData:true borra datos |
reorder_tables |
Reordena sidebar admin |
create_field |
Añade campo a tabla |
update_field |
Actualiza props. newFieldName renombra columna (destructivo). Cambios de type pueden truncar datos — surfacea warnings |
delete_field |
Borra campo. dropColumn:true borra datos permanentemente |
reorder_fields |
Reordena los campos del formulario admin |
regenerate_enlaces |
Regenera URLs de la tabla. generateAlias:true para preservar redirects |
Layout global
Ver 08-layout-and-libraries.md.
| Tool | Acción |
|---|---|
get_layout_field |
Lee style/javascript/header/footer del layout.json |
set_layout_field |
Escribe el campo (atómico: actualiza json + regenera tpl + compila). Destructivo |
Librerías globales
| Tool | Acción |
|---|---|
list_global_libraries |
Lista las URLs top (head) y bottom (antes de </body>) |
add_global_library |
Añade URL idempotente |
remove_global_library |
Quita URL idempotente |
set_global_libraries |
Reemplaza la lista de la sección. Destructivo |
Hooks (middleware)
| Tool | Acción |
|---|---|
get_hook_middleware |
Lee la config middleWare de un hook global |
set_hook_middleware |
Configura cuándo se ejecuta automáticamente: [], ["allurls"], ["<tableName>-<num>"] |
Ver 06-hooks-and-cmsapi.md para uso. Crear/editar el .php del hook se hace con acai-write.
Media
| Tool | Acción | Notas |
|---|---|---|
generate_image |
Genera imagen con IA y la guarda en cms/uploads/generated/ |
Devuelve dockerUrl y uploadUrl/fullUrl. En Forge prefiere uploadUrl/fullUrl sobre dockerUrl para upload_record_image |
upload_record_image |
Sube imagen a un campo de un registro | Necesita tableName, recordId (num), fieldName real (de relations o uploadFields) |
upload_image_to_assets |
Sube imagen a /images/ del template (assets globales) |
Acepta base64, data URI, URL. Permite resize/quality/format |
Navegación
| Tool | Acción |
|---|---|
navigate_browser |
Navega el browser preview del usuario a un enlace (e.g. /servicios/) |
Proyecto
| Tool | Acción |
|---|---|
get_web_url |
URL del sitio en desarrollo. OBLIGATORIO antes de fetch/Playwright. Acuérdate de añadir ?pruebas=1 |
save_project_styles |
Guarda resumen de estilos en docs/project-styles.md |
Git
| Tool | Acción |
|---|---|
list_git_log |
Lista los últimos commits para que el usuario elija un id de rollback |
| (rollback) | Tool de rescate; pide confirmación al usuario |
Autenticación
| Tool | Acción |
|---|---|
refresh_acai_token |
Renueva el JWT cuando expira (errores 403) |
Documentación
| Tool | Acción |
|---|---|
read_doc |
Lee un doc del knowledge base completo o por sección. Útil cuando un doc no fue cargado por relevancia o necesitas una sección puntual |
list_docs |
Lista los docs disponibles con sus títulos y summaries |
Workflows canónicos
1. Crear un módulo nuevo
- Estilo del proyecto: si existe
docs/project-styles.mdléelo. Si no, explora 3-4 módulos representativos (nocustom-*) y guarda consave_project_styles. - Lee la doc relevante según contenido:
01-builder-fields.mdsiempre;07-css-js-conventions.mdsi lleva JS;06-hooks-and-cmsapi.mdsi lleva hook PHP;02-twig.mdsi usa filtros. acai-writesobretemplate/estandar/modulos/<moduleId>_xxxxxx/index-base.tplcon el HTML/Twig. Si necesita CSS/JS/PHP, escribe tambiénstyle.css,script.js,hook.php.- Compilación automática al escribir
index-base.tpl. Si por algún motivo necesitas forzarla sin tocar el archivo:compile_module. add_module_to_recordpara colocarlo en una página. DevuelvesectionId.set_module_config_varspara rellenar variables (textos, listas, etc.). DevuelveuploadFieldsconrecordNum+fieldNamepor cada upload.- Imágenes:
generate_imageoupload_record_imageusando elrecordNumyfieldNamedel paso 6. navigate_browseralenlacede la página para que el usuario vea el resultado.
2. Editar un módulo existente
get_module_config_vars— leer estado actual (vars + recordNums).acai-view— leer el rango concreto deindex-base.tplque vas a tocar.acai-line-replace— modificar el bloque (compila automáticamente). Usaacai-writesolo si el cambio es masivo.- Si cambian variables:
set_module_config_varspara actualizar valores.
3. Gestionar imágenes de un módulo
Tras set_module_config_vars (recomendado):
- La respuesta incluye
uploadFieldscon{ fieldName, recordNum }por cada variable upload. - Para multi vars con uploads:
uploadFields["records.imagen"]es array[{index, fieldName, recordNum}]. upload_record_imagecontableName: "builder_custom",recordIdyfieldNamedeuploadFields.
Sin set_module_config_vars previo:
get_module_config_vars— obtienerecordNumde builder_custom.- Lee
builder.jsondel módulo para encontrar elfieldNamereal (devars.NOMBRE.relations.builder_custom, ej.image1— NO uses el nombre de la variable). upload_record_imagecontableName: "builder_custom",recordId(recordNum del paso 1),fieldName(de relations).
Generar imagen primero:
generate_imageconprompt+style.- Usa la URL recomendada que devuelve (
uploadUrlofullUrlen Forge;dockerUrlsolo en local). upload_record_imagecon esa URL.
4. Crear funcionalidad nueva con tabla + detalle
Ejemplo: implementar "Vacantes".
create_tablecontableName: "vacantes",menuType: "multi",enlace: true,seoMetas: true. Pregunta al usuario antes los flags.create_fieldpara cada campo:titulo,descripcion(wysiwyg),salario_minimo(textfield),categoria_num(list desde tabla),fecha_publicacion(date),fecha_expiracion(date),visible(checkbox),imagen_destacada(upload).acai-writesobretemplate/estandar/modulos/custom-vacantes/index-base.tplcon el Twig que usathisrecord.*(sección general que renderiza el detalle de cada registro).- (Opcional) Módulo de listado
vacantes_listado_xxxxxxcon'vacantes' | get('visible=1', 'fecha_publicacion DESC', 20). - (Opcional) Página índice
/vacantes/enapartados(Builder) con el módulo de listado dentro. navigate_browsera un detalle creado para verificar.
5. Editar header / footer del sitio
Ver 08-layout-and-libraries.md.
get_layout_field({ field: "header" })— lee Twig actual.- Modifica localmente.
set_layout_field({ field: "header", content: "..." })— atómico. Sobrescribelayout.json, regenera.tply compila.
NUNCA uses acai-write sobre custom-header-twig/index-base.tpl ni layout.json.
6. Añadir librería global (jQuery, Vue CDN, Google Fonts)
list_global_libraries— comprueba si ya existe.add_global_library({ section: "bottom", url: "..." })para JS, otoppara CSS/fonts.
Para reordenar dependencias: set_global_libraries con la lista completa.
7. Hook con middleware (auto-ejecutar antes de páginas)
acai-writesobrehooks/hooks.<id>.phpcon la lógica.get_hook_middlewaresobre/hooks/<id>/para ver config actual.set_hook_middlewarecon el nuevomiddleWare:[]→ solo cuando se llama explícitamente["allurls"]→ antes de cada página["cms_apartados-2"]→ solo antes del registro num=2 de apartados
8. Gestionar registros de una tabla
list_table_recordsconwhere/order/limit/fields(sincms_).get_recordpara uno completo (tableName+recordNum).create_or_update_recordpara crear/actualizar. Antes consulta el schema conget_table_schema.delete_table_recordspara borrar (destructivo permanente).
9. Explorar el sitio
list_table_recordssobreapartadospara ver páginas.list_page_modulessobre una página para ver módulos.get_module_config_varspara ver datos de un módulo.check_modulepara preview con datos custom.
10. Consultar la documentación bajo demanda
Si el knowledge_base no cargó un doc relevante (lo verás en "Other Available Docs") o necesitas una sección puntual con detalle:
list_docs() // todos los docs con summary
read_doc({ name: "05-tables-and-fields" }) // doc completo
read_doc({ name: "06-hooks-and-cmsapi", section: "Hook middleware" }) // sección por heading H2
Reglas globales para todas las tools
tableNamesiempre SIN prefijocms_(excepto enqueryDBTwig y en elmiddleWaredeset_hook_middleware).- PK siempre
num, nuncaid. Foreign keys con sufijo_num. - Upload fields son arrays — accede con
[0].urlPath. fieldNamepara imágenes viene debuilder.json→vars.NOMBRE.relations.builder_custom(ej.image1), NO del nombre de la variable.recordIdpara imágenes de módulo es elnumdebuilder_custom, NO elsectionId.- Tras
set_module_config_vars, TODAS las variables (incluidos uploads) recibenrecordNum+fieldNameenuploadFields. - Si un token JWT expira (error 403):
refresh_acai_tokeny reintentar. - Al pedir URLs del sitio:
get_web_urlSIEMPRE primero. Añade?pruebas=1para modo desarrollo. Nunca uses dominios de producción nilocalhost:8080. - Antes de crear archivos, lee la doc relevante (
read_docsi no está en el KB cargado). - Operaciones destructivas (
delete_*,dropColumn,dropData,dropTable,newTableName,newFieldName,regenerate_enlacessin alias,set_global_libraries,set_layout_field): pide confirmación al usuario si no es trivial.