目次

  1. エラーメッセージは2026年APIの「隠れたUI」
  2. KanseiLink実測 — エージェントが詰まるエラーの実態
  3. アンチパターンTOP6
  4. 処方箋: LLM-friendly エラーenvelope
  5. 実装例 — Before/After
  6. SaaS提供側チェックリスト
  7. FAQ

エラーメッセージは2026年APIの「隠れたUI」

2025年まで、APIのエラーメッセージは「人間の開発者が読むもの」だった。Slackで質問する、ドキュメントを開く、Stack Overflowを検索する——詰まったときの逃げ道が複数あった。

2026年、状況は反転した。APIの一次的な利用者は人間ではなくAIエージェントになり、エージェントは『ググる』『同僚に聞く』ができない。エラーレスポンスだけが、エージェントにとって 復帰のための唯一の手がかり だ。

業界レポートでは、ある開発チームが 「422レスポンスを本文なしで返すAPIに対し、エージェントが永久ループでリトライした」 という事例を報告している。本文に "missing required field 'first_name'" を明示しただけで、エージェントは即座に修正して成功した。エラーメッセージは2026年APIの隠れたUIであり、UX投資の対象だ。

エージェント時代の鉄則

「曖昧なエラーは、エージェントにとって不在のエラー」。400 Bad Request しか返さないAPIは、エージェントから見れば「何が悪いのか分からない壁」と等しい。情報量がゼロのエラーは、APIが落ちているのと同じ意味を持つ。

KanseiLink実測 — エージェントが詰まるエラーの実態

KanseiLinkがMCP経由で収集している実エージェント挙動データから、エラー周りの数字を抜き出すと以下の傾向が見える。

freee MCP 実測データ (2026年4月時点・212レポート)

15
api_error
(最多エラー)
4
auth_expired
(2位)
90%
全体成功率
216ms
平均レイテンシ

注目すべきは 「api_error」の中身が示されていない 点だ。429・422・404・500を一括して『api_error』として扱う実装が多く、エージェントは「自分が悪いのか、サーバーが悪いのか、リトライすべきか」を判別できない。一方 auth_expired には 「OAuthトークンを更新した(24h期限)」という再現性のある対処 が登録されているため、エージェントは次回同じエラーに遭遇しても自動復帰できる。

この対比は、「エラータイプの粒度」と「対処方法の明示」が成功率を決めるという、本記事のコアメッセージそのものだ。

アンチパターンTOP6

KanseiLinkが収集した実測データと業界調査から、AIエージェントを困らせるエラーメッセージの典型6パターンを抽出した。

❌ 1位: 本文なしの4xx

422 Unprocessable Entity」だけ返してbodyが空、あるいは「{"error": "validation failed"}」とだけ書かれているケース。エージェントは「何のフィールドが、どの理由で失敗したか」を判別できず、同じリクエストを永久にリトライしてトークンを浪費する。業界で報告されている「missing required field 'first_name'」を明示するだけで解消した事例が示すとおり、フィールド名の明示が最低条件だ。

❌ 2位: エラーコードが粒度不足

{"error": "api_error"}{"code": "ERR_001"} のような、機械的に判別できない汎用コード。KanseiLinkで観測されたfreeeの15件 api_error がまさにこれで、内訳が分からないため運用側の改善着手点も曖昧になる。エラーコードは「次にエージェントが何をすべきか」を一意に決める識別子 であるべきで、amount_must_be_positivequota_exceeded_for_period のように動詞・対象が明示された安定文字列が望ましい。

❌ 3位: retryableヒントの欠如

422(検証エラー)に対してエージェントが永遠にリトライする現象は、retryable: false 一行で防げる。逆に429・503などには retryable: true + retry_after_seconds を返すべきだ。このフィールド一つの追加で、エージェントの無駄なトークン消費が劇的に減ると業界では報告されている。設計コストと効果の比が極端に良いため、優先度の最も高い改善項目の一つだ。

❌ 4位: スタックトレース・内部実装の漏出

NullPointerException at com.example.UserService.findById:142 のような内部スタックトレースをそのまま返すAPI。セキュリティリスクであるだけでなく、エージェントは無関係な内部情報に注意を引かれ、本質を見誤る。「Cannot read property 'id' of undefined」のような実装側のJavaScriptエラーが、ユーザーに伝わるエラーメッセージとしてエージェント経由で表示される事故も実際に発生している。

❌ 5位: 言語・スキーマの混在

エラーフィールド名は英語("validation_error")だがメッセージは日本語混在、しかも文体が時々で変わる(です・ます調と命令形が混在)、というケース。エージェントは多言語を理解はするが、「machine-readableな部分」と「human/LLM-readableな部分」を分離していない構造では、機械的なswitch分岐が組みにくくなる。推奨は error.codeerror.field は安定した英語、error.messageerror.user_message は多言語対応、というハイブリッド。

❌ 6位: エラーenvelopeの不統一

同じAPIで認証エラーは {"err": "..."}、検証エラーは {"errors": [{"msg": "..."}]}、サーバーエラーはHTMLで返ってくる——というふうに、エンドポイント間でエラー形式がバラバラなケース。エージェントは 「全エンドポイントで共通のエラーパースロジック」を組めず、ツール毎に個別対応が必要になる。MCPサーバー実装でも、ラップする上流APIが不統一でも、MCP出口では必ず統一envelopeに正規化するのが2026年のベストプラクティスだ。

処方箋: LLM-friendly エラーenvelope

上記6パターンを全て吸収する、推奨されるエラーレスポンス構造は以下のとおり。フィールド名は業界での慣例を参考にしているが、固有のドメインに合わせて拡張可能だ。

{
  "error": {
    "code": "amount_must_be_positive",          // 機械可読・安定文字列
    "message": "The 'amount' field must be a positive integer. Received: -100.",
    "field": "amount",                          // 該当フィールド名
    "retryable": false,                         // 自動再試行で成功しうるか
    "suggested_fix": "Pass an integer >= 1 (in JPY).",
    "doc_url": "https://api.example.com/docs/errors#amount_must_be_positive",
    "request_id": "req_01HQ8K3...",            // サポート問い合わせ用
    "user_message": "金額は正の整数で入力してください"  // エンドユーザー向け(任意)
  }
}

認証期限切れ・レート制限など、特定カテゴリには追加フィールドが効く。

カテゴリ 追加すべきフィールド 理由
auth_expired refresh_url, token_lifetime_seconds エージェントが自動的にトークン更新フローに分岐できる
rate_limited retry_after_seconds, scope (global/tool) バックオフ起動 + 影響範囲の判定
not_found resource_type, searched_id 『そのIDは存在しない』を明示しエージェントの再検索を防止
conflict conflicting_resource_id, resolution_hint 重複作成等の競合をエージェントが解決可能

実装例 — Before/After

Before(エージェントが詰まるパターン)

HTTP/1.1 422 Unprocessable Entity
Content-Type: application/json

{
  "error": "validation failed"
}

エージェント側挙動: 「何かが悪いがどこか分からない」→ 同じリクエストを再送 → 同じエラー → 数回の往復後にユーザーに「失敗しました」とだけ返す。10〜20回の無駄なリトライでトークンと時間を浪費

After(エージェントが復帰可能なパターン)

HTTP/1.1 422 Unprocessable Entity
Content-Type: application/json

{
  "error": {
    "code": "missing_required_field",
    "message": "Required field 'client_email' is missing in the request body.",
    "field": "client_email",
    "retryable": false,
    "suggested_fix": "Add 'client_email' as a string (RFC 5322 email format) to the request body.",
    "doc_url": "https://api.example.com/docs/invoices#create",
    "request_id": "req_01HQ8K3..."
  }
}

エージェント側挙動: 「client_emailが欠けている」を即座に解釈 → ユーザー入力からclient_emailを抽出 or 推測 → 1回の修正リトライで成功。所要時間とトークンが1/10以下に短縮

✅ 設計の核心

エラーは『なぜ失敗したか』だけでなく『次に何をすべきか』を含めて初めて完成する。code(機械判別)、field(対象)、retryable(再試行可否)、suggested_fix(修正案)の4点セットが2026年の最低基準だ。

SaaS提供側チェックリスト

あなたのAPIまたはMCPサーバーが「エージェントに優しい」かを確認する10項目。

あなたのAPIエラーがエージェントから見てどう写るかをデータで把握

KanseiLinkは225+サービスの実エージェント挙動から、エラーパターン・成功率・既知の対処を集約しています。あなたのSaaSが「エージェント時代のエラー設計」基準を満たしているかを実測データで可視化できます。

エラー品質データで自社APIを診断する

FAQ

Q1. なぜエラーメッセージの品質が2026年APIで重要なのか?

API利用者の主流が人間からエージェントに移った。エージェントは『ググる』『同僚に聞く』ができず、エラーレスポンスが復帰のための唯一の手がかり。曖昧なエラーは無意味なリトライとトークン浪費を生み、最終的にユーザー体験が崩壊する。

Q2. KanseiLinkで最も多いエラーは?

freee MCP(212レポート)では『api_error』が15件で最多、次いで『auth_expired』が4件。auth_expiredには再現性ある対処が登録され自動復帰可能だが、api_errorは内訳不明でエージェントが対処判断不能というのが典型的な対比。

Q3. retryableフィールド追加でなぜトークンが節約される?

エージェントはデフォルトで「失敗→再試行」しがちで、422のような再試行不可エラーにも繰り返し試みる。retryable: false の明示で即座に上位ロジックに切り替わり、無駄な往復が消える。業界では「retryable導入1週目でトークン消費が目に見えて下がった」報告がある。

Q4. 日本語エラーメッセージはエージェントに通じる?

意味は通じるが、機械判別の障害になる。推奨は『error.code・field名は英語、message・user_messageは多言語対応』のハイブリッド。switch分岐に使うコードと、人間/LLMが読む説明を分離するのが定石。

Q5. MCPサーバー側で実装すべき最低基準は?

5項目: (1)error.code(機械可読安定文字列)、(2)error.message(LLM可読1〜2文)、(3)error.field(該当フィールド)、(4)error.retryable(boolean)、(5)error.suggested_fix(修正例)。実装コスト小・成功率効果大の高ROI改善。

Q6. 古い上流APIをラップするMCPサーバーでも適用できる?

適用可能で、むしろMCPの主要価値。上流が不統一なエラーを返しても、MCP出口で必ず統一envelopeに正規化することで、エージェントから見た複雑性を吸収する。これが「MCPがAPIラッパー以上の価値を持つ」典型例の一つ。

データ開示・免責事項

本記事に含まれるfreee MCPの「212レポート・15件のapi_error・4件のauth_expired」はKanseiLink MCPの get_insights ツールが2026年4月13日時点で返した実測値。confidence_scoreは0.61(中程度)で、サンプル数の追加でばらつく可能性がある。「422永久リトライ」「missing first_name で解決」事例はDEV.to "Your API Wasn't Designed for AI Agents. Here Are 5 Fixes."、Medium "Handling HTTP Errors in AI Agents: Lessons from the Field"等の業界記事に基づく一般的観測。エラーenvelopeの推奨フィールド構造は業界慣例(Stripe・GitHub・Anthropic API等)を参考にした提案で、特定の標準化団体が公式に承認したものではない。価格・仕様は予告なく変更される可能性があるため、本番運用時は最新の公式ドキュメントをご確認ください。