Грешки на MCP сървъра

Грешки на MCP сървъра

Как да обработвате грешки, върнати от сървъра foura-mcp.

Всеки response с грешка от който и да е от четирите инструмента (foura_auto, foura_single, foura_proxy, foura_browser) е структуриран. LLM агентите могат да четат полето code за логика за повторен опит, без да парсват свободен текст.

Формат на обвивката

Всяка грешка (isError: true) съдържа блок structuredContent. Минимални полета при всяка грешка:

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

При грешки от източника с HTTP статус присъства и status. При грешки за rate limit и капацитет обвивката добавя retryAfter, current.{concurrency, rpm} и limits.{maxConcurrency, maxRpm} със същата структура като основния REST API errors.

Стабилни стойности на code

Код HTTP Значение Безопасно за повторение?
ssrf_blocked n/a Целеви IP в частен или запазен диапазон (RFC 5735, RFC 6598, IPv6 запазен) Не, променете URL
upstream_non_json варира Източникът върна тяло, което не е валиден JSON Може би, разследвайте
output_validation_failed n/a outputSchema на MCP сървъра отхвърли отговора от източника (бъг в сървъра или неочаквана структура от източника) Може би, докладвайте
bad_request 400 Входната структура е отхвърлена от FourA API Не, коригирайте аргументите
auth_failed 401 FourA API ключът липсва, невалиден е или е деактивиран, това не се отнася за идентификационните данни на целевия сайт Не, коригирайте FourA ключа
forbidden 403 Целта отхвърли заявката (anti-bot, geo-block) Не, или превключете на foura_proxy
not_found 404 Целевият URL или endpoint не съществува Не
rate_limited 429 Достигнат RPM лимит на ключ Да, изчакайте retryAfter секунди
at_capacity 503 Достигнат лимит за паралелност (current.concurrency > limits.maxConcurrency) Да, изчакайте retryAfter секунди
service_disabled 503 Услугата е деактивирана за вашия акаунт (план или поддръжка) Свържете се с поддръжката
service_unavailable 503 Обща грешка 503 от източника Да, кратко изчакване
upstream_error 500+ Източник 5xx Да, експоненциално изчакване
upstream_client_error 4xx Други 4xx, които не са покрити по-горе Обикновено не
upstream_unknown друго Защитно, не би трябвало да се случва на практика Разследвайте
no_eligible_proxy n/a Никой proxy не съвпада със строгия exitCountries списък с разрешения, details.exitCountries съдържа нормализирания обхват Повторете по-късно, променяйте обхвата само изрично

Грешки на ниво HTTP от MCP сървъра

Някои неуспехи се случват на транспортния слой на MCP, преди да бъде извикан какъвто и да е инструмент. Те връщат сурови JSON-RPC грешки (без structuredContent):

HTTP Кога Какво виждате
400 Неподдържан 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 Липсващ или неправилен Authorization header JSON-RPC грешка + WWW-Authenticate: Bearer realm="foura-mcp", resource_metadata="https://foura.ai/docs/mcp/server#auth"
403 Неразрешен Origin или Host header (DNS-rebinding defense, CVE-2025-66414) Origin <value> is not in the allowlist или Host <value> is not in the allowlist
405 GET или DELETE на /mcp (режим без състояние) Method not allowed in stateless mode. Use POST /mcp.
413 Request body > 256 KB Express по подразбиране 413

Списъците с разрешения за 403 могат да се конфигурират чрез средата за самостоятелно хостващи потребители чрез FOURA_MCP_ALLOWED_HOSTS и FOURA_MCP_ALLOWED_ORIGINS.

Отказани браузърни профили

Браузърен профил, който каталогът не може да предостави, или профил, изпратен с unblocker зададен на false, се връща като upstream грешка с причината в error, като въпросният request не напуска FourA. Съобщението посочва какво е налично, така че опитайте отново с една от изброените комбинации вместо със същата.

Това са откази, а не прекъсвания: повторен опит с идентичен request не може да бъде успешен и на негово място не е използван друг браузър.

Стратегия за повторен опит

Четири категории:

  • Изчакайте и опитайте отново: rate_limited, at_capacity, service_unavailable, upstream_error. Спазвайте retryAfter, когато присъства. Използвайте exponential backoff с jitter, когато отсъства.
  • Запазете обхвата и опитайте по-късно: no_eligible_proxy. Не премахвайте exitCountries и не замествайте безшумно с друга държава. Променяйте или разширявайте списъка с позволени само когато потребителят изрично промени изискването.
  • Не опитвайте отново, докато входните данни или идентификационните данни не бъдат коригирани: bad_request, auth_failed, not_found, ssrf_blocked. За auth_failed проверете API ключа за FourA, а не идентификационните данни за целевия сайт.
  • Сменете инструмента, когато съдържанието го изисква: forbidden при foura_single може да оправдае ограничен опит с foura_proxy. Използвайте foura_browser, когато желаното съдържание се нуждае от JavaScript. След успешен избор на proxy, подайте върнатия ID от proxy в foura_browser.proxy, вместо да стартирате нов избор.

Пример за повторен опит (TypeScript, от страната на 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");
}

Свързани

  • MCP Server, четирите инструмента и техните схеми
  • MCP Recipes, workflow промптове, включени в сървъра
  • API Errors, същата обвивка на базовия слой на REST API
Обновено: 6 август 2026 г.