Yahoo!広告MCPサーバーのAPI v18デバッグ記録|フィールド名の罠と対処法

Written by
John Doe
公開日
2026-03-08

目次

広告運用のインフラを自社で持つということ

セクション画像

広告運用のデータを確認するために、毎回管理画面にログインしてレポートを手動でダウンロードする。多くの運用者がこの作業を当たり前だと思っている。だが、この「当たり前」のコストは積もると膨大だ。

自社でAPIツールを持てば、「先週の指名検索の数字を見せて」とAIに一言伝えるだけでデータが返ってくる。意思決定のスピードが根本的に変わる。Yahoo!広告をClaude Codeから操作するためのMCPサーバーを自作したのは、そうした運用基盤を自社に持つためだった。

しかし、自社ツールには「壊れていることに気づかない」という致命的なリスクがある。管理画面ならデータが表示されなければすぐにわかるが、APIツールの場合、エラーが返っていてもそれに気づくのは実際にデータを取りに行ったときだけだ。ある日、日常的な確認作業でYahoo!広告の指名検索データを取ろうとしたところ、3つのAPI全てが400 Bad Requestを返した。全滅だった。

原因の特定:APIの仕様変更という落とし穴

セクション画像

最初に認証を疑ったが、トークンは生きていた。問題はもっと根深いところにあった。MCPサーバー経由ではHTTPステータスコードしか見えないため、直接APIを叩いてレスポンスボディを確認したところ、accountIdnullだというエラーが返ってきた。値は確かに送っている。にもかかわらずnull扱いになる。

この現象には重要な教訓がある。Yahoo!広告APIは、認識できないフィールド名を受け取ると、そのフィールドの値をnullとして扱う。つまり「値がnullだ」というエラーメッセージの本当の意味は、「そのフィールド名をAPIが知らない」ということだった。

フィールド名の不一致——APIバージョン更新の地雷

セクション画像

調査の結果、問題はAPIバージョンv18でのフィールド名変更だった。たとえばAccountService/getaccountId(単数)ではなくaccountIds(複数形・配列)を期待するようになっていた。たった一文字の違いで全く動かなくなる。

さらにレポート関連のフィールド名も軒並み変更されていた。公式リファレンスと照合した結果、修正が必要だったフィールドは以下の通りだ。

  • dateRangeTypereportDateRangeType
  • downloadFormatreportDownloadFormat
  • IMPRESSIONSIMPS
  • CONVERSION_RATECONV_RATE
  • COST_PER_CONVERSIONCOST_PER_CONV

1つ直すと次のフィールドでエラーが出る。APIの仕様書をその都度確認しながら、モグラ叩きのように1つずつ潰していった。

設計の欠陥——ツールが「動いているふり」をしていた

セクション画像

フィールド名の問題よりも深刻だったのは、レポート取得のフロー自体が不完全だったことだ。Yahoo!広告のレポート取得はレポート定義の作成、完了の待機、CSVダウンロードという3ステップで構成されるが、元のコードはステップ1だけ実行して、ジョブ作成の確認JSONをそのまま返していた。つまり、実際のレポートデータは一度も取得できていなかった

これが「壊れていることに気づかない」問題の核心だ。ツールは一見動いているように見える。エラーも出ない。しかし返ってくるのはレポートデータではなくジョブ作成のレスポンスにすぎない。この状態が何ヶ月も続いていた可能性がある。

フィールド名の修正に加えて、レポート定義の作成からポーリング、CSVダウンロードまでの一連のフローを再実装した。以下はその中核部分だ。

async def _create_and_download_report(self, operand):
    report_id = val["reportDefinition"]["reportJobId"]
    # 完了を待つ(最大60秒、2秒間隔でポーリング)
    for _ in range(30):
        await asyncio.sleep(2)
        if status == "COMPLETED":
            break
    # CSVダウンロード
    resp = await client.post(
        f"{BASE_URL}/ReportDefinitionService/download",
        json={"accountId": account_id, "reportJobId": report_id},
    )
    return resp.text

修正後に見えたデータ

セクション画像

全部直した後、改めて指名検索の状況を確認した。

2/25 — 表示:98 / クリック:17 / CTR:17.4% / 費用:¥2,620 / IS:100%

2/26 — 表示:106 / クリック:21 / CTR:19.8% / 費用:¥4,162 / IS:99.1%

2/27 — 表示:100 / クリック:28 / CTR:28.0% / 費用:¥3,621 / IS:98.0%

2/28 — 表示:90 / クリック:18 / CTR:20.0% / 費用:¥2,185 / IS:100%

3/1 — 表示:92 / クリック:12 / CTR:13.0% / 費用:¥1,322 / IS:100%

3/2 — 表示:178 / クリック:50 / CTR:28.1% / 費用:¥5,292 / IS:100%

3/3 — 表示:108 / クリック:20 / CTR:18.5% / 費用:¥3,382 / IS:100%

インプレッションシェア99.6%。指名検索はほぼ完全にカバーできている。キーワード別で見ると自社ブランド名の完全一致が品質インデックス10でCTR 34.2%。ブランドワードとしては健全な数字である。

この「データが見える」という当たり前のことが、ツールの不具合で3ヶ月近くできていなかった可能性がある。もしこの期間にインプレッションシェアが低下していたら、競合にブランドワードを取られていたかもしれない。データが見えないということは、問題に気づけないということであり、気づけない問題は対処できない。自社ツールの信頼性は、広告運用の成果に直結している。

技術の問題ではなく、運用設計の問題

セクション画像

今回の障害は一見すると技術的なデバッグの話に見える。しかし本質は、自社ツールの保守運用をどう設計するかという問題だ。

APIは必ずバージョンアップする。フィールド名が変わり、仕様が変わり、昨日まで動いていたコードが今日動かなくなる。これは避けられない現実であり、「一度作ったら終わり」という前提でツールを構築すると、いつか必ずデータが見えなくなる時がくる。

重要なのは、壊れたことそのものではなく、壊れていることに3ヶ月間気づけなかった運用体制のほうだ。定期的な疎通確認の自動化、APIバージョン更新の監視、エラー時のアラート通知——こうした「メンテナンスの仕組み」を最初から設計に組み込んでおくべきだった。

なぜそれでも自社ツールを持つべきか

こうしたメンテナンスコストがあるにもかかわらず、自社でAPIツールを持つ価値は大きい。管理画面にログインしてレポートをダウンロードする手動作業は、1回あたり数分でも年間では膨大な時間になる。さらに、AIと連携した運用基盤があれば「先週のCTRが低下したキャンペーンを特定して」「予算消化ペースが遅いキャンペーンの入札を調整して」といった高次の判断を自動化できる。このレベルの運用効率は、管理画面の手動操作では到達できない。

ただし、その基盤を構築し、維持し、APIの仕様変更に追従し続けるには、技術と広告運用の両方の知見が必要になる。両方を社内に持てる組織は多くない。

まとめ

広告運用の競争力は、運用者のスキルだけでなく、その運用者がどんなインフラの上で仕事をしているかにも左右される。AIと連携した自社ツール基盤は、意思決定のスピードと精度を根本的に変える。しかし、そのインフラは作って終わりではなく、継続的なメンテナンスが必要だ。

広告運用のインフラを自社で構築・維持するには、技術と運用の両方の知見が求められる。自走が難しければ、パートナーと組むのが現実的だ。「ツールを作る」だけでなく「ツールを動かし続ける」体制まで含めて、運用基盤の設計を考えてほしい。

Relation

関連記事

This is some text inside of a div block.

【実例公開】Google広告の広告グループ再編ガイド|8キャンペーン・84本のRSAを設計した全工程

This is some text inside of a div block.
7 min read
This is some text inside of a div block.

AIでYouTubeチャンネルを90日で収益化する7ステップ|プロンプト付き完全ガイド

This is some text inside of a div block.
7 min read
This is some text inside of a div block.

Claude CodeでRemotionを設定する方法|AIでプログラマティック動画制作

This is some text inside of a div block.
7 min read
This is some text inside of a div block.

月10万円のSEO計測作業をAIで自動化した方法|Claude Code×サチコ×Notion

This is some text inside of a div block.
7 min read
This is some text inside of a div block.

Clarityデータで判明、CTAはバナーよりテキストボックスが正解

This is some text inside of a div block.
7 min read
This is some text inside of a div block.

1Password CLI+opxで.envの秘密情報を排除する方法

This is some text inside of a div block.
7 min read

現在【毎月先着5社様】限定無料相談受付ます

大変申し訳ありません。私たちのリソースには限りがあり、一社一社に質の高いサービスを提供するため、現在【毎月先着5社様】限定で、この特別な条件(全額返金保証+無料相談)でのご案内とさせていただいております。

さらに、今このページをご覧のあなただけに、無料相談へお申し込みいただいた方限定で、通常5万円相当の【競合サイト分析&改善提案レポート】を無料でプレゼントいたします。

枠がすぐに埋まる可能性がありますので、お早めにお申し込みください。

プライバシーポリシーに同意し、まずは無料相談をおこないます
Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.