drupal-mcp-connector 2.25.0 → 3.0.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/.agents/commands/drupal-audit-site-health.md +1 -1
- package/.agents/commands/drupal-entity-update.md +1 -1
- package/.agents/commands/drupal-report-accessibility-audit.md +4 -2
- package/.agents/commands/drupal-report-alias-coverage.md +4 -2
- package/.agents/commands/drupal-report-broken-embeds.md +4 -2
- package/.agents/commands/drupal-report-broken-links.md +4 -2
- package/.agents/commands/drupal-report-content-by-author.md +4 -2
- package/.agents/commands/drupal-report-duplicate-content.md +4 -2
- package/.agents/commands/drupal-report-missing-field.md +2 -2
- package/.agents/commands/drupal-report-orphan-pages.md +4 -2
- package/.agents/commands/drupal-report-orphaned-references.md +4 -2
- package/.agents/commands/drupal-report-pii-exposure.md +4 -2
- package/.agents/commands/drupal-report-readability.md +4 -2
- package/.agents/commands/drupal-report-recently-published.md +1 -1
- package/.agents/commands/drupal-report-revision-hotspots.md +4 -2
- package/.agents/commands/drupal-report-scheduled-content.md +4 -4
- package/.agents/commands/drupal-report-seo-audit.md +4 -2
- package/.agents/commands/drupal-report-seo-meta-coverage.md +4 -2
- package/.agents/commands/drupal-report-stale-content.md +4 -2
- package/.agents/commands/drupal-report-taxonomy-usage.md +2 -2
- package/.agents/commands/drupal-report-translation-coverage.md +4 -2
- package/.agents/commands/drupal-report-unpublished.md +1 -1
- package/.agents/commands/drupal-report-workflow-bottlenecks.md +4 -2
- package/.agents/commands/drupal-schedule-publish.md +5 -3
- package/.agents/commands/drupal-search-content.md +1 -1
- package/.agents/commands/drupal-search.md +1 -1
- package/.agents/commands/drupal-update-node.md +1 -1
- package/CHANGELOG.md +114 -0
- package/README.md +57 -1
- package/bin/drupal-mcp-doctor.js +16 -0
- package/bin/drupal-mcp-wizard.js +17 -0
- package/package.json +10 -5
- package/src/index.js +19 -19
- package/src/lib/backends/jsonapi.js +19 -7
- package/src/lib/dispatch.js +22 -0
- package/src/lib/doctor.js +645 -0
- package/src/lib/module-tools.js +33 -2
- package/src/lib/operations.js +1 -1
- package/src/lib/patch-preflight.js +32 -32
- package/src/lib/principal.js +13 -5
- package/src/lib/reports-support.js +68 -0
- package/src/lib/security.js +42 -44
- package/src/lib/sentinel-draft.js +59 -3
- package/src/lib/server-tools.js +3 -3
- package/src/lib/transports.js +153 -0
- package/src/lib/version-skew.js +193 -0
- package/src/lib/wizard.js +902 -0
- package/src/lib/workflow-prompts.js +5 -5
- package/src/tools/audit-composite.js +21 -11
- package/src/tools/codegen.js +2 -2
- package/src/tools/config.js +11 -6
- package/src/tools/entities.js +1 -1
- package/src/tools/index.js +1 -1
- package/src/tools/media.js +2 -2
- package/src/tools/nodes.js +17 -9
- package/src/tools/reports-config.js +3 -3
- package/src/tools/reports-content.js +109 -39
- package/src/tools/reports-extra.js +56 -32
- package/src/tools/reports-links.js +13 -13
- package/src/tools/reports.js +65 -42
- package/src/tools/revisions.js +2 -1
- package/src/tools/scheduler.js +142 -27
- package/src/tools/search.js +16 -12
- package/src/tools/translations.js +7 -1
|
@@ -11,7 +11,7 @@ Parse the arguments supplied with this command into this tool's parameters:
|
|
|
11
11
|
|
|
12
12
|
**Optional:**
|
|
13
13
|
- `site` (string): Named site from connector config. Omit only on reads: multi-site configs fall back to defaultSite (often local/dev, not production). Writes require an explicit site when more than one site is configured. Every response includes `_target` { name, baseUrl, source } (`hint` when you passed site, `default` when you did not).
|
|
14
|
-
- `type` (string):
|
|
14
|
+
- `type` (string): Content type for the content/link sections. Omit it and those sections are reported unavailable; site-wide sections still run.
|
|
15
15
|
- `sampleSize` (number): Per-section scan cap (kept small for a fast roll-up)
|
|
16
16
|
- `sections` (array (pass as JSON)): Subset of sections to run (default: all). Available: content_summary, stale_content, seo_audit, accessibility, duplicate_content, readability, pii_exposure, broken_links, redirect_health, alias_coverage, log_404, config_best_practices, module_audit, permission_audit
|
|
17
17
|
|
|
@@ -19,7 +19,7 @@ Parse the arguments supplied with this command into this tool's parameters:
|
|
|
19
19
|
- `langcode` (string): Target language for an unpublished working translation (nodes). Continues that translation via Sentinel.
|
|
20
20
|
- `attributes` (object (pass as JSON))
|
|
21
21
|
- `relationships` (object (pass as JSON))
|
|
22
|
-
- `dryRun` (boolean (true/false)): Validate, resolve ERR identifiers, run the server-side preflight when one applies, and return a preview without the real write. The result's `checks` block says what was checked; `caveat` names what was not. Only an existing node draft (or a langcode translation draft) is checked with the real payload: Sentinel's non-saving draft endpoint applies the submitted fields through field access and validates the entity (`serverPreflight: sentinel_draft`). On other moderated targets an id-mismatch core PATCH with no fields checks entity update access and core's working-copy guard only; field access and entity validation are NOT checked (`core_patch_guard`), so the real write can still fail with a field-access 403 or a 422. Unmoderated targets get no server-side check at all (`none`). A
|
|
22
|
+
- `dryRun` (boolean (true/false)): Validate, resolve ERR identifiers, run the server-side preflight when one applies, and return a preview without the real write. The result's `checks` block says what was checked; `caveat` names what was not. Only an existing node draft (or a langcode translation draft) is checked with the real payload: Sentinel's non-saving draft endpoint applies the submitted fields through field access and validates the entity (`serverPreflight: sentinel_draft`). On other moderated targets an id-mismatch core PATCH with no fields checks entity update access and core's working-copy guard only; field access and entity validation are NOT checked (`core_patch_guard`), so the real write can still fail with a field-access 403 or a 422. Unmoderated targets get no server-side check at all (`none`). A changed/revision_timestamp gap on the default revision (possiblyPatchBlocked) is a warning on list_revisions, not a local dryRun refusal — the write proceeds to the core probe / Sentinel (#405). An actual Sentinel stale-copy refusal is still rewritten. Any refusal fails the dryRun.
|
|
23
23
|
- `returning` (one of: full, minimal): Response verbosity. "full" (default) returns the complete saved entity; "minimal" returns just identity + state (id, type, bundle, title, status, changed, url) — much smaller, recommended for bulk writes where the echoed body would dominate the response.
|
|
24
24
|
|
|
25
25
|
If a required parameter is missing, 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.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: "Accessibility audit for body content: images without alt text, inline H1 tags, non-descriptive link text ('click here', 'read more'), and tables without captions."
|
|
3
|
-
argument-hint: "[site] [
|
|
3
|
+
argument-hint: "<type> [site] [sampleSize]"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
Call the MCP tool `drupal_report_accessibility_audit`.
|
|
@@ -9,9 +9,11 @@ Accessibility audit for body content: images without alt text, inline H1 tags, n
|
|
|
9
9
|
|
|
10
10
|
Parse the arguments supplied with this command into this tool's parameters:
|
|
11
11
|
|
|
12
|
+
**Required:**
|
|
13
|
+
- `type` (string): Content type machine name (required; see drupal_list_content_types)
|
|
14
|
+
|
|
12
15
|
**Optional:**
|
|
13
16
|
- `site` (string): Named site from connector config. Omit only on reads: multi-site configs fall back to defaultSite (often local/dev, not production). Writes require an explicit site when more than one site is configured. Every response includes `_target` { name, baseUrl, source } (`hint` when you passed site, `default` when you did not).
|
|
14
|
-
- `type` (string): Content type (default: article)
|
|
15
17
|
- `sampleSize` (number)
|
|
16
18
|
|
|
17
19
|
If a required parameter is missing, 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.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: "URL-alias coverage for a content type: nodes whose canonical URL is still /node/N (no alias / pathauto gap), plus conflicting aliases (one alias mapped to multiple system paths) when the path_alias entity is exposed."
|
|
3
|
-
argument-hint: "[site] [
|
|
3
|
+
argument-hint: "<type> [site] [sampleSize]"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
Call the MCP tool `drupal_report_alias_coverage`.
|
|
@@ -9,9 +9,11 @@ URL-alias coverage for a content type: nodes whose canonical URL is still /node/
|
|
|
9
9
|
|
|
10
10
|
Parse the arguments supplied with this command into this tool's parameters:
|
|
11
11
|
|
|
12
|
+
**Required:**
|
|
13
|
+
- `type` (string): Content type machine name (required; see drupal_list_content_types)
|
|
14
|
+
|
|
12
15
|
**Optional:**
|
|
13
16
|
- `site` (string): Named site from connector config. Omit only on reads: multi-site configs fall back to defaultSite (often local/dev, not production). Writes require an explicit site when more than one site is configured. Every response includes `_target` { name, baseUrl, source } (`hint` when you passed site, `default` when you did not).
|
|
14
|
-
- `type` (string): Content type (default: article)
|
|
15
17
|
- `sampleSize` (number): Max nodes to scan
|
|
16
18
|
|
|
17
19
|
If a required parameter is missing, 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.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: "Scan published body content for embedded entities (media/entity embeds) and report usage by type, flagging embeds with a missing/malformed data-entity-uuid. Full target-existence verification is gated on a future server-tool."
|
|
3
|
-
argument-hint: "[site] [
|
|
3
|
+
argument-hint: "<type> [site] [sampleSize]"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
Call the MCP tool `drupal_report_broken_embeds`.
|
|
@@ -9,9 +9,11 @@ Scan published body content for embedded entities (media/entity embeds) and repo
|
|
|
9
9
|
|
|
10
10
|
Parse the arguments supplied with this command into this tool's parameters:
|
|
11
11
|
|
|
12
|
+
**Required:**
|
|
13
|
+
- `type` (string): Content type machine name (required; see drupal_list_content_types)
|
|
14
|
+
|
|
12
15
|
**Optional:**
|
|
13
16
|
- `site` (string): Named site from connector config. Omit only on reads: multi-site configs fall back to defaultSite (often local/dev, not production). Writes require an explicit site when more than one site is configured. Every response includes `_target` { name, baseUrl, source } (`hint` when you passed site, `default` when you did not).
|
|
14
|
-
- `type` (string): Content type (default: article)
|
|
15
17
|
- `sampleSize` (number): Max nodes to scan
|
|
16
18
|
|
|
17
19
|
If a required parameter is missing, 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.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: "Inventory links in published body content (internal/external/images), aggregate external hosts, and flag malformed hrefs. With checkLive:true, verifies links via bounded, SSRF-guarded outbound HTTP (internal always; external only if includeExternal and host-allowlisted). No network egress unless checkLive is set."
|
|
3
|
-
argument-hint: "[site] [
|
|
3
|
+
argument-hint: "<type> [site] [sampleSize] [checkLive] [includeExternal]"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
Call the MCP tool `drupal_report_broken_links`.
|
|
@@ -9,9 +9,11 @@ Inventory links in published body content (internal/external/images), aggregate
|
|
|
9
9
|
|
|
10
10
|
Parse the arguments supplied with this command into this tool's parameters:
|
|
11
11
|
|
|
12
|
+
**Required:**
|
|
13
|
+
- `type` (string): Content type machine name (required; see drupal_list_content_types)
|
|
14
|
+
|
|
12
15
|
**Optional:**
|
|
13
16
|
- `site` (string): Named site from connector config. Omit only on reads: multi-site configs fall back to defaultSite (often local/dev, not production). Writes require an explicit site when more than one site is configured. Every response includes `_target` { name, baseUrl, source } (`hint` when you passed site, `default` when you did not).
|
|
14
|
-
- `type` (string): Content type (default: article)
|
|
15
17
|
- `sampleSize` (number): Max nodes to scan
|
|
16
18
|
- `checkLive` (boolean (true/false)): Perform live HTTP checks (off by default)
|
|
17
19
|
- `includeExternal` (boolean (true/false)): When checkLive, also check allowlisted external hosts
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: "Count nodes per author for a given content type. Returns author UUIDs and counts sorted by most prolific."
|
|
3
|
-
argument-hint: "[site] [
|
|
3
|
+
argument-hint: "<type> [site] [limit]"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
Call the MCP tool `drupal_report_content_by_author`.
|
|
@@ -9,9 +9,11 @@ Count nodes per author for a given content type. Returns author UUIDs and counts
|
|
|
9
9
|
|
|
10
10
|
Parse the arguments supplied with this command into this tool's parameters:
|
|
11
11
|
|
|
12
|
+
**Required:**
|
|
13
|
+
- `type` (string): Content type machine name (required; see drupal_list_content_types)
|
|
14
|
+
|
|
12
15
|
**Optional:**
|
|
13
16
|
- `site` (string): Named site from connector config. Omit only on reads: multi-site configs fall back to defaultSite (often local/dev, not production). Writes require an explicit site when more than one site is configured. Every response includes `_target` { name, baseUrl, source } (`hint` when you passed site, `default` when you did not).
|
|
14
|
-
- `type` (string): Content type (default: article)
|
|
15
17
|
- `limit` (number): Max nodes to scan
|
|
16
18
|
|
|
17
19
|
If a required parameter is missing, 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.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: "Find duplicate / near-duplicate titles within a content type (normalized title grouping). Surfaces accidental re-publishing and content cannibalization."
|
|
3
|
-
argument-hint: "[site] [
|
|
3
|
+
argument-hint: "<type> [site] [sampleSize]"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
Call the MCP tool `drupal_report_duplicate_content`.
|
|
@@ -9,9 +9,11 @@ Find duplicate / near-duplicate titles within a content type (normalized title g
|
|
|
9
9
|
|
|
10
10
|
Parse the arguments supplied with this command into this tool's parameters:
|
|
11
11
|
|
|
12
|
+
**Required:**
|
|
13
|
+
- `type` (string): Content type machine name (required; see drupal_list_content_types)
|
|
14
|
+
|
|
12
15
|
**Optional:**
|
|
13
16
|
- `site` (string): Named site from connector config. Omit only on reads: multi-site configs fall back to defaultSite (often local/dev, not production). Writes require an explicit site when more than one site is configured. Every response includes `_target` { name, baseUrl, source } (`hint` when you passed site, `default` when you did not).
|
|
14
|
-
- `type` (string): Content type (default: article)
|
|
15
17
|
- `sampleSize` (number): Max nodes to scan
|
|
16
18
|
|
|
17
19
|
If a required parameter is missing, 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.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: "Find entities of a content type where a given field is empty (e.g. a missing meta description, image, or summary). Works for scalar fields and entity-reference fields. Sampling-bounded — flags 'approximate' when the scan is capped. An absent field is not an empty one: JSON:API leaves out a field this account may not view. When the field is absent from every sampled entity the result is `notVisible: true` with no findings (the field may be denied to this account, not exist on the bundle, or be misspelled) instead of every entity counted as missing. Otherwise each finding has `reason` 'empty' (key present, no value) or 'absent' (key missing, possibly access-denied)."
|
|
3
|
-
argument-hint: "<field> [site] [
|
|
3
|
+
argument-hint: "<type> <field> [site] [sampleSize]"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
Call the MCP tool `drupal_report_missing_field`.
|
|
@@ -10,11 +10,11 @@ Find entities of a content type where a given field is empty (e.g. a missing met
|
|
|
10
10
|
Parse the arguments supplied with this command into this tool's parameters:
|
|
11
11
|
|
|
12
12
|
**Required:**
|
|
13
|
+
- `type` (string): Content type machine name (required; see drupal_list_content_types)
|
|
13
14
|
- `field` (string): Field machine name to check for emptiness, e.g. 'field_meta_description', 'field_image'
|
|
14
15
|
|
|
15
16
|
**Optional:**
|
|
16
17
|
- `site` (string): Named site from connector config. Omit only on reads: multi-site configs fall back to defaultSite (often local/dev, not production). Writes require an explicit site when more than one site is configured. Every response includes `_target` { name, baseUrl, source } (`hint` when you passed site, `default` when you did not).
|
|
17
|
-
- `type` (string): Content type machine name (default: article)
|
|
18
18
|
- `sampleSize` (number): Max entities to scan
|
|
19
19
|
|
|
20
20
|
If a required parameter is missing, 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.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: "Find published pages with no inbound internal links from other sampled pages — content islands. Best-effort over the sampled set."
|
|
3
|
-
argument-hint: "[site] [
|
|
3
|
+
argument-hint: "<type> [site] [sampleSize]"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
Call the MCP tool `drupal_report_orphan_pages`.
|
|
@@ -9,9 +9,11 @@ Find published pages with no inbound internal links from other sampled pages —
|
|
|
9
9
|
|
|
10
10
|
Parse the arguments supplied with this command into this tool's parameters:
|
|
11
11
|
|
|
12
|
+
**Required:**
|
|
13
|
+
- `type` (string): Content type machine name (required; see drupal_list_content_types)
|
|
14
|
+
|
|
12
15
|
**Optional:**
|
|
13
16
|
- `site` (string): Named site from connector config. Omit only on reads: multi-site configs fall back to defaultSite (often local/dev, not production). Writes require an explicit site when more than one site is configured. Every response includes `_target` { name, baseUrl, source } (`hint` when you passed site, `default` when you did not).
|
|
14
|
-
- `type` (string): Content type (default: article)
|
|
15
17
|
- `sampleSize` (number)
|
|
16
18
|
|
|
17
19
|
If a required parameter is missing, 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.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: "Find entities whose entity-reference fields point at targets that no longer exist (orphaned references). Best-effort: samples entities and probes each distinct referenced target via JSON:API. A 404 (or unaddressable ref) is an orphan; 401/403 and connector policy denials are counted as unverifiable, not missing. uid/revision_uid are skipped when the policy denies user. Flags 'approximate' when sampling-bounded."
|
|
3
|
-
argument-hint: "[site] [
|
|
3
|
+
argument-hint: "<type> [site] [sampleSize]"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
Call the MCP tool `drupal_report_orphaned_references`.
|
|
@@ -9,9 +9,11 @@ Find entities whose entity-reference fields point at targets that no longer exis
|
|
|
9
9
|
|
|
10
10
|
Parse the arguments supplied with this command into this tool's parameters:
|
|
11
11
|
|
|
12
|
+
**Required:**
|
|
13
|
+
- `type` (string): Content type machine name (required; see drupal_list_content_types)
|
|
14
|
+
|
|
12
15
|
**Optional:**
|
|
13
16
|
- `site` (string): Named site from connector config. Omit only on reads: multi-site configs fall back to defaultSite (often local/dev, not production). Writes require an explicit site when more than one site is configured. Every response includes `_target` { name, baseUrl, source } (`hint` when you passed site, `default` when you did not).
|
|
14
|
-
- `type` (string): Content type machine name to scan (default: article)
|
|
15
17
|
- `sampleSize` (number): Max entities to scan for broken references
|
|
16
18
|
|
|
17
19
|
If a required parameter is missing, 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.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: "Scan published body content for accidentally exposed PII (emails, US SSNs, phone numbers). Matched values are masked in the output so the report itself doesn't leak data."
|
|
3
|
-
argument-hint: "[site] [
|
|
3
|
+
argument-hint: "<type> [site] [sampleSize] [kinds]"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
Call the MCP tool `drupal_report_pii_exposure`.
|
|
@@ -9,9 +9,11 @@ Scan published body content for accidentally exposed PII (emails, US SSNs, phone
|
|
|
9
9
|
|
|
10
10
|
Parse the arguments supplied with this command into this tool's parameters:
|
|
11
11
|
|
|
12
|
+
**Required:**
|
|
13
|
+
- `type` (string): Content type machine name (required; see drupal_list_content_types)
|
|
14
|
+
|
|
12
15
|
**Optional:**
|
|
13
16
|
- `site` (string): Named site from connector config. Omit only on reads: multi-site configs fall back to defaultSite (often local/dev, not production). Writes require an explicit site when more than one site is configured. Every response includes `_target` { name, baseUrl, source } (`hint` when you passed site, `default` when you did not).
|
|
14
|
-
- `type` (string): Content type (default: article)
|
|
15
17
|
- `sampleSize` (number)
|
|
16
18
|
- `kinds` (array (pass as JSON)): PII kinds to scan (default: all)
|
|
17
19
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: "Score body readability (Flesch Reading Ease) for a content type and flag hard-to-read content and structural issues (no H2 subheadings, multiple H1s)."
|
|
3
|
-
argument-hint: "[site] [
|
|
3
|
+
argument-hint: "<type> [site] [sampleSize] [hardThreshold]"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
Call the MCP tool `drupal_report_readability`.
|
|
@@ -9,9 +9,11 @@ Score body readability (Flesch Reading Ease) for a content type and flag hard-to
|
|
|
9
9
|
|
|
10
10
|
Parse the arguments supplied with this command into this tool's parameters:
|
|
11
11
|
|
|
12
|
+
**Required:**
|
|
13
|
+
- `type` (string): Content type machine name (required; see drupal_list_content_types)
|
|
14
|
+
|
|
12
15
|
**Optional:**
|
|
13
16
|
- `site` (string): Named site from connector config. Omit only on reads: multi-site configs fall back to defaultSite (often local/dev, not production). Writes require an explicit site when more than one site is configured. Every response includes `_target` { name, baseUrl, source } (`hint` when you passed site, `default` when you did not).
|
|
14
|
-
- `type` (string): Content type (default: article)
|
|
15
17
|
- `sampleSize` (number)
|
|
16
18
|
- `hardThreshold` (number): Flag content scoring below this
|
|
17
19
|
|
|
@@ -11,7 +11,7 @@ Parse the arguments supplied with this command into this tool's parameters:
|
|
|
11
11
|
|
|
12
12
|
**Optional:**
|
|
13
13
|
- `site` (string): Named site from connector config. Omit only on reads: multi-site configs fall back to defaultSite (often local/dev, not production). Writes require an explicit site when more than one site is configured. Every response includes `_target` { name, baseUrl, source } (`hint` when you passed site, `default` when you did not).
|
|
14
|
-
- `type` (string): Content type (
|
|
14
|
+
- `type` (string): Content type machine name. Omit to read every node bundle (results merged, newest first; unreadable bundles listed in bundleErrors).
|
|
15
15
|
- `limit` (number)
|
|
16
16
|
|
|
17
17
|
If a required parameter is missing, 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.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: "Find nodes with the most revision activity — useful for spotting churn or content that needs editorial process review. Requires Drupal 9.3+ JSON:API revisions."
|
|
3
|
-
argument-hint: "[site] [
|
|
3
|
+
argument-hint: "<type> [site] [limit]"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
Call the MCP tool `drupal_report_revision_hotspots`.
|
|
@@ -9,9 +9,11 @@ Find nodes with the most revision activity — useful for spotting churn or cont
|
|
|
9
9
|
|
|
10
10
|
Parse the arguments supplied with this command into this tool's parameters:
|
|
11
11
|
|
|
12
|
+
**Required:**
|
|
13
|
+
- `type` (string): Content type machine name (required; see drupal_list_content_types)
|
|
14
|
+
|
|
12
15
|
**Optional:**
|
|
13
16
|
- `site` (string): Named site from connector config. Omit only on reads: multi-site configs fall back to defaultSite (often local/dev, not production). Writes require an explicit site when more than one site is configured. Every response includes `_target` { name, baseUrl, source } (`hint` when you passed site, `default` when you did not).
|
|
14
|
-
- `type` (string): Content type (default: article)
|
|
15
17
|
- `limit` (number)
|
|
16
18
|
|
|
17
19
|
If a required parameter is missing, 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.
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: "Report content with Scheduler publish/unpublish dates set, split into pending (future) and overdue (past, action not run).
|
|
2
|
+
description: "Report content with Scheduler publish/unpublish dates set, split into pending (future) and overdue (past, action not run). Omit type to scan every node bundle in one call (one row per bundle in byContentType). A bundle is gated only when sampled nodes carry no publish_on/unpublish_on key at all; fields that exist but are empty report pending 0 / overdue 0. A bundle with no nodes reports zero counts with schedulerFields 'unknown'."
|
|
3
3
|
argument-hint: "[site] [type] [sampleSize]"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
Call the MCP tool `drupal_report_scheduled_content`.
|
|
7
7
|
|
|
8
|
-
Report content with Scheduler publish/unpublish dates set, split into pending (future) and overdue (past, action not run).
|
|
8
|
+
Report content with Scheduler publish/unpublish dates set, split into pending (future) and overdue (past, action not run). Omit type to scan every node bundle in one call (one row per bundle in byContentType). A bundle is gated only when sampled nodes carry no publish_on/unpublish_on key at all; fields that exist but are empty report pending 0 / overdue 0. A bundle with no nodes reports zero counts with schedulerFields 'unknown'.
|
|
9
9
|
|
|
10
10
|
Parse the arguments supplied with this command into this tool's parameters:
|
|
11
11
|
|
|
12
12
|
**Optional:**
|
|
13
13
|
- `site` (string): Named site from connector config. Omit only on reads: multi-site configs fall back to defaultSite (often local/dev, not production). Writes require an explicit site when more than one site is configured. Every response includes `_target` { name, baseUrl, source } (`hint` when you passed site, `default` when you did not).
|
|
14
|
-
- `type` (string): Content type
|
|
15
|
-
- `sampleSize` (number)
|
|
14
|
+
- `type` (string): Content type machine name. Omit to scan every node bundle.
|
|
15
|
+
- `sampleSize` (number): Max nodes to scan per content type
|
|
16
16
|
|
|
17
17
|
If a required parameter is missing, 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.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: "SEO audit for a content type: missing meta descriptions, title length issues, and thin content (under 300 words). Returns node lists for each issue category. Meta descriptions use the rendered Metatag output via GraphQL when available (reported as `metaSource`); when no description source is readable it reports the meta check as unavailable rather than a false zero."
|
|
3
|
-
argument-hint: "[site] [
|
|
3
|
+
argument-hint: "<type> [site] [sampleSize]"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
Call the MCP tool `drupal_report_seo_audit`.
|
|
@@ -9,9 +9,11 @@ SEO audit for a content type: missing meta descriptions, title length issues, an
|
|
|
9
9
|
|
|
10
10
|
Parse the arguments supplied with this command into this tool's parameters:
|
|
11
11
|
|
|
12
|
+
**Required:**
|
|
13
|
+
- `type` (string): Content type machine name (required; see drupal_list_content_types)
|
|
14
|
+
|
|
12
15
|
**Optional:**
|
|
13
16
|
- `site` (string): Named site from connector config. Omit only on reads: multi-site configs fall back to defaultSite (often local/dev, not production). Writes require an explicit site when more than one site is configured. Every response includes `_target` { name, baseUrl, source } (`hint` when you passed site, `default` when you did not).
|
|
14
|
-
- `type` (string): Content type (default: article)
|
|
15
17
|
- `sampleSize` (number)
|
|
16
18
|
|
|
17
19
|
If a required parameter is missing, 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.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: "Report structured-meta (SEO) coverage for a content type: how many sampled nodes populate each meta field (metatag, meta description). Complements drupal_report_seo_audit with explicit per-field coverage. Reads scalar and entity-reference fields. A field absent from every sampled node has `present: false` and `coverage: null` (unknown, not 0), and is listed in `notVisible` when you named it. When none of the checked fields is visible, no node is flagged and `nodesMissingAllMeta` is null: JSON:API leaves out a field this account may not view."
|
|
3
|
-
argument-hint: "[site] [
|
|
3
|
+
argument-hint: "<type> [site] [fields] [sampleSize]"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
Call the MCP tool `drupal_report_seo_meta_coverage`.
|
|
@@ -9,9 +9,11 @@ Report structured-meta (SEO) coverage for a content type: how many sampled nodes
|
|
|
9
9
|
|
|
10
10
|
Parse the arguments supplied with this command into this tool's parameters:
|
|
11
11
|
|
|
12
|
+
**Required:**
|
|
13
|
+
- `type` (string): Content type machine name (required; see drupal_list_content_types)
|
|
14
|
+
|
|
12
15
|
**Optional:**
|
|
13
16
|
- `site` (string): Named site from connector config. Omit only on reads: multi-site configs fall back to defaultSite (often local/dev, not production). Writes require an explicit site when more than one site is configured. Every response includes `_target` { name, baseUrl, source } (`hint` when you passed site, `default` when you did not).
|
|
14
|
-
- `type` (string): Content type (default: article)
|
|
15
17
|
- `fields` (array (pass as JSON)): Meta field machine names to check
|
|
16
18
|
- `sampleSize` (number)
|
|
17
19
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: "Find content that hasn't been updated in N days. Returns a sorted list with titles, status, and days-since-update."
|
|
3
|
-
argument-hint: "[site] [
|
|
3
|
+
argument-hint: "<type> [site] [days] [status] [limit]"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
Call the MCP tool `drupal_report_stale_content`.
|
|
@@ -9,9 +9,11 @@ Find content that hasn't been updated in N days. Returns a sorted list with titl
|
|
|
9
9
|
|
|
10
10
|
Parse the arguments supplied with this command into this tool's parameters:
|
|
11
11
|
|
|
12
|
+
**Required:**
|
|
13
|
+
- `type` (string): Content type machine name (required; see drupal_list_content_types)
|
|
14
|
+
|
|
12
15
|
**Optional:**
|
|
13
16
|
- `site` (string): Named site from connector config. Omit only on reads: multi-site configs fall back to defaultSite (often local/dev, not production). Writes require an explicit site when more than one site is configured. Every response includes `_target` { name, baseUrl, source } (`hint` when you passed site, `default` when you did not).
|
|
14
|
-
- `type` (string): Content type (default: article)
|
|
15
17
|
- `days` (number): Stale threshold in days
|
|
16
18
|
- `status` (boolean (true/false)): Filter by publish status
|
|
17
19
|
- `limit` (number)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: "Count how many nodes use each term in a vocabulary. Identifies over-used, under-used, and orphaned terms."
|
|
3
|
-
argument-hint: "<vocabulary> [site] [
|
|
3
|
+
argument-hint: "<vocabulary> <contentType> [site] [referenceField] [limit]"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
Call the MCP tool `drupal_report_taxonomy_usage`.
|
|
@@ -11,10 +11,10 @@ Parse the arguments supplied with this command into this tool's parameters:
|
|
|
11
11
|
|
|
12
12
|
**Required:**
|
|
13
13
|
- `vocabulary` (string): Vocabulary machine name, e.g. 'tags', 'category'
|
|
14
|
+
- `contentType` (string): Content type machine name (required; see drupal_list_content_types)
|
|
14
15
|
|
|
15
16
|
**Optional:**
|
|
16
17
|
- `site` (string): Named site from connector config. Omit only on reads: multi-site configs fall back to defaultSite (often local/dev, not production). Writes require an explicit site when more than one site is configured. Every response includes `_target` { name, baseUrl, source } (`hint` when you passed site, `default` when you did not).
|
|
17
|
-
- `contentType` (string): Content type to count references from (default: article)
|
|
18
18
|
- `referenceField` (string): Field referencing the vocabulary (default: field_{vocabulary})
|
|
19
19
|
- `limit` (number)
|
|
20
20
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: "Per-node translation coverage from Sentinel's inventory (missing non-default language, outdated core flag, language counts). Without Sentinel the report is unavailable — JSON:API only shows the default language, so a histogram would be misleading."
|
|
3
|
-
argument-hint: "[site] [
|
|
3
|
+
argument-hint: "<type> [site] [sampleSize]"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
Call the MCP tool `drupal_report_translation_coverage`.
|
|
@@ -9,9 +9,11 @@ Per-node translation coverage from Sentinel's inventory (missing non-default lan
|
|
|
9
9
|
|
|
10
10
|
Parse the arguments supplied with this command into this tool's parameters:
|
|
11
11
|
|
|
12
|
+
**Required:**
|
|
13
|
+
- `type` (string): Content type machine name (required; see drupal_list_content_types)
|
|
14
|
+
|
|
12
15
|
**Optional:**
|
|
13
16
|
- `site` (string): Named site from connector config. Omit only on reads: multi-site configs fall back to defaultSite (often local/dev, not production). Writes require an explicit site when more than one site is configured. Every response includes `_target` { name, baseUrl, source } (`hint` when you passed site, `default` when you did not).
|
|
14
|
-
- `type` (string): Content type (default: article)
|
|
15
17
|
- `sampleSize` (number): Max nodes to inventory
|
|
16
18
|
|
|
17
19
|
If a required parameter is missing, 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.
|
|
@@ -11,7 +11,7 @@ Parse the arguments supplied with this command into this tool's parameters:
|
|
|
11
11
|
|
|
12
12
|
**Optional:**
|
|
13
13
|
- `site` (string): Named site from connector config. Omit only on reads: multi-site configs fall back to defaultSite (often local/dev, not production). Writes require an explicit site when more than one site is configured. Every response includes `_target` { name, baseUrl, source } (`hint` when you passed site, `default` when you did not).
|
|
14
|
-
- `type` (string): Content type machine name (
|
|
14
|
+
- `type` (string): Content type machine name. Omit to read every node bundle (results merged, newest first; unreadable bundles listed in bundleErrors).
|
|
15
15
|
- `limit` (number): Max unpublished nodes to return
|
|
16
16
|
|
|
17
17
|
If a required parameter is missing, 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.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: "Find content stuck in a non-published moderation state (draft/needs_review) beyond N days — editorial bottlenecks. Reads moderation_state; gated when content_moderation isn't exposed."
|
|
3
|
-
argument-hint: "[site] [
|
|
3
|
+
argument-hint: "<type> [site] [days] [states] [langcode] [sampleSize]"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
Call the MCP tool `drupal_report_workflow_bottlenecks`.
|
|
@@ -9,9 +9,11 @@ Find content stuck in a non-published moderation state (draft/needs_review) beyo
|
|
|
9
9
|
|
|
10
10
|
Parse the arguments supplied with this command into this tool's parameters:
|
|
11
11
|
|
|
12
|
+
**Required:**
|
|
13
|
+
- `type` (string): Content type machine name (required; see drupal_list_content_types)
|
|
14
|
+
|
|
12
15
|
**Optional:**
|
|
13
16
|
- `site` (string): Named site from connector config. Omit only on reads: multi-site configs fall back to defaultSite (often local/dev, not production). Writes require an explicit site when more than one site is configured. Every response includes `_target` { name, baseUrl, source } (`hint` when you passed site, `default` when you did not).
|
|
14
|
-
- `type` (string): Content type (default: article)
|
|
15
17
|
- `days` (number): Days-in-state threshold
|
|
16
18
|
- `states` (array (pass as JSON)): Moderation states to treat as bottlenecks
|
|
17
19
|
- `langcode` (string): Limit to this translation (Sentinel inventory). Omit for the default-language field on each node.
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: "Schedule a content node to publish and/or unpublish at a future time using the Drupal Scheduler module. Sets the publish_on and unpublish_on fields on the node.
|
|
3
|
-
argument-hint: "<type> <id> [site] [publishOn] [unpublishOn]"
|
|
2
|
+
description: "Schedule a content node to publish and/or unpublish at a future time using the Drupal Scheduler module. Sets the publish_on and unpublish_on fields on the node. Provide at least one of publishOn or unpublishOn. Moderated bundles (Content Moderation) also need a target state: pass publishState / unpublishState (moderation state machine names, e.g. 'published', 'archived'), written as publish_state / unpublish_state. These fields exist only when the Scheduler Content Moderation Integration module is enabled. When the bundle exposes a state field and its date is set without the state, the call fails, because Drupal would accept a schedule that never runs. When a moderated bundle has no state field, the dates are written and the result carries a warning. Whether this account may schedule a given transition is decided by the site (Drupal validation and MCP Sentinel policy), not the connector; a refusal returns the site's reason verbatim. Without the Scheduler module on the content type, the call fails with a capability error. Timestamps accept ISO 8601 (e.g. '2026-07-01T12:00:00Z') or a Unix epoch and are passed through unchanged."
|
|
3
|
+
argument-hint: "<type> <id> [site] [publishOn] [unpublishOn] [publishState] [unpublishState]"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
Call the MCP tool `drupal_schedule_publish`.
|
|
7
7
|
|
|
8
|
-
Schedule a content node to publish and/or unpublish at a future time using the Drupal Scheduler module. Sets the publish_on and unpublish_on fields on the node.
|
|
8
|
+
Schedule a content node to publish and/or unpublish at a future time using the Drupal Scheduler module. Sets the publish_on and unpublish_on fields on the node. Provide at least one of publishOn or unpublishOn. Moderated bundles (Content Moderation) also need a target state: pass publishState / unpublishState (moderation state machine names, e.g. 'published', 'archived'), written as publish_state / unpublish_state. These fields exist only when the Scheduler Content Moderation Integration module is enabled. When the bundle exposes a state field and its date is set without the state, the call fails, because Drupal would accept a schedule that never runs. When a moderated bundle has no state field, the dates are written and the result carries a warning. Whether this account may schedule a given transition is decided by the site (Drupal validation and MCP Sentinel policy), not the connector; a refusal returns the site's reason verbatim. Without the Scheduler module on the content type, the call fails with a capability error. Timestamps accept ISO 8601 (e.g. '2026-07-01T12:00:00Z') or a Unix epoch and are passed through unchanged.
|
|
9
9
|
|
|
10
10
|
Parse the arguments supplied with this command into this tool's parameters:
|
|
11
11
|
|
|
@@ -17,5 +17,7 @@ Parse the arguments supplied with this command into this tool's parameters:
|
|
|
17
17
|
- `site` (string): Named site from connector config. Omit only on reads: multi-site configs fall back to defaultSite (often local/dev, not production). Writes require an explicit site when more than one site is configured. Every response includes `_target` { name, baseUrl, source } (`hint` when you passed site, `default` when you did not).
|
|
18
18
|
- `publishOn` (string): When to publish — ISO 8601 datetime or Unix epoch. Sets the Scheduler publish_on field.
|
|
19
19
|
- `unpublishOn` (string): When to unpublish — ISO 8601 datetime or Unix epoch. Sets the Scheduler unpublish_on field.
|
|
20
|
+
- `publishState` (string): Moderation state machine name to enter at publishOn (e.g. 'published'). Written as publish_state. Required when publishOn is set and the bundle has a publish_state field.
|
|
21
|
+
- `unpublishState` (string): Moderation state machine name to enter at unpublishOn (e.g. 'archived'). Written as unpublish_state. Required when unpublishOn is set and the bundle has an unpublish_state field.
|
|
20
22
|
|
|
21
23
|
If a required parameter is missing, 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.
|
|
@@ -14,7 +14,7 @@ Parse the arguments supplied with this command into this tool's parameters:
|
|
|
14
14
|
|
|
15
15
|
**Optional:**
|
|
16
16
|
- `site` (string): Named site from connector config. Omit only on reads: multi-site configs fall back to defaultSite (often local/dev, not production). Writes require an explicit site when more than one site is configured. Every response includes `_target` { name, baseUrl, source } (`hint` when you passed site, `default` when you did not).
|
|
17
|
-
- `type` (string):
|
|
17
|
+
- `type` (string): Content type machine name. Omit to search every node bundle (merged, newest first); if any bundle cannot be read the search fails and names it.
|
|
18
18
|
- `status` (boolean (true/false)): Filter by publish status
|
|
19
19
|
- `limit` (number)
|
|
20
20
|
|
|
@@ -14,7 +14,7 @@ Parse the arguments supplied with this command into this tool's parameters:
|
|
|
14
14
|
|
|
15
15
|
**Optional:**
|
|
16
16
|
- `site` (string): Named site from connector config. Omit only on reads: multi-site configs fall back to defaultSite (often local/dev, not production). Writes require an explicit site when more than one site is configured. Every response includes `_target` { name, baseUrl, source } (`hint` when you passed site, `default` when you did not).
|
|
17
|
-
- `type` (string): Content type machine name (
|
|
17
|
+
- `type` (string): Content type machine name. Omit to search every node bundle (merged, newest first); if any bundle cannot be read the search fails and names it.
|
|
18
18
|
- `limit` (number)
|
|
19
19
|
|
|
20
20
|
If a required parameter is missing, 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.
|
|
@@ -24,7 +24,7 @@ Parse the arguments supplied with this command into this tool's parameters:
|
|
|
24
24
|
- `langcode` (string): Target language for an unpublished working translation (e.g. 'es'). Continues that translation via Sentinel; does not create a missing translation and does not PATCH canonical langcode.
|
|
25
25
|
- `fields` (object (pass as JSON)): Scalar/attribute field values keyed by machine name. Formatted text: a string or { value, format?, summary? }. format must be in the field's allowed_formats; a single allowed format is used when omitted. Entity-reference fields go in `relationships`, not here.
|
|
26
26
|
- `relationships` (object (pass as JSON)): Entity-reference fields as JSON:API relationships, keyed by field machine name. Single-value uses { data: { type, id } }; multi-value uses { data: [{ type, id }, …] }. Paragraph / ERR items must carry meta.target_revision_id — the connector injects it when missing, and fails the write if it cannot. Image alt on a translation uses the existing file UUID plus meta.alt; replacing the file is refused.
|
|
27
|
-
- `dryRun` (boolean (true/false)): Validate, resolve ERR identifiers, run the server-side preflight when one applies, and return a preview without the real write. The result's `checks` block says what was checked; `caveat` names what was not. Only an existing node draft (or a langcode translation draft) is checked with the real payload: Sentinel's non-saving draft endpoint applies the submitted fields through field access and validates the entity (`serverPreflight: sentinel_draft`). On other moderated targets an id-mismatch core PATCH with no fields checks entity update access and core's working-copy guard only; Drupal does not check field access or entity validation on that probe (`core_patch_guard`). Text format is resolved before the preview returns, including on that path: a known allowed_formats list is enforced, and an unknown list reuses the format stored on the field. Other fields can still fail the real write with a field-access 403 or a validation 422. Unmoderated targets get no server-side check at all (`none`). A
|
|
27
|
+
- `dryRun` (boolean (true/false)): Validate, resolve ERR identifiers, run the server-side preflight when one applies, and return a preview without the real write. The result's `checks` block says what was checked; `caveat` names what was not. Only an existing node draft (or a langcode translation draft) is checked with the real payload: Sentinel's non-saving draft endpoint applies the submitted fields through field access and validates the entity (`serverPreflight: sentinel_draft`). On other moderated targets an id-mismatch core PATCH with no fields checks entity update access and core's working-copy guard only; Drupal does not check field access or entity validation on that probe (`core_patch_guard`). Text format is resolved before the preview returns, including on that path: a known allowed_formats list is enforced, and an unknown list reuses the format stored on the field. Other fields can still fail the real write with a field-access 403 or a validation 422. Unmoderated targets get no server-side check at all (`none`). A changed/revision_timestamp gap on the default revision (possiblyPatchBlocked) is a warning on list_revisions, not a local dryRun refusal — the write proceeds to the core probe / Sentinel (#405). An actual Sentinel stale-copy refusal is still rewritten. Any refusal fails the dryRun.
|
|
28
28
|
- `returning` (one of: full, minimal): Response verbosity. "full" (default) returns the complete saved entity; "minimal" returns just identity + state (id, type, bundle, title, status, changed, url) — much smaller, recommended for bulk writes where the echoed body would dominate the response.
|
|
29
29
|
|
|
30
30
|
If a required parameter is missing, 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.
|