Lỗi MCP Server

Lỗi MCP Server

Cách xử lý các lỗi được trả về bởi foura-mcp server.

Mọi phản hồi lỗi từ bất kỳ công cụ nào trong bốn công cụ (foura_auto, foura_single, foura_proxy, foura_browser) đều có cấu trúc. Các LLM agent có thể đọc trường code cho logic retry mà không cần phân tích cú pháp văn bản.

Cấu trúc envelope

Mọi lỗi (isError: true) đều chứa một khối structuredContent. Các trường tối thiểu trên mọi lỗi:

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

Đối với các lỗi upstream có trạng thái HTTP, status cũng sẽ có mặt. Đối với các lỗi giới hạn tốc độ và dung lượng, phong bì sẽ thêm retryAfter, current.{concurrency, rpm}limits.{maxConcurrency, maxRpm}, cùng định dạng với lỗi REST API cơ bản.

Các giá trị code ổn định

HTTP Ý nghĩa An toàn để thử lại không?
ssrf_blocked n/a IP đích nằm trong dải riêng tư hoặc được bảo lưu (RFC 5735, RFC 6598, dải bảo lưu IPv6) Không, hãy thay đổi URL
upstream_non_json thay đổi Upstream trả về body không phải là JSON hợp lệ Có thể, hãy điều tra
output_validation_failed n/a outputSchema của máy chủ MCP đã từ chối phản hồi của upstream (lỗi máy chủ hoặc định dạng upstream không mong muốn) Có thể, hãy báo cáo
bad_request 400 Định dạng đầu vào bị FourA API từ chối Không, hãy sửa các đối số
auth_failed 401 Khóa FourA API bị thiếu, không hợp lệ hoặc đã bị vô hiệu hóa; đây không phải là vấn đề về thông tin xác thực của trang đích Không, hãy sửa khóa FourA
forbidden 403 Đích đã từ chối request (chống bot, chặn địa lý) Không, hoặc chuyển sang foura_proxy
not_found 404 URL đích hoặc endpoint không tồn tại Không
rate_limited 429 Đạt giới hạn RPM trên mỗi khóa Có, đợi retryAfter giây
at_capacity 503 Đạt giới hạn đồng thời (current.concurrency > limits.maxConcurrency) Có, đợi retryAfter giây
service_disabled 503 Dịch vụ đã bị vô hiệu hóa cho tài khoản của bạn (gói cước hoặc bảo trì) Liên hệ hỗ trợ
service_unavailable 503 503 chung từ upstream Có, khoảng thời gian backoff ngắn
upstream_error 500+ 5xx của upstream Có, backoff theo hàm mũ
upstream_client_error 4xx Các mã 4xx khác không được đề cập ở trên Thường là không
upstream_unknown khác Phòng thủ, không nên xảy ra trong thực tế Điều tra
no_eligible_proxy n/a Không có proxy nào khớp với danh sách cho phép exitCountries nghiêm ngặt; details.exitCountries chứa phạm vi đã chuẩn hóa Thử lại sau; chỉ thay đổi phạm vi một cách rõ ràng

Các lỗi cấp HTTP từ máy chủ MCP

Một số lỗi xảy ra ở lớp truyền tải MCP, trước khi bất kỳ công cụ nào được gọi. Chúng trả về lỗi JSON-RPC thô (không có structuredContent):

HTTP Khi nào Bạn thấy gì
400 Header MCP-Protocol-Version không được hỗ trợ Unsupported MCP-Protocol-Version: <value>. Supported: 2025-11-25, 2025-06-18, 2025-03-26, 2024-11-05, 2024-10-07.
401 Header Authorization bị thiếu hoặc có định dạng sai Lỗi JSON-RPC + WWW-Authenticate: Bearer realm="foura-mcp", resource_metadata="https://foura.ai/docs/mcp/server#auth"
403 Header Origin hoặc Host không được phép (Phòng thủ DNS-rebinding, CVE-2025-66414) Origin <value> is not in the allowlist hoặc Host <value> is not in the allowlist
405 GET hoặc DELETE trên /mcp (chế độ không trạng thái) Method not allowed in stateless mode. Use POST /mcp.
413 Body của request > 256 KB Express mặc định 413

Các danh sách cho phép đối với lỗi 403 có thể định cấu hình qua môi trường cho những người tự lưu trữ (self-host) thông qua FOURA_MCP_ALLOWED_HOSTSFOURA_MCP_ALLOWED_ORIGINS.

Các browser profile bị từ chối

Một browser profile mà danh mục không thể cung cấp, hoặc một profile được gửi với unblocker được đặt thành false, sẽ trả về lỗi upstream với lý do trong error và request đó không bao giờ rời khỏi FourA. Thông báo sẽ liệt kê những gì khả dụng, vì vậy hãy thử lại với một trong các tổ hợp được liệt kê thay vì dùng lại tổ hợp cũ.

Đây là các trường hợp từ chối, không phải lỗi hệ thống (outages): việc thử lại request giống hệt sẽ không thể thành công và không có trình duyệt nào khác được sử dụng để thay thế.

Chiến lược retry

Bốn nhóm:

  • Chờ và thử lại: rate_limited, at_capacity, service_unavailable, upstream_error. Tôn trọng retryAfter nếu có. Sử dụng exponential backoff với jitter khi không có.
  • Giữ nguyên phạm vi và thử lại sau: no_eligible_proxy. Không gỡ bỏ exitCountries hoặc ngầm thay thế bằng một quốc gia khác. Chỉ thay đổi hoặc mở rộng allowlist khi người dùng thay đổi yêu cầu một cách rõ ràng.
  • Không thử lại cho đến khi input hoặc credential được sửa: bad_request, auth_failed, not_found, ssrf_blocked. Đối với auth_failed, hãy xác minh API key của FourA, không phải thông tin xác thực của trang đích.
  • Chuyển đổi công cụ khi nội dung yêu cầu: forbidden trên foura_single có thể biện minh cho một lần thử foura_proxy có giới hạn. Sử dụng foura_browser khi nội dung mong muốn cần JavaScript. Sau khi chọn proxy thành công, hãy truyền ID proxy được trả về vào foura_browser.proxy thay vì bắt đầu một lựa chọn mới.

Ví dụ về retry (TypeScript, phía 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");
}

Liên quan

  • MCP Server, bốn công cụ và schema của chúng
  • MCP Recipes, các prompt workflow đi kèm với server
  • API Errors, cùng một envelope ở tầng REST API bên dưới
Cập nhật: 6 tháng 8, 2026