Kai Ole Hartwig

sylius-agent-ready — ein Shop, den Agenten benutzen können.

Ein Sylius-Shop ist für Menschen mit Browsern gebaut. Ein Agent, der dort ankommt, findet keinen Weg zu erfahren, was verkauft wird, keinen maschinenlesbaren Preis und keine Möglichkeit, sich auszuweisen. Siebzehn MIT-lizenzierte Bundles schließen diese Lücke — ein Paket pro Protokoll, jedes einzeln einsetzbar.

Was ein Agent im Shop vorfindet

Mit sylius-agent-ready

Ein Produktfeed auf SKU-Ebene mit Preis in kleinster Einheit und Verfügbarkeit. Content Signals, die sagen, was erlaubt ist. OAuth 2.1 mit dynamischer Client-Registrierung — ein Agent weist sich aus, bevor er fragt.

Bisher

Ein HTML-Katalog, aus dem sich Preise nur durch Scraping lösen lassen. Keine Angabe, ob der Inhalt indexiert oder für Training verwendet werden darf. Keine Registrierung, keine Identität — jeder Zugriff ist anonym und ununterscheidbar vom nächsten Bot.

Die vier Gruppen

MCP

mcp · webmcp

Werkzeuge statt Dokumente. Die Server Card nach SEP-1649, damit ein Agent Transport und Tool-Fläche kennt, bevor er sich verbindet — und WebMCP, das dieselben Aktionen im Browser des Kunden anbietet.

Commerce-Protokolle

acp · ucp · mpp · x402

Wie ein Agent handelt. ACP-Discovery mit SKU-genauem Produktfeed, das UCP-Profil, ein OpenAPI-Dokument mit x-payment-info und x402-Middleware, die eine Datenroute mit HTTP 402 beantwortet, wenn sie nicht bezahlt ist.

Agent-Authentifizierung

mcp-oauth · auth-md · web-bot-auth

Wie ein Agent sich ausweist. OAuth 2.1 mit dynamischer Client-Registrierung und verpflichtendem PKCE, dazu die RFC-8414- und RFC-9728-Metadaten. /auth.md beschreibt denselben Weg in Prosa — aus derselben Quelle, damit Text und Metadaten nicht auseinanderlaufen.

Discovery

robots-txt · llms-txt · markdown · api-catalog · agent-skills · a2a

Wie ein Agent den Shop überhaupt findet und versteht. robots.txt mit namentlich genannten AI-Crawlern und Content Signals, llms.txt als Landkarte statt Katalog, Markdown-Aushandlung über Accept, der RFC-9727-API-Katalog samt Link-Headern, der Agent-Skills-Index und die A2A Agent Card.

Ein Paket pro Protokoll. Einzeln einsetzbar. Kein Sammel-Bundle.

Sylius: 2.0+ · PHP: 8.2+ · Lizenz: MIT · Stand: 1.0.0

Wer alles will, nimmt das Metapaket koh/sylius-agent-ready. Wer nur llms.txt braucht, installiert nur das — und bekommt keine Krypto-Abhängigkeiten mit, die er nie wollte.

Discovery ist kostenlos, Daten können kosten

Die x402-Middleware beantwortet eine Route mit HTTP 402 und den Zahlungsanforderungen, die ein Agent erfüllen kann. Sie ist standardmäßig aus — ein Bundle zu installieren darf nicht anfangen, Geld zu verlangen.

Wenn sie eingeschaltet wird, gilt eine Grenze, die im Code steht und nicht in der Dokumentation: gegated werden nur Datenrouten. Nie der Storefront, nie der Checkout, und ausdrücklich nie die Discovery-Dokumente. Ein /.well-known/* hinter einer Bezahlschranke macht einen Shop nicht profitabel, sondern unsichtbar.

Ein Agent mit gültigem OAuth-Token kommt ohne Zahlung durch. Beide Wege stehen in derselben 402-Antwort — bekannter Agent zahlt per Vertrag, unbekannter per Request.

Der Kaufabschluss bleibt beim Menschen, wo das Recht es verlangt

Das ACP-Bundle kennt zwei Zustände. Standardmäßig deklariert es den Katalog und verschweigt den Checkout — denn ein Agent, der checkout in den Fähigkeiten liest, wird versuchen, über die API zu kaufen.

Für einen Shop mit altersbeschränktem Sortiment ist das keine Option: der Abschluss muss in einer sichtbaren Browser-Session passieren, in der das Alter geprüft werden kann. Jeder Feed-Eintrag trägt dafür age_restriction, damit ein Agent ein beschränktes Produkt nicht für gewöhnliche Ware hält.

Das ist keine Lücke der Umsetzung. ACP und UCP sehen beide einen Checkout-Session-Handoff genau dafür vor — der Agent bereitet vor, der Mensch schließt ab. Wer ein Sortiment ohne solche Auflagen führt, schaltet den Checkout mit einer Zeile Konfiguration frei.

Siebzehn Pakete, die einander nicht kennen

Ein Paket pro Protokoll heißt: der API-Katalog muss wissen, was die anderen anbieten — ohne sie zu kennen. Das löst ein Fundamentpaket, koh/sylius-agent-contracts. Es liefert selbst keinen einzigen Endpunkt, nur Interfaces, Registries und einen Request-Kontext.

Eine Klasse, die eines dieser Interfaces implementiert, wird containerweit automatisch registriert — auch aus dem eigenen App\-Namespace, ohne jede Verdrahtung. Wer sein Magazin in llms.txt haben will, schreibt fünfundzwanzig Zeilen und ist fertig.

Der Effekt zeigt sich beim Entfernen: ist ein Paket nicht installiert, verschwindet sein Eintrag überall gleichzeitig — aus llms.txt, aus dem API-Katalog, aus den Link-Headern. Es gibt keine Stelle, an der eine Fähigkeit stehenbleibt, die niemand mehr bedient.

Installieren reicht nicht

composer require koh/sylius-agent-ready

 

Ein Metapaket kann keine Bundles registrieren, keine Routen importieren und keinen Firewall-Eintrag setzen. Drei Schritte bleiben Handarbeit, und der Shop ist nicht agent-ready, bevor alle drei erledigt sind. Der wichtigste davon ist der dritte.

Die Firewall-Ausnahme muss über den Sylius-Firewalls stehen. Sylius' shop_regex ist ein Catch-all und trifft auch /.well-known/… — und diese Firewall ist stateful. Ohne Ausnahme startet jeder Crawler-Zugriff eine Session, und jede Antwort trägt Set-Cookie: nicht cachebar, für Dokumente, deren ganzer Zweck es ist, aus einem geteilten Cache zu kommen. Ein access_control-Eintrag hilft nicht — der greift erst, nachdem eine Firewall bereits gematcht hat.

Und: public/robots.txt löschen. Der Webserver beantwortet sie von der Platte, bevor Symfony überhaupt gefragt wird, und beschattet die dynamische Route lautlos.

Ob alles sitzt, beantwortet ein Kommando, das jeden angekündigten Endpunkt tatsächlich aufruft:

 

bin/console koh:agent:check

 

Es findet den Fehler, den kein Unit-Test sieht, weil beide Hälften für sich richtig sind: ein Bundle meldet einen Endpunkt an, llms.txt und der API-Katalog bewerben ihn brav — und die Route wurde nie importiert. Agenten laufen in einen 404, während jedes Dokument korrekt aussieht.

Quellcode & Doku

Sicherheitsmeldungen

CVD · CSAF 2.0

Bitte kein öffentliches Issue. Coordinated Vulnerability Disclosure über security@ole-hartwig.eu; Advisories werden als CSAF 2.0 veröffentlicht.

CSAF-Kanal
Sicherheitsmeldungen

Lizenz & Support

MIT-Lizenz · semantische Versionierung

MIT. Support-Fenster nach der veröffentlichten End-of-Life-Policy. Jedes Paket bringt README, CHANGELOG und eine Decommission-Anleitung mit — wie man es wieder loswird, steht genauso da wie die Installation.

Composer-Paket

MIT · Sylius 2.0+ · PHP 8.2+

composer require koh/sylius-agent-ready

Alle siebzehn Pakete sind gebaut, getestet und unter MIT veröffentlicht. Die öffentliche Distribution über Packagist wird vorbereitet (coming soon) — bis dahin laufen sie über die eigene Composer-Registry.

Shop, den Agenten finden sollen?

Die Pakete laufen ohne mich — MIT-lizenziert, dokumentiert, mit Tests. Wenn du sie selbst einsetzen willst, brauchst du nichts weiter als die Doku.

Wenn du Begleitung willst — Integration in einen bestehenden Shop, ein eigenes Protokoll, oder die Frage, welche Discovery-Fläche für dein Sortiment rechtlich überhaupt sinnvoll ist — sprich mich an.