Erros do Servidor MCP

Erros do servidor MCP

Como lidar com erros retornados pelo servidor foura-mcp.

Toda resposta de erro de qualquer uma das quatro ferramentas (foura_auto, foura_single, foura_proxy, foura_browser) é estruturada. Agentes LLM podem ler o campo code para lógica de repetição sem analisar texto.

Formato do envelope

Todo erro (isError: true) carrega um bloco structuredContent. Campos mínimos em cada erro:

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

Em erros de upstream com status HTTP, status também está presente. Em erros de rate limit e capacidade, o envelope adiciona retryAfter, current.{concurrency, rpm} e limits.{maxConcurrency, maxRpm}, com o mesmo formato dos erros da API REST subjacentes.

Valores estáveis de code

Código HTTP Significado Seguro tentar novamente?
ssrf_blocked n/a IP de destino em um intervalo privado ou reservado (RFC 5735, RFC 6598, IPv6 reservado) Não, altere o URL
upstream_non_json varia O upstream retornou um corpo que não era um JSON válido Talvez, investigue
output_validation_failed n/a O outputSchema do servidor MCP rejeitou a response do upstream (bug no servidor ou formato de upstream inesperado) Talvez, reporte
bad_request 400 Formato de entrada rejeitado pela API da FourA Não, corrija os argumentos
auth_failed 401 A chave da API da FourA está ausente, é inválida ou foi desativada (isso não se refere às credenciais do site de destino) Não, corrija a chave da FourA
forbidden 403 O destino rejeitou a request (anti-bot, bloqueio geográfico) Não, ou mude para foura_proxy
not_found 404 O URL ou endpoint de destino não existe Não
rate_limited 429 Limite de RPM por chave atingido Sim, aguarde retryAfter segundos
at_capacity 503 Limite de concorrência atingido (current.concurrency > limits.maxConcurrency) Sim, aguarde retryAfter segundos
service_disabled 503 Serviço desativado para sua conta (plano ou manutenção) Entre em contato com o suporte
service_unavailable 503 503 genérico do upstream Sim, backoff curto
upstream_error 500+ 5xx do upstream Sim, backoff exponencial
upstream_client_error 4xx Outros erros 4xx não cobertos acima Geralmente não
upstream_unknown outro Defensivo, não deve ocorrer na prática Investigue
no_eligible_proxy n/a Nenhum proxy corresponde à allowlist restrita de exitCountries; details.exitCountries contém o escopo normalizado Tente novamente mais tarde; altere o escopo apenas explicitamente

Erros no nível do HTTP do servidor MCP

Algumas falhas ocorrem na camada de transporte do MCP, antes que qualquer ferramenta seja chamada. Elas retornam erros JSON-RPC brutos (sem structuredContent):

HTTP Quando O que você vê
400 Header MCP-Protocol-Version não suportado Unsupported MCP-Protocol-Version: <value>. Supported: 2025-11-25, 2025-06-18, 2025-03-26, 2024-11-05, 2024-10-07.
401 Header Authorization ausente ou malformado Erro JSON-RPC + WWW-Authenticate: Bearer realm="foura-mcp", resource_metadata="https://foura.ai/docs/mcp/server#auth"
403 Header Origin ou Host não permitido (defesa contra DNS-rebinding, CVE-2025-66414) Origin <value> is not in the allowlist ou Host <value> is not in the allowlist
405 GET ou DELETE em /mcp (modo stateless) Method not allowed in stateless mode. Use POST /mcp.
413 Corpo da request > 256 KB Padrão 413 do Express

As allowlists para o erro 403 são configuráveis por ambiente para self-hosters usando FOURA_MCP_ALLOWED_HOSTS e FOURA_MCP_ALLOWED_ORIGINS.

Perfis de navegador recusados

Um perfil de navegador que o catálogo não pode apresentar, ou um perfil enviado com unblocker definido como false, retorna como uma falha de upstream com o motivo em error e a request nunca sai do FourA. A mensagem nomeia o que está disponível, então tente novamente com uma das combinações listadas em vez da mesma.

Estas são recusas, não interrupções: tentar a mesma request novamente não pode ter sucesso, e nenhum outro navegador foi usado em seu lugar.

Estratégia de nova tentativa

Quatro categorias:

  • Aguarde e tente novamente: rate_limited, at_capacity, service_unavailable, upstream_error. Respeite retryAfter quando presente. Use exponential backoff com jitter quando estiver ausente.
  • Preserve o escopo e tente novamente mais tarde: no_eligible_proxy. Não remova exitCountries nem substitua outro país silenciosamente. Altere ou amplie a allowlist apenas quando o usuário alterar explicitamente o requisito.
  • Não tente novamente até que a entrada ou credencial seja corrigida: bad_request, auth_failed, not_found, ssrf_blocked. Para auth_failed, verifique a chave de API do FourA, não as credenciais do site de destino.
  • Mude de ferramenta quando o conteúdo exigir: forbidden em foura_single pode justificar uma tentativa limitada de foura_proxy. Use foura_browser quando o conteúdo desejado precisar de JavaScript. Após uma seleção de proxy bem-sucedida, passe o ID proxy retornado para foura_browser.proxy em vez de iniciar uma nova seleção.

Exemplo de nova tentativa (TypeScript, lado do 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");
}

Relacionados

  • Servidor MCP, as quatro ferramentas e seus schemas
  • Receitas MCP, prompts de fluxo de trabalho incluídos no servidor
  • Erros da API, mesmo envelope na camada da API REST subjacente
Atualizado em: 6 de agosto de 2026