Google広告を運用していると、毎日のように管理画面へログインしてデータを確認する作業が発生します。「過去30日のキャンペーンパフォーマンスはどうだったか」「先週CPAが高かったキャンペーンはどれか」——そのたびにブラウザを開き、フィルタをかけ、期間を設定する。
この検証では、AIから自然言語でGoogle広告APIを叩ける状態をMCPサーバーで実現しました。ただし最大の壁は実装ではありません。認証を通すほうが、MCPサーバーのコードを書くより10倍大変でした。
本記事は3回シリーズの第1回です。第2回でローカルMCPサーバーの構築、第3回でリモートMCPサーバーの構築を扱います。
この検証の概要
検証時期 | 2026年4月5日 |
|---|---|
やりたかったこと | AIに「過去30日のキャンペーンパフォーマンスを見せて」と聞くだけで、Google広告APIからデータが返る状態をつくる |
使用技術 | MCP(Model Context Protocol)/Google Ads API v19/OAuth 2.0 |
本記事の範囲 | 認証まわりのセットアップ(最初にして最大の壁) |
必要な認証情報 | 6種類 |
結論:詰まるのは実装ではなく認証
Google広告APIの認証は、必要なものが多く、手順も長く、エラーメッセージが分かりにくいという三重苦があります。
特に厄介なのが次の2点です。どちらも「設定は正しいのに動かない」ように見えます。
login-customer-idに何を指定するか——間違えると403- Developer Tokenの Pending 状態——APIは通るのにデータが空で返る
後述しますが、この2つを知っているかどうかで所要時間がまったく変わります。
MCPとは
MCP(Model Context Protocol)は、Anthropic社が提唱したオープン標準プロトコルです。よく「AIアプリケーションのためのUSB-Cポート」と表現されます。
USB-Cがどんなデバイスでも同じポートで接続できるように、MCPはどんな外部サービスでも同じプロトコルでAIにつなげられるという思想です。
Claude / Cursor(AIクライアント)
↕ MCP プロトコル
MCPサーバー
↕
外部API(Google広告 API など)2026年現在、MCPのエコシステムは急速に広がっています。Web版のClaudeからもMCPサーバーに接続でき、VS Codeとの統合も進んでいます。パッケージマネージャで公開されたMCPサーバーを1クリックでインストールできる環境も整いつつあります。
必要な認証情報は6種類
# | 必要なもの | 取得場所 |
|---|---|---|
1 | GCPプロジェクト | Google Cloud Console |
2 | Google Ads APIの有効化 | GCPのAPIライブラリ |
3 | OAuth同意画面の設定 | GCPの認証情報 |
4 | OAuthクライアントID(client_id + client_secret) | GCPの認証情報 |
5 | デベロッパートークン | Google広告管理画面(GCPではない) |
6 | リフレッシュトークン | OAuth認証フロー |
取得場所がGCPとGoogle広告管理画面の2箇所に分かれている点が、最初の混乱ポイントです。
GCPプロジェクト作成
↓
Google Ads API有効化
↓
OAuth同意画面設定
↓
OAuthクライアントID作成 → client_id + client_secret取得
↓
Developer Token取得(Google広告管理画面のAPIセンター)
↓
認可コード取得(ブラウザでOAuth認証)
↓
リフレッシュトークン発行(curlでトークン交換)
↓
API動作確認(curlで直叩き)Step 1〜3:GCP側の設定
Google Cloud Consoleで新規プロジェクトを作成し、「APIとサービス」→「ライブラリ」から Google Ads API を有効化します。
次にOAuth同意画面を設定します。ポイントは3つです。
- ユーザータイプ: 「外部」を選択
- スコープ:
https://www.googleapis.com/auth/adwordsを追加 - テストユーザー: 自分のGoogleアカウントのメールアドレスを追加
テストユーザーの追加を忘れると、認証時に「このアプリはアクセスできません」というエラーが出ます。見落としやすい項目です。
続いて「認証情報を作成」→「OAuthクライアントID」で、アプリケーションの種類に「デスクトップアプリ」を選択します。作成すると client_id と client_secret が表示されるので控えておきます(JSONでダウンロードも可能)。
Step 4:Developer Tokenの取得
ここが特殊です。Developer TokenはGCPではなく、Google広告の管理画面から取得します。
Google広告にログインし、「ツールと設定」→「APIセンター」に進むと、22文字の英数字トークンが表示されます。
そして重要な注意点があります。
- 最初に発行されるDeveloper Tokenは Pending(テスト)状態
- Pending状態では、テストMCCアカウント配下でしか動作しない
- 本番のGoogle広告アカウントにアクセスするには本番承認(Standard Access)が必要
- 承認には通常1〜3営業日かかる
承認待ちの時間が発生するため、早めに申請しておくことが重要です。実装が終わってから申請すると、そこで足止めされます。
Step 5:リフレッシュトークンの発行
① 認可コードの取得
次のURLをブラウザで開きます(your-client-id は取得した client_id に置き換え)。
https://accounts.google.com/o/oauth2/auth?client_id=your-client-id.apps.googleusercontent.com&redirect_uri=http://localhost&scope=https://www.googleapis.com/auth/adwords&access_type=offline&response_type=codeログインしてアクセスを許可すると http://localhost にリダイレクトされます。
ここで戸惑いやすい点があります。localhostにサーバーが立っていないため、ブラウザには「サイトに到達できません」と表示されます。しかし問題ありません。アドレスバーのURLに含まれる code= の値が認可コードです。
http://localhost/?code=4/0Axxxxxxxxxxxxxxxxxxxxxxxx&scope=...② トークン交換
curl \
--data "grant_type=authorization_code" \
--data "client_id=your-client-id.apps.googleusercontent.com" \
--data "client_secret=your-client-secret" \
--data "redirect_uri=http://localhost" \
--data "code=取得した認可コード" \
https://www.googleapis.com/oauth2/v3/token成功すると次のようなレスポンスが返ります。
{
"access_token": "ya29.xxxxx...",
"expires_in": 3599,
"refresh_token": "1//0exxxxx...",
"scope": "https://www.googleapis.com/auth/adwords",
"token_type": "Bearer"
}refresh_token の値を必ず保存してください。access_tokenは1時間で期限切れになりますが、refresh_tokenがあれば何度でも再発行できます。
Step 6:curlで動作確認
アカウント一覧の取得で疎通を確認します。
curl -f --request GET \
"https://googleads.googleapis.com/v19/customers:listAccessibleCustomers" \
--header "Content-Type: application/json" \
--header "developer-token: your-developer-token" \
--header "Authorization: Bearer your-access-token"さらにGAQL(Google Ads Query Language)でキャンペーン一覧も取得できます。
curl -i -X POST \
"https://googleads.googleapis.com/v19/customers/your-customer-id/googleAds:searchStream" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your-access-token" \
-H "developer-token: your-developer-token" \
-H "login-customer-id: your-mcc-id" \
--data '{
"query": "SELECT campaign.id, campaign.name FROM campaign ORDER BY campaign.id"
}'ハマりポイント①:login-customer-id の罠
GAQLクエリを投げる際、ヘッダーに login-customer-id を指定します。MCC(マネージャーアカウント)配下のクライアントアカウントを操作する場合です。
ここでクライアントアカウントのIDを指定すると 403 Forbidden になります。
指定箇所 | 入れるID |
|---|---|
| MCCのID |
URLパスの | 操作対象のクライアントアカウントID |
login-customer-id は「どのMCCとしてログインするか」を示すヘッダーです。操作対象を指定するものではありません。
ハマりポイント②:Pending Developer Tokenの壁
こちらのほうが厄介です。APIは正常に通るのに、データが空で返ります。
原因はDeveloper TokenのPending状態です。
- Pending状態ではテストMCCアカウント配下でしか動作しない
- テストMCCと本番MCCは完全に分離されている。テストMCCに本番のクライアントアカウントを紐づけることはできない
- テストMCC自体にキャンペーン等のデータが存在しない
つまり「APIは通っているのにデータが返ってこない」状態は、何も間違っていません。テストMCCにデータがないだけです。
ここで実装を疑い始めると、原因のない場所を延々と探すことになります。
本番承認後の切り替え
本番承認(Standard Access)が下りたら、以下を切り替えます。
login-customer-id→ 本番MCCのID- URLの
customers/{id}→ 本番クライアントアカウントのID
よくある質問
MCPとは何ですか?
AIと外部APIをつなぐオープン標準プロトコルです。「AIアプリケーションのためのUSB-Cポート」と表現されます。どんな外部サービスでも同じプロトコルでAIに接続できます。
Developer Tokenはどこで取得しますか?
GCPではなく、Google広告の管理画面(ツールと設定 → APIセンター)です。22文字の英数字が表示されます。
APIは成功するのにデータが空です
Developer TokenがPending状態の可能性が高いです。Pending状態ではテストMCC配下でしか動作せず、テストMCCにはデータが存在しません。実装は正しい可能性があります。本番承認には1〜3営業日かかります。
403エラーが出ます
login-customer-id にクライアントアカウントのIDを指定していないか確認してください。ここにはMCCのIDを入れ、操作対象はURLパスの customers/{id} で指定します。
まとめ
- MCPサーバーはコードを書くより認証を通すほうが大変だった
- 必要な認証情報は6種類。取得場所がGCPとGoogle広告管理画面に分かれている
- Developer TokenはGoogle広告管理画面から取得(22文字)。最初はPending状態
- Pending状態ではテストMCC配下のみ。データが空で返るのは正常
- 本番承認には1〜3営業日。実装前に申請しておく
login-customer-idにはMCCのIDを入れる。クライアントIDを入れると403- 認可コードはリダイレクト先がエラー表示でもURLから取得できる
外部APIとの連携では、認証の設計と承認フローが実装より重くなることがあります。承認待ちが発生する要素は、先に申請してから開発に入ると止まりません。
次回は、この認証情報を使って Python + FastMCP でMCPサーバーを実装します。
株式会社AI棒では、こうしたAI活用の検証を日々行い、企業の広告運用・マーケティング業務へのAI導入を支援しています。ご相談はお問い合わせフォームから、継続的な伴走支援についてはAI参謀をご覧ください。
