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. BeachteretryAfter, falls vorhanden. Nutze exponentielles Backoff mit Jitter, falls es fehlt. - Scope beibehalten und später erneut versuchen:
no_eligible_proxy. Entferne nichtexitCountriesund 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 beiauth_failedden FourA API-Schlüssel, nicht die Credentials der Zielseite. - Tool wechseln, wenn der Inhalt es erfordert:
forbiddenauffoura_singlekann einen begrenztenfoura_proxy-Versuch rechtfertigen. Nutzefoura_browser, wenn der gewünschte Inhalt JavaScript benötigt. Übergib nach erfolgreicher Proxy-Auswahl die zurückgegebeneproxyID anfoura_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