Files
agenticSystem/mcp-server
Jordan Diaz bdee7665ec feat: el agente puede declarar y leer las cmsTables de un modulo
Las cmsTables (tablas del CMS cuyo contenido MUESTRA un modulo) ya se
definen desde Forge y desde el CMS legacy; faltaba que el agente las
entendiera.

- update_module_metadata acepta cmsTables. El endpoint del server ya la
  validaba, asi que solo habia que declararla en el schema Zod.
- get_module_config_vars la devuelve: sale gratis porque el handler ya
  resolvia el schema del modulo para uploadFields/varsMeta.
- Docs (01, 03, 09) con el matiz que mas se puede confundir: `tables` es
  donde viven los VALORES de las vars (siempre builder_custom, lo pone el
  compilador) y `cmsTables` es que contenido MUESTRA el modulo.

Para el agente lo util no es solo escribirlas: al recibirlas sabe donde
esta de verdad el contenido visible. Si le piden cambiar lo que muestra un
listado de noticias, los registros estan en esa tabla, no en las vars del
modulo.

Se documenta ademas que la metadata del builder.json es la UNICA parte
editable del fichero (y solo con esta tool): el resto lo regenera el
compilador en cada compilacion.
2026-08-12 11:32:07 +00:00
..
2026-04-01 23:16:45 +01:00
2026-04-01 23:16:45 +01:00
2026-04-17 20:03:02 +00:00
2026-04-01 23:16:45 +01:00
2026-04-01 23:16:45 +01:00
2026-04-01 23:16:45 +01:00
2026-04-01 23:16:45 +01:00
2026-04-01 23:16:45 +01:00
2026-04-01 23:16:45 +01:00
2026-04-01 23:16:45 +01:00
2026-04-01 23:16:45 +01:00
2026-04-01 23:16:45 +01:00
2026-04-01 23:16:45 +01:00
2026-04-01 23:16:45 +01:00
2026-04-01 23:16:45 +01:00
2026-04-20 11:10:51 +00:00
2026-04-01 23:16:45 +01:00
2026-04-01 23:16:45 +01:00
2026-04-01 23:16:45 +01:00
2026-04-08 23:52:54 +00:00

Acai Code MCP Server

Servidor MCP (Model Context Protocol) para Acai que permite a Claude y otros agentes IA acceder y manipular el código, módulos, tablas y registros de proyectos Acai.

📋 Contenido


🚀 Instalación Local

Requisitos

  • Node.js >= 16
  • npm o yarn

Pasos

  1. Instalar dependencias
cd server
npm install
  1. Iniciar el servidor en modo desarrollo
npm start

El servidor estará disponible en http://localhost:3000/sse

  1. Iniciar con watch mode (recarga automática)
npm run dev
  1. Verificar que funciona
curl http://localhost:3000/health

Deberías ver:

{
  "status": "ok",
  "activeSessions": 0,
  "mode": "sse"
}

🐳 Docker (Producción)

Requisitos

  • Docker instalado
  • Docker Compose (opcional pero recomendado)

Construcción de la imagen

# Desde la carpeta server/
docker build -t acai-mcp-server .

Ejecución

Opción 1: Docker Compose (Recomendado)

docker-compose up -d

Esto inicia:

  • Servidor MCP en puerto 3000
  • Monitor UI en puerto 4545 (opcional)
  • Auto-restart habilitado

Detener:

docker-compose down

Opción 2: Docker directo

docker run -d \
  --name acai-mcp-server \
  --restart unless-stopped \
  -p 3000:3000 \
  acai-mcp-server

Ver logs

docker logs acai-mcp-server -f

Parar/Reiniciar

docker stop acai-mcp-server
docker start acai-mcp-server
docker restart acai-mcp-server

🔧 Configuración de Clientes

Claude Code (Recomendado)

Crea el archivo .mcp.json en la raíz de tu proyecto:

Opción A: Con X-User-Token (Simple)

{
  "mcpServers": {
    "acai-code": {
      "command": "npx",
      "args": [
        "mcp-remote",
        "http://localhost:3000/sse",
        "--header",
        "X-User-Token: {TU_TOKEN_AQUI}"
      ]
    }
  }
}

Opción B: Con X-Acai-Token (Completo)

{
  "mcpServers": {
    "acai-code": {
      "command": "npx",
      "args": [
        "mcp-remote",
        "http://localhost:3000/sse",
        "--header",
        "X-Acai-Token: {TU_TOKEN_AQUI}",
        "--header",
        "X-Acai-Token-Hash: {TU_TOKEN_HASH_AQUI}",
        "--header",
        "X-Acai-Website: {TU_DOMINIO_AQUI}"
      ]
    }
  }
}

Obtener credenciales

  1. Abre https://cms.acaisuite.com/admin.php?debug=1
  2. Busca en la consola o en los Network headers:
    • X-User-Token: Token único (contiene el dominio automáticamente)
    • X-Acai-Token: Token de sesión
    • X-Acai-Token-Hash: Hash de validación
    • X-Acai-Website: Tu dominio

Servidor remoto

Si el Docker está en otra máquina:

{
  "mcpServers": {
    "acai-code": {
      "command": "npx",
      "args": [
        "mcp-remote",
        "http://192.168.1.100:3000/sse",
        "--header",
        "X-User-Token: {TU_TOKEN_AQUI}"
      ]
    }
  }
}

👨‍💻 Desarrollo

Estructura

server/
├── tools/
│   ├── modules/        # Herramientas para módulos
│   ├── tables/         # Herramientas para tablas
│   ├── records/        # Herramientas para registros
│   ├── files/          # Herramientas para archivos
│   ├── media/          # Herramientas para media
│   ├── auth/           # Herramientas de autenticación
│   └── helpers/        # Utilidades compartidas
├── auth/
│   ├── apiClient.js    # Cliente HTTP con auto-login
│   ├── credentials.js  # Gestión de credenciales
│   └── index.js        # Exportaciones
├── utils/
│   ├── moduleParser.js # Parser de componentes Acai
│   └── remoteParser.js # Parser remoto (appParser)
├── resources/          # Guías y documentación
├── server.js           # Punto de entrada principal
├── httpServer.js       # Servidor HTTP/SSE
└── package.json

Agregar una nueva herramienta

  1. Crear archivo tools/category/toolname.js:
import { z } from "zod";
import { withAuth, getSessionCredentials, getApiClient } from "../../auth/index.js";
import { handleToolError, validateRequired, handleApiResponse } from "../helpers/errorHandler.js";

export function registerMyToolTool(server) {
    server.tool(
        "my_tool",
        "Descripción de la herramienta",
        {
            param1: z.string().describe("Descripción del parámetro"),
        },
        withAuth(async ({ param1 }, extra) => {
            try {
                const credentials = getSessionCredentials(extra.sessionId);
                const client = await getApiClient(extra.sessionId);

                // Tu lógica aquí
                const response = await client.post("/endpoint", {
                    action_ws: "mi_accion",
                });

                return {
                    content: [{ type: "text", text: JSON.stringify(response.data, null, 2) }],
                };
            } catch (error) {
                return handleToolError(error, 'my_tool', { param1 });
            }
        })
    );
}
  1. Registrar en tools/category/index.js:
import { registerMyToolTool } from './toolname.js';

export function registerCategoryTools(server) {
    // ... otras herramientas
    registerMyToolTool(server);
}
  1. Probar
npm run dev

Scripts disponibles

npm start          # Iniciar servidor
npm run dev        # Desarrollo con watch
npm test          # Ejecutar tests
npm run lint      # Verificar linting

📚 Herramientas Disponibles

Módulos (6)

  • list_modules - Listar módulos
  • get_module - Obtener contenido
  • save_module - Crear/actualizar
  • check_module - Validar sintaxis
  • check_module_usage - Ver dónde se usa
  • delete_module - Eliminar

Tablas (6)

  • list_tables - Listar tablas
  • get_table_schema - Ver estructura
  • create_table - Crear tabla
  • edit_table_field - Editar campo
  • delete_table_field - Eliminar campo
  • get_table_templates - Obtener templates

Registros (5)

  • list_records - Listar registros
  • get_record - Obtener uno
  • create_record - Crear
  • update_record - Actualizar
  • delete_record - Eliminar

Archivos (4)

  • list_files - Listar archivos
  • read_file - Leer contenido
  • write_file - Crear/actualizar
  • delete_file - Eliminar

Media (3)

  • list_media - Listar media
  • upload_media - Subir archivo
  • delete_media - Eliminar

Auth (1)

  • get_session_info - Info de sesión

🔐 Autenticación

X-User-Token (Recomendado)

  • Token único por usuario
  • Incluye automáticamente el dominio
  • Simplifica la configuración
  • Trigger auto-login en primera petición

X-Acai-Token + X-Acai-Token-Hash + X-Acai-Website

  • Más flexible
  • Permite cambiar dominio
  • Requiere 3 headers
  • Más control

Auto-login

Si solo envías X-User-Token:

  1. Se detecta en la conexión SSE
  2. En la primera petición a una herramienta, se hace login
  3. Las credenciales se cachean en la sesión
  4. Las peticiones posteriores usan el token cacheado

🐛 Troubleshooting

Puerto 3000 en uso

# Encontrar proceso en puerto 3000
lsof -i :3000

# Matar proceso
kill -9 <PID>

# O cambiar puerto
MCP_PORT=3001 npm start

Error: "Token no válido" (403)

  • Verifica que el token no ha expirado
  • Obtén uno nuevo desde https://cms.acaisuite.com/admin.php?debug=1
  • Revisa los logs: docker logs acai-mcp-server -f

Error: "window is not defined"

  • Asegúrate de pasar listTables a parseComponents()
  • Revisa que remoteParser.js tiene las variables seteadas correctamente

Conexión rechazada

# Verifica que está corriendo
curl http://localhost:3000/health

# Ver logs
npm run dev
# o
docker logs acai-mcp-server -f

Tools no disponibles

  • Verifica headers en .mcp.json
  • Comprueba que el token es válido
  • Revisa los logs del servidor

📝 Variables de entorno

MCP_PORT=3000              # Puerto del servidor MCP
MCP_MONITOR_PORT=4545      # Puerto del Monitor UI
MCP_MONITOR_DISABLED=0     # Desactivar Monitor UI
ACAI_TOKEN=...             # Token por defecto (no recomendado)
ACAI_WEBSITE=...           # Dominio por defecto
ACAI_TOKEN_HASH=...        # Hash por defecto

🔄 Actualizar

Versión local

git pull origin main
npm install
npm start

Docker

# Reconstruir imagen
docker build -t acai-mcp-server .

# Reiniciar contenedor
docker restart acai-mcp-server

📖 Recursos

  • Guía Acai: resources/guia-programacion-acai.md
  • Atributos: resources/guia-atributos-acai.md
  • Twig Filters: resources/guia-twig-filters.md
  • Builder Vars: resources/guia-builder-vars.md
  • PHP Hooks: resources/guia-php-hooks.md

🤝 Contribuir

  1. Fork el proyecto
  2. Crea una rama: git checkout -b feature/nueva-herramienta
  3. Haz commit: git commit -am 'Agregar nueva herramienta'
  4. Push: git push origin feature/nueva-herramienta
  5. Abre un Pull Request

📞 Soporte

Para problemas o preguntas:

  1. Revisa los logs: docker logs acai-mcp-server -f
  2. Verifica la configuración en .mcp.json
  3. Abre un issue en el repositorio

📄 Licencia

Igual que el proyecto principal de Acai.


Última actualización: Diciembre 2025