MCP-Server-Fehler

MCP-Server-Fehler

So behandelst du Fehler, die vom foura-mcp-Server zurückgegeben werden.

Jede Fehlerantwort von einem der vier Tools (foura_auto, foura_single, foura_proxy, foura_browser) ist strukturiert. LLM-Agenten können das Feld code für die Retry-Logik lesen, ohne Fließtext zu parsen.

Envelope-Struktur

Jeder Fehler (isError: true) enthält einen structuredContent-Block. Mindestfelder bei jedem Fehler:

{
  "service": "auto | single | proxy | browser",
  "code": "rate_limited",
  "error": "Rate limit exceeded"
}

Bei Upstream-Fehlern mit HTTP-Status ist auch status vorhanden. Bei Rate-Limit- und Kapazitätsfehlern fügt der Envelope retryAfter, current.{concurrency, rpm} und limits.{maxConcurrency, maxRpm} hinzu, mit derselben Struktur wie die zugrunde liegenden REST-API-Fehler.

Stabile code-Werte

Code HTTP Bedeutung Wiederholung sicher?
ssrf_blocked n/a Ziel-IP in einem privaten oder reservierten Bereich (RFC 5735, RFC 6598, IPv6 reserved) Nein, URL ändern
upstream_non_json variiert Upstream gab einen Body zurück, der kein gültiges JSON war Vielleicht, untersuchen
output_validation_failed n/a Die outputSchema des MCP-Servers hat die Upstream-Response abgelehnt (Server-Bug oder unerwartetes Upstream-Format) Vielleicht, melden
bad_request 400 Eingabeformat von der FourA-API abgelehnt Nein, Argumente beheben
auth_failed 401 Der FourA-API-Schlüssel fehlt, ist ungültig oder deaktiviert; dies betrifft keine Anmeldedaten der Zielseite Nein, FourA-Schlüssel beheben
forbidden 403 Ziel hat den Request abgelehnt (Anti-Bot, Geo-Block) Nein, oder zu foura_proxy wechseln
not_found 404 Ziel-URL oder Endpoint existiert nicht Nein
rate_limited 429 RPM-Limit pro Schlüssel erreicht Ja, retryAfter Sekunden warten
at_capacity 503 Nebenläufigkeitslimit erreicht (current.concurrency > limits.maxConcurrency) Ja, retryAfter Sekunden warten
service_disabled 503 Service für dein Konto deaktiviert (Tarif oder Wartung) Support kontaktieren
service_unavailable 503 Generischer 503 vom Upstream Ja, kurzer Backoff
upstream_error 500+ Upstream 5xx Ja, exponentieller Backoff
upstream_client_error 4xx Andere 4xx, die oben nicht behandelt wurden Meistens nein
upstream_unknown other Defensiv, sollte in der Praxis nicht auftreten Untersuchen
no_eligible_proxy n/a Kein Proxy entspricht der strikten exitCountries Allowlist; details.exitCountries enthält den normalisierten Scope Später erneut versuchen; Scope nur explizit ändern

HTTP-Fehler vom MCP-Server

Einige Fehler treten auf der MCP-Transportschicht auf, bevor ein Tool aufgerufen wird. Diese geben unformatierte JSON-RPC-Fehler zurück (kein structuredContent):

HTTP Wann Was du siehst
400 Nicht unterstützter MCP-Protocol-Version Header Unsupported MCP-Protocol-Version: <value>. Supported: 2025-11-25, 2025-06-18, 2025-03-26, 2024-11-05, 2024-10-07.
401 Fehlender oder fehlerhafter Authorization Header JSON-RPC-Fehler + WWW-Authenticate: Bearer realm="foura-mcp", resource_metadata="https://foura.ai/docs/mcp/server#auth"
403 Unzulässiger Origin oder Host Header (Schutz vor DNS-Rebinding, CVE-2025-66414) Origin <value> is not in the allowlist oder Host <value> is not in the allowlist
405 GET oder DELETE auf /mcp (zustandsloser Modus) Method not allowed in stateless mode. Use POST /mcp.
413 Request-Body > 256 KB Express Default 413

Die Allowlists für 403 sind für Self-Hoster über FOURA_MCP_ALLOWED_HOSTS und FOURA_MCP_ALLOWED_ORIGINS umgebungskonfigurierbar.

Abgelehnte Browser-Profile

Ein Browser-Profil, das der Katalog nicht bereitstellen kann, oder ein Profil, das mit unblocker auf false gesendet wird, kommt als Upstream-Fehler mit dem Grund in error zurück und der Request verlässt FourA niemals. Die Nachricht nennt die verfügbaren Optionen, wiederhole den Vorgang also mit einer der aufgelisteten Kombinationen statt mit derselben.

Dies sind Ablehnungen, keine Ausfälle: Ein erneuter Versuch mit dem identischen Request kann nicht erfolgreich sein, und es wurde kein anderer Browser an dessen Stelle verwendet.

Retry-Strategie

Vier Kategorien:

  • Warten und erneut versuchen: rate_limited, at_capacity, service_unavailable, upstream_error. Beachte retryAfter, falls vorhanden. Nutze exponentielles Backoff mit Jitter, falls es fehlt.
  • Scope beibehalten und später erneut versuchen: no_eligible_proxy. Entferne nicht exitCountries und ersetze ein Land nicht stillschweigend durch ein anderes. Ändere oder erweitere die Allowlist nur, wenn der Benutzer die Anforderung explizit ändert.
  • Nicht erneut versuchen, bis Eingabe oder Credential korrigiert sind: bad_request, auth_failed, not_found, ssrf_blocked. Überprüfe bei auth_failed den FourA API-Schlüssel, nicht die Credentials der Zielseite.
  • Tool wechseln, wenn der Inhalt es erfordert: forbidden auf foura_single kann einen begrenzten foura_proxy-Versuch rechtfertigen. Nutze foura_browser, wenn der gewünschte Inhalt JavaScript benötigt. Übergib nach erfolgreicher Proxy-Auswahl die zurückgegebene proxy ID an foura_browser.proxy, anstatt eine neue Auswahl zu starten.

Retry-Beispiel (TypeScript, MCP-seitig)

async function callWithRetry(call: () => Promise<any>, maxAttempts = 3) {
  for (let attempt = 1; attempt <= maxAttempts; attempt++) {
    const r = await call();
    if (!r.isError) return r;

    const code = r.structuredContent?.code;
    const wait = r.structuredContent?.retryAfter ?? Math.min(2 ** attempt, 30);

    if (["rate_limited", "at_capacity", "service_unavailable", "upstream_error"].includes(code)) {
      await new Promise((res) => setTimeout(res, wait * 1000));
      continue;
    }
    // Non-retryable, surface to caller
    throw new Error(`${code}: ${r.structuredContent?.error}`);
  }
  throw new Error("max retries exceeded");
}

Verwandte Themen

  • MCP Server, die vier Tools und ihre Schemas
  • MCP Recipes, mit dem Server gelieferte Workflow-Prompts
  • API Errors, gleicher Envelope auf der zugrunde liegenden REST API-Schicht
Aktualisiert: 6. August 2026