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の選択が成功した後は、新しく選択を開始するのではなく、返されたproxy IDを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の背後にあるアカウントおよびプラットフォームの制限
最終更新日: 2026年9月27日