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} và limits.{maxConcurrency, maxRpm}, cùng định dạng với lỗi REST API cơ bản.
Các giá trị code ổn định
| Mã | 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_HOSTS và FOURA_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ọngretryAfternế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ỏexitCountrieshoặ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ớiauth_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:
forbiddentrênfoura_singlecó thể biện minh cho một lần thửfoura_proxycó giới hạn. Sử dụngfoura_browserkhi nội dung mong muốn cần JavaScript. Sau khi chọn proxy thành công, hãy truyền IDproxyđược trả về vàofoura_browser.proxythay 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