Wird geladen

Der Streamable-HTTP-Transport ermöglicht es MCP-Clients, sich über HTTP-Verbindungen mit remote gehosteten Servern zu verbinden. Im Gegensatz zum Standard-I/O-Transport, der sowohl Client als auch Server auf derselben Maschine erfordert, eröffnet dieser Transport Möglichkeiten für öffentliche MCP-Server, auf die jeder zugreifen kann.

Der MCP-Client auf deinem Computer und der MCP-Server auf einer entfernten Maschine, die über den Streamable-HTTP-Transport in beide Richtungen kommunizieren.

Es gibt jedoch einen wichtigen Vorbehalt: Bestimmte Konfigurationseinstellungen können die Funktionalität deines MCP-Servers erheblich einschränken. Wenn deine Anwendung lokal mit Standard-I/O-Transport einwandfrei funktioniert, aber bei der Bereitstellung mit HTTP-Transport nicht mehr funktioniert, ist dies wahrscheinlich die Ursache.

Der MCP-Client und ein entfernter MCP-Server tauschen JSON über HTTP aus, was alle vier Kommunikationsmuster erschwert.

Konfigurationseinstellungen, die wichtig sind

Zwei zentrale Einstellungen steuern das Verhalten des Streamable-HTTP-Transports:

  • stateless_http - Steuert die Verwaltung des Verbindungszustands
  • json_response - Steuert die Handhabung des Antwortformats

Standardmäßig sind beide Einstellungen false, aber bestimmte Bereitstellungsszenarien können dich zwingen, sie auf true zu setzen. Wenn diese aktiviert sind, können sie Kernfunktionen wie Fortschrittsbenachrichtigungen, Logging und vom Server initiierte Anfragen beeinträchtigen.

Die Herausforderung der HTTP-Kommunikation

Um zu verstehen, warum diese Einschränkungen bestehen, müssen wir uns ansehen, wie HTTP-Kommunikation funktioniert. Bei Standard-HTTP:

HTTP-Client sendet ein POST an https://my-server.com/api und der Server antwortet; gilt für alle HTTP-Anfragen, nicht nur für MCP.

  • Clients können problemlos Anfragen an Server initiieren (der Server hat eine bekannte URL)
  • Server können problemlos auf diese Anfragen antworten
  • Server können nicht ohne Weiteres Anfragen an Clients initiieren (Clients haben keine bekannten URLs)
  • Antwortmuster vom Client zurück zum Server werden problematisch

Der Server kennt die Adresse des Clients nicht, und ein Hinweis fügt hinzu, dass dies für alle HTTP-Anfragen gilt, nicht nur bei MCP.

Betroffene MCP-Nachrichtentypen

Diese HTTP-Einschränkung wirkt sich auf bestimmte MCP-Kommunikationsmuster aus. Die folgenden Nachrichtentypen lassen sich mit reinem HTTP nur schwer umsetzen:

  • Vom Server initiierte Anfragen: Create-Message-Anfragen, List-Roots-Anfragen
  • Benachrichtigungen: Fortschrittsbenachrichtigungen, Logging-Benachrichtigungen, Initialized-Benachrichtigungen, Cancelled-Benachrichtigungen

Genau das sind die Funktionen, die ausfallen, wenn du die restriktiven HTTP-Einstellungen aktivierst. Fortschrittsbalken verschwinden, das Logging funktioniert nicht mehr, und vom Server initiierte Sampling-Anfragen schlagen fehl.

Die Streamable-HTTP-Lösung

Der Streamable-HTTP-Transport bietet tatsächlich eine clevere Lösung, um die Einschränkungen von HTTP zu umgehen, allerdings mit Kompromissen. Wenn du gezwungen bist, stateless_http=True oder json_response=True zu verwenden, teilst du dem Transport im Grunde mit, innerhalb der Beschränkungen von HTTP zu arbeiten, anstatt sie zu umgehen.

Häkchen bei Client-Anfragen und Server-Antworten, ein Kreuz bei vom Server initiierten Anfragen, ein Fragezeichen bei Client-Antworten.

Das Verständnis dieser Einschränkungen hilft dir, fundierte Entscheidungen zu treffen über:

  • Welchen Transport du für unterschiedliche Bereitstellungsszenarien verwenden solltest
  • Wie du deinen MCP-Server so gestaltest, dass er mit HTTP-Beschränkungen elegant umgeht
  • Wann es sich lohnt, eingeschränkte Funktionalität zugunsten der Vorteile des Remote-Hostings in Kauf zu nehmen

Entscheidend ist zu wissen, dass diese Einschränkungen bestehen, und deine MCP-Server-Architektur entsprechend zu planen. Wenn deine Anwendung stark auf vom Server initiierte Anfragen oder Echtzeit-Benachrichtigungen angewiesen ist, musst du möglicherweise deine Wahl des Transports überdenken oder alternative Kommunikationsmuster implementieren.