Drupal MCP by usefulapi

Read and write Drupal JSON:API nodes, taxonomy terms, users and files.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
90%
Naming quality
80%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~1,585Tokens (tool definitions)
~1.9 KBTypical response size
Moderate attention impact (1.24% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "drupal": {
      "url": "https://drupal.usefulapi.io/mcp"
    }
  }
}

Remote endpoints

https://drupal.usefulapi.io/mcpstreamable-http

What it can do

Tool inventory

Tools (7)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢drupal_list_resource_types

List all available JSON:API resource types (entity_type/bundle pairs) with their hrefs, so the agent can discover what to query. JSON:API: GET /jsonapi.

Input Schema

{
  "type": "object",
  "properties": {},
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢drupal_list_resources(entity_type, bundle, sort, page_limit, page_offset, ...)

List a collection of resources for an entity_type/bundle, with optional sorting, pagination, includes, and a single-field filter. JSON:API: GET /jsonapi/{entity_type}/{bundle}.

Input Schema

{
  "type": "object",
  "properties": {
    "entity_type": {
      "type": "string",
      "description": "The entity type machine name, e.g. \"node\", \"taxonomy_term\", \"user\"."
    },
    "bundle": {
      "type": "string",
      "description": "The bundle machine name, e.g. \"article\", \"tags\", \"user\"."
    },
    "sort": {
      "description": "Field to sort by; prefix with - for descending, e.g. -created (→ query param sort).",
      "type": "string"
    },
    "page_limit": {
      "description": "Max records to return (→ query param page[limit]).",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "page_offset": {
      "description": "Records to skip (→ query param page[offset]).",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "include": {
      "description": "Comma-separated relationship paths to include, e.g. uid,field_tags (→ query param include).",
      "type": "string"
    },
    "filter_field": {
      "description": "Field path to filter on, e.g. title (used with filter_value; builds a verbose filter).",
      "type": "string"
    },
    "filter_value": {
      "description": "Value to match for filter_field.",
      "type": "string"
    },
    "filter_operator": {
      "description": "Filter operator, e.g. \"=\", \"CONTAINS\", \">\", \"STARTS_WITH\". Default \"=\".",
      "type": "string"
    }
  },
  "required": [
    "entity_type",
    "bundle"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢drupal_get_resource(entity_type, bundle, uuid, include)

Get a single resource by UUID for an entity_type/bundle, with optional includes. JSON:API: GET /jsonapi/{entity_type}/{bundle}/{uuid}.

Input Schema

{
  "type": "object",
  "properties": {
    "entity_type": {
      "type": "string",
      "description": "The entity type machine name, e.g. \"node\", \"taxonomy_term\", \"user\"."
    },
    "bundle": {
      "type": "string",
      "description": "The bundle machine name, e.g. \"article\", \"tags\", \"user\"."
    },
    "uuid": {
      "type": "string",
      "description": "The entity UUID (JSON:API uses the UUID, never the numeric id)."
    },
    "include": {
      "description": "Comma-separated relationship paths to include, e.g. uid,field_tags (→ query param include).",
      "type": "string"
    }
  },
  "required": [
    "entity_type",
    "bundle",
    "uuid"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢drupal_search_content(bundle, query, page_limit)

Convenience node-title search: list nodes of a bundle whose title CONTAINS a query string. JSON:API: GET /jsonapi/node/{bundle} with a verbose CONTAINS filter on title.

Input Schema

{
  "type": "object",
  "properties": {
    "bundle": {
      "type": "string",
      "description": "The node bundle (content type) machine name, e.g. \"article\", \"page\"."
    },
    "query": {
      "type": "string",
      "description": "Text to match against the node title (CONTAINS)."
    },
    "page_limit": {
      "description": "Max records to return (→ query param page[limit]).",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "bundle",
    "query"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴drupal_create_resource(entity_type, bundle, attributes, relationships)

Create a new resource (content entity) for an entity_type/bundle. JSON:API: POST /jsonapi/{entity_type}/{bundle} → 201. Body is { data: { type: entity_type--bundle, attributes, relationships? } }.

Input Schema

{
  "type": "object",
  "properties": {
    "entity_type": {
      "type": "string",
      "description": "The entity type machine name, e.g. \"node\", \"taxonomy_term\", \"user\"."
    },
    "bundle": {
      "type": "string",
      "description": "The bundle machine name, e.g. \"article\", \"tags\", \"user\"."
    },
    "attributes": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {},
      "description": "Field values, e.g. { \"title\": \"Hello\", \"body\": { \"value\": \"…\", \"format\": \"plain_text\" } }."
    },
    "relationships": {
      "description": "Optional relationships, e.g. { \"field_tags\": { \"data\": [{ \"type\": \"taxonomy_term--tags\", \"id\": \"<uuid>\" }] } }.",
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    }
  },
  "required": [
    "entity_type",
    "bundle",
    "attributes"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴drupal_update_resource(entity_type, bundle, uuid, attributes, relationships)

Update an existing resource by UUID (partial update of attributes and/or relationships). JSON:API: PATCH /jsonapi/{entity_type}/{bundle}/{uuid}. Body is { data: { type, id: uuid, attributes?, relationships? } }.

Input Schema

{
  "type": "object",
  "properties": {
    "entity_type": {
      "type": "string",
      "description": "The entity type machine name, e.g. \"node\", \"taxonomy_term\", \"user\"."
    },
    "bundle": {
      "type": "string",
      "description": "The bundle machine name, e.g. \"article\", \"tags\", \"user\"."
    },
    "uuid": {
      "type": "string",
      "description": "The entity UUID (JSON:API uses the UUID, never the numeric id)."
    },
    "attributes": {
      "description": "Field values to change.",
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    },
    "relationships": {
      "description": "Relationships to change.",
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    }
  },
  "required": [
    "entity_type",
    "bundle",
    "uuid"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴drupal_delete_resource(entity_type, bundle, uuid)

Delete a resource by UUID. JSON:API: DELETE /jsonapi/{entity_type}/{bundle}/{uuid} → 204 (empty body). Returns a small confirmation.

Input Schema

{
  "type": "object",
  "properties": {
    "entity_type": {
      "type": "string",
      "description": "The entity type machine name, e.g. \"node\", \"taxonomy_term\", \"user\"."
    },
    "bundle": {
      "type": "string",
      "description": "The bundle machine name, e.g. \"article\", \"tags\", \"user\"."
    },
    "uuid": {
      "type": "string",
      "description": "The entity UUID (JSON:API uses the UUID, never the numeric id)."
    }
  },
  "required": [
    "entity_type",
    "bundle",
    "uuid"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded7 tools
verifiedversion not recorded7 tools