Wird geladen

Die Flags stateless_http und json_response in MCP-Servern steuern grundlegende Aspekte des Verhaltens deines Servers. Zu verstehen, wann und warum du sie einsetzen solltest, ist entscheidend, besonders wenn du planst, deinen Server zu skalieren oder in der Produktion einzusetzen.

Wann du Stateless HTTP benötigst

Stell dir vor, du baust einen MCP-Server, der populär wird. Anfangs hast du vielleicht nur wenige Clients, die sich mit einer einzelnen Serverinstanz verbinden:

Drei MCP-Clients, einer mit der Bezeichnung „Du" und zwei mit „Jemand anderes", die sich alle mit einem MCP-Server auf einem entfernten Rechner verbinden.

Wenn dein Server wächst, versuchen vielleicht Tausende von Clients, sich zu verbinden. Eine einzelne Serverinstanz lässt sich nicht so skalieren, dass sie den gesamten Traffic bewältigen kann:

Drei MCP-Clients, deiner und zwei andere, plus 99999 weitere Personen, die sich alle mit einem MCP-Server auf einem entfernten Rechner verbinden.

Die typische Lösung ist horizontale Skalierung – das Ausführen mehrerer Serverinstanzen hinter einem Load Balancer:

Drei MCP-Clients, deiner und zwei andere, die alle über einen Load Balancer geleitet werden, der auf drei MCP-Server verteilt.

Aber hier wird es kompliziert. Denk daran, dass MCP-Clients zwei separate Verbindungen benötigen:

  • Eine GET-SSE-Verbindung zum Empfangen von Server-zu-Client-Anfragen
  • POST-Anfragen zum Aufrufen von Tools und Empfangen von Antworten

Ein „GET SSE Response"-Pfeil von einem von zwei MCP-Servern hinauf zum MCP-Client, mit dem Load Balancer dazwischen.

Mit einem Load Balancer können diese Anfragen an unterschiedliche Serverinstanzen weitergeleitet werden. Wenn dein Tool Claude verwenden muss (über Sampling), müsste der Server, der die POST-Anfrage bearbeitet, sich mit dem Server abstimmen, der die GET-SSE-Verbindung bearbeitet. Das führt zu einem komplexen Koordinationsproblem zwischen den Servern.

Ein MCP-Client, zwei Server: GET SSE Response von einem, POST SSE Response mit Create Message Request und Call Tool Result.

Wie Stateless HTTP dieses Problem löst

Das Setzen von stateless_http=True beseitigt dieses Koordinationsproblem, allerdings mit erheblichen Kompromissen:

FastMCP-Konstruktor mit den Argumenten stateless_http=True und json_response=True, jeweils verknüpft mit den unten aufgeführten Kompromissen.

Wenn Stateless HTTP aktiviert ist:

  • Clients erhalten keine Sitzungs-IDs – der Server kann einzelne Clients nicht nachverfolgen
  • Keine Server-zu-Client-Anfragen – der GET-SSE-Pfad steht nicht mehr zur Verfügung
  • Kein Sampling – Claude oder andere KI-Modelle können nicht verwendet werden
  • Keine Fortschrittsberichte – während langer Vorgänge können keine Fortschrittsaktualisierungen gesendet werden
  • Keine Abonnements – Clients können nicht über Ressourcenaktualisierungen benachrichtigt werden

Es gibt jedoch einen Vorteil: Die Client-Initialisierung ist nicht mehr erforderlich. Clients können Anfragen direkt stellen, ohne den anfänglichen Handshake-Prozess durchlaufen zu müssen.

Diagramm mit einem durchgezogenen POST-SSE-Response-Pfeil vom MCP-Client zum Server und einem gestrichelten grauen GET-SSE-Response-Pfeil zurück.

JSON Response verstehen

Das Flag json_response=True ist einfacher – es deaktiviert lediglich das Streaming für Antworten auf POST-Anfragen. Statt mehrerer SSE-Nachrichten während der Ausführung eines Tools erhältst du nur das Endergebnis als reines JSON.

Bei deaktiviertem Streaming:

  • Keine zwischenzeitlichen Fortschrittsmeldungen
  • Keine Log-Ausgaben während der Ausführung
  • Nur das endgültige Tool-Ergebnis

Wann diese Flags verwendet werden sollten

Verwende Stateless HTTP, wenn:

  • Du horizontale Skalierung mit Load Balancern benötigst
  • Du keine Server-zu-Client-Kommunikation benötigst
  • Deine Tools kein Sampling von KI-Modellen erfordern
  • Du den Verbindungs-Overhead minimieren möchtest

Verwende JSON Response, wenn:

  • Du keine Streaming-Antworten benötigst
  • Du einfachere, nicht streamende HTTP-Antworten bevorzugst
  • Du mit Systemen integrierst, die reines JSON erwarten

Entwicklung vs. Produktion

Wenn du lokal mit Standard-I/O-Transport entwickelst, aber planst, mit HTTP-Transport bereitzustellen, teste mit demselben Transport, den du in der Produktion verwenden wirst. Die Verhaltensunterschiede zwischen zustandsbehafteten und zustandslosen Modi können erheblich sein, und es ist besser, etwaige Probleme während der Entwicklung zu erkennen als nach der Bereitstellung.

Diese Flags verändern grundlegend, wie dein MCP-Server funktioniert. Wähle sie daher basierend auf deinen spezifischen Anforderungen an Skalierung und Funktionalität.