Hallo zusammen. Ich betreibe selbstgehostetes n8n (v2.21.0) auf EasyPanel, eine einzelne Replik, hinter Traefik. Ich nutze den MCP Server Trigger Node (Streamable HTTP) auf dem /mcp-Pfad mit Retell AI als MCP-Client.
Kurze Response-Tools (Get many events) funktionieren perfekt und erscheinen in Executions. Aber längere Response-Tools (Create event) geben “error parsing json response from mcp server” an den Client zurück, und der Create Node wird nie ausgeführt. Die vom Client gesendeten Daten sind korrekt (gültiges Start/End mit Zeitzone).
Das hat angefangen, nachdem ich den Server neu installiert habe. Laut n8n-Dokumentation braucht es Proxy-Buffering und gzip-Kompression für den /mcp-Endpunkt deaktiviert. Wie konfiguriert man das korrekt auf EasyPanel/Traefik? Jedes funktionierende Beispiel mit Labels/Middleware würde sehr helfen. Danke!
@Luis_Morello du hast die Ursache im Grunde genau identifiziert, es geht nur um ein kleines Detail: Es ist spezifisch die gzip/compress-Seite, nicht das Buffering. Traefiks compress-Middleware wird nur bei Antworten über ~1KB aktiviert (minResponseBodyBytes hat standardmäßig 1024), daher rutscht deine Get-many-Ausgabe darunter durch und passiert unverändert, aber die größere Create-Antwort übersteigt das, wird gzippt, und Retell kann den komprimierten Stream nicht parsen, daher bekommst du „error parsing json
Fügen Sie die folgenden Labels zu Ihrem n8n-Service im Abschnitt EasyPanel → Service → Advanced → Custom Labels hinzu:
traefik.http.middlewares.n8n-mcp-compress.compress=true
traefik.http.middlewares.n8n-mcp-compress.compress.excludedcontenttypes=text/event-stream
Dies teilt Traefik mit, alles zu komprimieren, außer dem MCP-Stream.
traefik.http.middlewares.n8n-mcp-headers.headers.customResponseHeaders.Cache-Control=no-transform
Dies stellt sicher, dass kein anderer Proxy oder Cache zwischen Traefik und Retell AI versucht, den Stream zu verändern.
Kritischer Schritt: Sie müssen Ihren Router-Namen finden (sichtbar im Traefik-Dashboard, falls vorhanden, oder folgt normalerweise einem Muster wie https-n8n-your-project). Eine häufige Möglichkeit, dies in EasyPanel/Traefik anzuwenden, ist jedoch:
traefik.http.routers.n8n-router.middlewares=n8n-mcp-compress,n8n-mcp-headers
*(Ersetzen Sie n8n-router durch den eigentlichen Router-Namen, den EasyPanel für Ihren Service verwendet. Falls Sie den Router-Namen nicht finden können, überprüfen Sie den Tab „Labels
Danke @achamm, die Erklärung zur 1KB-Schwelle macht vollkommen Sinn und passt genau zu meinem Split zwischen kurzen funktionierenden und langen fehlgeschlagenen Tests. Ich exposiere n8n über EasyPanel’s integrierte Domain-Box (die auto-generierte *.easypanel.host Domain), nicht über Custom-Docker-Labels — das Feld „Middleware 1
@Luis_Morello ja, da noch ein Compress zu stapeln wird es nicht schaffen, die eingebaute Domains-Middleware wird auf jeden Pfad angewendet, also führt Traefik weiterhin den Standard-Compress parallel dazu aus, deswegen umgeht /mcp das nicht. Da du nur ein Replikat hast und der n8n-Editor eigentlich keine Gzip braucht, ist die einfachste Lösung ohne Ausfallzeit, Compress ganz von dieser Domain zu entfernen, anstatt pro Pfad dagegen anzukämpfen. Erlaubt dir das Middlewares-Feld, den Standard-Compress zu löschen oder zu ersetzen, oder kannst du nur darauf stapeln? Das entscheidet, ob das eine Ein-Feld-Änderung ist oder ein kleines Custom.yaml-Router nur für /mcp.
Vielen Dank @kjooleng, das ist wirklich hilfreich und deckt sich mit der Kompressionsdiagnose. Zwei Dinge, die ich gerne verstehen möchte, bevor ich etwas anfasse, da ich die eingebaute Domain-Box von EasyPanel nutze (keine benutzerdefinierten Router-Labels) und lieber nicht die ganze Domain kaputt machen möchte, indem ich rätsel:
- Die
traefik.http.routers.<router>.middlewares=...Zeile — ersetzt das nicht die gesamte Middleware-Liste auf dem Router, anstatt sie zu ergänzen? Meine Sorge ist, dass EasyPanel bereits seine eigenen Middlewares auf diesem Router verwaltet (HTTPS-Umleitung, etc.) im Hintergrund, sodass das Überschreiben der Liste diese möglicherweise löscht. Gibt es eine sichere Möglichkeit, diese zwei Middlewares hinzuzufügen, ohne EasyPanel’s verwaltete zu löschen? - @achamm erwähnte, dass n8n’s Streamable HTTP entweder
text/event-streamoderapplication/jsonje nach Antwortgröße antworten kann, und schlug vor, beide Content-Types auszuschließen. Dein Snippet schließt nurtext/event-streamaus — wäre es sicherer,application/jsonauch zuexcludedcontenttypeshinzuzufügen?
Ich mag die Idee des Cache-Control: no-transform Headers wirklich, ich behalte das auf jeden Fall. Nur möchte ich den Router-Teil richtig hinbekommen, damit ich die Domain nicht lahmlege. Danke nochmal!
@Luis_Morello du hast recht dich zu sorgen, die .middlewares=-Zeile setzt die ganze geordnete Liste für diesen Router, es ist kein Append, also würde das Überschreiben auf easypanels verwalteten Router deren https-redirect und alles andere, das sie dort eingefügt haben, löschen. genau deshalb würde ich diesen Router-Middleware-Chain auf der Built-in-Domain allein lassen. am sichersten ist ein separater höher-priorisierter Router für /mcp in custom.yaml, der easypanels Router gar nicht anfasst, /mcp matched dann zuerst deinen mit kein compress und alle anderen Paths behalten ihre verwaltete Chain unverändert. wenn du deinen n8n-Service-Namen pastbinst (easypanel zeigt ihn in der Service-Config) kann ich dir genau den Router-Block schreiben.
Basierend auf Ihren Bedenken finden Sie hier die genauen Labels zum Verwenden.
Schritt A: Middlewares definieren (Diese sind sicher; sie überschreiben nichts)
traefik.http.middlewares.n8n-mcp-compress.compress=true
traefik.http.middlewares.n8n-mcp-compress.compress.excludedcontenttypes=text/event-stream,application/json
traefik.http.middlewares.n8n-mcp-headers.headers.customResponseHeaders.Cache-Control=no-transform
**Schritt B: An Router anhängen (Der „Vorsicht
Hey @Luis_Morello, da du auf EasyPanel’s integrierter Domain bist und @achamm bestätigt hat, dass ein separater /mcp Router der sicherste Weg ist, hier ist der genaue custom.yaml Block zum Einfügen in /etc/easypanel/traefik/config/
http:
middlewares:
mcp-nocompress:
compress:
excludedContentTypes:
- text/event-stream
- application/json
mcp-notransform:
headers:
customResponseHeaders:
Cache-Control: "no-transform"
routers:
n8n-mcp:
rule: "Host(`your-instance.easypanel.host`) && PathPrefix(`/mcp`)"
priority: 100
service: "your-n8n-service@docker"
middlewares:
- mcp-nocompress
- mcp-notransform
tls: {}
Ersetze your-instance.easypanel.host durch deine tatsächliche Domain und your-n8n-service@docker durch den Servicenamen, der in EasyPanel angezeigt wird (normalerweise -@docker). Die priority: 100 stellt sicher, dass dieser Router /mcp zuerst matched, bevor EasyPanel’s verwalteter Router ihn erfasst, sodass ihre HTTPS-Umleitung und andere Middlewares völlig unverändert bleiben.
Nach dem Speichern Traefik in den EasyPanel-Einstellungen neu starten und dann @kjooleng curl -I Check ausführen, um zu bestätigen, dass Content-Encoding: gzip nicht mehr in der Antwort vorhanden ist.
Das hier abschließen — es stellte sich heraus, dass es NICHT an Traefik lag. Ich habe mit wget verifiziert, dass der MCP-Endpunkt intern (localhost:5678) und extern (öffentliche URL über Traefik) identische Antworten zurückgab: gleicher text/event-stream, chunked, kein gzip, keine Kürzung. Die echte Ursache lag auf der Retell-Seite — meine Telefonnummer war an eine alte Agent-Version gebunden, die noch eine tote n8n-URL verwendete, sodass echte Anrufe beim MCP-Handshake einen 404-Fehler erhielten. Das Neu-Verlinken der Nummer zur aktuell veröffentlichten Version hat es behoben. Keine Traefik-Änderungen waren erforderlich. Danke für die Hinweise!