solcom_mcp_tools read-only (ToolOperation::Read).
Nächster Schritt: schreibende Tools für Navigation (Menü-System, stabile Entity-API)
und Canvas Page Building (Config-Entities, Custom Constraints). Alle Write-Tools
erhalten confirm-Dry-Run-Mechanismus und administer mcp server-Permission-Guard.
Drei Phasen, je unabhängig deploybar. Phase A liefert alle Navigation-Write-Tools. Phase B die Canvas-Tools. Phase C ist optional.
ADR-0011 auf Write-Erweiterung aktualisieren. SolcomToolBase::checkAccess schreibsensitiv machen. 6 Menu-Tool-Plugins + Services + Tests bauen. Dry-Run-Mechanismus (confirm: false) für alle Write-Operationen.
Read-Tools list_available_component_versions, validate_canvas_tree, preview_canvas_page zuerst. Danach Write-Tools create_canvas_page und delete_canvas_page mit Dry-Run und Permission-Guard. Besondere Vorsicht: component_version-Match und StaticPropSource-Constraint.
update_canvas_page (Tree-Elemente add/remove/reorder) und Canvas Page Regions Support. Nur wenn Phase B stabil und real gebraucht wird.
11 neue Tools aufgeteilt auf zwei Domänen. Navigation nutzt Standard-Entity-API; Canvas-Tools operieren auf Config-Entities mit Canvas-Constraints.
list_menus — Read: alle verfügbaren Menüslist_menu_items — Read: Links eines Menüs (menu_name, limit)create_menu_item — Write: neuer Link (menu_name, title, link, parent?, weight?, confirm)update_menu_item — Write: Link ändern (id, title?, link?, weight?, confirm)delete_menu_item — Write: Link löschen (id, confirm)reorder_menu_items — Write: Reihenfolge/Parent (menu_name, ids[], confirm)list_available_component_versions — Read: Component-IDs + aktuelle versionvalidate_canvas_tree — Read: Baum prüfen vor dem Schreibenpreview_canvas_page — Read: Diff anzeigen was erzeugt würdecreate_canvas_page — Write: ContentTemplate anlegen (confirm)delete_canvas_page — Write: ContentTemplate entfernen (confirm)Die zwei kritischsten Stellen: checkAccess-Erweiterung für Write-Guards und Canvas-Component-Tree-Node-Struktur mit Pflichtfeld component_version.
protected function checkAccess( array $values, AccountInterface $account, bool $return_as_object = FALSE ): bool|AccessResultInterface { if ($this->getPluginDefinition() ?->getOperation() ?->isModifying()) { return AccessResult::allowedIf( $account->hasPermission( 'administer mcp server' ) )->cachePerPermissions(); } return AccessResult::allowed(); }
# Jeder Node im component_tree: uuid: "generated-uuid" parent_uuid: ~ # oder UUID des Parents slot: ~ # oder Slot-Name component_id: "sdc.byte_theme.button" component_version: "7f0a1c9ded3eab0e" # = active_version der Component-Config # muss mit canvas.component.*.active_version # übereinstimmen — sonst Constraint-Fehler inputs: '{"label":"Click","href":"/"}' # nur StaticPropSource erlaubt in Config-Trees label: "Optional label"
component_version stimmt nicht mit canvas.component.*.active_version überein — Canvas-Constraint-Fehler beim Import.validate_canvas_tree (Read-Tool) prüft vor jedem Write alle Versions-Matches explizit. Write-Tool rejected bei Validation-Fehler mit klarem Message.StaticPropSource. validate_canvas_tree prüft Input-Typ. Fehler-Response nennt die erlaubte Alternative (Editor).confirm: false ist Default. Nur bei confirm: true wird geschrieben. Dry-Run-Response zeigt exakt was passieren würde.solcom_mcp_tools bleibt im dev-Config-Split. Reviewer-Agent (drupal-config-architecture-reviewer) prüft das bei jedem PR.administer mcp server oder administer content templates?administer content templates) statt der generischen MCP-Permission. Entscheidung beeinflusst Phase B.