MCPサーバーエラー
MCP Server エラー
foura-mcp server から返されるエラーの処理方法。
4つのツール(foura_auto、foura_single、foura_proxy、foura_browser)からのすべてのエラー response は構造化されています。LLM エージェントはテキストを解析することなく、リトライロジック用に code フィールドを読み取ることができます。
エンベロープの形式
すべてのエラー(isError: true)には structuredContent ブロックが含まれます。すべてのエラーにおける必須フィールドは以下の通りです:
{
"service": "auto | single | proxy | browser",
"code": "rate_limited",
"error": "Rate limit exceeded"
}
HTTPステータスを伴うアップストリームエラーの場合、statusも含まれます。プラットフォームの共有割り当てによって呼び出しが拒否された場合、エンベロープにはretryAfter、current.{concurrency, rpm}、およびlimits.{maxConcurrency, maxRpm}が追加されます(基盤となるREST APIエラーと同じ形式です)。
ご契約プラン固有の制限によって呼び出しが拒否された場合、コードはその制限自体を示します: plan_limit_の後にcredits、bandwidth、rate、concurrency、browser_daily、premium、またはfeatureが続きます。待機によって解除される場合はretryAfterに待機時間が設定され、プランに含まれていない機能など、待機では解除されない制限の場合は省略されます。plan_limit_browser_dailyにもretryAfterは含まれません(UTC午前0時にリセットされます)。
foura_autoでは、ラダー内でプラン制限に達した場合、rate_limitedまたはforbiddenとして返され、reasonにプランのコードが含まれます。
安定版codeの値
| コード | HTTP | 意味 | リトライ可能か |
|---|---|---|---|
ssrf_blocked |
n/a | ターゲットがプライベートまたは予約済みアドレス (RFC 5735, RFC 6598, IPv6 予約済み) であるか、URL が http(s) ではないか、ホスト名が解決できませんでした | 不可。URL を確認してください。一時的に失敗した名前解決であればリトライ可能です |
upstream_non_json |
varies | アップストリームから有効な JSON ではない本文が返されました | 状況による。要調査 |
output_validation_failed |
n/a | MCP サーバーの outputSchema がアップストリームのレスポンスを拒否したか、ツールが呼び出しを完了できませんでした (API キー未設定、API 接続不可など) |
状況による。設定を確認の上、報告してください |
bad_request |
400 | 入力形式が FourA API によって拒否されました | 不可。引数を修正してください |
auth_failed |
401 | FourA API キーが見つからないか、無効であるか、無効化されています。ターゲットサイトの認証情報に関するものではありません | 不可。FourA キーを修正してください |
forbidden |
403 | ターゲットがリクエストを拒否しました (サイトのチェック、国制限など) | 不可。または foura_proxy に切り替えてください |
not_found |
404 | ターゲット URL またはエンドポイントが存在しません | 不可 |
rate_limited |
429 | プラットフォーム共有の分あたり許容量、または validate によって拒否されたターゲットからの 429 です。foura_auto では、プランのクレジット、トラフィック、またはレート制限の可能性もあります (reason を参照) |
可能。retryAfter がある場合は待機し、ない場合はバックオフしてください |
at_capacity |
503 | 同時実行数の上限に達しました (current.concurrency > limits.maxConcurrency) |
可能。retryAfter 秒待機してください |
service_disabled |
503 | サービスはメンテナンスのため停止中です。プランに含まれていないツールは plan_limit_feature として返されます |
サポートにお問い合わせください |
service_unavailable |
503 | アップストリームからの一般的な 503 です | 可能。短いバックオフを行ってください |
upstream_error |
500+ または 0 | ターゲットがサーバーエラーを返したか、foura_proxy において foura_browser および foura_auto が応答しませんでした |
可能。指数バックオフを行ってください |
upstream_client_error |
4xx | 上記に含まれないその他の 4xx です | 通常は不可 |
upstream_unknown |
その他 | リクエストは実行されましたが、有効な応答が得られませんでした。foura_single ではターゲットが応答せず (タイムアウト、接続拒否)、任意のツールにおいて validate が 2xx または 3xx レスポンスを拒否しました。status および error を確認してください |
要調査 |
no_eligible_proxy |
n/a | 厳格な exitCountries 許可リストに一致するプロキシがありません。details.exitCountries には正規化されたスコープが含まれます |
後でリトライしてください。スコープの変更は明示的にのみ行ってください |
plan_limit_credits |
429 | プランの月間クレジットを使い果たしました | 可能。retryAfter 以降にリトライするか、プランを変更してください |
plan_limit_bandwidth |
429 | この請求期間のプランのトラフィック許容量を使い果たしました | 可能。retryAfter 以降にリトライするか、プランを変更してください |
plan_limit_rate |
429 | そのエンドポイントに対するプランの分あたりリクエスト数上限です | 可能。retryAfter 以降にリトライしてください |
plan_limit_concurrency |
429 | そのエンドポイントに対するプランの同時リクエスト数上限です | 可能。retryAfter 以降にリトライしてください |
plan_limit_browser_daily |
429 | プランの 1 日あたりの Browser 許容量を使い果たしました | 可能。明日以降にリトライするか、foura_single / foura_proxy を使用してください |
plan_limit_premium |
403 | プレミアム出口が含まれていないプランで exitClass: "premium" を送信しました |
不可。パラメータを削除するか、プランを変更してください |
plan_limit_feature |
403 | プランに対象のエンドポイントまたは機能が含まれていません | 不可。プランを変更してください |
MCPサーバーからのHTTPレベルエラー
一部のエラーは、ツールが呼び出される前のMCPトランスポート層で発生します。これらは生のJSON-RPCエラーを返します(structuredContentなし):
| HTTP | 発生条件 | レスポンス内容 |
|---|---|---|
| 400 | サポートされていないMCP-Protocol-Versionヘッダー |
Unsupported MCP-Protocol-Version: <value>. Supported: 2025-11-25, 2025-06-18, 2025-03-26, 2024-11-05, 2024-10-07. |
| 401 | API keyなしでのツール呼び出しまたはリソース読み取り。ツールおよびプロンプトのリスト取得はキーなしで動作します | JSON-RPC error + WWW-Authenticate: Bearer realm="foura-mcp" |
| 403 | 許可されていないOriginまたはHostヘッダー(DNSリバインディング防御、CVE-2025-66414) |
Origin <value> is not in the allowlistまたはHost <value> is not in the allowlist |
| 405 | /mcp(ステートレスモード)に対するGETまたはDELETE |
Method not allowed in stateless mode. Use POST /mcp. |
| 413 | 256 KBを超えるリクエストボディ | Expressデフォルトの413 |
403の許可リストは、セルフホスト環境向けにFOURA_MCP_ALLOWED_HOSTSおよびFOURA_MCP_ALLOWED_ORIGINSで環境変数から設定可能です。
拒否されたブラウザプロファイル
カタログが提供できないブラウザプロファイル、またはunblockerをfalseに設定して送信されたプロファイルは、errorに理由が含まれるアップストリームエラーとして返され、リクエストがFourAから送信されることはありません。メッセージには利用可能な組み合わせが示されるため、同一のリクエストではなく、リストされた組み合わせのいずれかで再試行してください。
これらはサービス停止ではなくリクエストの拒否です。同一のリクエストを再試行しても成功せず、他のブラウザが代用されることもありません。
リトライ戦略
5つの区分:
- ターゲットではなく自身のプランによる拒否: すべての
plan_limit_*コード。別のツール経由で同じ処理を実行しても同様に拒否されるため、endpointを切り替えても時間を浪費するだけです。retryAfterがある場合はその解除を待ち、ない場合はプランの変更が必要です。plan_limit_premiumは、exitClassを外すことで自ら解消できます。 - 待機して再試行:
rate_limited、at_capacity、service_unavailable、upstream_error。retryAfterが存在する場合はそれに従ってください。存在しない場合は、ジッター付きの指数バックオフを使用します。キュー内のすべてのツール呼び出しを一度に再実行するのではなく、並行実行数を減らして対処してください。 - スコープを維持して後で再試行:
no_eligible_proxy。exitCountriesを削除したり、別の国へ勝手に置き換えたりしないでください。ユーザーが明示的に要件を変更した場合にのみ、許可リストを変更または拡張します。 - 入力または認証情報が修正されるまで再試行しない:
bad_request、auth_failed、not_found、ssrf_blocked。auth_failedについては、ターゲットサイトの認証情報ではなくFourAのAPI keyを確認してください。 - コンテンツに応じてツールを切り替える:
foura_singleでのforbiddenは、回数を制限したfoura_proxyの試行を正当化する理由になります。目的のコンテンツにJavaScriptが必要な場合はfoura_browserを使用します。proxyの選択が成功した後は、新しく選択を開始するのではなく、返されたproxyIDを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: 4つのツールとそのスキーマ
- MCP Recipes: サーバーに同梱されているワークフロープロンプト
- API Errors: 基盤となるREST API層での共通エンベロープ
- Rate Limits:
rate_limitedおよびat_capacityの背後にあるアカウントおよびプラットフォームの制限