Alimentando con MCP el asistente de IA en un portal Drupal con el módulo Droost

Droost
Solucionex
17
Sep 26

Advertencia: Droost es un módulo para usar en modo desarrollo, al igual de otros módulos como Devel. El uso de este módulo en entornos de producción está totalmente desaconsejado.

Los desarrolladores (en general) de Drupal tratan de encontrar herramientas para facilitar y agilizar el desarrollo, y gracias a la popularización de la IA, esto ha sido posible de una manera drástica. Para comunicar la IA con los portales Drupal se han explicado ya varias maneras, por ejemplo este artículo que habla sobre la integración de Drupal con Claude / opencode. Con el paso del tiempo, nuevas herramientas van apareciendo, y una de ellas es el módulo Droost.

¿Qué es el módulo Droost?

Droost es un módulo para Drupal pensado para mejorar la forma en la que los asistentes y agentes de inteligencia artificial trabajan sobre un proyecto. Tiene como objetivo facilitar la comunicación de la información estructurada y actualizada sobre la aplicación Drupal que se está ejecutando, evitando que tengan que deducir su arquitectura únicamente a partir de archivos de configuración, consultas a base de datos, etc.

Para conseguirlo, Droost utiliza el protocolo MCP. En este caso Drupal actúa como fuente de contexto y capacidades.

Esto resuelve uno de los principales problemas al utilizar asistentes de IA durante el desarrollo: normalmente, el agente no conoce con precisión qué versión de Drupal estamos utilizando, qué módulos están instalados, qué tipos de entidad y campos existen o cómo está configurado el proyecto. Sin ese contexto, puede proponer APIs obsoletas, servicios que no existen o soluciones que no encajan con la arquitectura real del sitio.

La diferencia respecto a pedirle simplemente al asistente que ejecute comandos de Drush es que estas capacidades están descritas mediante esquemas y devuelven resultados predecibles en lugar de interpretar la salida de texto de distintos comandos. De esta forma, sus respuestas pueden ajustarse a las versiones, módulos y configuraciones reales del proyecto.

¿Se pueden hacer operaciones de escritura?

Una de las cosas que más facilita el trabajo a la hora de trabajar con Drupal y la IA es la de crear Tipos de contenido, taxonomías, paragraphs, menús, etc. a partir de prompts o archivos .md de definición. Con Droost también es posible hacer estas operaciones ya que no se limita a ofrecer información de solo lectura, también incluye herramientas capaces de realizar operaciones como modificar configuración, instalar módulos, crear o actualizar entidades, crear Vistas, etc. Sin embargo, estas operaciones están protegidas y desactivadas por defecto.

Instalación

Para la instalación se van a utilizar las herramientras Composer y Drush.

Primero se instalará el paquete via composer:

composer require 'drupal/droost:^1.0@alpha'

Ahora hay que habilitar el módulo y los submódulos del mismo para tener algunas funcionalidades:

drush en droost, droost_brain, droost_devel, droost_search, droost_views

Ahora hay que lanzar el comando que inicializa la configuración de Drush. En este caso se está usando ddev, por lo que hay que especificarlo:

ddev drush droost:install --launcher=ddev

Añadir al opencode.json o al archivo necesario si no lo ha hecho el módulo automáticamente lo siguiente:

{
  "mcp": {
    "droost": {
      "type": "local",
      "command": ["ddev", "drush", "mcp:server"],
      "enabled": true
    }
  }
}

Prueba de listado tipo de contenidos artículos

Para realizar el experimento se ha hecho una prueba que lista el Tipo de contenido artículos usando, por un lado Droost, y por otro examinando los archivos del portal. El resultado ha sido cronometrado para poder comparar tiempo de ejecución. Los documentos están en formato MD, para un major lectura se pueden copiar y usar un previsualizador de MD.

Tipos de contenido y campos - Droost

Fecha de ejecucion: 2026-07-16 16:00:12 CEST
Fuente: Droost MCP (droost_entities)
Inicio cronometro: 1784210556613 ms
Fin cronometro: 1784210566252 ms
Duracion: 9639 ms
Alcance: configuracion activa de Drupal consultada via Entity API.
Campos base comunes
Droost devuelve estos campos base en todos los bundles de nodo.

Campos base: 25

Campo	Etiqueta	Tipo	Requerido	Traducible	Cardinalidad	Target type
nid	nid	integer	no	no	1	-
uuid	uuid	uuid	no	no	1	-
vid	vid	integer	no	no	1	-
langcode	langcode	language	no	si	1	-
type	Tipo de contenido	entity_reference	si	no	1	node_type
revision_timestamp	revision_timestamp	created	no	no	1	-
revision_uid	revision_uid	entity_reference	no	no	1	user
revision_log	revision_log	string_long	no	no	1	-
status	status/Publicado	boolean	no	variable	1	-
uid	uid/Escrito por	entity_reference	no	variable	1	user
title	title/Titulo	string	si	variable	1	-
created	created/Fecha de autoria	created	no	variable	1	-
changed	changed/Modificado	changed	no	variable	1	-
promote	Promocionado a la pagina principal	boolean	no	variable	1	-
sticky	sticky/Fijo al comienzo de las listas	boolean	no	variable	1	-
default_langcode	default_langcode	boolean	no	si	1	-
revision_default	revision_default	boolean	no	no	1	-
revision_translation_affected	revision_translation_affected	boolean	no	si	1	-
metatag	metatag/Metatags	metatag_computed/map	no	variable	-1	-
path	path/Alias de URL	path	no	variable	1	-
publish_on	publish_on	timestamp	no	si	1	-
unpublish_on	unpublish_on	timestamp	no	si	1	-
menu_link	menu_link/Enlace del menu	entity_reference	no	variable	1	menu_link_content
content_translation_source	content_translation_source	language	no	si	1	-
content_translation_outdated	content_translation_outdated	boolean	no	si	1	-
article - Articulo
Campos totales via Droost: 29 Campos configurables: 4

Campo	Etiqueta	Tipo	Requerido	Traducible	Cardinalidad	Target type
article__category	Categoria	entity_reference	si	no	1	taxonomy_term
article__tags	Etiquetas de publicacion	entity_reference	no	no	-1	taxonomy_term
body	Descripcion	text_with_summary	no	si	1	-
image	Imagen	entity_reference	no	si	1	media
offer - Oferta de empleo
Campos totales via Droost: 30 Campos configurables: 5

Campo	Etiqueta	Tipo	Requerido	Traducible	Cardinalidad	Target type
body	Descripcion	text_with_summary	no	no	1	-
image	Imagen	entity_reference	no	no	1	media
offer__highlights	Aspectos destacados	entity_reference_revisions	no	no	-1	paragraph
offer__tags	Etiquetas de oferta	string	no	no	-1	-
structure	Estructura	entity_reference_revisions	no	si	-1	paragraph
page - Pagina Avanzada
Campos totales via Droost: 28 Campos configurables: 3

Campo	Etiqueta	Tipo	Requerido	Traducible	Cardinalidad	Target type
body	Texto	text_with_summary	no	si	1	-
meta_descipcion	Meta descipcion	metatag	no	si	1	-
structure	Estructura	entity_reference_revisions	no	si	-1	paragraph
project - Proyecto
Campos totales via Droost: 36 Campos configurables: 11

Campo	Etiqueta	Tipo	Requerido	Traducible	Cardinalidad	Target type
body	Texto	text_with_summary	no	si	1	-
extlink	Url	link	no	no	1	-
image	Imagen	entity_reference	no	no	1	media
image_list	Imagen listado	entity_reference	si	no	1	media
meta_descipcion	Meta descipcion	metatag	no	si	1	-
project__client	Cliente	string	no	no	1	-
project__is_innovation	Innovacion	boolean	no	no	1	-
project__is_success	Caso de exito	boolean	no	no	1	-
project__sector	Sector	entity_reference	no	no	1	taxonomy_term
project__tools	Herramientas	entity_reference	no	no	-1	node
structure	Estructura	entity_reference_revisions	no	no	-1	paragraph
service - Servicio
Campos totales via Droost: 30 Campos configurables: 5

Campo	Etiqueta	Tipo	Requerido	Traducible	Cardinalidad	Target type
body	Descripcion	text_with_summary	si	si	1	-
icon_font	Icono Fontawesome	fontawesome_icon	si	no	1	-
image	Imagen	entity_reference	no	no	1	media
meta_descipcion	Meta descipcion	metatag	no	si	1	-
structure	Estructura	entity_reference_revisions	no	si	-1	paragraph
tool - Herramienta
Campos totales via Droost: 28 Campos configurables: 3

Campo	Etiqueta	Tipo	Requerido	Traducible	Cardinalidad	Target type
body	Descripcion	text_with_summary	no	si	1	-
image	Imagen	entity_reference	no	si	1	media
tool__service	Servicio	entity_reference	si	no	1	node
Observaciones
Droost devuelve los campos base, campos computados y campos configurables tal como los expone la Entity API activa.
Para evitar repetir 25 campos base por bundle, se listan una vez y cada tipo muestra sus campos configurables.
Los bundles activos detectados por Droost coinciden con los tipos exportados en config/sync en esta prueba.

Listando el contenido de manera convencional:

# Tipos de contenido y campos - Configuracion YAML

- Fecha de ejecucion: 2026-07-16 16:00:12 CEST
- Fuente: ficheros YAML de `config/sync`
- Inicio cronometro: `1784210443407` ms
- Fin cronometro: `1784210472950` ms
- Duracion: `29543` ms
- Alcance: configuracion exportada en disco (`node.type.*`, `field.field.node.*.*`, `field.storage.node.*`).

## article - Articulo

Campos configurables: 4

| Campo | Etiqueta | Tipo | Requerido | Traducible | Cardinalidad | Target type |
| --- | --- | --- | --- | --- | --- | --- |
| `article__category` | Categoria | entity_reference | si | no | 1 | taxonomy_term |
| `article__tags` | Etiquetas de publicacion | entity_reference | no | no | -1 | taxonomy_term |
| `body` | Descripcion | text_with_summary | no | si | 1 | - |
| `image` | Imagen | entity_reference | no | si | 1 | media |

## offer - Oferta de empleo

Campos configurables: 5

| Campo | Etiqueta | Tipo | Requerido | Traducible | Cardinalidad | Target type |
| --- | --- | --- | --- | --- | --- | --- |
| `body` | Descripcion | text_with_summary | no | no | 1 | - |
| `image` | Imagen | entity_reference | no | no | 1 | media |
| `offer__highlights` | Aspectos destacados | entity_reference_revisions | no | no | -1 | paragraph |
| `offer__tags` | Etiquetas de oferta | string | no | no | -1 | - |
| `structure` | Estructura | entity_reference_revisions | no | si | -1 | paragraph |

## page - Pagina Avanzada

Campos configurables: 3

| Campo | Etiqueta | Tipo | Requerido | Traducible | Cardinalidad | Target type |
| --- | --- | --- | --- | --- | --- | --- |
| `body` | Texto | text_with_summary | no | si | 1 | - |
| `meta_descipcion` | Meta descipcion | metatag | no | si | 1 | - |
| `structure` | Estructura | entity_reference_revisions | no | si | -1 | paragraph |

## project - Proyecto

Campos configurables: 11

| Campo | Etiqueta | Tipo | Requerido | Traducible | Cardinalidad | Target type |
| --- | --- | --- | --- | --- | --- | --- |
| `body` | Texto | text_with_summary | no | si | 1 | - |
| `extlink` | Url | link | no | no | 1 | - |
| `image` | Imagen | entity_reference | no | no | 1 | media |
| `image_list` | Imagen listado | entity_reference | si | no | 1 | media |
| `meta_descipcion` | Meta descipcion | metatag | no | si | 1 | - |
| `project__client` | Cliente | string | no | no | 1 | - |
| `project__is_innovation` | Innovacion | boolean | no | no | 1 | - |
| `project__is_success` | Caso de exito | boolean | no | no | 1 | - |
| `project__sector` | Sector | entity_reference | no | no | 1 | taxonomy_term |
| `project__tools` | Herramientas | entity_reference | no | no | -1 | node |
| `structure` | Estructura | entity_reference_revisions | no | no | -1 | paragraph |

## service - Servicio

Campos configurables: 5

| Campo | Etiqueta | Tipo | Requerido | Traducible | Cardinalidad | Target type |
| --- | --- | --- | --- | --- | --- | --- |
| `body` | Descripcion | text_with_summary | si | si | 1 | - |
| `icon_font` | Icono Fontawesome | fontawesome_icon | si | no | 1 | - |
| `image` | Imagen | entity_reference | no | no | 1 | media |
| `meta_descipcion` | Meta descipcion | metatag | no | si | 1 | - |
| `structure` | Estructura | entity_reference_revisions | no | si | -1 | paragraph |

## tool - Herramienta

Campos configurables: 3

| Campo | Etiqueta | Tipo | Requerido | Traducible | Cardinalidad | Target type |
| --- | --- | --- | --- | --- | --- | --- |
| `body` | Descripcion | text_with_summary | no | si | 1 | - |
| `image` | Imagen | entity_reference | no | si | 1 | media |
| `tool__service` | Servicio | entity_reference | si | no | 1 | node |

## Observaciones

- Este metodo solo lista campos configurables exportados, no campos base ni campos computados de la Entity API.
- Los tipos exportados en `config/sync` coinciden con los bundles activos detectados por Droost en esta prueba.

Como se puede comprobar en los documentos adjuntados, el resultado por Droost es bastante más rápido, con una información mejor formateada y más precisa que de manera convencional.

Cómo añadir contenidos, vistas, etc. con Droost

Lo primero es activar el poder crear, sobreescribir, etc. información en el portal. Para ello se puede hacer mediante drush o en la página de configuración del módulo.

Configuración droost
ddev drush config:set droost.settings allow_destructive true

También se podría activar el PHP eval tool, pero con el permiso de MCP tools ya cubrimos la mayoría de casos y no es tan destructivo.

Con esto ya podríamos generar contenidos, vistas, menús, etc. Es importante nutrir también al proyecto con una skill base para que siga la convención con la que se esté acostumbrado a trabajar, ya que sino realizará las creaciones, etc. de manera genérica. 

 

La imagen de este Post ha sido generada por Inteligencia Artificial.

Drupal 11
Depuración avanzada en Drupal 10
IA
MCP
Drupal