drupal-mcp-connector 1.6.0 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/commands/drupal-audit-config-best-practices.md +16 -0
- package/.claude/commands/drupal-audit-site-health.md +19 -0
- package/.claude/commands/drupal-block-user.md +20 -0
- package/.claude/commands/drupal-bulk-create.md +21 -0
- package/.claude/commands/drupal-bulk-update.md +21 -0
- package/.claude/commands/drupal-config-get.md +19 -0
- package/.claude/commands/drupal-config-list.md +17 -0
- package/.claude/commands/drupal-config-set.md +20 -0
- package/.claude/commands/drupal-content-by-moderation-state.md +22 -0
- package/.claude/commands/drupal-create-block.md +21 -0
- package/.claude/commands/drupal-create-media.md +22 -0
- package/.claude/commands/drupal-create-menu-link.md +24 -0
- package/.claude/commands/drupal-create-node.md +26 -0
- package/.claude/commands/drupal-create-paragraph.md +20 -0
- package/.claude/commands/drupal-create-redirect.md +22 -0
- package/.claude/commands/drupal-create-taxonomy-term.md +23 -0
- package/.claude/commands/drupal-create-translation.md +23 -0
- package/.claude/commands/drupal-create-user.md +24 -0
- package/.claude/commands/drupal-delete-media.md +22 -0
- package/.claude/commands/drupal-delete-node.md +23 -0
- package/.claude/commands/drupal-delete-taxonomy-term.md +22 -0
- package/.claude/commands/drupal-describe-fields.md +20 -0
- package/.claude/commands/drupal-drush-cache-rebuild.md +16 -0
- package/.claude/commands/drupal-drush-config-export.md +16 -0
- package/.claude/commands/drupal-drush-config-import.md +16 -0
- package/.claude/commands/drupal-drush-config-status.md +16 -0
- package/.claude/commands/drupal-drush-cron.md +16 -0
- package/.claude/commands/drupal-drush-module-disable.md +21 -0
- package/.claude/commands/drupal-drush-module-enable.md +19 -0
- package/.claude/commands/drupal-drush-module-list.md +17 -0
- package/.claude/commands/drupal-drush-security-updates.md +16 -0
- package/.claude/commands/drupal-drush-sql-query.md +19 -0
- package/.claude/commands/drupal-drush-status.md +16 -0
- package/.claude/commands/drupal-drush-updatedb.md +16 -0
- package/.claude/commands/drupal-drush-user-create.md +22 -0
- package/.claude/commands/drupal-drush-user-list.md +19 -0
- package/.claude/commands/drupal-drush-watchdog.md +19 -0
- package/.claude/commands/drupal-entity-create.md +23 -0
- package/.claude/commands/drupal-entity-delete.md +24 -0
- package/.claude/commands/drupal-entity-get.md +22 -0
- package/.claude/commands/drupal-entity-list.md +25 -0
- package/.claude/commands/drupal-entity-update.md +24 -0
- package/.claude/commands/drupal-find-orphaned-media.md +18 -0
- package/.claude/commands/drupal-get-entity-schema.md +20 -0
- package/.claude/commands/drupal-get-media.md +20 -0
- package/.claude/commands/drupal-get-node.md +20 -0
- package/.claude/commands/drupal-get-paragraph.md +20 -0
- package/.claude/commands/drupal-get-revision.md +21 -0
- package/.claude/commands/drupal-get-taxonomy-term.md +20 -0
- package/.claude/commands/drupal-get-taxonomy-terms.md +21 -0
- package/.claude/commands/drupal-get-user-by-name.md +19 -0
- package/.claude/commands/drupal-get-user.md +19 -0
- package/.claude/commands/drupal-graphql-introspect.md +17 -0
- package/.claude/commands/drupal-graphql.md +40 -0
- package/.claude/commands/drupal-list-blocks.md +20 -0
- package/.claude/commands/drupal-list-content-types.md +16 -0
- package/.claude/commands/drupal-list-entity-types.md +16 -0
- package/.claude/commands/drupal-list-media-types.md +16 -0
- package/.claude/commands/drupal-list-media.md +21 -0
- package/.claude/commands/drupal-list-menu-links.md +20 -0
- package/.claude/commands/drupal-list-moderation-states.md +20 -0
- package/.claude/commands/drupal-list-nodes.md +24 -0
- package/.claude/commands/drupal-list-revisions.md +20 -0
- package/.claude/commands/drupal-list-roles.md +16 -0
- package/.claude/commands/drupal-list-sites.md +10 -0
- package/.claude/commands/drupal-list-translations.md +21 -0
- package/.claude/commands/drupal-list-users.md +20 -0
- package/.claude/commands/drupal-list-vocabularies.md +16 -0
- package/.claude/commands/drupal-mcp-whoami.md +16 -0
- package/.claude/commands/drupal-report-404-log.md +17 -0
- package/.claude/commands/drupal-report-accessibility-audit.md +18 -0
- package/.claude/commands/drupal-report-alias-coverage.md +18 -0
- package/.claude/commands/drupal-report-broken-embeds.md +18 -0
- package/.claude/commands/drupal-report-broken-links.md +20 -0
- package/.claude/commands/drupal-report-cache-config.md +16 -0
- package/.claude/commands/drupal-report-config-drift.md +16 -0
- package/.claude/commands/drupal-report-content-by-author.md +18 -0
- package/.claude/commands/drupal-report-content-summary.md +16 -0
- package/.claude/commands/drupal-report-duplicate-content.md +18 -0
- package/.claude/commands/drupal-report-field-completeness.md +21 -0
- package/.claude/commands/drupal-report-menu-integrity.md +17 -0
- package/.claude/commands/drupal-report-missing-field.md +21 -0
- package/.claude/commands/drupal-report-module-audit.md +16 -0
- package/.claude/commands/drupal-report-orphan-pages.md +18 -0
- package/.claude/commands/drupal-report-orphaned-references.md +18 -0
- package/.claude/commands/drupal-report-permission-audit.md +16 -0
- package/.claude/commands/drupal-report-pii-exposure.md +19 -0
- package/.claude/commands/drupal-report-readability.md +19 -0
- package/.claude/commands/drupal-report-recently-published.md +18 -0
- package/.claude/commands/drupal-report-redirect-health.md +17 -0
- package/.claude/commands/drupal-report-revision-hotspots.md +18 -0
- package/.claude/commands/drupal-report-scheduled-content.md +18 -0
- package/.claude/commands/drupal-report-seo-audit.md +18 -0
- package/.claude/commands/drupal-report-seo-meta-coverage.md +19 -0
- package/.claude/commands/drupal-report-stale-content.md +20 -0
- package/.claude/commands/drupal-report-status-report.md +17 -0
- package/.claude/commands/drupal-report-taxonomy-usage.md +22 -0
- package/.claude/commands/drupal-report-text-format-audit.md +16 -0
- package/.claude/commands/drupal-report-translation-coverage.md +19 -0
- package/.claude/commands/drupal-report-unpublished.md +18 -0
- package/.claude/commands/drupal-report-user-activity.md +18 -0
- package/.claude/commands/drupal-report-workflow-bottlenecks.md +20 -0
- package/.claude/commands/drupal-resolve-reference.md +22 -0
- package/.claude/commands/drupal-revert-revision.md +21 -0
- package/.claude/commands/drupal-schedule-publish.md +22 -0
- package/.claude/commands/drupal-search-content.md +22 -0
- package/.claude/commands/drupal-search.md +21 -0
- package/.claude/commands/drupal-security-info.md +16 -0
- package/.claude/commands/drupal-set-moderation-state.md +21 -0
- package/.claude/commands/drupal-site-info.md +16 -0
- package/.claude/commands/drupal-update-media.md +23 -0
- package/.claude/commands/drupal-update-menu-link.md +25 -0
- package/.claude/commands/drupal-update-node.md +27 -0
- package/.claude/commands/drupal-update-paragraph.md +21 -0
- package/.claude/commands/drupal-update-redirect.md +22 -0
- package/.claude/commands/drupal-update-taxonomy-term.md +23 -0
- package/.claude/commands/drupal-update-user.md +25 -0
- package/.claude/commands/drupal-upload-file-and-create-media.md +24 -0
- package/.claude/commands/drupal-upload-file.md +22 -0
- package/CHANGELOG.md +18 -0
- package/README.md +27 -1
- package/package.json +4 -1
- package/scripts/generate-commands.js +118 -0
- package/src/index.js +21 -71
- package/src/lib/operations.js +57 -0
- package/src/lib/tool-prompts.js +145 -0
- package/src/tools/index.js +51 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "List Drupal modules. Filter by enabled or disabled status."
|
|
3
|
+
argument-hint: "[site] [status]"
|
|
4
|
+
allowed-tools: mcp__drupal__drupal_drush_module_list
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Call the `mcp__drupal__drupal_drush_module_list` MCP tool.
|
|
8
|
+
|
|
9
|
+
List Drupal modules. Filter by enabled or disabled status.
|
|
10
|
+
|
|
11
|
+
Parse the request in `$ARGUMENTS` into this tool's parameters:
|
|
12
|
+
|
|
13
|
+
**Optional:**
|
|
14
|
+
- `site` (string): omit for the default site
|
|
15
|
+
- `status` (string)
|
|
16
|
+
|
|
17
|
+
If a required parameter is missing from `$ARGUMENTS`, ask before calling — do not invent values. Coerce each value to its JSON type (booleans → true/false, numbers → numeric, object/array → parse JSON), then make the single tool call and summarize the result.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "List modules with known security advisories via `drush pm:security`."
|
|
3
|
+
argument-hint: "[site]"
|
|
4
|
+
allowed-tools: mcp__drupal__drupal_drush_security_updates
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Call the `mcp__drupal__drupal_drush_security_updates` MCP tool.
|
|
8
|
+
|
|
9
|
+
List modules with known security advisories via `drush pm:security`.
|
|
10
|
+
|
|
11
|
+
Parse the request in `$ARGUMENTS` into this tool's parameters:
|
|
12
|
+
|
|
13
|
+
**Optional:**
|
|
14
|
+
- `site` (string): omit for the default site
|
|
15
|
+
|
|
16
|
+
If a required parameter is missing from `$ARGUMENTS`, ask before calling — do not invent values. Coerce each value to its JSON type (booleans → true/false, numbers → numeric, object/array → parse JSON), then make the single tool call and summarize the result.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Run a read-only SQL query (SELECT, SHOW, DESCRIBE, EXPLAIN only) via Drush. Write queries are blocked by the security layer."
|
|
3
|
+
argument-hint: "<query> [site]"
|
|
4
|
+
allowed-tools: mcp__drupal__drupal_drush_sql_query
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Call the `mcp__drupal__drupal_drush_sql_query` MCP tool.
|
|
8
|
+
|
|
9
|
+
Run a read-only SQL query (SELECT, SHOW, DESCRIBE, EXPLAIN only) via Drush. Write queries are blocked by the security layer.
|
|
10
|
+
|
|
11
|
+
Parse the request in `$ARGUMENTS` into this tool's parameters:
|
|
12
|
+
|
|
13
|
+
**Required:**
|
|
14
|
+
- `query` (string)
|
|
15
|
+
|
|
16
|
+
**Optional:**
|
|
17
|
+
- `site` (string): omit for the default site
|
|
18
|
+
|
|
19
|
+
If a required parameter is missing from `$ARGUMENTS`, ask before calling — do not invent values. Coerce each value to its JSON type (booleans → true/false, numbers → numeric, object/array → parse JSON), then make the single tool call and summarize the result.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Get Drupal site status via `drush status` — version, DB, file paths, active config."
|
|
3
|
+
argument-hint: "[site]"
|
|
4
|
+
allowed-tools: mcp__drupal__drupal_drush_status
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Call the `mcp__drupal__drupal_drush_status` MCP tool.
|
|
8
|
+
|
|
9
|
+
Get Drupal site status via `drush status` — version, DB, file paths, active config.
|
|
10
|
+
|
|
11
|
+
Parse the request in `$ARGUMENTS` into this tool's parameters:
|
|
12
|
+
|
|
13
|
+
**Optional:**
|
|
14
|
+
- `site` (string): omit for the default site
|
|
15
|
+
|
|
16
|
+
If a required parameter is missing from `$ARGUMENTS`, ask before calling — do not invent values. Coerce each value to its JSON type (booleans → true/false, numbers → numeric, object/array → parse JSON), then make the single tool call and summarize the result.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Run pending database updates via `drush updatedb`. Always run after deploying module updates."
|
|
3
|
+
argument-hint: "[site]"
|
|
4
|
+
allowed-tools: mcp__drupal__drupal_drush_updatedb
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Call the `mcp__drupal__drupal_drush_updatedb` MCP tool.
|
|
8
|
+
|
|
9
|
+
Run pending database updates via `drush updatedb`. Always run after deploying module updates.
|
|
10
|
+
|
|
11
|
+
Parse the request in `$ARGUMENTS` into this tool's parameters:
|
|
12
|
+
|
|
13
|
+
**Optional:**
|
|
14
|
+
- `site` (string): omit for the default site
|
|
15
|
+
|
|
16
|
+
If a required parameter is missing from `$ARGUMENTS`, ask before calling — do not invent values. Coerce each value to its JSON type (booleans → true/false, numbers → numeric, object/array → parse JSON), then make the single tool call and summarize the result.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Create a Drupal user and optionally assign roles. Requires write access."
|
|
3
|
+
argument-hint: "<name> <mail> <password> [site] [roles]"
|
|
4
|
+
allowed-tools: mcp__drupal__drupal_drush_user_create
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Call the `mcp__drupal__drupal_drush_user_create` MCP tool.
|
|
8
|
+
|
|
9
|
+
Create a Drupal user and optionally assign roles. Requires write access.
|
|
10
|
+
|
|
11
|
+
Parse the request in `$ARGUMENTS` into this tool's parameters:
|
|
12
|
+
|
|
13
|
+
**Required:**
|
|
14
|
+
- `name` (string)
|
|
15
|
+
- `mail` (string)
|
|
16
|
+
- `password` (string)
|
|
17
|
+
|
|
18
|
+
**Optional:**
|
|
19
|
+
- `site` (string): omit for the default site
|
|
20
|
+
- `roles` (array (pass as JSON))
|
|
21
|
+
|
|
22
|
+
If a required parameter is missing from `$ARGUMENTS`, ask before calling — do not invent values. Coerce each value to its JSON type (booleans → true/false, numbers → numeric, object/array → parse JSON), then make the single tool call and summarize the result.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "List Drupal users via Drush. Filter by active/blocked status or role."
|
|
3
|
+
argument-hint: "[site] [status] [role] [limit]"
|
|
4
|
+
allowed-tools: mcp__drupal__drupal_drush_user_list
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Call the `mcp__drupal__drupal_drush_user_list` MCP tool.
|
|
8
|
+
|
|
9
|
+
List Drupal users via Drush. Filter by active/blocked status or role.
|
|
10
|
+
|
|
11
|
+
Parse the request in `$ARGUMENTS` into this tool's parameters:
|
|
12
|
+
|
|
13
|
+
**Optional:**
|
|
14
|
+
- `site` (string): omit for the default site
|
|
15
|
+
- `status` (string)
|
|
16
|
+
- `role` (string)
|
|
17
|
+
- `limit` (number)
|
|
18
|
+
|
|
19
|
+
If a required parameter is missing from `$ARGUMENTS`, ask before calling — do not invent values. Coerce each value to its JSON type (booleans → true/false, numbers → numeric, object/array → parse JSON), then make the single tool call and summarize the result.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Fetch recent Drupal watchdog/dblog entries. Filter by type or severity level."
|
|
3
|
+
argument-hint: "[site] [type] [severity] [limit]"
|
|
4
|
+
allowed-tools: mcp__drupal__drupal_drush_watchdog
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Call the `mcp__drupal__drupal_drush_watchdog` MCP tool.
|
|
8
|
+
|
|
9
|
+
Fetch recent Drupal watchdog/dblog entries. Filter by type or severity level.
|
|
10
|
+
|
|
11
|
+
Parse the request in `$ARGUMENTS` into this tool's parameters:
|
|
12
|
+
|
|
13
|
+
**Optional:**
|
|
14
|
+
- `site` (string): omit for the default site
|
|
15
|
+
- `type` (string)
|
|
16
|
+
- `severity` (string)
|
|
17
|
+
- `limit` (number)
|
|
18
|
+
|
|
19
|
+
If a required parameter is missing from `$ARGUMENTS`, ask before calling — do not invent values. Coerce each value to its JSON type (booleans → true/false, numbers → numeric, object/array → parse JSON), then make the single tool call and summarize the result.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Create an entity of any Drupal entity type and bundle. Use drupal_get_entity_schema first to know what fields are available. All operations checked against security config."
|
|
3
|
+
argument-hint: "<entityType> <bundle> [site] [attributes] [relationships] [dryRun]"
|
|
4
|
+
allowed-tools: mcp__drupal__drupal_entity_create
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Call the `mcp__drupal__drupal_entity_create` MCP tool.
|
|
8
|
+
|
|
9
|
+
Create an entity of any Drupal entity type and bundle. Use drupal_get_entity_schema first to know what fields are available. All operations checked against security config.
|
|
10
|
+
|
|
11
|
+
Parse the request in `$ARGUMENTS` into this tool's parameters:
|
|
12
|
+
|
|
13
|
+
**Required:**
|
|
14
|
+
- `entityType` (string)
|
|
15
|
+
- `bundle` (string)
|
|
16
|
+
|
|
17
|
+
**Optional:**
|
|
18
|
+
- `site` (string): omit for the default site
|
|
19
|
+
- `attributes` (object (pass as JSON)): Field values keyed by Drupal machine name
|
|
20
|
+
- `relationships` (object (pass as JSON)): Relationship data keyed by field name
|
|
21
|
+
- `dryRun` (boolean (true/false)): Validate and return a preview of the create without committing.
|
|
22
|
+
|
|
23
|
+
If a required parameter is missing from `$ARGUMENTS`, ask before calling — do not invent values. Coerce each value to its JSON type (booleans → true/false, numbers → numeric, object/array → parse JSON), then make the single tool call and summarize the result.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Delete an entity of any Drupal entity type. Requires allowDestructive = true in security config. Confirm with the user before calling."
|
|
3
|
+
argument-hint: "<entityType> <bundle> <id> [site] [dryRun]"
|
|
4
|
+
allowed-tools: mcp__drupal__drupal_entity_delete
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Call the `mcp__drupal__drupal_entity_delete` MCP tool.
|
|
8
|
+
|
|
9
|
+
Delete an entity of any Drupal entity type. Requires allowDestructive = true in security config. Confirm with the user before calling.
|
|
10
|
+
|
|
11
|
+
> ⚠ **Destructive** — this permanently changes or deletes data. Confirm with the user before calling.
|
|
12
|
+
|
|
13
|
+
Parse the request in `$ARGUMENTS` into this tool's parameters:
|
|
14
|
+
|
|
15
|
+
**Required:**
|
|
16
|
+
- `entityType` (string)
|
|
17
|
+
- `bundle` (string)
|
|
18
|
+
- `id` (string)
|
|
19
|
+
|
|
20
|
+
**Optional:**
|
|
21
|
+
- `site` (string): omit for the default site
|
|
22
|
+
- `dryRun` (boolean (true/false)): Validate and return a preview of the delete without committing.
|
|
23
|
+
|
|
24
|
+
If a required parameter is missing from `$ARGUMENTS`, ask before calling — do not invent values. Coerce each value to its JSON type (booleans → true/false, numbers → numeric, object/array → parse JSON), then make the single tool call and summarize the result.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Fetch a single entity of any Drupal entity type by UUID."
|
|
3
|
+
argument-hint: "<entityType> <bundle> <id> [site] [include]"
|
|
4
|
+
allowed-tools: mcp__drupal__drupal_entity_get
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Call the `mcp__drupal__drupal_entity_get` MCP tool.
|
|
8
|
+
|
|
9
|
+
Fetch a single entity of any Drupal entity type by UUID.
|
|
10
|
+
|
|
11
|
+
Parse the request in `$ARGUMENTS` into this tool's parameters:
|
|
12
|
+
|
|
13
|
+
**Required:**
|
|
14
|
+
- `entityType` (string)
|
|
15
|
+
- `bundle` (string)
|
|
16
|
+
- `id` (string): Entity UUID
|
|
17
|
+
|
|
18
|
+
**Optional:**
|
|
19
|
+
- `site` (string): omit for the default site
|
|
20
|
+
- `include` (array (pass as JSON)): Relationship field names to sideload
|
|
21
|
+
|
|
22
|
+
If a required parameter is missing from `$ARGUMENTS`, ask before calling — do not invent values. Coerce each value to its JSON type (booleans → true/false, numbers → numeric, object/array → parse JSON), then make the single tool call and summarize the result.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "List entities of any Drupal entity type and bundle. Supports structured filters, sorting, pagination, and relationship includes. Use drupal_list_entity_types first to discover available types."
|
|
3
|
+
argument-hint: "<entityType> <bundle> [site] [filters] [sort] [include] [limit] [offset]"
|
|
4
|
+
allowed-tools: mcp__drupal__drupal_entity_list
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Call the `mcp__drupal__drupal_entity_list` MCP tool.
|
|
8
|
+
|
|
9
|
+
List entities of any Drupal entity type and bundle. Supports structured filters, sorting, pagination, and relationship includes. Use drupal_list_entity_types first to discover available types.
|
|
10
|
+
|
|
11
|
+
Parse the request in `$ARGUMENTS` into this tool's parameters:
|
|
12
|
+
|
|
13
|
+
**Required:**
|
|
14
|
+
- `entityType` (string): Entity type machine name, e.g. 'paragraph', 'block_content', 'commerce_product'
|
|
15
|
+
- `bundle` (string): Bundle machine name
|
|
16
|
+
|
|
17
|
+
**Optional:**
|
|
18
|
+
- `site` (string): omit for the default site
|
|
19
|
+
- `filters` (array (pass as JSON)): Structured filters: [{ field, op, value }]
|
|
20
|
+
- `sort` (array (pass as JSON)): Sort specs: [{ field, dir }]
|
|
21
|
+
- `include` (array (pass as JSON)): Relationship field names to sideload
|
|
22
|
+
- `limit` (number)
|
|
23
|
+
- `offset` (number)
|
|
24
|
+
|
|
25
|
+
If a required parameter is missing from `$ARGUMENTS`, ask before calling — do not invent values. Coerce each value to its JSON type (booleans → true/false, numbers → numeric, object/array → parse JSON), then make the single tool call and summarize the result.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Update an existing entity of any Drupal entity type. Only include attributes/relationships you want to change."
|
|
3
|
+
argument-hint: "<entityType> <bundle> <id> [site] [attributes] [relationships] [dryRun]"
|
|
4
|
+
allowed-tools: mcp__drupal__drupal_entity_update
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Call the `mcp__drupal__drupal_entity_update` MCP tool.
|
|
8
|
+
|
|
9
|
+
Update an existing entity of any Drupal entity type. Only include attributes/relationships you want to change.
|
|
10
|
+
|
|
11
|
+
Parse the request in `$ARGUMENTS` into this tool's parameters:
|
|
12
|
+
|
|
13
|
+
**Required:**
|
|
14
|
+
- `entityType` (string)
|
|
15
|
+
- `bundle` (string)
|
|
16
|
+
- `id` (string)
|
|
17
|
+
|
|
18
|
+
**Optional:**
|
|
19
|
+
- `site` (string): omit for the default site
|
|
20
|
+
- `attributes` (object (pass as JSON))
|
|
21
|
+
- `relationships` (object (pass as JSON))
|
|
22
|
+
- `dryRun` (boolean (true/false)): Validate and return a preview of the update without committing.
|
|
23
|
+
|
|
24
|
+
If a required parameter is missing from `$ARGUMENTS`, ask before calling — do not invent values. Coerce each value to its JSON type (booleans → true/false, numbers → numeric, object/array → parse JSON), then make the single tool call and summarize the result.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Find media entities not referenced by any content. Useful for storage cleanup audits."
|
|
3
|
+
argument-hint: "[site] [type] [limit]"
|
|
4
|
+
allowed-tools: mcp__drupal__drupal_find_orphaned_media
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Call the `mcp__drupal__drupal_find_orphaned_media` MCP tool.
|
|
8
|
+
|
|
9
|
+
Find media entities not referenced by any content. Useful for storage cleanup audits.
|
|
10
|
+
|
|
11
|
+
Parse the request in `$ARGUMENTS` into this tool's parameters:
|
|
12
|
+
|
|
13
|
+
**Optional:**
|
|
14
|
+
- `site` (string): omit for the default site
|
|
15
|
+
- `type` (string): Media type to check (default: image)
|
|
16
|
+
- `limit` (number)
|
|
17
|
+
|
|
18
|
+
If a required parameter is missing from `$ARGUMENTS`, ask before calling — do not invent values. Coerce each value to its JSON type (booleans → true/false, numbers → numeric, object/array → parse JSON), then make the single tool call and summarize the result.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Inspect the fields and relationships available on any Drupal entity type + bundle. Run this before creating or updating entities to know what fields are available."
|
|
3
|
+
argument-hint: "<entityType> <bundle> [site]"
|
|
4
|
+
allowed-tools: mcp__drupal__drupal_get_entity_schema
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Call the `mcp__drupal__drupal_get_entity_schema` MCP tool.
|
|
8
|
+
|
|
9
|
+
Inspect the fields and relationships available on any Drupal entity type + bundle. Run this before creating or updating entities to know what fields are available.
|
|
10
|
+
|
|
11
|
+
Parse the request in `$ARGUMENTS` into this tool's parameters:
|
|
12
|
+
|
|
13
|
+
**Required:**
|
|
14
|
+
- `entityType` (string): e.g. 'node', 'paragraph', 'commerce_product', 'block_content'
|
|
15
|
+
- `bundle` (string): e.g. 'article', 'text', 'default'
|
|
16
|
+
|
|
17
|
+
**Optional:**
|
|
18
|
+
- `site` (string): omit for the default site
|
|
19
|
+
|
|
20
|
+
If a required parameter is missing from `$ARGUMENTS`, ask before calling — do not invent values. Coerce each value to its JSON type (booleans → true/false, numbers → numeric, object/array → parse JSON), then make the single tool call and summarize the result.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Fetch a single media entity by UUID and media type."
|
|
3
|
+
argument-hint: "<type> <id> [site]"
|
|
4
|
+
allowed-tools: mcp__drupal__drupal_get_media
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Call the `mcp__drupal__drupal_get_media` MCP tool.
|
|
8
|
+
|
|
9
|
+
Fetch a single media entity by UUID and media type.
|
|
10
|
+
|
|
11
|
+
Parse the request in `$ARGUMENTS` into this tool's parameters:
|
|
12
|
+
|
|
13
|
+
**Required:**
|
|
14
|
+
- `type` (string)
|
|
15
|
+
- `id` (string): Media entity UUID
|
|
16
|
+
|
|
17
|
+
**Optional:**
|
|
18
|
+
- `site` (string): omit for the default site
|
|
19
|
+
|
|
20
|
+
If a required parameter is missing from `$ARGUMENTS`, ask before calling — do not invent values. Coerce each value to its JSON type (booleans → true/false, numbers → numeric, object/array → parse JSON), then make the single tool call and summarize the result.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Fetch a single Drupal content node by UUID and content type. Returns title, body, status, path alias, and all attributes."
|
|
3
|
+
argument-hint: "<type> <id> [site]"
|
|
4
|
+
allowed-tools: mcp__drupal__drupal_get_node
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Call the `mcp__drupal__drupal_get_node` MCP tool.
|
|
8
|
+
|
|
9
|
+
Fetch a single Drupal content node by UUID and content type. Returns title, body, status, path alias, and all attributes.
|
|
10
|
+
|
|
11
|
+
Parse the request in `$ARGUMENTS` into this tool's parameters:
|
|
12
|
+
|
|
13
|
+
**Required:**
|
|
14
|
+
- `type` (string): Content type machine name, e.g. 'article'
|
|
15
|
+
- `id` (string): Node UUID
|
|
16
|
+
|
|
17
|
+
**Optional:**
|
|
18
|
+
- `site` (string): Named site (omit for default)
|
|
19
|
+
|
|
20
|
+
If a required parameter is missing from `$ARGUMENTS`, ask before calling — do not invent values. Coerce each value to its JSON type (booleans → true/false, numbers → numeric, object/array → parse JSON), then make the single tool call and summarize the result.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Fetch a single Paragraph entity by paragraph type (bundle) and UUID. Returns the redacted paragraph plus a `ref` ({ type: 'paragraph--<bundle>', id }) you can use to embed it in a host entity's paragraph / ERR field. Note: paragraphs are referenced (by target_id + target_revision_id in the entity API, or by UUID over JSON:API) from a host field rather than queried standalone in production. Governed by the site security policy."
|
|
3
|
+
argument-hint: "<paragraphType> <id> [site]"
|
|
4
|
+
allowed-tools: mcp__drupal__drupal_get_paragraph
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Call the `mcp__drupal__drupal_get_paragraph` MCP tool.
|
|
8
|
+
|
|
9
|
+
Fetch a single Paragraph entity by paragraph type (bundle) and UUID. Returns the redacted paragraph plus a `ref` ({ type: 'paragraph--<bundle>', id }) you can use to embed it in a host entity's paragraph / ERR field. Note: paragraphs are referenced (by target_id + target_revision_id in the entity API, or by UUID over JSON:API) from a host field rather than queried standalone in production. Governed by the site security policy.
|
|
10
|
+
|
|
11
|
+
Parse the request in `$ARGUMENTS` into this tool's parameters:
|
|
12
|
+
|
|
13
|
+
**Required:**
|
|
14
|
+
- `paragraphType` (string): Paragraph type / bundle machine name
|
|
15
|
+
- `id` (string): Paragraph UUID
|
|
16
|
+
|
|
17
|
+
**Optional:**
|
|
18
|
+
- `site` (string): omit for the default site
|
|
19
|
+
|
|
20
|
+
If a required parameter is missing from `$ARGUMENTS`, ask before calling — do not invent values. Coerce each value to its JSON type (booleans → true/false, numbers → numeric, object/array → parse JSON), then make the single tool call and summarize the result.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Fetch a single revision of a content node by version id or alias. `version` may be a numeric vid (e.g. 42), an explicit 'id:<vid>', or the relative aliases 'rel:latest-version' / 'rel:working-copy'. Read-only; attributes are redacted per security policy."
|
|
3
|
+
argument-hint: "<type> <id> <version> [site]"
|
|
4
|
+
allowed-tools: mcp__drupal__drupal_get_revision
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Call the `mcp__drupal__drupal_get_revision` MCP tool.
|
|
8
|
+
|
|
9
|
+
Fetch a single revision of a content node by version id or alias. `version` may be a numeric vid (e.g. 42), an explicit 'id:<vid>', or the relative aliases 'rel:latest-version' / 'rel:working-copy'. Read-only; attributes are redacted per security policy.
|
|
10
|
+
|
|
11
|
+
Parse the request in `$ARGUMENTS` into this tool's parameters:
|
|
12
|
+
|
|
13
|
+
**Required:**
|
|
14
|
+
- `type` (string): Content type machine name
|
|
15
|
+
- `id` (string): Node UUID
|
|
16
|
+
- `version` (string): Numeric vid, 'id:<vid>', 'rel:latest-version', or 'rel:working-copy'.
|
|
17
|
+
|
|
18
|
+
**Optional:**
|
|
19
|
+
- `site` (string): omit for the default site
|
|
20
|
+
|
|
21
|
+
If a required parameter is missing from `$ARGUMENTS`, ask before calling — do not invent values. Coerce each value to its JSON type (booleans → true/false, numbers → numeric, object/array → parse JSON), then make the single tool call and summarize the result.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Fetch a single taxonomy term by UUID."
|
|
3
|
+
argument-hint: "<vocabulary> <id> [site]"
|
|
4
|
+
allowed-tools: mcp__drupal__drupal_get_taxonomy_term
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Call the `mcp__drupal__drupal_get_taxonomy_term` MCP tool.
|
|
8
|
+
|
|
9
|
+
Fetch a single taxonomy term by UUID.
|
|
10
|
+
|
|
11
|
+
Parse the request in `$ARGUMENTS` into this tool's parameters:
|
|
12
|
+
|
|
13
|
+
**Required:**
|
|
14
|
+
- `vocabulary` (string)
|
|
15
|
+
- `id` (string): Term UUID
|
|
16
|
+
|
|
17
|
+
**Optional:**
|
|
18
|
+
- `site` (string): omit for the default site
|
|
19
|
+
|
|
20
|
+
If a required parameter is missing from `$ARGUMENTS`, ask before calling — do not invent values. Coerce each value to its JSON type (booleans → true/false, numbers → numeric, object/array → parse JSON), then make the single tool call and summarize the result.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "List all terms in a taxonomy vocabulary, sorted by name."
|
|
3
|
+
argument-hint: "<vocabulary> [site] [limit] [offset]"
|
|
4
|
+
allowed-tools: mcp__drupal__drupal_get_taxonomy_terms
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Call the `mcp__drupal__drupal_get_taxonomy_terms` MCP tool.
|
|
8
|
+
|
|
9
|
+
List all terms in a taxonomy vocabulary, sorted by name.
|
|
10
|
+
|
|
11
|
+
Parse the request in `$ARGUMENTS` into this tool's parameters:
|
|
12
|
+
|
|
13
|
+
**Required:**
|
|
14
|
+
- `vocabulary` (string): Vocabulary machine name, e.g. 'tags'
|
|
15
|
+
|
|
16
|
+
**Optional:**
|
|
17
|
+
- `site` (string): omit for the default site
|
|
18
|
+
- `limit` (number)
|
|
19
|
+
- `offset` (number)
|
|
20
|
+
|
|
21
|
+
If a required parameter is missing from `$ARGUMENTS`, ask before calling — do not invent values. Coerce each value to its JSON type (booleans → true/false, numbers → numeric, object/array → parse JSON), then make the single tool call and summarize the result.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Look up a Drupal user by their exact username."
|
|
3
|
+
argument-hint: "<name> [site]"
|
|
4
|
+
allowed-tools: mcp__drupal__drupal_get_user_by_name
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Call the `mcp__drupal__drupal_get_user_by_name` MCP tool.
|
|
8
|
+
|
|
9
|
+
Look up a Drupal user by their exact username.
|
|
10
|
+
|
|
11
|
+
Parse the request in `$ARGUMENTS` into this tool's parameters:
|
|
12
|
+
|
|
13
|
+
**Required:**
|
|
14
|
+
- `name` (string): Drupal username (exact match)
|
|
15
|
+
|
|
16
|
+
**Optional:**
|
|
17
|
+
- `site` (string): omit for the default site
|
|
18
|
+
|
|
19
|
+
If a required parameter is missing from `$ARGUMENTS`, ask before calling — do not invent values. Coerce each value to its JSON type (booleans → true/false, numbers → numeric, object/array → parse JSON), then make the single tool call and summarize the result.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Fetch a single Drupal user account by UUID, including their assigned roles."
|
|
3
|
+
argument-hint: "<id> [site]"
|
|
4
|
+
allowed-tools: mcp__drupal__drupal_get_user
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Call the `mcp__drupal__drupal_get_user` MCP tool.
|
|
8
|
+
|
|
9
|
+
Fetch a single Drupal user account by UUID, including their assigned roles.
|
|
10
|
+
|
|
11
|
+
Parse the request in `$ARGUMENTS` into this tool's parameters:
|
|
12
|
+
|
|
13
|
+
**Required:**
|
|
14
|
+
- `id` (string): User UUID
|
|
15
|
+
|
|
16
|
+
**Optional:**
|
|
17
|
+
- `site` (string): omit for the default site
|
|
18
|
+
|
|
19
|
+
If a required parameter is missing from `$ARGUMENTS`, ask before calling — do not invent values. Coerce each value to its JSON type (booleans → true/false, numbers → numeric, object/array → parse JSON), then make the single tool call and summarize the result.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Introspect the Drupal GraphQL schema. Omit typeName for a full schema overview; provide typeName to get detailed fields and args for a specific type."
|
|
3
|
+
argument-hint: "[site] [typeName]"
|
|
4
|
+
allowed-tools: mcp__drupal__drupal_graphql_introspect
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Call the `mcp__drupal__drupal_graphql_introspect` MCP tool.
|
|
8
|
+
|
|
9
|
+
Introspect the Drupal GraphQL schema. Omit typeName for a full schema overview; provide typeName to get detailed fields and args for a specific type.
|
|
10
|
+
|
|
11
|
+
Parse the request in `$ARGUMENTS` into this tool's parameters:
|
|
12
|
+
|
|
13
|
+
**Optional:**
|
|
14
|
+
- `site` (string): omit for the default site
|
|
15
|
+
- `typeName` (string): Name of a specific GraphQL type to inspect in detail (optional)
|
|
16
|
+
|
|
17
|
+
If a required parameter is missing from `$ARGUMENTS`, ask before calling — do not invent values. Coerce each value to its JSON type (booleans → true/false, numbers → numeric, object/array → parse JSON), then make the single tool call and summarize the result.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Execute a GraphQL query against a Drupal site. Requires the GraphQL Compose module (drupal.org/project/graphql_compose), which exposes a read-only schema; mutations are gated by \"allowGraphqlMutations\". Use drupal_graphql_introspect first to discover available types and fields. Example query: query GetArticle($id: String!) { nodeById(id: $id) { title ... on NodeArticle { body { value } } } } Example mutation (only if your GraphQL Compose schema enables mutations): mutation CreateArticle($title: String!, $body: String!) { createNodeArticle(data: { title: $title, body: { value: $body, format: \"full_html\" } }) { entity { title uuid } errors { message } } }"
|
|
3
|
+
argument-hint: "<query> [site] [variables] [operationName]"
|
|
4
|
+
allowed-tools: mcp__drupal__drupal_graphql
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Call the `mcp__drupal__drupal_graphql` MCP tool.
|
|
8
|
+
|
|
9
|
+
Execute a GraphQL query against a Drupal site.
|
|
10
|
+
Requires the GraphQL Compose module (drupal.org/project/graphql_compose), which
|
|
11
|
+
exposes a read-only schema; mutations are gated by "allowGraphqlMutations".
|
|
12
|
+
Use drupal_graphql_introspect first to discover available types and fields.
|
|
13
|
+
|
|
14
|
+
Example query:
|
|
15
|
+
query GetArticle($id: String!) {
|
|
16
|
+
nodeById(id: $id) {
|
|
17
|
+
title
|
|
18
|
+
... on NodeArticle { body { value } }
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
Example mutation (only if your GraphQL Compose schema enables mutations):
|
|
23
|
+
mutation CreateArticle($title: String!, $body: String!) {
|
|
24
|
+
createNodeArticle(data: { title: $title, body: { value: $body, format: "full_html" } }) {
|
|
25
|
+
entity { title uuid }
|
|
26
|
+
errors { message }
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
Parse the request in `$ARGUMENTS` into this tool's parameters:
|
|
31
|
+
|
|
32
|
+
**Required:**
|
|
33
|
+
- `query` (string): GraphQL query or mutation string
|
|
34
|
+
|
|
35
|
+
**Optional:**
|
|
36
|
+
- `site` (string): Named site (omit for default)
|
|
37
|
+
- `variables` (object (pass as JSON)): Variables to pass with the query
|
|
38
|
+
- `operationName` (string): Operation name (for multi-operation documents)
|
|
39
|
+
|
|
40
|
+
If a required parameter is missing from `$ARGUMENTS`, ask before calling — do not invent values. Coerce each value to its JSON type (booleans → true/false, numbers → numeric, object/array → parse JSON), then make the single tool call and summarize the result.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "List custom content blocks (block_content entities), optionally scoped to a single block type (bundle). Returns each block's admin label (info) and body. Does not list code/plugin-defined blocks."
|
|
3
|
+
argument-hint: "[site] [type] [limit] [offset] [sort]"
|
|
4
|
+
allowed-tools: mcp__drupal__drupal_list_blocks
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Call the `mcp__drupal__drupal_list_blocks` MCP tool.
|
|
8
|
+
|
|
9
|
+
List custom content blocks (block_content entities), optionally scoped to a single block type (bundle). Returns each block's admin label (info) and body. Does not list code/plugin-defined blocks.
|
|
10
|
+
|
|
11
|
+
Parse the request in `$ARGUMENTS` into this tool's parameters:
|
|
12
|
+
|
|
13
|
+
**Optional:**
|
|
14
|
+
- `site` (string): omit for the default site
|
|
15
|
+
- `type` (string): Block type (bundle) machine name to filter by, e.g. 'basic'. Omit to list all custom blocks.
|
|
16
|
+
- `limit` (number)
|
|
17
|
+
- `offset` (number)
|
|
18
|
+
- `sort` (array (pass as JSON)): Sort specs: [{ field, dir }]. Defaults to info asc.
|
|
19
|
+
|
|
20
|
+
If a required parameter is missing from `$ARGUMENTS`, ask before calling — do not invent values. Coerce each value to its JSON type (booleans → true/false, numbers → numeric, object/array → parse JSON), then make the single tool call and summarize the result.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "List all content types defined on this Drupal site with their machine names and descriptions."
|
|
3
|
+
argument-hint: "[site]"
|
|
4
|
+
allowed-tools: mcp__drupal__drupal_list_content_types
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Call the `mcp__drupal__drupal_list_content_types` MCP tool.
|
|
8
|
+
|
|
9
|
+
List all content types defined on this Drupal site with their machine names and descriptions.
|
|
10
|
+
|
|
11
|
+
Parse the request in `$ARGUMENTS` into this tool's parameters:
|
|
12
|
+
|
|
13
|
+
**Optional:**
|
|
14
|
+
- `site` (string): omit for the default site
|
|
15
|
+
|
|
16
|
+
If a required parameter is missing from `$ARGUMENTS`, ask before calling — do not invent values. Coerce each value to its JSON type (booleans → true/false, numbers → numeric, object/array → parse JSON), then make the single tool call and summarize the result.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Discover all JSON:API resource types (entity types + bundles) exposed by this Drupal site, filtered to only those your security config allows. Run this before working with an unfamiliar entity type."
|
|
3
|
+
argument-hint: "[site]"
|
|
4
|
+
allowed-tools: mcp__drupal__drupal_list_entity_types
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Call the `mcp__drupal__drupal_list_entity_types` MCP tool.
|
|
8
|
+
|
|
9
|
+
Discover all JSON:API resource types (entity types + bundles) exposed by this Drupal site, filtered to only those your security config allows. Run this before working with an unfamiliar entity type.
|
|
10
|
+
|
|
11
|
+
Parse the request in `$ARGUMENTS` into this tool's parameters:
|
|
12
|
+
|
|
13
|
+
**Optional:**
|
|
14
|
+
- `site` (string): omit for the default site
|
|
15
|
+
|
|
16
|
+
If a required parameter is missing from `$ARGUMENTS`, ask before calling — do not invent values. Coerce each value to its JSON type (booleans → true/false, numbers → numeric, object/array → parse JSON), then make the single tool call and summarize the result.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "List all media types defined on this Drupal site (image, document, remote_video, audio, etc.)."
|
|
3
|
+
argument-hint: "[site]"
|
|
4
|
+
allowed-tools: mcp__drupal__drupal_list_media_types
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Call the `mcp__drupal__drupal_list_media_types` MCP tool.
|
|
8
|
+
|
|
9
|
+
List all media types defined on this Drupal site (image, document, remote_video, audio, etc.).
|
|
10
|
+
|
|
11
|
+
Parse the request in `$ARGUMENTS` into this tool's parameters:
|
|
12
|
+
|
|
13
|
+
**Optional:**
|
|
14
|
+
- `site` (string): omit for the default site
|
|
15
|
+
|
|
16
|
+
If a required parameter is missing from `$ARGUMENTS`, ask before calling — do not invent values. Coerce each value to its JSON type (booleans → true/false, numbers → numeric, object/array → parse JSON), then make the single tool call and summarize the result.
|