Architecture Decision Record · 0010

mcp_server-Familie als dev-only Modul-Set via config_split

TL;DRmcp_server und verwandte Submodule werden ausschließlich über einen config_split-Override (machine-name: dev) aktiviert — per settings.local.php lokal eingeschaltet, im Default-Sync deaktiviert, damit Stage/Prod das Modul nie sieht.
!
Status (2026-05-04): Config-Split-Pattern weiterhin gültig. ADR-0011 wurde auf die aktuelle Server-Entscheidung korrigiert: mcp_server bleibt der lokale Dev-only-Server, mcp_tools dient nur noch als Referenz für selektives Porting in solcom_mcp_tools. Das hier beschriebene Config-Split-Pattern bleibt die Schutzmauer für Stage/Prod.

Kontext

drupal/mcp_server exponiert Drupal-Capabilities über das Model Context Protocol an LLM-Clients wie Claude Code und Claude Desktop. Im Solcom-Projekt soll das Modul als lokales Dev-Tooling dienen — primärer Use-Case ist STDIO-Transport (drush mcp:server) zwischen einem Claude-Client und dem DDEV-Drupal des Entwicklers.

Das Modul-Set hat drei Eigenschaften, die seine produktive Aktivierung problematisch machen:

  1. Pre-stable Status. mcp_server hat keine stable Release — nur 1.x-dev und 2.x-dev. Damit gibt es keine Security-Coverage unter der Drupal-Security-Advisory-Policy. Die Tool-API (drupal/tool) ist 1.0.0-beta1. Die zugrundeliegende Composer-Library mcp/sdk ^0.5.0 ist semantisch 0.x.
  2. Sicherheits-Surface. Das Modul ist darauf ausgelegt, Drupal-Funktionen an externe Prozesse auszuliefern. Das HTTP-Submodul (mcp_server_oauth) wäre ein authentifizierter externer Endpunkt. Selbst die STDIO-Variante exponiert den Tool-Bridge-Mechanismus.
  3. Use-Case ist Per-Entwickler. Es gibt keine Site-globale Funktion, die mcp_server in Stage/Prod erfüllen würde — der Konsument ist immer ein lokaler MCP-Client.

Standard-Drupal-Configuration-Management exportiert Modul-Aktivierungen in core.extension.yml und importiert sie auf jeder Site, die drush config:import ausführt. Ohne Trennung würde mcp_server auch in Stage/Prod aktiv sein. Das Repo hatte vor dieser Entscheidung kein Environment-Trennungs-Pattern.

Entscheidung

Die mcp_server-Modul-Familie wird ausschließlich über einen config_split-Override mit Status inactive im Sync und Status active nur in lokalen DDEV-Setups aktiviert. Konkret:

config:import ohne aktiven Split (also: Stage/Prod) sieht im Default-Sync kein mcp_server in core.extension.yml und würde es deaktivieren. Die Migration zu Stage/Prod ist fail-safe.

Rejected alternatives

Expand each rejected option to see the rationale.

Modul global aktivieren + Config exportieren („Standard-Workflow") rejected

Lässt das Modul nach jeder drush config:import auch in Stage/Prod aktiv sein. Da das Modul pre-stable und security-uncovered ist, ist die Verbreitungs-Surface in Prod-Environments inakzeptabel.

Modul aktivieren, Config nicht exportieren rejected

Wäre minimaler Eingriff. Bricht aber das Drupal-CMS-Konfig-Management-Pattern: (a) Drift zwischen Sync und Active-Config, (b) die Tool-Bridge-Konfiguration wäre nicht reproduzierbar.

Settings-basierter Toggle ($settings['mcp_server.enabled'] = TRUE) rejected

Würde das Modul-Aktivierungs-Verhalten an Settings koppeln statt an Config. Drupal hat dafür kein etabliertes Pattern; wir müssten eigene Logik schreiben, die config_split als Framework-Fertiglösung ersetzt.

environment_indicator plus manueller Process rejected

environment_indicator markiert visuell die Umgebung, trennt aber keine Module. Kombiniert mit Config-nicht-exportieren — derselbe Settings-vs-Config-Bruch.

HTTP-Transport mit mcp_server_oauth aktivieren rejected

Out-of-scope für die aktuelle Use-Case-Definition (lokales Dev-Tooling). Ein OAuth-2.1-Setup ist ein eigener Plan, der von dieser Entscheidung nicht präjudiziert wird.

Branch 1.x-dev statt 2.x-dev von mcp_server rejected

2.x nutzt mcp/sdk ^0.5.0 (aktuelle, von Acquia gesponserte Weiterentwicklung) und ist die aktive Schiene, in die zukünftige Stable-Releases fließen werden.

Consequences