Грешки на 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