Skip to main content
Glama

MCP Drupal

Servidor MCP que automatiza la subida de artículos de blog a un sitio Drupal a partir de un Google Sheet + documentos de Google Docs con el contenido ya escrito.

No es una app aparte ni tiene interfaz propia: se usa hablando en lenguaje normal dentro de Claude Code, como si le pidieras cualquier otra cosa.

Arquitectura

Google Sheet (una fila = un artículo)
   → columna D enlaza a un Google Doc con el contenido
   → MCP (Node/TS) lee el Sheet y el Doc vía Google Drive/Sheets API
   → parsea título, meta SEO, intro y body
   → crea el artículo en Drupal vía JSON:API, como borrador
   → pinta la fila del Sheet en verde

Todo corre como un proceso externo (este MCP) que habla con Drupal por su JSON:API del core y con Google por su API — no requiere instalar nada en el hosting de Drupal ni acceso a Composer/SSH.

Related MCP server: google-drive-mcp

Cómo funciona

Tenéis un Google Sheet con una fila por artículo. Cada fila enlaza a un documento de Google Docs con el texto ya escrito (título, meta descripción, intro y cuerpo). Cuando le pides al asistente que procese una fila:

  1. Entra a esa fila y a ese documento — solo a los que le compartáis, nada más.

  2. Separa el contenido: título, título SEO, meta descripción, intro y cuerpo, siguiendo un formato fijo dentro del documento (ver Formato del documento).

  3. Lo sube a Drupal como borrador. El bot nunca tiene permiso para publicar — eso siempre lo hace una persona a mano, después de revisar.

  4. Marca la fila del Sheet en verde claro.

  5. Devuelve el enlace directo a la edición del artículo en Drupal para revisión.

El bot no "entiende" el contenido — sigue una plantilla determinista. Si un documento se aparta del formato habitual, revisa el resultado en Drupal antes de publicar.

Qué necesitas antes de empezar

Instalación paso a paso

git clone <url-de-este-repo> mcp-drupal
cd mcp-drupal
npm install

Crear .env (copiar .env.example y rellenar):

cp .env.example .env
DRUPAL_BASE_URL=https://www.tudominio.es
DRUPAL_USER=mcp_bot
DRUPAL_PASSWORD=<contraseña del usuario mcp_bot>
  • DRUPAL_BASE_URL no debería cambiar salvo que el sitio cambie de dominio.

  • DRUPAL_USER es un usuario restringido creado a propósito para el bot: solo puede crear/editar artículos, no puede borrar, publicar ni administrar nada más del sitio.

  • DRUPAL_PASSWORD te la debe pasar quien tenga acceso al panel de administración de Drupal.

Este archivo nunca se sube a git (está en .gitignore) ni se comparte fuera del equipo.

Coloca el archivo de credenciales de Google (ver Credenciales de Google) en la raíz del proyecto, con el nombre exacto:

google-service-account.json

Compilar:

npm run build

Registrar el servidor en Claude Code:

claude mcp add --scope user drupal-mcp -- node /ruta/completa/a/mcp-drupal/dist/index.js

Sustituye /ruta/completa/a/ por la ruta real donde tengas la carpeta. Tiene que ser la ruta completa, no relativa, porque Claude Code puede arrancar desde cualquier carpeta. --scope user hace que el MCP quede disponible en cualquier proyecto que abras con Claude Code en tu ordenador.

Reinicia Claude Code para que la conexión quede activa.

Comprobar que funciona: pídele a Claude, en lenguaje normal, "lista las filas del Sheet de [nombre]". Si te devuelve las filas, todo está conectado. Si da error, revisa que .env y google-service-account.json estén en la raíz del proyecto (no en src/ ni dist/), y que la carpeta de Drive esté compartida con el email de la cuenta de servicio con permiso Editor.

Uso diario

  1. Rellena una fila del Sheet: keyword, titular, tipo, enlace al documento con el contenido, slug sugerido, cliente.

  2. Pídele al bot que la suba, en tus propias palabras: "sube el artículo de la fila 5 del Sheet de agosto" o "sube todas las filas del sheet".

  3. El bot localiza la fila, extrae el contenido del documento enlazado, y crea el artículo en Drupal como borrador (nunca publicado).

  4. La fila del Sheet se pinta de verde claro automáticamente.

  5. El bot devuelve el enlace directo de edición del artículo en Drupal.

  6. Paso manual, siempre: quien revise añade la imagen (la genérica del proyecto, o la definitiva) en la pestaña Media y marca "Publicado".

Herramientas disponibles

Herramienta

Qué hace

list_resource_types

Lista los content types y recursos disponibles en Drupal

list_nodes

Lista nodos de un content type, con paginación y filtro por título

get_node

Trae un nodo concreto por UUID

create_node

Crea un nodo (título, body, intro, meta tags, relaciones opcionales)

update_node

Edita un nodo existente

list_sheet_rows

Lee las filas del Google Sheet (keyword, titular, tipo, documento, slug, cliente)

get_article_content_from_doc

Descarga un Google Doc y extrae título / meta título / metadescripción / intro / body en HTML, con tablas convertidas a listas

mark_sheet_row_done

Pinta una fila del Sheet en verde claro

No hace falta llamarlas por su nombre — pídele al bot lo que quieres hacer en lenguaje normal y él elige la herramienta adecuada.

Formato esperado del documento de contenido

El parseo (src/googleClient.ts, función parseArticleHtml) asume esta estructura en el Google Doc:

  1. Primera línea (estilo Título 1) → título del artículo.

  2. Línea Title=... → título SEO (meta tag), sustituye el valor por defecto.

  3. Línea Metadescription=... → metadescripción SEO.

  4. Los párrafos siguientes, hasta el primer subtítulo (h1/h2/h3) → van al campo field_intro.

  5. Desde el primer subtítulo en adelante → van al body. Las tablas se convierten automáticamente en listas (<ul>), porque no se visualizan bien en Drupal.

Si algún documento no sigue exactamente este patrón, revisa el resultado en Drupal antes de publicar — el parser es determinista pero no "entiende" el contenido, solo sigue la estructura.

Campos de Drupal usados (content type article)

Campo Drupal

Contenido

title

Título del artículo

field_intro

Intro (HTML, formato basic_html)

body

Cuerpo del artículo (HTML, formato basic_html)

field_article_meta_tags

Texto con JSON {"title": "...", "description": "..."}

field_article_media

(Manual) referencia a un paragraph media_slider con la imagen

La URL amigable se genera sola vía Pathauto a partir del título.

Configuración necesaria en Drupal

  1. Módulos core activados (Extender → sin Composer, ya vienen con Drupal): JSON:API, HTTP Basic Authentication.

  2. JSON:API en modo escritura: /admin/config/services/jsonapi → "Accept all JSON:API create, read, update, and delete operations" (por defecto viene en solo lectura).

  3. Rol y usuario restringidos: rol con permiso únicamente de crear/editar el content type article (nada de administración, nada de borrado). Usuario (ej. mcp_bot) con ese rol, autenticado por Basic Auth.

  4. Borrador por defecto: Estructura → Tipos de contenido → Article → Opciones de publicación → casilla "Publicado" desmarcada como valor por defecto. Así todo artículo nuevo nace sin publicar, sin que el bot necesite ningún permiso especial. Este cambio afecta a cómo nace cualquier artículo nuevo para cualquier editor humano también — pedid aprobación antes de aplicarlo.

Por qué el bot nunca publica

Drupal protege el campo status (publicado/no publicado) con el permiso administer nodes, que da control total sobre todo el contenido del sitio, no solo article. Para mantener el riesgo acotado a "solo articles, sin borrado", el bot no tiene ese permiso:

  • Nunca puede publicar ni despublicar nada — solo crear borradores.

  • Publicar sigue siendo un clic manual de alguien con permiso de admin, después de revisar.

Se evaluó Content Moderation (Workflows + Content Moderation, ambos core) como alternativa que evitaría este permiso tan amplio, pero asignar el flujo Editorial al content type Article cambiaría la interfaz de publicación para todo el equipo editorial, no solo para el bot — así que se descartó por ahora.

La imagen es manual

El campo de imagen (field_article_media) no es un campo de imagen simple: es una referencia a un bloque paragraph tipo media_slider, que a su vez referencia un archivo directamente (el pie de foto va en el atributo alt). Crear ese bloque vía API requiere un permiso adicional (crear paragraph) que no se concede al bot, porque abre más superficie de la deseada. El código para hacerlo existe (uploadFile / createMediaSliderParagraph en src/drupalClient.ts) pero no está expuesto como herramienta activa.

Por eso: quien revise el borrador debe añadir la imagen manualmente antes de publicar.

Credenciales de Google

Cada persona/cliente que use este MCP con su propia carpeta de Drive necesita su propio proyecto y credenciales — no se comparten entre personas.

Crear un proyecto y una cuenta de servicio nueva

  1. Ir a console.cloud.google.com, crear un proyecto nuevo.

  2. APIs y servicios → Biblioteca: habilitar Google Drive API y Google Sheets API.

  3. APIs y servicios → Credenciales → Crear credenciales → Cuenta de servicio. Nombre libre (ej. content-bot). No hace falta asignar roles ni "Principales con acceso".

  4. Entrar en la cuenta de servicio creada → pestaña Claves → Agregar clave → Crear clave nueva → JSON. Se descarga un archivo .json — es una credencial, trátala como una contraseña: no la subas a ningún sitio público ni la compartas por chat/email sin cifrar.

  5. Copiar el email de la cuenta de servicio (tipo nombre@proyecto.iam.gserviceaccount.com).

  6. En Google Drive, compartir la carpeta que contiene el Sheet y los documentos con ese email, con permiso Editor (el bot necesita poder pintar la fila del Sheet, no solo leerla).

  7. Renombrar el .json descargado exactamente a google-service-account.json y colocarlo en la raíz del proyecto.

Cambiar solo de carpeta de Drive (misma cuenta de servicio)

No hace falta tocar .env ni el .json. Solo comparte la nueva carpeta con el mismo email de la cuenta de servicio, y dile a Claude qué Sheet usar (por ID o URL) al pedirle que procese una fila.

Cambiar de persona que opera el bot

La persona nueva se crea su propia cuenta de servicio (pasos de arriba), comparte su carpeta con el email de esa cuenta nueva, y sustituye el google-service-account.json antiguo por el nuevo. Con eso, la persona anterior deja de tener acceso y la nueva ya puede usarlo — sin tocar el .env ni recompilar nada. Del lado de Drupal no hace falta ningún cambio: el usuario del bot es del sitio, no de la persona que lo opera.

Revocar el acceso a una cuenta de servicio anterior

Con las credenciales nuevas ya funcionando (confirma listando filas del Sheet):

  • Simplemente deja de usar la cuenta de servicio anterior — como el .json que tienes ahora es el tuyo, esa cuenta ya no interviene en nada.

  • Si además quieres que esa clave deje de ser válida por completo: entra en Drive → la carpeta compartida → quita el acceso al email antiguo. Eso corta el acceso aunque la clave siga existiendo en su Google Cloud.

Seguridad

  • El usuario de Drupal usado por el bot tiene permisos mínimos: crear/editar solo article, sin borrado, sin publicar, sin acceso de administración.

  • Las credenciales (.env, google-service-account.json) nunca se suben a git (están en .gitignore) ni se comparten fuera del equipo.

  • Cada persona/cliente que use este MCP debe generar sus propias credenciales de Google — no reutilizar las de otra persona.

Available Tools

8 tools
create_nodeA

Crea un nodo nuevo en el sitio Drupal. Requiere que el usuario mcp_agent tenga permiso de creación en ese content type

ParametersJSON Schema
NameRequiredDescriptionDefault
attributesYesAtributos JSON:API, ej. { title: '...', body: { value: '...', format: 'basic_html' } }
contentTypeYes
relationshipsNoRelaciones JSON:API opcionales, ej. field_article_media apuntando a un paragraph

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the behavioral transparency burden. It reveals a meaningful prerequisite: mcp_agent must hold creation permission for the specific content type. It does not mention return format, failure modes, or that the call mutates Drupal content, leaving behavioral disclosure incomplete.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, with the action first and the permission caveat second. Every word adds value; there is no boilerplate or repetition of schema structures.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For three parameters, nested objects, and no output schema, the description is thin: it lacks error/result behavior, how to discover valid content types, and when to use this tool with relationships. The permission caveat helps, but the agent still has to infer several operation-critical details.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds JSON:API formatting examples for attributes and marks relationships as optional, which is useful beyond the bare schema. The required contentType parameter still has no description in either the schema or the description text, so a key semantic gap remains.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a concrete operation: 'Crea un nodo nuevo en el sitio Drupal' (create a new node). This verb+resource pair makes it clearly distinct from sibling read/list/update tools, even though it does not explicitly name them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The creation intent is clear, and the permission requirement ('Requiere que el usuario mcp_agent tenga permiso de creación en ese content type') gives useful context. However, there is no explicit when-to-use vs. update_node/list_nodes guidance or any exclusion criteria; the agent must infer the typical workflow.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_article_content_from_docA

Descarga y extrae de un Google Doc el título, meta título, meta descripción, intro y body (HTML listo para Drupal, tablas convertidas a listas)

ParametersJSON Schema
NameRequiredDescriptionDefault
docUrlOrIdYesURL o ID del Google Doc

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the behavioral burden, and it does meaningfully: it discloses a read-style operation (download + extract) and a notable transformation ('tablas convertidas a listas'). It does not cover auth requirements or failure modes, but the core processing behavior is transparent enough for safe invocation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, well-structured sentence front-loads the action, lists extracted fields, and appends the Drupal-ready format and table conversion as a parenthetical. There is no filler and every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter extraction tool with no output schema, the description adequately names all delivered content fields and one important transform. It does not clarify the relationship to create_node (i.e., that this tool only extracts, it does not publish the Drupal node), but the core call semantics are complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the sole parameter docUrlOrId is already described as 'URL o ID del Google Doc'. The tool description adds no additional parameter-level meaning, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with specific verbs ('Descarga y extrae') tied to a concrete resource (Google Doc) and enumerates exactly what is extracted: título, meta título, meta descripción, intro y body. It also names the target format (HTML listo para Drupal), making the tool's purpose unmistakable and clearly distinct from the sibling node CRUD tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The intended use is implied: pull content from a Google Doc in a Drupal-ready format. However, there is no explicit guidance about when to use this tool versus list_nodes/get_node/create_node/update_node, nor any mention of prerequisites such as document sharing permissions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_nodeB

Obtiene un nodo concreto del sitio Drupal por su UUID

ParametersJSON Schema
NameRequiredDescriptionDefault
uuidYes
contentTypeYes

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations available, the description carries the full burden of disclosing behavior. 'Obtiene' clearly marks this as a read/retrieval operation rather than a mutation, which is useful. However, it does not disclose return value format, error behavior, permissions, or whether related fields are included.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single focused sentence with no filler, and the key retrieval intent is front-loaded. It is concise and readable, though slightly too minimal to cover the full parameter context.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This tool has no output schema, no annotations, and a 0% parameter schema coverage, so the one-line description must do more. It fails to explain the contentType parameter, the expected return value, or how this retrieval tool differs from sibling retrieval tools, making it incomplete for reliable agent use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for the bare input schema. It gives meaning to the uuid parameter ('por su UUID'), but it says nothing about the required contentType parameter, leaving half of the required inputs unexplained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: it retrieves a single Drupal node by UUID. This clearly distinguishes get_node from siblings like list_nodes (which lists many nodes) and create_node/update_node (which mutate nodes).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'por su UUID' implies the tool should be used when a specific UUID is known, but the description does not explicitly say when to prefer it over list_nodes or other retrieval tools. It provides no exclusions or alternative routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_nodesA

Lista nodos de un content type del sitio Drupal, con paginación y filtro opcional por título

ParametersJSON Schema
NameRequiredDescriptionDefault
pageSizeNo
pageOffsetNo
contentTypeYesMachine name del content type, ej. 'page', 'vehiculo'
filterTitleNoFiltra por título (contiene)

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

There are no annotations, so the description carries the full burden. 'Lista' implies a read-only operation, and pagination and filtering are mentioned, but the description does not disclose return format, default pagination values, or potential side effects. This is adequate but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, compact sentence that front-loads the main action and resource, then adds the two relevant features. No redundant or filler words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only list tool this is adequate, but with no output schema it would benefit from describing what kind of node data is returned and what the default pagination behavior is. The essentials are present, but an agent may be unsure about the result shape.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 50%; contentType and filterTitle are documented in the schema, while pageSize and pageOffset are not. The description mentions 'paginación' and 'filtro opcional por título', which partially compensates by hinting at the purpose of those parameters, but it does not explain offset semantics or how pagination maps to the specific parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the action ('Lista'), the resource ('nodos'), and the scope ('de un content type del sitio Drupal'). It also mentions the key features, pagination and optional title filter, which distinguishes it from sibling tools like get_node (single node) and list_resource_types (content types).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use this tool: when listing nodes of a specific content type. It does not explicitly state exclusions or mention alternatives, so it misses the top tier, but the use case is strongly implied by the wording.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_resource_typesA

Lista los tipos de recurso JSON:API disponibles en el sitio Drupal (content types, taxonomías, etc.)

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses a read-only listing behavior and scopes results to the Drupal site, but it does not mention authentication requirements, return format, or any limitation beyond 'disponibles'. The verb 'Lista' implies a safe read, but little else is transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence that conveys the action and scope efficiently. There is no filler or redundant content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (zero parameters, no output schema), the description adequately explains what the tool returns: a list of JSON:API resource types. It could specify the exact response shape, but for a discovery listing tool this is sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the baseline is 4. The description does not need to explain parameter semantics, and the empty schema confirms no inputs are required.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Lista') and a clear resource ('tipos de recurso JSON:API disponibles en el sitio Drupal') with examples. It is unambiguous and distinct from siblings like list_nodes, though it does not explicitly contrast itself with any sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies that this tool is used to discover available JSON:API resource types, but it does not provide explicit guidance about when to use this tool versus alternatives like list_nodes. There are no stated when-to-use or when-not-to-use conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_sheet_rowsB

Lista las filas del Google Sheet de contenidos (columnas: keyword, titular, tipo, documento, slug, cliente)

ParametersJSON Schema
NameRequiredDescriptionDefault
sheetIdYesID del Google Sheet (de su URL)

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description bears the full burden of behavioral disclosure. It only says the tool lists rows; it does not explicitly state that this is a read-only operation, does not describe pagination, output formatting, or any side effects. This is a minimal disclosure for a no-annotation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is one concise sentence that leads with the verb and resource, and then lists columns. Every word contributes information; there is no redundancy or fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter list tool, the description provides the essential context: it lists rows and specifies the columns returned. Since there is no output schema, the column enumeration partially compensates. It does not cover edge cases like pagination or sorting, but these are not critical for a straightforward list operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents the only parameter, sheetId. The description adds no additional parameter details beyond what the schema provides, matching the baseline for full schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Lista'/'List') and resource ('las filas del Google Sheet de contenidos'), and enumerates the columns returned. This clearly distinguishes it from siblings like list_nodes and list_resource_types because the resource is explicitly the content sheet's rows.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided about when to use this tool versus alternatives. There is no mention of use cases, exclusions, or prerequisites. The only usage signal is implied by the verb and resource.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mark_sheet_row_doneA

Pinta de verde claro una fila del Sheet para marcarla como ya subida

ParametersJSON Schema
NameRequiredDescriptionDefault
sheetIdYes
rowIndexYesNúmero de fila tal como aparece en el Sheet (fila 2 = primera fila de datos)

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and does disclose the visible side effect: the row is painted light green. It also states the semantic meaning of that color change, 'ya subida'. It does not mention permissions, persistence, or undo behavior, but for a simple visual-marker tool the core behavior is transparent enough.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single short sentence that begins with the action and ends with the purpose. There is no filler, repetition, or content that duplicates the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter visual mutation tool, the description is nearly sufficient, but without annotations, an output schema, or parameter-level help for sheetId, there are still notable gaps around return behavior and reversibility. The low complexity of the tool keeps it at a minimum-viable level.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema describes rowIndex well with a row-numbering rule, but sheetId has no schema description. The description adds no parameter-level guidance: it only refers to 'el Sheet' and does not clarify what sheetId should contain or how to obtain it, so it does not compensate for the missing schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: 'Pinta de verde claro una fila del Sheet' makes clear the action and target. The purpose clause 'para marcarla como ya subida' states the intended outcome, which also distinguishes it from unconnected sibling tools like list_nodes and create_node.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'para marcarla como ya subida' provides clear context for when this tool should be used: after a row has been uploaded and needs to be visually marked. No alternative tool is referenced, and none of the siblings appears to overlap with this row-marking action, so the selection is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_nodeA

Actualiza campos de un nodo existente en el sitio Drupal. Requiere permiso de edición en ese content type

ParametersJSON Schema
NameRequiredDescriptionDefault
uuidYes
attributesYes
contentTypeYes
relationshipsNo

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description bears the full behavioral burden. It does disclose an authentication/permission requirement, which is useful. It does not explain partial-update semantics, side effects, or error behavior beyond that.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no filler: the first defines the core purpose, the second adds the key prerequisite. The action is front-loaded and every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 4-parameter mutation tool with no annotations, no parameter descriptions, and no output schema, this is too thin. An agent knows what the tool does but not how to populate attributes or relationships, what the response looks like, or what other behavioral constraints apply.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description does not compensate. 'Campos' loosely maps to the attributes parameter, and 'content type' appears in the permission sentence, but uuid, the structure of attributes, and relationships are left entirely unexplained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific action ('Actualiza campos') and a specific resource ('nodo existente en el sitio Drupal'). The word 'existente' clearly distinguishes it from create_node, and the update semantics distinguish it from list_nodes/get_node.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implies usage when one needs to edit a Drupal node's fields and provides a prerequisite ('Requiere permiso de edición en ese content type'). It does not, however, explicitly state when not to use it or name alternatives such as create_node or list_nodes.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

TDQS

A4/5.0
Disambiguation5/5

Each tool targets a clearly distinct resource and action: Drupal nodes, Drupal resource types, Google Sheet rows, and Google Doc extraction are all unambiguous. No two tools could reasonably be confused for the same operation.

Naming Consistency5/5

All tool names follow a consistent snake_case verb-first pattern such as list_nodes, create_node, update_node, list_sheet_rows, and mark_sheet_row_done. The naming is predictable and easy to remember.

Tool Count5/5

With 8 tools, the server is well scoped for its purpose: it covers Drupal node operations, content type discovery, and the Google Sheets/Docs content-import pipeline. Each tool earns its place.

Completeness4/5

The core ingestion workflow is well covered: read from Sheet and Doc, create/update Drupal nodes, list types, and mark rows done. The main gap is the lack of a delete_node operation, which would make full content lifecycle management more complete.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/laurasang13/MCP_Drupal'

If you have feedback or need assistance with the MCP directory API, please join our Discord server