Markus Michalski FAQ

Sylius Admin: Technische Details

Technik von Sylius Admin: Plugin-Aufbau, zwei Server aus einer Codebasis, Start über run.py, Request-Ablauf mit JWT und Scope-Allowlist, Fehlerübersetzung, Abhängigkeiten und Verzeichnisstruktur.

English Version

Zurück zur Übersicht

Sylius Admin: Technische Details

Diese Dokumentation bezieht sich immer auf die aktuellste veröffentlichte Version.

Aufbau des Plugins

Datei oder Ordner Zweck
.claude-plugin/plugin.json Plugin-Manifest (syliusadmin), verweist auf skills/ und .mcp.json
.claude-plugin/marketplace.json Marketplace-Eintrag claude-plugin-syliusadmin mit dem Plugin syliusadmin
.mcp.json Registriert zwei stdio-Server: syliusadmin-stage-mcp und syliusadmin-prod-mcp
bin/run-server, bin/run-server.cmd Starter für POSIX und Windows, rufen den venv-Interpreter mit run.py auf
servers/syliusadmin-server/run.py Einstiegspunkt: wählt und lädt die .env, baut Client und Server, startet stdio
servers/syliusadmin-server/src/syliusadmin/ Server-Code
skills/setup/, skills/sylius-produkt-wizard/ Die zwei Skills

Gesamtbild

graph TD
    A["Claude Code"] --> B["syliusadmin-stage-mcp"]
    A --> C["syliusadmin-prod-mcp"]
    B --> D["run.py mit SYLIUS_ENV_NAME=stage"]
    C --> E["run.py mit SYLIUS_ENV_NAME=prod"]
    D --> F["stage/.env"]
    E --> G["prod/.env"]
    D --> H["Sylius Stage Admin API"]
    E --> I["Sylius Prod Admin API"]

Beide Server laufen aus derselben Codebasis. Sie unterscheiden sich nur durch die Variable SYLIUS_ENV_NAME, die run.py in den Pfad der jeweiligen .env übersetzt. Der Server meldet sich gegenüber Claude als sylius-admin-<umgebung> und nennt die Umgebung in seinen Anweisungen.

Ablauf eines Tool-Aufrufs

sequenceDiagram
    participant C as "Claude"
    participant T as "Tool"
    participant K as "SyliusClient"
    participant S as "Sylius Admin API"

    C->>T: Tool-Aufruf mit Parametern
    T->>T: Parameter validieren
    T->>K: get, post, put, patch oder delete
    K->>K: Scope-Allowlist prüfen
    alt Pfad nicht erlaubt
        K-->>T: SyliusScopeError
        T-->>C: Fehlermeldung
    else Pfad erlaubt
        K->>S: Login falls kein gültiges Token
        S-->>K: JWT
        K->>S: Request mit Bearer-Token
        S-->>K: Antwort
        K-->>T: JSON
        T-->>C: Ergebnis
    end

Ablauf im Detail

  1. Parameter prüfen: Jedes Tool validiert seine Eingaben, bevor ein Request entsteht (Codes, Längen, Wertebereiche, Pflichtkombinationen).
  2. Scope prüfen: SyliusClient gleicht Methode und Pfad gegen die Allowlist ab. Außerdem lehnt er Formularfelder ab, die mit _method beginnen.
  3. Authentifizieren: Das JWT kommt von POST /api/v2/admin/administrators/token, wird im Speicher gehalten und 30 Sekunden vor Ablauf neu geholt.
  4. Request senden: Mit Authorization: Bearer ..., Accept: application/json und, falls konfiguriert, X-Stage-Api-Key. Das HTTP-Timeout beträgt 30 Sekunden.
  5. Antwort auswerten: Statuscodes ab 400 werden zu SyliusApiError (mit Status, Methode, Pfad, Umgebung und höchstens 500 Zeichen Detail). Ein leerer Body oder 204 wird zu null.
  6. Fehler übersetzen: Alle eigenen Fehlerklassen des Clients werden zentral in ToolError umgewandelt, damit Claude die ursprüngliche Meldung sieht statt eines allgemeinen Tool-Fehlers.

Besonderheiten

Thema Verhalten
Update-Methode Aktualisierungen laufen als PUT, nicht PATCH, weil Sylius für diese Ressourcen keinen Merge-Patch registriert.
Übersetzungen Beim Ändern bestehender Übersetzungen liest der Server die vorhandenen Locales und sendet sie mit ihrer @id (JSON-LD), damit Sylius sie an Ort und Stelle aktualisiert statt neue Einträge anzulegen.
Preise update_variant_channel_pricing liest die bestehenden Channel-Preise und sendet die vollständige Sammlung, damit andere Channels nicht verloren gehen.
Collection-Antworten Der Server akzeptiert die nackte Liste sowie die member- und hydra:member-Hülle.
Archivieren archive_shipping_method und restore_shipping_method sind PATCH-Aufrufe ohne Body.
Bild-Upload Multipart-Formular mit Datei; ein CDN-Bild wird als Multipart-Formular ohne Datei gesendet.
Konfiguration laden load_dotenv(..., override=True): die Datei gewinnt gegen bereits gesetzte SYLIUS_*-Variablen.
Caching, Rate-Limiting Außer dem Token im Speicher gibt es weder Cache noch eigenes Rate-Limiting.

Angesprochene Admin-API-Ressourcen

Alle Pfade liegen unter /api/v2/admin/.

Ressource Zugriff
administrators/token Login
products (inklusive images und translations) Lesen und Schreiben
product-variants Lesen und Schreiben (inklusive Channel-Preise)
taxons (inklusive images und translations) Lesen und Schreiben
product-attributes, product-options Lesen und Anlegen
zones, countries Lesen, Anlegen, Ändern
shipping-methods (inklusive archive und restore), shipping-categories, tax-categories Lesen, Anlegen, Ändern
product-marketplace-links Lesen, Anlegen, Ändern, Löschen
channels, product-custom-input-fields Nur lesen

Server-Verzeichnisstruktur

servers/syliusadmin-server/
├── run.py                      # Einstiegspunkt, .env-Auswahl
└── src/syliusadmin/
    ├── server.py               # create_server()-Factory, Tool-Registrierung
    ├── config.py               # SyliusConfig aus der Umgebung
    ├── sylius_client.py        # HTTP-Client, JWT, Scope-Allowlist
    └── tools/
        ├── _errors.py          # SyliusError wird zu ToolError
        ├── _codes.py           # Code-Validierung
        ├── _translations.py    # Zusammenführen von Übersetzungen, SEO-Felder
        ├── products.py
        ├── variants.py
        ├── taxons.py
        ├── attributes.py
        ├── options.py
        ├── product_images.py
        ├── channels.py
        ├── countries.py
        ├── zones.py
        ├── shipping_categories.py
        ├── shipping_methods.py
        ├── tax_categories.py
        ├── marketplace_links.py
        └── custom_input_fields.py

Protokoll und Abhängigkeiten

Eigenschaft Wert
Transport stdio
MCP-SDK mcp ab 2.0.0, unter 3.0.0
HTTP-Client httpx 0.28.x
Konfiguration python-dotenv ab 1.2.0, unter 2.0.0
Nebenläufigkeit anyio ab 4.9, unter 5.0.0
Python 3.12 oder neuer

Tools, die nur lesen, sind mit dem MCP-Hinweis read_only markiert. Schreibende Tools tragen die entsprechenden Hinweise, Ersetzungen und das Löschen von Marketplace-Links sind als destructive gekennzeichnet.