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.
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
- Parameter prüfen: Jedes Tool validiert seine Eingaben, bevor ein Request entsteht (Codes, Längen, Wertebereiche, Pflichtkombinationen).
- Scope prüfen:
SyliusClientgleicht Methode und Pfad gegen die Allowlist ab. Außerdem lehnt er Formularfelder ab, die mit_methodbeginnen. - Authentifizieren: Das JWT kommt von
POST /api/v2/admin/administrators/token, wird im Speicher gehalten und 30 Sekunden vor Ablauf neu geholt. - Request senden: Mit
Authorization: Bearer ...,Accept: application/jsonund, falls konfiguriert,X-Stage-Api-Key. Das HTTP-Timeout beträgt 30 Sekunden. - 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 zunull. - Fehler übersetzen: Alle eigenen Fehlerklassen des Clients werden zentral in
ToolErrorumgewandelt, 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.