# Referencia de herramientas

> Todas las herramientas que el servidor MCP de Dilohost ofrece a tu agente, con sus acciones, quién puede usarlas, cuáles piden confirmación y sus parámetros.

Esta página se genera a partir del propio servidor, así que siempre coincide con lo que ve tu agente. No necesitas aprendértela para usar Dilohost: basta con pedir las cosas con tus palabras. Sirve para entender qué hace el agente por debajo, para revisar permisos o para construir tu propia integración.

## Cómo se usan

Cada herramienta agrupa varias **acciones** relacionadas. El agente elige la acción con el parámetro `action` y añade los parámetros que esa acción necesita:

```json
{
  "name": "database",
  "arguments": { "action": "create", "project": "tienda", "name": "datos", "engine": "postgres" }
}
```

Todas las herramientas admiten además dos parámetros comunes:

| Parámetro | Para qué |
|---|---|
| `account` | Cuenta sobre la que actuar, si la persona pertenece a varias. Por defecto, la suya. |
| `confirm` | Código de confirmación que devolvió una llamada anterior. Solo se envía después de que la persona lo apruebe. Ver [Confirmaciones](/docs/seguridad/confirmaciones). |

En las tablas, **Quién puede** dice quién puede usar cada acción: *Equipo* es cualquier persona de la cuenta y los [tokens de servicio](/docs/cuenta/tokens) (*Equipo · lee* marca las acciones que solo consultan); *Solo el propietario*, quien creó la cuenta. Ver [Equipo](/docs/cuenta/equipo).

## Resumen

| Herramienta | Para qué | Tipo |
|---|---|---|
| [`account`](/docs/referencia/herramientas#account) | Cuenta | Solo lectura |
| [`billing`](/docs/referencia/herramientas#billing) | Plan y pagos | Escribe, no borra |
| [`domain`](/docs/referencia/herramientas#domain) | Dominios | Puede cambiar o borrar |
| [`dns`](/docs/referencia/herramientas#dns) | DNS | Puede cambiar o borrar |
| [`email`](/docs/referencia/herramientas#email) | Correo | Puede cambiar o borrar |
| [`project`](/docs/referencia/herramientas#project) | Proyectos | Puede cambiar o borrar |
| [`deploy`](/docs/referencia/herramientas#deploy) | Publicar | Puede cambiar o borrar |
| [`app`](/docs/referencia/herramientas#app) | Apps | Puede cambiar o borrar |
| [`config`](/docs/referencia/herramientas#config) | Variables de entorno | Puede cambiar o borrar |
| [`database`](/docs/referencia/herramientas#database) | Bases de datos | Puede cambiar o borrar |
| [`backup`](/docs/referencia/herramientas#backup) | Copias de seguridad | Puede cambiar o borrar |
| [`storage`](/docs/referencia/herramientas#storage) | Almacenamiento de ficheros | Puede cambiar o borrar |
| [`storage_read`](/docs/referencia/herramientas#storage-read) | Ver almacenamiento de ficheros | Solo lectura |
| [`jobs`](/docs/referencia/herramientas#jobs) | Tareas y procesos | Puede cambiar o borrar |
| [`team`](/docs/referencia/herramientas#team) | Equipo | Puede cambiar o borrar |
| [`trash`](/docs/referencia/herramientas#trash) | Papelera | Puede cambiar o borrar |
| [`upload`](/docs/referencia/herramientas#upload) | Subir proyecto | Puede cambiar o borrar |
| [`feature_request`](/docs/referencia/herramientas#feature-request) | Pedir una función | Escribe, no borra |


## account

**Cuenta** · Solo lectura

Información de la cuenta de Dilohost: con quién está conectado el agente, el plan y sus límites, lo que se ha gastado de cada límite, el catálogo de planes con precios y las últimas acciones registradas. Acciones: info, usage, plans, audit.

| Acción | Quién puede | Pide confirmación |
|---|---|---|
| `info` | Equipo · lee | — |
| `usage` | Equipo · lee | — |
| `plans` | Equipo · lee | — |
| `audit` | Equipo | — |

| Parámetro | Tipo | Descripción |
|---|---|---|
| `limit` | integer | audit: cuántas acciones mostrar (máx. 100). |
| `month` | string | usage: mes del consumo medido (AAAA-MM); por defecto, el actual. |

## billing

**Plan y pagos** · Escribe, no borra

Contratar y pagar el plan de la cuenta (contratar, cambiar de plan, el método de pago, los datos fiscales y el tope de gasto, solo el propietario de la cuenta; el saldo y las recargas, cualquier persona del equipo). Los pagos se hacen en las páginas seguras de Stripe, con el enlace que devuelve la acción: los datos de tarjeta nunca pasan por este servidor. Flujo: account.plans para elegir → billing.profile con los datos de facturación (nombre o razón social, país, zona si es España, particular o empresa, NIF) → billing.checkout (plan, period month|year) → la persona paga en el enlace → billing.status. Con un plan ya activo: billing.change_plan (pide confirmación y muestra lo que se cobra ahora), billing.portal (método de pago, recibos y cancelación al final del periodo), billing.invoices. Precios sin IVA; el IVA se calcula según los datos de facturación (21 % en España peninsular y Baleares; sin IVA en Canarias para empresas, Ceuta y Melilla, y para empresas de la UE con NIF-IVA válido). Uso: cada plan incluye crédito de uso al mes (Gratis 1 €); lo medido se gasta a tarifa (account.plans la muestra). billing.usage da lo gastado, el crédito que queda y el tope de gasto; billing.spend_cap lo cambia (euros de exceso al mes, o "none"). En Gratis, el exceso se paga del monedero y, sin saldo, las apps se paran hasta el día 1. Saldo: billing.balance y billing.add_funds (dominios y uso extra del plan Gratis). Acciones: status, usage, spend_cap, profile, checkout, change_plan, portal, invoices, balance, add_funds.

| Acción | Quién puede | Pide confirmación |
|---|---|---|
| `status` | Equipo · lee | — |
| `usage` | Equipo · lee | — |
| `spend_cap` | Solo el propietario | — |
| `profile` | Solo el propietario | — |
| `checkout` | Solo el propietario | — |
| `change_plan` | Solo el propietario | Sí |
| `portal` | Solo el propietario | — |
| `invoices` | Equipo | — |
| `balance` | Equipo | — |
| `add_funds` | Equipo | — |

| Parámetro | Tipo | Descripción |
|---|---|---|
| `plan` | string | checkout/change_plan: id del plan (autonomo, negocio…; ver account.plans). |
| `period` | string | checkout/change_plan: month (mensual) o year (anual: 10 mensualidades). Valores: `month`, `year`. |
| `name` | string | profile: nombre completo o razón social que irá en las facturas. |
| `kind` | string | profile: particular, o empresa (incluye autónomos). Valores: `particular`, `empresa`. |
| `country` | string | profile: país, código de dos letras (ES, PT, FR…). Solo España y la UE. |
| `region` | string | profile (España): peninsula_baleares, canarias, ceuta o melilla. Valores: `peninsula_baleares`, `canarias`, `ceuta`, `melilla`. |
| `tax_id` | string | profile: NIF/CIF/NIE (obligatorio para empresas; en la UE, el NIF-IVA). |
| `address` | string | profile: dirección (opcional). |
| `postal_code` | string | profile: código postal (opcional). |
| `city` | string | profile: ciudad (opcional). |
| `amount` | integer | add_funds: euros de saldo (sin IVA) a recargar. Valores: `10`, `25`, `50`, `100`. |
| `cap` | string | spend_cap: euros de exceso por uso al mes como máximo (p. ej. "25"), o "none" para quitar el tope. Al llegar se paran las apps. |
| `month` | string | usage: mes (AAAA-MM); por defecto, el actual. |

## domain

**Dominios** · Puede cambiar o borrar

Dominios propios para las webs (el plan Gratis admite uno, comprado aquí o traído). - Buscar y comprar: `search` (disponibilidad y precio; .es, .com, .net, .org, .eu, .dev, .app) → `contact_create` (titular: siempre la persona o empresa cliente, con su NIF) → `buy` (pide confirmación con el precio; se paga con el saldo de billing.add_funds, salvo el dominio incluido en el pago anual). - Traer uno que ya tiene: `connect` (da un registro TXT para demostrar que es suyo) → la persona lo crea en su DNS actual → `verify` → si mode="delegated", cambia los nameservers en su registrador a ns1/ns2.dilohost.es (las instrucciones salen en verify) → `status` hasta que esté activo. Con mode="records" no se cambian los nameservers: solo se apunta la web desde su DNS. - Web: `attach` (dominio + project + app) → certificado HTTPS automático cuando el dominio ya apunta aquí → `status`. `detach` la quita. - Mantenimiento: `list`, `status`, `renew`, `auto_renew`, `transfer_in` (traerse el registro desde otro registrador; antes hay que conectarlo y verificarlo), `transfer_code` (para llevárselo: se envía por correo), `remove`. Los registros DNS se gestionan con la tool dns. Acciones: search, contact_create, contacts, buy, connect, verify, status, list, attach, detach, renew, auto_renew, transfer_in, transfer_code, remove.

| Acción | Quién puede | Pide confirmación |
|---|---|---|
| `search` | Equipo · lee | — |
| `contact_create` | Equipo | — |
| `contacts` | Equipo | — |
| `buy` | Equipo | Sí |
| `connect` | Equipo | — |
| `verify` | Equipo | — |
| `status` | Equipo · lee | — |
| `list` | Equipo · lee | — |
| `attach` | Equipo | — |
| `detach` | Equipo | Sí |
| `renew` | Equipo | Sí |
| `auto_renew` | Equipo | — |
| `transfer_in` | Equipo | Sí |
| `transfer_code` | Solo el propietario | Sí |
| `remove` | Equipo | Sí |

| Parámetro | Tipo | Descripción |
|---|---|---|
| `domain` | string | Dominio (p. ej. mipanaderia.es). En search, también una palabra o nombre. |
| `mode` | string | connect: «delegated» (recomendado: Dilohost lleva su DNS) o «records» (solo apuntar la web desde su DNS actual). Valores: `delegated`, `records`. |
| `project` | string | attach: proyecto de la app. |
| `app` | string | attach: app o web del proyecto. |
| `www` | boolean | attach: servir también www (redirige a la raíz). Por defecto true. |
| `price_cents` | integer | buy: precio en céntimos que devolvió search (si cambió, se avisa). |
| `contact_id` | integer | buy/transfer_in: titular (de contact_create o contacts). |
| `years` | integer | renew: años (1 por defecto). |
| `enabled` | boolean | auto_renew: activar o desactivar. |
| `auth_code` | string | transfer_in: código de transferencia del registrador actual. |
| `type` | string | contact_create: persona/autónomo u organización. Valores: `individual`, `organization`. |
| `first_name` | string | contact_create: nombre (de la persona de contacto si es organización). |
| `last_name` | string | contact_create: apellidos. |
| `org_name` | string | contact_create: razón social (organización). |
| `ident_number` | string | contact_create: NIF/NIE/CIF del titular (pasaporte fuera de España). |
| `person_ident_number` | string | contact_create (organización): NIF/NIE de la persona de contacto. |
| `email` | string | contact_create: correo del titular (el registrador puede pedir que lo confirme). |
| `phone` | string | contact_create: teléfono con prefijo (+34 600 000 000). |
| `address` | string | contact_create: dirección. |
| `postal_code` | string | contact_create: código postal. |
| `city` | string | contact_create: ciudad. |
| `state` | string | contact_create: provincia. |
| `country` | string | contact_create: país (ES, PT…). |

## dns

**DNS** · Puede cambiar o borrar

Registros DNS de los dominios cuyo DNS gestiona Dilohost (comprados aquí o traídos con mode="delegated"). - `list`: registros actuales (los «gestionados» los pone la plataforma: nameservers y, con la web conectada, el A de la raíz y www). - `set`: crea o sustituye todos los valores de un nombre y tipo (name «@» = raíz; «www», «blog», «_dmarc»…; type A, AAAA, CNAME, MX, TXT, SRV, CAA, NS; values lista; ttl 60-86400). - `delete`: borra un nombre y tipo (pide confirmación). - `preset`: configura el correo de un proveedor o una verificación: google_workspace, microsoft365 (value = host MX que da Microsoft), zoho, search_console (value = código). El SPF se fusiona con el que haya. Se valida todo antes de escribir: un CNAME no convive con otros registros, un solo SPF por nombre, CAA compatible con el certificado de la web. Acciones: list, set, delete, preset.

| Acción | Quién puede | Pide confirmación |
|---|---|---|
| `list` | Equipo · lee | — |
| `set` | Equipo | — |
| `delete` | Equipo | Sí |
| `preset` | Equipo | — |

| Parámetro | Tipo | Descripción |
|---|---|---|
| `domain` *(obligatorio)* | string | Dominio (p. ej. mipanaderia.es). |
| `name` | string | set/delete: «@» para la raíz o el subdominio sin el dominio (www, blog, _dmarc…). |
| `type` | string | set/delete: A, AAAA, CNAME, MX, TXT, SRV, CAA o NS. |
| `values` | array | set: valores. MX «10 mx.ejemplo.com», TXT el texto tal cual, SRV «prioridad peso puerto destino», CAA «0 issue "letsencrypt.org"». |
| `ttl` | integer | set: segundos (60-86400, por defecto 3600). |
| `preset` | string | preset: proveedor. Valores: `google_workspace`, `microsoft365`, `zoho`, `search_console`. |
| `value` | string | preset: dato que necesita (host MX de Microsoft o código de Search Console). |

## email

**Correo** · Puede cambiar o borrar

Buzones de correo con el dominio de la persona (info@sudominio.es), con IMAP/POP/SMTP y webmail. El dominio tiene que estar en la cuenta: con su DNS en Dilohost (delegated o comprado aquí) ponemos los registros; con su DNS fuera (mode="records") los pone la persona. - `list`: dominios con correo, sus buzones y los dominios donde se puede activar. - `enable` (domain): activa el correo; con el DNS en Dilohost pone MX, SPF, DKIM, DMARC y SRV; si el DNS está fuera (domain.connect con mode="records"), devuelve los registros que la persona tiene que poner allí (pide confirmación). - `status` (domain): si ya se puede enviar (al activar se recibe enseguida; enviar espera a que se verifique el dominio, minutos). - `disable` (domain): desactiva el correo de un dominio sin buzones. - `create` (address, name, password): crea un buzón (pide confirmación con el coste). La contraseña es opcional (12+ caracteres); sin ella, se pone después en el panel de dilohost.es. `password` (address, password) la cambia. - `delete` (address): borra el buzón y TODOS sus mensajes (pide confirmación). - `aliases` (address, aliases): direcciones extra que llegan a ese buzón (p. ej. ["ventas","hola"]); sustituye la lista. - `settings`: datos para configurar el móvil u Outlook. - Reenvío a otro correo (p. ej. su Gmail): solo se activa en el panel (Correo → Reenvío); `list` muestra a dónde reenvía cada buzón. - Traer el correo de otro proveedor (Gmail, Migadu, IONOS…): `guide` describe el flujo completo; `migrate` (address, source_user, source_password; o link=true si la persona prefiere escribirla en un enlace), `migrate_status`, `migrate_again` (otra pasada tras cambiar el MX) y `migrate_close`. Al final, `old_records`/`clean_old_records` (domain): restos del proveedor antiguo. Acciones: list, enable, status, disable, create, password, delete, aliases, settings, guide, migrate, migrate_status, migrate_again, migrate_close, old_records, clean_old_records.

| Acción | Quién puede | Pide confirmación |
|---|---|---|
| `list` | Equipo · lee | — |
| `settings` | Equipo · lee | — |
| `status` | Equipo · lee | — |
| `enable` | Equipo | Sí |
| `disable` | Equipo | Sí |
| `create` | Equipo | Sí |
| `delete` | Equipo | Sí |
| `aliases` | Equipo | — |
| `password` | Equipo | — |
| `guide` | Equipo · lee | — |
| `migrate` | Equipo | — |
| `migrate_status` | Equipo · lee | — |
| `migrate_again` | Equipo | — |
| `migrate_close` | Equipo | — |
| `old_records` | Equipo · lee | — |
| `clean_old_records` | Equipo | Sí |

| Parámetro | Tipo | Descripción |
|---|---|---|
| `domain` | string | enable/status/disable/old_records/clean_old_records: dominio (p. ej. mipanaderia.es). |
| `address` | string | create/delete/aliases: dirección completa del buzón (info@mipanaderia.es). |
| `name` | string | create: nombre que verán los destinatarios (p. ej. «Panadería Ana»). |
| `aliases` | array | aliases: partes antes de la @ (["ventas","hola"]); lista vacía para quitarlos. |
| `password` | string | create/password: contraseña del buzón de Dilohost, si la persona la da (mínimo 12 caracteres). Nunca se devuelve. |
| `source_user` | string | migrate: usuario del correo antiguo (casi siempre la dirección completa). |
| `source_password` | string | migrate: contraseña del correo antiguo (en Gmail y otros, contraseña de aplicación). Nunca se devuelve. |
| `source_host` | string | migrate: servidor IMAP de origen; si no se pasa, se detecta por el MX (email.guide lo explica). |
| `source_port` | integer | migrate: 993 (por defecto) o 143. |
| `link` | boolean | migrate: true para dar a la persona un enlace donde escribir la contraseña, en vez de pasarla por la conversación. |

## project

**Proyectos** · Puede cambiar o borrar

Proyectos de la cuenta: cada uno agrupa sus webs y apps, bases de datos, buckets y tareas. Acciones: create, list, info, delete (va a la papelera 30 días; pide confirmación), export (zip con el código, las variables y enlaces a las copias).

| Acción | Quién puede | Pide confirmación |
|---|---|---|
| `create` | Equipo | — |
| `list` | Equipo · lee | — |
| `info` | Equipo · lee | — |
| `delete` | Equipo | Sí |
| `export` | Equipo | Sí |

| Parámetro | Tipo | Descripción |
|---|---|---|
| `project` | string | Identificador del proyecto: 2-20 minúsculas, números o guiones (p. ej. "mi-tienda"). |
| `name` | string | create: nombre visible del proyecto (opcional). |

## deploy

**Publicar** · Puede cambiar o borrar

Publica webs y apps en https://<app>-<proyecto>-<cuenta>.dilosite.es. `guide` explica cómo subir el código y cómo prepararlo para que el build tarde poco. Acciones: guide, publish, git_remote, git_revoke, connect_repo, sync, repo, disconnect_repo, subdomain, redeploy, status, history, rollback. Formas de subir el código: 1. `git_remote`: remoto git de Dilohost + credencial de 1 h; `git push` a main publica. Para agentes con terminal. 2. `connect_repo`: su repositorio de GitHub, GitLab, Bitbucket, Codeberg u otro, con clave de despliegue de solo lectura (y webhook); después `sync`. 3. tool `upload` mode="agent": zip por URL firmada. 4. tool `upload` mode="page": enlace para que la persona arrastre el zip. `publish` con `files` (texto, ≤400 ficheros, 8 MB) para webs pequeñas y cambios puntuales; con `git_url`, repos públicos. Con index.html y sin package.json/composer.json/Dockerfile: web estática al instante. Lo demás se construye (Node, PHP, Python, Go, Ruby… o su Dockerfile): `status` da el progreso hasta «live» o «failed» y, si el build se puede acelerar, `para_que_tarde_menos`. `dockerfile=false` ignora el Dockerfile del repo (p. ej. el de otro hosting); en PHP/Laravel es mucho más rápido. La app escucha en la variable PORT (8080). `subdomain`: <nombre>.dilosite.es si está libre ("default" vuelve a la de siempre; pide confirmación). Dominios propios: tool domain. `git_revoke` anula las credenciales de git de la app. `rollback` vuelve a una versión anterior sin reconstruir.

| Acción | Quién puede | Pide confirmación |
|---|---|---|
| `guide` | Equipo · lee | — |
| `publish` | Equipo | — |
| `git_remote` | Equipo | — |
| `git_revoke` | Equipo | — |
| `connect_repo` | Equipo | Sí |
| `sync` | Equipo | — |
| `repo` | Equipo · lee | — |
| `subdomain` | Equipo | Sí |
| `disconnect_repo` | Equipo | Sí |
| `redeploy` | Equipo | — |
| `status` | Equipo · lee | — |
| `history` | Equipo · lee | — |
| `rollback` | Equipo | — |

| Parámetro | Tipo | Descripción |
|---|---|---|
| `project` | string | Proyecto (créalo antes con project.create). Todas las acciones salvo guide. |
| `app` | string | Nombre de la app dentro del proyecto: 1-20 minúsculas y números, sin guiones (p. ej. "web"). Todas las acciones salvo guide. |
| `files` | object | publish: ficheros a crear o actualizar, {"ruta/relativa": "contenido de texto"}. Hasta 400 ficheros y 8 MB. |
| `delete` | array | publish: rutas a borrar del proyecto. |
| `replace_all` | boolean | publish: true = el proyecto queda exactamente con los ficheros enviados (borra el resto). |
| `git_url` | string | publish: en lugar de files, URL https de un repositorio git público. |
| `git_ref` | string | publish: rama del repositorio git (por defecto la principal). |
| `port` | integer | publish: puerto en el que escucha la app si no usa la variable PORT (por defecto 8080). |
| `volume_path` | string | publish: ruta de un disco persistente para ficheros que deben sobrevivir a cada publicación (p. ej. /app/storage). |
| `volume_size_mb` | integer | publish: tamaño del disco persistente en MB (por defecto 512). |
| `message` | string | publish: descripción del cambio (queda en el historial). |
| `dockerfile` | boolean | publish/git_remote/connect_repo: false = ignorar el Dockerfile del proyecto (p. ej. si es el de otro hosting) y construir sin él, que en PHP/Laravel es mucho más rápido. Se recuerda para las siguientes publicaciones; true vuelve a usarlo. |
| `number` | integer | status/rollback: número de versión (por defecto la última / la anterior). |
| `subdomain` | string | subdomain: nombre elegido para la web en <nombre>.dilosite.es (3-40 minúsculas, números y guiones; tiene que estar libre). "default" vuelve a la dirección de siempre. |
| `repo_url` | string | connect_repo: dirección del repositorio de la persona (la de clonar: git@github.com:usuario/proyecto.git o https://github.com/usuario/proyecto). |
| `branch` | string | connect_repo: rama que se publica (por defecto main). |
| `access_token` | string | connect_repo: SOLO para servidores git distintos de GitHub, GitLab, Bitbucket y Codeberg: token de acceso de solo lectura al repositorio. |

## app

**Apps** · Puede cambiar o borrar

Operación de una app, web, worker o tarea ya publicada. Acciones: status, logs (últimas líneas), restart, resources (límites de memoria y CPU del plan), disk (ampliar su disco persistente con size_mb: se concede si el servidor tiene sitio; se cobra por lo que ocupe), run (comandos de mantenimiento como migraciones; lista cerrada), diagnose (explica por qué no funciona y qué hacer), traffic (visitas de una web: páginas vistas, visitantes, páginas más vistas, orígenes, códigos de respuesta, robots y tiempos; últimos 14 días como máximo).

| Acción | Quién puede | Pide confirmación |
|---|---|---|
| `status` | Equipo · lee | — |
| `logs` | Equipo · lee | — |
| `restart` | Equipo | — |
| `resources` | Equipo · lee | — |
| `disk` | Equipo | — |
| `run` | Equipo | — |
| `diagnose` | Equipo · lee | — |
| `traffic` | Equipo · lee | — |

| Parámetro | Tipo | Descripción |
|---|---|---|
| `project` *(obligatorio)* | string | — |
| `name` *(obligatorio)* | string | Nombre de la app, web, worker o tarea. |
| `lines` | integer | logs: cuántas líneas (máx. 300). |
| `command` | string | run: comando, p. ej. "php artisan migrate --force" o "npx prisma migrate deploy". |
| `days` | integer | traffic: días hacia atrás (1-14, por defecto 7). |
| `size_mb` | integer | disk: nuevo tamaño del disco persistente en MB (mayor que el actual). |

## config

**Variables de entorno** · Puede cambiar o borrar

Variables de entorno de una app (se aplican reiniciándola). Los secretos (secret=true) se guardan cifrados y no se vuelven a mostrar nunca por aquí (si se pierden, se cambian por uno nuevo). Acciones: list, set, unset (pide confirmación).

| Acción | Quién puede | Pide confirmación |
|---|---|---|
| `list` | Equipo · lee | — |
| `set` | Equipo | — |
| `unset` | Equipo | Sí |

| Parámetro | Tipo | Descripción |
|---|---|---|
| `project` *(obligatorio)* | string | — |
| `app` *(obligatorio)* | string | — |
| `values` | object | set: {"NOMBRE": "valor"}. |
| `secret` | boolean | set: true si son contraseñas, claves o tokens (no se volverán a mostrar). |
| `keys` | array | unset: nombres de variables. |

## database

**Bases de datos** · Puede cambiar o borrar

Bases de datos PostgreSQL o MySQL del proyecto, cada una con su usuario propio. Acciones: create, list, connection (con inject_into="<app>" guarda la conexión como variables secretas de esa app sin mostrar la contraseña; recomendado), delete (pide confirmación; la base va con sus datos). Las copias están en la tool backup.

| Acción | Quién puede | Pide confirmación |
|---|---|---|
| `create` | Equipo | — |
| `list` | Equipo · lee | — |
| `connection` | Equipo | — |
| `delete` | Equipo | Sí |

| Parámetro | Tipo | Descripción |
|---|---|---|
| `project` *(obligatorio)* | string | — |
| `name` | string | Nombre de la base: 1-20 minúsculas y números (p. ej. "db"). |
| `engine` | string | create: motor (por defecto postgres). Valores: `postgres`, `mysql`. |
| `inject_into` | string | connection: nombre de la app que recibe DATABASE_URL y DB_* como variables secretas. |

## backup

**Copias de seguridad** · Puede cambiar o borrar

Copias de las bases de datos, guardadas fuera del servidor. Se hace una cada noche automáticamente y se conservan según el plan (7 o 30 días). Acciones: now (copia ahora), list, restore (sustituye los datos actuales por los de la copia; pide confirmación), download_link (enlace de descarga válido 1 hora).

| Acción | Quién puede | Pide confirmación |
|---|---|---|
| `now` | Equipo | — |
| `list` | Equipo · lee | — |
| `restore` | Equipo | Sí |
| `download_link` | Equipo | Sí |

| Parámetro | Tipo | Descripción |
|---|---|---|
| `project` *(obligatorio)* | string | — |
| `database` *(obligatorio)* | string | Nombre de la base de datos. |
| `backup` | string | restore/download_link: identificador de la copia (de backup.list). |

## storage

**Almacenamiento de ficheros** · Puede cambiar o borrar

Crear y gestionar buckets compatibles con S3 para guardar ficheros de las apps (fotos, documentos…), cada uno con su clave propia. Para ver los buckets o descargar un fichero, la tool storage_read. Acciones: create_bucket, connection (con inject_into="<app>" guarda AWS_* como variables secretas de la app), upload_url (enlace temporal de 1 hora para subir un fichero con PUT), delete (pide confirmación; borra el bucket y sus ficheros).

| Acción | Quién puede | Pide confirmación |
|---|---|---|
| `create_bucket` | Equipo | — |
| `connection` | Equipo | — |
| `upload_url` | Equipo | — |
| `delete` | Equipo | Sí |

| Parámetro | Tipo | Descripción |
|---|---|---|
| `project` *(obligatorio)* | string | — |
| `name` | string | Nombre del bucket: 1-20 minúsculas y números (p. ej. "fotos"). |
| `inject_into` | string | connection: app que recibe las variables AWS_*. |
| `object` | string | upload_url: ruta del fichero dentro del bucket (p. ej. "fotos/logo.png"). |

## storage_read

**Ver almacenamiento de ficheros** · Solo lectura

Consultar los buckets de ficheros de un proyecto, sin cambiar nada. Acciones: list (buckets, capacidad y estado), download_url (enlace temporal de 1 hora para descargar un fichero; object = su ruta dentro del bucket). Crear, conectar a una app, subir o borrar: tool storage.

| Acción | Quién puede | Pide confirmación |
|---|---|---|
| `list` | Equipo · lee | — |
| `download_url` | Equipo · lee | — |

| Parámetro | Tipo | Descripción |
|---|---|---|
| `project` *(obligatorio)* | string | — |
| `name` | string | download_url: nombre del bucket. |
| `object` | string | download_url: ruta del fichero dentro del bucket (p. ej. "fotos/logo.png"). |

## jobs

**Tareas y procesos** · Puede cambiar o borrar

Procesos que reutilizan el código de una app ya publicada: add_worker (un proceso que corre siempre, p. ej. "php artisan queue:work") y add_cron (un comando programado, formato cron, hora de Madrid; mínimo cada 5 minutos). Acciones: add_cron, add_worker, list, remove (pide confirmación).

| Acción | Quién puede | Pide confirmación |
|---|---|---|
| `add_cron` | Equipo | — |
| `add_worker` | Equipo | — |
| `list` | Equipo · lee | — |
| `remove` | Equipo | Sí |

| Parámetro | Tipo | Descripción |
|---|---|---|
| `project` *(obligatorio)* | string | — |
| `name` | string | Nombre de la tarea: 1-20 minúsculas y números. |
| `app` | string | add_*: app de cuyo código sale la tarea. |
| `command` | string | add_*: comando a ejecutar (p. ej. "php artisan schedule:run"). |
| `schedule` | string | add_cron: horario en formato cron de 5 campos, p. ej. "*/15 * * * *" o "0 3 * * *". |

## team

**Equipo** · Puede cambiar o borrar

Equipo de la cuenta: las personas que la comparten (sus webs, su plan y su saldo). Hay un propietario (quien la creó) y usuarios invitados, que pueden hacerlo todo salvo gestionar el equipo, el plan o el pago. Acciones: list, invite (solo el propietario; queda pendiente hasta que la apruebe en el panel de dilohost.es y entonces se envía el correo), remove (solo el propietario; pide confirmación).

| Acción | Quién puede | Pide confirmación |
|---|---|---|
| `list` | Equipo · lee | — |
| `invite` | Solo el propietario | — |
| `remove` | Solo el propietario | Sí |

| Parámetro | Tipo | Descripción |
|---|---|---|
| `email` | string | Correo de la persona. |

## trash

**Papelera** · Puede cambiar o borrar

Proyectos borrados: se guardan 30 días con todos sus datos y se pueden recuperar. Acciones: list, restore, purge (borra para siempre antes de tiempo; pide confirmación).

| Acción | Quién puede | Pide confirmación |
|---|---|---|
| `list` | Equipo · lee | — |
| `restore` | Equipo | — |
| `purge` | Equipo | Sí |

| Parámetro | Tipo | Descripción |
|---|---|---|
| `project` | string | Proyecto de la papelera. |

## upload

**Subir proyecto** · Puede cambiar o borrar

Sube un proyecto entero en un .zip (hasta 200 MB; 1 GB descomprimido) y lo publica. Es la alternativa a git (deploy.git_remote) y a conectar un repositorio (deploy.connect_repo). - mode="agent" (para clientes que pueden hacer peticiones HTTP, p. ej. con curl): `begin` devuelve un formulario firmado y el comando curl listo; `commit` confirma la subida. - mode="page" (para clientes que no pueden subir ficheros, p. ej. un chat web como claude.ai o ChatGPT): `begin` devuelve un enlace donde la persona arrastra el zip, que se publica solo; `status` da el estado. El zip sustituye el código anterior de la app (el historial se conserva y se puede volver atrás). Se respeta el .gitignore; node_modules, vendor y los builds no hacen falta. Los enlaces caducan a los 15 minutos y valen para una sola subida. Acciones: begin, commit, status.

| Acción | Quién puede | Pide confirmación |
|---|---|---|
| `begin` | Equipo | — |
| `commit` | Equipo | — |
| `status` | Equipo · lee | — |

| Parámetro | Tipo | Descripción |
|---|---|---|
| `project` | string | begin: proyecto (créalo antes con project.create). |
| `app` | string | begin: nombre de la app: 1-20 minúsculas y números (p. ej. "web"). |
| `mode` | string | begin: "agent" si tú subes el zip por HTTP; "page" si lo sube la persona desde el navegador. Valores: `agent`, `page`. |
| `upload_id` | string | commit/status: identificador devuelto por begin. |
| `port` | integer | begin: puerto en el que escucha la app si no usa la variable PORT. |
| `volume_path` | string | begin: ruta de un disco persistente (p. ej. /app/storage). |
| `volume_size_mb` | integer | begin: tamaño del disco persistente en MB. |

## feature_request

**Pedir una función** · Escribe, no borra

Peticiones de funciones al equipo de Dilohost, para lo que la persona necesita y ninguna tool cubre. - `create`: title (una frase), need (qué quería conseguir la persona y para qué, con sus palabras), tried (qué tools se probaron y por qué no bastaban), proposal (opcional: cómo se podría resolver), area (opcional: tool o tema). - `list`: las peticiones de esta cuenta y en qué estado están. Las peticiones las lee el equipo; no llevan contraseñas, claves ni datos personales de terceros. Acciones: create, list.

| Acción | Quién puede | Pide confirmación |
|---|---|---|
| `create` | Equipo | — |
| `list` | Equipo · lee | — |

| Parámetro | Tipo | Descripción |
|---|---|---|
| `title` | string | create: la función en una frase (máx. 120). |
| `need` | string | create: qué quería conseguir la persona y para qué (máx. 2000). |
| `tried` | string | create: qué probaste y por qué no bastaba (máx. 1000). |
| `proposal` | string | create: opcional, cómo lo resolverías (máx. 1000). |
| `area` | string | create: opcional, tool o tema relacionado (p. ej. domain, database, correo). |

