Drupal MCP by usefulapi
Read and write Drupal JSON:API nodes, taxonomy terms, users and files.
Should I use this
Quality & Safety
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
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-httpWhat it can do
Tool inventory
Tools (7)
🟢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
Evidence