Mit dem Symfony MCP Bundle wird die eigene Anwendung zum MCP Server. Konfiguration, mehrere Server und Clients, Protokoll Revisionen und MCP Apps.
Mehr erfahren
Ein Tag inhouse mit Benjamin Klein für Developer, Tester und Admins. Context Engineering, Harness, ADRs und zwei Hands on Blöcke mit KI Agenten in eurem Setup.
composer config extra.symfony.allow-contrib true
composer require sulu/mcp-bundle
mkdir -p config/jwt
openssl genrsa -aes128 -out config/jwt/private.pem 4096
openssl rsa -in config/jwt/private.pem -pubout -out config/jwt/public.pem
SULU_MCP_SERVER_URL=https://your-sulu-host.example.com
OAUTH_PRIVATE_KEY=%kernel.project_dir%/config/jwt/private.pem
OAUTH_PUBLIC_KEY=%kernel.project_dir%/config/jwt/public.pem
OAUTH_PASSPHRASE=<passphrase>
OAUTH_ENCRYPTION_KEY=<random-string>
bin/console doctrine:migrations:diff
bin/console doctrine:migrations:migrate
/admin/mcp. Die MCP Firewall muss deshalb in der security.yaml vor der Admin Firewall stehen, weil Symfony die erste passende Firewall nimmt.
security:
firewalls:
mcp:
pattern: ^/admin/mcp/?$
provider: sulu
stateless: true
entry_point: sulu_mcp.authentication_entry_point
oauth2: true
admin:
pattern: ^/admin(\/|$)
access_control:
- { path: ^/\.well-known/oauth-, roles: PUBLIC_ACCESS }
- { path: ^/admin/mcp/register$, roles: PUBLIC_ACCESS }
- { path: ^/admin/mcp/token$, roles: PUBLIC_ACCESS }
- { path: ^/admin/mcp/?$, roles: IS_AUTHENTICATED_FULLY }
/admin/mcp/authorize und die Consent Seite brauchen den eingeloggten User und müssen deshalb bei der Admin Firewall landen.
Forbidden: Invalid Host header., obwohl OAuth vorher geklappt hat. Im Symfony Log steht dazu nichts, und der Client meldet abgelehnte Zugangsdaten. Die Recipe trägt den Host ein, ohne Flex macht ihr das selbst.
mcp:
servers:
sulu:
http:
allowed_hosts:
- '%env(key:host:url:SULU_MCP_SERVER_URL)%'
- localhost
- 127.0.0.1
- '[::1]'
claude mcp add --transport http sulu https://your-sulu-host.example.com/admin/mcp
bin/console sulu:mcp:create-client "Claude Cowork" --client=claude-cowork \
--redirect-uri="<callback-uri-aus-dem-connector-setup>"
CONTENT_ASSISTANT_PROMPT.md. Er erklärt dem Assistenten das Sulu Inhaltsmodell. Ob alle gewünschten Tools aktiv sind, seht ihr so:
bin/console cache:clear
bin/console debug:container --tag=mcp.tool
sulu_mcp_cimd_client. Die Abhängigkeiten stehen jetzt bei symfony/mcp-bundle 0.13 und mcp/sdk 0.8. Gleicht bei einem Upgrade auch config/bundles.php und die Routen mit der aktuellen Anleitung ab, denn die OAuth Routen liegen jetzt in zwei Dateien.
By default, everything an assistant creates or changes stays a draft.
Mit dem Symfony MCP Bundle wird die eigene Anwendung zum MCP Server. Konfiguration, mehrere Server und Clients, Protokoll Revisionen und MCP Apps.
Mehr erfahren
Sulu.ai 0.8: Credits im Admin, klare Fehlerzustände, Mistral Medium 3.5. Wie das native KI Layer von Sulu CMS Redaktionsarbeit von 45 auf 10 Minuten drückt.
Mehr erfahren
Sulu Redirect Bundle 3.0: HTTP Weiterleitungen im Symfony CMS verwalten. Umstieg auf symfony uid und neuer Import Endpoint im NCA Guide zum Upgrade.
Mehr erfahren
Wir sind Experten für PHP und helfen Ihnen, Ihre digitalen Herausforderungen zu meistern. Unser erfahrenes Team unterstützt Sie bei PHP Updates, PHP Refactoring und berät Sie remote zu allen Fragen rund um PHP. Mit unseren vollautomatischen CI/CD Deployments und einer robusten Docker-Infrastruktur bringen wir Ihre PHP-Projekte auf das nächste Level. Vertrauen Sie auf unsere Expertise für zuverlässige und skalierbare PHP-Lösungen.
Das Sulu MCP Bundle macht Sulu zum MCP Server. KI Assistenten lesen und ändern damit Seiten, Artikel, Snippets, Blöcke und Medien über 42 Tools. Dabei arbeiten sie mit den Rechten des verbundenen Users. Veröffentlichen, Löschen, Blöcke entfernen und Medien Upload schaltet ihr einzeln frei.
Ihr braucht PHP 8.2 oder neuer, Symfony 7.3 oder 8 und Sulu ab Version 3.0.9. Dazu kommt ein öffentlich erreichbarer Host, damit sich externe Clients anmelden können. Das Bundle läuft als normales Symfony Bundle in eurem Projekt und benötigt Datenbanktabellen für die OAuth Daten.
Das Repository enthält Anleitungen für Claude.ai, Claude Code, Claude Cowork, ChatGPT, Codex und Mistral Le Chat. Die meisten dieser Clients melden sich selbst an, ihr gebt also nur die URL ein. Für einen Client ohne Selbstregistrierung legt ihr den Zugang per Konsolenbefehl an.
Ja, das Bundle ist Open Source und steht unter MIT Lizenz. Sulu.ai ist dafür keine Voraussetzung. Kosten entstehen höchstens beim KI Anbieter oder Client, den ihr verbindet, und beim Betrieb eurer eigenen Installation. Die Höhe hängt also ganz von eurem Setup ab.
Ab Werk nicht. Das Publish Tool ist aus, Inhalte bleiben Drafts. Erst wenn ihr dangerous_tools.publish einschaltet, steht es bereit, und auch dann nur für User mit den passenden Sulu Rechten. Solange der Schalter aus bleibt, drückt also immer ein Mensch auf Veröffentlichen.
Clients melden sich über OAuth 2.1 an. Ihr loggt euch mit eurem Sulu Konto ein und bestätigt den Client auf einer Consent Seite. Erst danach wird ein Token ausgestellt. Einen separaten API Key mit vollem Zugriff gibt es nicht, und Client Namen ohne vertrauten Host werden als nicht verifiziert markiert.
Oft liegt es am Host und gar nicht am Token. Fehlt eure Domain in allowed_hosts, antwortet der Transport nach erfolgreichem OAuth mit Forbidden: Invalid Host header. Im Symfony Log steht dazu nichts. Tragt den Host unter mcp.servers.sulu.http.allowed_hosts ein, dann läuft die Verbindung.
Dafür gibt es zwei häufige Gründe. Der passende Schalter unter dangerous_tools ist aus, dann existiert das Tool für Clients nicht. Oder der Rolle fehlen die Sulu Rechte, dann wird es ausgeblendet. Nach einer Änderung leert ihr den Cache und prüft die Liste mit debug:container --tag=mcp.tool.
Das Bundle verbindet externe KI Clients mit eurem CMS. Sulu.ai bringt KI Funktionen direkt in den Admin. Beide lassen sich getrennt nutzen, das Bundle funktioniert also ohne Sulu.ai. Laut Sulu baut Sulu.ai auf derselben Grundlage auf und ergänzt sie um weitere Tools und Integrationen.
Ja, ein anderes Bundle kann eigene Typen über das ContentTypeExtensionInterface ergänzen. Danach greifen die übergreifenden Inhalts Tools, Block Tools, Vorschau Tools und sulu_content_search darauf zu. Eigene heikle Tools lassen sich mit dem Attribut DangerousTool in einer eigenen Kategorie absichern.
Ja. Clients mit der Protokoll Revision 2026-07-28 arbeiten stateless, jeder Server kann also jede Anfrage beantworten. Ältere Clients nutzen Sessions. Bei mehreren Servern stellt ihr dafür den Session Store auf cache oder leitet jeden Client immer zum selben Server.
NCA hilft bei Installation, Firewall, OAuth und der Auswahl passender Schalter. Dazu kommen Tests und die Einbindung in eure Pipeline. Der Start ist ein kostenloses Kennenlernen, danach schätzen wir den Aufwand und rechnen transparent minutengenau ab.