Błędy serwera MCP
Błędy serwera MCP
Jak obsługiwać błędy zwracane przez serwer foura-mcp.
Każda odpowiedź z błędem z dowolnego z czterech narzędzi (foura_auto, foura_single, foura_proxy, foura_browser) jest ustrukturyzowana. Agenci LLM mogą odczytać pole code w celu wdrożenia logiki ponownych prób bez konieczności parsowania zwykłego tekstu.
Struktura koperty
Każdy błąd (isError: true) zawiera blok structuredContent. Minimalne pola w każdym błędzie:
{
"service": "auto | single | proxy | browser",
"code": "rate_limited",
"error": "Rate limit exceeded"
}
W przypadku błędów upstream ze statusem HTTP obecny jest również status. W przypadku błędów związanych z limitami żądań i przepustowością, koperta dodaje retryAfter, current.{concurrency, rpm} i limits.{maxConcurrency, maxRpm}, o takim samym formacie jak podstawowe błędy REST API errors.
Stabilne wartości code
| Kod | HTTP | Znaczenie | Bezpieczne do ponowienia? |
|---|---|---|---|
ssrf_blocked |
brak | Docelowy adres IP w prywatnym lub zastrzeżonym zakresie (RFC 5735, RFC 6598, zastrzeżone IPv6) | Nie, zmień URL |
upstream_non_json |
różny | Upstream zwrócił treść, która nie była prawidłowym JSON-em | Być może, zbadaj |
output_validation_failed |
brak | Serwer MCP outputSchema odrzucił odpowiedź upstream (błąd serwera lub nieoczekiwany format upstream) |
Być może, zgłoś |
bad_request |
400 | Format danych wejściowych odrzucony przez API FourA | Nie, popraw argumenty |
auth_failed |
401 | Klucz API FourA jest brakujący, nieprawidłowy lub dezaktywowany; nie dotyczy to danych uwierzytelniających strony docelowej | Nie, popraw klucz FourA |
forbidden |
403 | Cel odrzucił request (anti-bot, blokada geograficzna) | Nie, lub przełącz na foura_proxy |
not_found |
404 | Docelowy URL lub endpoint nie istnieje | Nie |
rate_limited |
429 | Osiągnięto limit RPM dla klucza | Tak, poczekaj retryAfter sekund |
at_capacity |
503 | Osiągnięto limit współbieżności (current.concurrency > limits.maxConcurrency) |
Tak, poczekaj retryAfter sekund |
service_disabled |
503 | Usługa wyłączona dla Twojego konta (plan lub przerwa techniczna) | Skontaktuj się ze wsparciem |
service_unavailable |
503 | Ogólny błąd 503 z upstream | Tak, krótkie opóźnienie ponowienia |
upstream_error |
500+ | Błąd 5xx z upstream | Tak, wykładnicze opóźnienie ponowienia |
upstream_client_error |
4xx | Inne 4xx nieomówione powyżej | Zazwyczaj nie |
upstream_unknown |
inne | Defensywne, nie powinno występować w praktyce | Zbadaj |
no_eligible_proxy |
brak | Żaden proxy nie pasuje do ścisłej listy dozwolonych exitCountries; details.exitCountries zawiera znormalizowany zasięg |
Spróbuj ponownie później; zmieniaj zasięg tylko jawnie |
Błędy na poziomie HTTP z serwera MCP
Niektóre błędy występują w warstwie transportowej MCP, zanim jakiekolwiek narzędzie zostanie wywołane. Zwracają one surowe błędy JSON-RPC (brak structuredContent):
| HTTP | Kiedy | Co widzisz |
|---|---|---|
| 400 | Nieobsługiwany nagłówek MCP-Protocol-Version |
Unsupported MCP-Protocol-Version: <value>. Supported: 2025-11-25, 2025-06-18, 2025-03-26, 2024-11-05, 2024-10-07. |
| 401 | Brakujący lub zniekształcony nagłówek Authorization |
Błąd JSON-RPC + WWW-Authenticate: Bearer realm="foura-mcp", resource_metadata="https://foura.ai/docs/mcp/server#auth" |
| 403 | Niedozwolony nagłówek Origin lub Host (obrona przed DNS-rebinding, CVE-2025-66414) |
Origin <value> is not in the allowlist lub Host <value> is not in the allowlist |
| 405 | GET lub DELETE na /mcp (tryb bezstanowy) |
Method not allowed in stateless mode. Use POST /mcp. |
| 413 | Request body > 256 KB | Domyślne 413 z Express |
Listy dozwolonych dla 403 są konfigurowalne przez środowisko dla hostujących samodzielnie za pomocą FOURA_MCP_ALLOWED_HOSTS i FOURA_MCP_ALLOWED_ORIGINS.
Odrzucone profile przeglądarki
Profil przeglądarki, którego katalog nie może zaprezentować, lub profil wysłany z parametrem unblocker ustawionym na false, wraca jako błąd upstream z podaniem przyczyny w error, a żądanie nigdy nie opuszcza FourA. Komunikat wymienia, co jest dostępne, więc spróbuj ponownie z jedną z wymienionych kombinacji zamiast z tą samą.
Są to odmowy, nie awarie: ponowienie identycznego żądania nie może się powieść i żadna inna przeglądarka nie została użyta w jego miejsce.
Strategia ponawiania prób
Cztery kategorie:
- Poczekaj i spróbuj ponownie:
rate_limited,at_capacity,service_unavailable,upstream_error. RespektujretryAfter, jeśli jest obecny. Użyj exponential backoff z jitterem, gdy go brakuje. - Zachowaj zakres i spróbuj ponownie później:
no_eligible_proxy. Nie usuwajexitCountriesani nie podmieniaj po cichu na inny kraj. Zmień lub rozszerz listę dozwolonych tylko wtedy, gdy użytkownik wyraźnie zmieni wymaganie. - Nie ponawiaj próby, dopóki dane wejściowe lub poświadczenia nie zostaną naprawione:
bad_request,auth_failed,not_found,ssrf_blocked. Dlaauth_failed, zweryfikuj klucz API FourA, a nie poświadczenia witryny docelowej. - Zmień narzędzie, gdy wymaga tego zawartość:
forbiddennafoura_singlemoże uzasadniać ograniczoną próbęfoura_proxy. Użyjfoura_browser, gdy żądana zawartość wymaga JavaScript. Po udanym wyborze proxy, przekaż zwrócony identyfikatorproxydofoura_browser.proxyzamiast rozpoczynać nowy wybór.
Przykład ponawiania prób (TypeScript, strona MCP)
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");
}
Powiązane
- MCP Server, cztery narzędzia i ich schematy
- MCP Recipes, prompty przepływów pracy dostarczane z serwerem
- API Errors, ta sama koperta w bazowej warstwie REST API