Google Ads Builder は、WebサイトのURLを1つ渡すだけでGoogle検索広告のキーワード設計・広告文・除外キーワード・入稿用CSVまで一式を書き出す Claude Code スキルです(リポジトリは mikefutia/google-ads-builder)。広告アカウントには一切接続せず、あくまで「下書き」だけを手元に生成します。Claude Code そのものの導入や設定は Claude Code|2026年版・インストールからCLAUDE.md・Hooks・本番運用までの実装手引き にまとめています。
campaign-dashboard.html。見出し・説明文の右肩に出ている小さな数字が文字数で、上限を超えると枠が赤くなる(サンプルの campaign.json をレンダリングしたもの)- 入力はURL 1本だけ。Claudeがサイトを読み、広告グループ・キーワード・広告文・除外リストを設計する
- 出力は Google Ads Editor 用CSV とダッシュボードHTML の2ファイル。どちらも手元の
./search-ads-run/に置かれる - 広告アカウントには接続しない。APIキー不要・課金なし・配信設定を書き換えない
- 同梱スクリプトは264行・標準ライブラリのみ。全履歴を通して外部送信のコードは存在しなかった(本記事で実測)
- 日本語で使うなら文字数チェックを信用しない。全角を1文字として数えるため、Googleの実カウントとズレる
・何ができるか:URLからGoogle検索広告一式(キーワード/RSA/除外/拡張/設定推奨)の下書きを生成し、入稿用CSVに書き出す
・何を解決するか:ゼロからのキャンペーン設計にかかる数時間の単純作業。特に「広告グループごとに見出し15本」という物量
・何を代替するか:代理店の初期構築やGoogleの「スマート」自動生成の代わりに、構造を自分で確認できる下書きを作る。ただし配信・運用そのものは代替しない
Google Ads Builderとは——URL1本で何が出てくるのか
Google Ads Builder は、SCALE AI の Mike Futia 氏が公開している Claude Code 用スキルです。リポジトリの実体は驚くほど小さく、LICENSE / README.md / .gitignore / SKILL.md / scripts/render_report.py の5ファイルしかありません。GitHub API 上の言語構成も Python 12,231バイトのみ、つまり「スクリプト1本 + 指示書1枚」という構成です。
この構成が意味するのは、処理の大半がコードではなく Claude 側の判断で行われるということです。SKILL.md(136行)が「サイトを読め」「広告グループをこう分けろ」「見出しは15本、各30文字以内で書け」と手順を指示し、Claude がその通りに campaign.json を書きます。同梱の Python スクリプトは、その JSON を CSV と HTML に変換するだけの後処理です。作者自身も SKILL.md にこう書いています——「スクリプトはレンダリングと書き出しだけを行い、キャンペーンの設計はモデルの判断による」。
生成物は次の3つです。
・brief.json — サイトから読み取った事業内容・強み・価格帯・想定顧客のメモ
・campaign.json — キャンペーンの全構造(広告グループ、キーワード、広告文、除外、拡張、設定推奨)
・google-ads-editor.csv と campaign-dashboard.html — スクリプトが campaign.json から生成する成果物
生成までの流れ
SKILL.md は0〜8の9ステップで構成されています。実際の処理順は次の通りです。
URL・目標・地域・予算を確認"] --> B["Step 1 サイトを読む
WebFetch で商品・強み・価格・実績を抽出"] B --> C["Step 2 構造設計
高意図/課題認知/ブランド/競合に分ける"] C --> D["Step 3 除外キーワード
汎用ジャンク+事業固有+マッチ種別"] D --> E["Step 4 RSA執筆
見出し15本×30字/説明4本×90字"] E --> F["Step 5 拡張と設定
サイトリンク・コールアウト・入札・予算配分"] F --> G["Step 6 campaign.json を書く
caveats(注意書き)は必須"] G --> H["Step 7 python3 render_report.py
CSV と ダッシュボードHTML を生成"] H --> I["Step 8 チャットで要約報告"]
注目したいのは Step 6 の設計です。SKILL.md は campaign.json に caveats(注意書き)フィールドを必須とし、しかも「これは配信可能な下書きであって、稼働中のキャンペーンではない。コンバージョン計測を入れ、実予算を設定してから配信すること。検索ボリュームとCPCは概算なのでキーワードプランナーで検証すること」という文言を常に含めろと指示しています。誇張を抑える仕掛けがスキル側に埋め込まれている点は、この種のマーケティング系ツールとしては珍しい部類です。
安全性を実コードで監査する——外部送信・書き込み範囲・権限
「サイトを読ませて広告を作る」と聞くと、手元の情報がどこかへ送られていないかが気になります。README の「APIキー不要」という文言を信用せず、実ファイルを全行読んで確認しました。結論から言うと、Python 側にネットワーク通信の能力はありません。ただし後述する通り、注意すべき点は3つ見つかりました。
1. 依存はすべて標準ライブラリ
scripts/render_report.py の import は6つだけで、いずれも Python 標準ライブラリです。
・csv — CSV書き出し
・html — HTMLエスケープ
・json — campaign.json の読み込み
・os — パス結合とディレクトリ作成
・sys — 終了とstderr出力
・webbrowser — 生成したHTMLを開く
外部パッケージは1つも使っておらず、requirements.txt も pyproject.toml も存在しません。README の「stdlib only, no packages to install」は事実でした。pip install を求められることはありません。
2. 外部送信のコードは全履歴を通して存在しない
ネットワーク通信・プロセス起動・環境変数アクセスに使われうる名前を、リポジトリ全体に対して網羅的に検索しました。同じことは手元でも実行できます。
# リポジトリを取得して、通信・プロセス起動・秘密情報アクセスの痕跡を探す
git clone https://github.com/mikefutia/google-ads-builder.git
cd google-ads-builder
# ① 現在のコードを検査
grep -rniE 'socket|urllib|requests|http\.client|smtplib|webhook|telemetry|api[_-]?key|token|secret|credential' \
--include='*.py' .
# ② 過去の全コミットで「追加された行」まで遡って検査
git log -p --all | grep -E '^\+' \
| grep -niE 'socket|urllib|requests|subprocess|os\.system|popen|eval\(|exec\(|environ|getenv|urlopen'
# ③ importを一覧化して標準ライブラリだけか確認
grep -rnE '^\s*(import|from)\s' --include='*.py' .
①②とも一致0件でした。②は現在のコードだけでなくコミット履歴上で一度でも追加された行を対象にしているので、「あとから消した通信コード」も検出できます。このリポジトリはコミットが2つしかなく(いずれも2026年7月14日)、2つ目はリネームに伴う README.md と SKILL.md の更新のみで、render_report.py は初回コミットから一度も変更されていません。
subprocess / os.system / os.popen / eval / exec / __import__ / pickle も同様に不在です。環境変数を読む os.environ / os.getenv も使われておらず、~/.ssh や .env やキーチェーンに触れる記述もありません。
3. 書き込み先はカレントディレクトリ配下の2ファイルのみ
出力パスはスクリプト冒頭で固定されています。
RUN_DIR = os.path.join(os.getcwd(), "search-ads-run")
CAMPAIGN = os.path.join(RUN_DIR, "campaign.json") # 読むだけ
CSV_OUT = os.path.join(RUN_DIR, "google-ads-editor.csv") # 書く
HTML_OUT = os.path.join(RUN_DIR, "campaign-dashboard.html") # 書く
open(..., "w") が現れるのは CSV_OUT と HTML_OUT の2箇所だけです。削除系(os.remove / shutil.rmtree)や権限変更(chmod)は存在せず、ディレクトリ走査(os.walk / glob / listdir)もありません。実際に空ディレクトリで走らせて確認したところ、生成されたのは想定通りの2ファイルだけでした。基準が os.getcwd() である点だけ意識しておくとよく、実行したディレクトリの直下に search-ads-run/ が作られます。リポジトリの .gitignore にも search-ads-run/ が登録済みなので、成果物が誤ってコミットされる心配は低めです。
気をつけたい点3つ(隠さず書く)
問題が無かった項目だけを並べても監査にならないので、気になった3点も書いておきます。いずれも「悪意の証拠」ではなく「知っておくべき挙動」です。
(a) 実行するとブラウザが自動で開く。 --no-open を付けない限り、最後に webbrowser.open("file://" + HTML_OUT) が走り、既定のブラウザで生成HTMLを開きます。開くのはローカルファイルなので通信は発生しませんが、外部プロセスの起動ではあります。自動で開いてほしくない場合は --no-open を付けてください。
(b) 通信しないのは Python 側であって、スキル全体ではない。 SKILL.md の Step 1 は Claude の WebFetch であなたのサイトを読ませます。つまりアウトバウンド通信は確かに存在します。「Google広告のAPIキーが要らない」ことと「一切通信しない」ことは別の話です。読みに行く先はあなたが指定したURLとその配下のページ(商品・価格・会社概要など)で、SKILL.md には認証情報やローカルファイルを読ませる指示はありません。読み取った内容は Claude のコンテキストを経由して brief.json と campaign.json に書かれます。
(c) allowed-tools の書き方が緩い。 SKILL.md のフロントマターは次のようになっています。
allowed-tools: Bash(python3 *) Read Write WebFetch WebSearch
ツール名がスペース区切りで並べられており、Bash(python3 *) は同梱スクリプトに限定した書き方ではなく、任意の python3 実行を許すパターンです。Read も宣言されていますが、SKILL.md の手順内で読み取り対象が具体的に指定される場面はありません。
ただし——ここが監査の要点ですが——この宣言がどう解釈されたとしても、実体のコードにその能力がありません。6つのimportに socket も urllib も subprocess も os.environ も含まれない以上、宣言の緩さが情報の外部送信に転化する経路が存在しないからです。宣言を信じる代わりにコードを読む、というのが結論の根拠です。
Google Ads Builderのインストールと使い方
導入は skills ディレクトリへの clone だけです。
# 1. スキルとして配置する
git clone https://github.com/mikefutia/google-ads-builder.git \
~/.claude/skills/google-ads-builder
# 2. Claude Code を再起動してスキルを認識させる
# 3. サイトを指定して起動する(Claude Code のプロンプトに入力)
# build search ads for https://example.com
起動フレーズは SKILL.md の description に列挙されており、build my Google ads / build google ads / build search ads / generate google search ads などが登録されています。日本語だけで話しかけると起動しない可能性があるので、最初は英語のフレーズを使うのが確実です。
起動すると Claude は Step 0 として4項目を質問してきます。主要なコンバージョン(購入/リード獲得/電話/予約)、ターゲット地域、月予算、競合ブランドや保護したい自社ブランド語の4つです。SKILL.md は「これらは build 全体を変えるので飛ばすな」と明記しており、目標に応じてCTAと入札戦略が、予算に応じて広告グループ数とマッチタイプの攻め方が変わる設計になっています。
レンダリングは Claude が自動で呼びますが、campaign.json を手で書き換えたあとに再生成したいときは直接叩けます。
# campaign.json のあるディレクトリで実行する
python3 ~/.claude/skills/google-ads-builder/scripts/render_report.py --no-open
# 実際の出力(文字数超過があると stderr に一覧が出る)
# ⚠ 3 field(s) over Google's limit — fix before launch:
# headline 37/30: 'Roasted To Order Every Single Morning' (Category - Espresso Beans)
# headline 49/30: 'Buy Premium Specialty Espresso Beans Online Today' (Category - Espresso Beans)
# desc 117/90: 'Roasted to order and shipped within 24 hours...' (Category - Espresso Beans)
# ✓ Wrote /path/to/search-ads-run/google-ads-editor.csv
# ✓ Wrote /path/to/search-ads-run/campaign-dashboard.html
なお campaign.json が無い状態で実行すると、エラーメッセージを出して終了します(ERROR: ... not found. Write campaign.json first)。ディレクトリを作る前に読み込みを試すため、空のディレクトリで叩いても search-ads-run/ が散らかることはありません。
生成されるキャンペーンの中身
出力されるダッシュボードを見ると、このスキルが「キーワードの羅列」ではなく構造を持ったキャンペーンを作ろうとしていることが分かります。
広告グループは4つの型に分ける
SKILL.md が指示する広告グループの型は次の4種類です。1グループあたりキーワードは5〜15本、マッチタイプはフレーズ一致と完全一致を主体にし、部分一致はスマート入札と厳しい除外リストがある場合に限る、という方針まで指定されています。
| 型 | 狙う検索者 | キーワード例 | 特徴 |
|---|---|---|---|
| Category / high-intent | 購入直前の層 | buy <商品> / best <カテゴリ> |
商品ラインごとに1グループ。CVに最も近い |
| Problem-aware | 課題を言語化している層 | how to <課題> / <課題> solution |
上位ファネル。CPCは低いがCVは遠い |
| Brand | 自社名で探している層 | 自社ブランド語 | 安価で高CV。競合の刈り取り防御にもなる |
| Competitor(任意) | 競合を検討中の層 | 競合ブランド語 | CPCが高く、広告文に競合名を使えない制約あり |
競合グループについては「CPCが高くなることと、広告文に競合ブランド名を使えないポリシー制約を明示せよ」と指示されており、単に競合語を突っ込むだけの実装にはなっていません。
レスポンシブ検索広告は物量が本体
1広告グループにつき見出し15本・説明文4本。これを手で書くのが最も面倒な部分で、実際このスキルの価値の大半はここにあります。SKILL.md は見出しの内訳まで指定していて、キーワード一致型・ベネフィット型・オファー/価格型・CTA型・実績型・差別化型を混ぜること、Quality Score のために中心キーワードを3本以上の見出しに含めることを求めています。
ポリシー面の指示も具体的です。過剰な大文字、根拠のない最上級表現(#1 や証拠なき best)、見出しへの電話番号、記号の連打を禁止し、「すべての主張はサイトから裏付けられること」と条件を付けています。
除外キーワードは3層で組む
検索広告で予算が溶ける最大の原因は、意図の違う検索にお金を払ってしまうことです。SKILL.md は除外キーワードを3つの層に分けて作るよう指示しています。
・汎用ジャンク層 — free / jobs / salary / diy / how to make / used / torrent / pdf など、どの業種でも購買意図から外れやすい語。ただし「事業に合わせて調整せよ」と条件が付いており、機械的な適用にはなっていません
・事業固有層 — 同じ単語で意味が違うケース(別業界の同名商品など)、想定と違う顧客層、取り扱いのない商品カテゴリ
・マッチ種別の指定 — どの除外を完全一致にし、どれをフレーズ一致にするか
3層目が地味に重要です。除外を完全一致で入れるかフレーズ一致で入れるかによって遮断範囲が大きく変わり、広く効かせすぎると本来拾いたい検索まで消えてしまいます。CSV では Negative Phrase / Negative Exact として Criterion Type 列に書き出されるため、Google Ads Editor に取り込んだ時点でこの区別が保持されます。
拡張と設定の推奨値まで出る
キャンペーン構造だけでなく、周辺設定の推奨値も生成されます。
・サイトリンク4本 — サイト内の実在ページに対して、リンクテキスト25文字と説明文35文字×2を割り当てる
・コールアウト4〜6本 — Free Shipping / 30-Day Returns のような25文字以内のベネフィット断片
・構造化スニペット — ヘッダー(Types / Brands など)と値のセット
・入札戦略 — 最初はコンバージョン数の最大化、データが貯まったら目標CPAへ移行、という2段階の推奨
・配信ネットワーク — 検索のみ。ディスプレイはオフにする、と明示されている
・予算配分 — 広告グループごとの配分案と、地域・広告スケジュールの推奨
ディスプレイネットワークを明示的にオフにする指示が入っている点は、実務的には妥当な既定値です。検索広告のつもりで作ったキャンペーンがディスプレイにも配信されて想定外の消化をする、というのはよくある事故なので、ここを既定で閉じているのは好ましい設計と言えます。
サイトリンクについては「サイト内の実在ページを使え」と条件が付いており、存在しないURLを作文させない制約になっています。ただしこれは指示であって機械的な検証ではないため、入稿前にリンク先が実在するかは自分で確認してください。スクリプト側が検査するのは文字数だけです。
文字数超過は色と数字で示される
ダッシュボードは見出し・説明文の1つずつに文字数を添え、上限を超えたものだけ枠を赤くします。実際に上限超過のデータを流し込んだ結果が次の画面です。
CSV は Google Ads Editor が読み取れる列構成(Campaign / Ad Group / Keyword / Criterion Type / Final URL + Headline 1〜15 + Description 1〜4 + Path 1,2)で書き出され、キーワード行・RSA行・除外行が1ファイルに収まります。除外キーワードは Negative Phrase のように Criterion Type 側で表現され、キャンペーン単位の除外として書き出されます。
日本語で使うときの落とし穴
ここが日本語サイトで使う場合の最大の注意点です。ダッシュボードの文字数表示は、日本語では正しくありません。
スクリプトの判定は len(h) > HEADLINE_MAX(30)という単純な比較で、Python の len() は全角も半角も1文字として数えます。一方、Google広告の公式ヘルプは「韓国語・日本語・中国語のような全角言語では、すべての文字が2文字としてカウントされる」と明記しています。つまり見出しの実質上限は15文字、説明文は45文字です。
手元で確認するとズレは明確でした。
# 全角を2として数え直し、スクリプトの len() 判定と突き合わせる
python3 -c "
import unicodedata
for s in ['東京で一番おいしいコーヒー豆の通販', '焙煎したてを24時間以内に発送します']:
py = len(s)
g = sum(2 if unicodedata.east_asian_width(c) in ('W','F') else 1 for c in s)
print(f'{s} len()={py} -> {\"OK\" if py<=30 else \"NG\"} / 全角2換算={g} -> {\"OK\" if g<=30 else \"NG\"}')
"
# 東京で一番おいしいコーヒー豆の通販 len()=17 -> OK / 全角2換算=34 -> NG
# 焙煎したてを24時間以内に発送します len()=18 -> OK / 全角2換算=34 -> NG
どちらもダッシュボード上は緑(上限内)で表示されますが、実際には入稿時に弾かれます。日本語で運用するなら、ダッシュボードの数字を信じずに上記のようなワンライナーで検算するか、Claude に「日本語なので見出しは全角15文字以内で書いて」と最初に伝えておくのが確実です。
CSVを表計算ソフトで開くときの注意
もう1点、実際に試して確認した挙動があります。生成される CSV は csv.DictWriter でそのまま書き出されるため、= や + や @ で始まるセルに対する無害化処理が入りません。試しに +1+1 や @SUM(1+1) をキーワードに入れて出力したところ、そのままの形で CSV に書き込まれました。
Google Ads Editor への取り込みでは問題になりませんが、内容をレビューするために Excel や Google スプレッドシートで開くと数式として解釈される可能性があります。実務上、広告文の元になるのは自社サイトの記述なので危険性は高くありませんが、レビューはテキストエディタで行うか、インポート時に列の書式を「テキスト」に指定するのが無難です。
類似ツールとの比較——Toprank・Claude Adsとの棲み分け
「Google広告 × Claude Code」という組み合わせのツールは他にもありますが、触れる対象がそれぞれ違います。この軸で見ると選び分けは明確です。
| 観点 | Google Ads Builder | Toprank | Claude Ads |
|---|---|---|---|
| アカウント接続 | しない | する(Google/Meta広告API) | する(7プラットフォーム) |
| 主な用途 | 新規キャンペーンの下書き生成 | SEO監査・広告運用の自動化 | 既存広告の監査(190項目超) |
| 認証情報 | 不要 | 必要 | 必要 |
| 配信設定の変更 | しない | する(無駄な広告費の削減など) | しない(指摘のみ) |
| 出力 | CSV + ダッシュボードHTML | CLI操作の実行結果 | 監査レポート |
| 適した場面 | まだアカウントが無い/ゼロから設計する | 運用中アカウントの継続改善 | 運用中広告の健康診断 |
Google広告とMeta広告のAPIを直接操作して運用そのものを自動化したい場合は Toprank完全解説:Claude Code向けSEO/Google/Meta広告プラグインを解剖 が、すでに配信中の広告の粗を洗い出したい場合は Claude Ads完全ガイド:190項目のAI広告監査を7プラットフォームで自動化 が対象になります。Google Ads Builder が埋めているのは、その手前——まだ何も無い状態から構造を作るフェーズです。
なお、スキルという仕組み自体(なぜフォルダを置くだけで機能が増えるのか、SKILL.md に何を書くのか)については Claude Skillsとは|「スキル=フォルダ」の仕組みと作り方・使い方を徹底解説 で解説しています。Google Ads Builder は、その仕組みを特定用途に振り切った応用例として読むと理解しやすいはずです。
導入前に知っておきたい実体と限界
最後に、リポジトリの実体と、使う前に理解しておくべき制約を整理します。
リポジトリの実体
| 項目 | 実測値 |
|---|---|
| ライセンス | MIT |
| 言語 | Python のみ(12,231バイト) |
| ファイル数 | 5(LICENSE / README / .gitignore / SKILL.md / render_report.py) |
| コミット数 | 2(いずれも2026年7月14日) |
| リリース・タグ | 0 |
| コントリビューター | 1名 |
| 公開日 | 2026年7月14日 |
リリースもタグも無く、コミットは公開日の2件だけです。バージョン管理された成果物ではないので、導入するなら clone した時点の内容を自分で確認する前提になります。逆に言えば全体で482行しかないため、この記事でやったように全行読み切ることが現実的です。追加のメンテナンスが継続している様子は現時点では確認できません。
機能上の限界
・検索ボリュームは推定値。有料のキーワードツールAPIを使わないため、ボリュームやCPCの数字はモデルの推定です。SKILL.md 自身が「directional estimates」と明記しており、出稿前にキーワードプランナーでの検証を求めています
・サイトが読めなければ成立しない。JS描画が重くて生のfetchで中身が取れない場合はヘッドレス系のツールを使えと指示されており、それでも読めなければ「推測で作ったキャンペーンは出荷する価値がない」として処理を止めるよう書かれています
・コンバージョン計測は含まれない。タグの設置、実予算の設定、入札の調整はすべて人間の作業として残ります
・日本語の文字数チェックが機能しない(前述)。全角言語で使う場合は自分で検算が必要です
・広告の良し悪しはモデルの判断次第。スクリプトは文字数しか検査しないため、キーワード選定や訴求の質はレビューで担保するしかありません
どんな人に向くか
向くのは、これから検索広告を始める事業者や、既存サイトから最初のキャンペーン骨格を短時間で組みたい担当者です。特に「広告グループごとに見出し15本」という物量は、人力だと丸一日かかる部分で、そこを下書きまで持っていける価値は小さくありません。アカウントに接続しないため、試す際のリスクが構造的に低いのも利点です。
逆に向かないのは、すでに運用が回っていて実測データに基づく改善をしたい場合です。このスキルは実績データを一切参照しないので、運用中アカウントの最適化には Toprank や Claude Ads のような接続型のほうが適しています。
生成されたCSVは下書きです。①コンバージョン計測タグの設置 ②実予算の設定 ③キーワードプランナーでのボリューム検証 ④日本語の場合は全角換算での文字数再チェック ⑤広告文の主張がサイトの記載と一致しているかの確認——この5点を済ませてから入稿してください。スキル自身も campaign.json の caveats に同趣旨の注意書きを必ず入れる設計になっています。
まとめ
Google Ads Builder は、482行という極めて小さな実装で「URL1本から検索広告の下書き一式を作る」という単一の目的に振り切った Claude Code スキルです。処理の大半は SKILL.md の指示に沿った Claude の判断で行われ、同梱スクリプトは CSV と HTML への変換に徹しています。
安全性については、README の記述を確認するのではなく実ファイルを全行読んで検証しました。import は6つとも標準ライブラリ、ネットワーク通信のコードは全コミット履歴を通して不在、書き込みは実行ディレクトリ配下の2ファイルのみです。allowed-tools の宣言が緩い点、実行時にブラウザが自動で開く点、そして「Python が通信しない」ことと「スキル全体が通信しない」ことは別である点(Claude は WebFetch で対象サイトを読みます)——この3つは把握したうえで使うべきですが、情報が外部に送出される経路はコード上に見つかりませんでした。
日本語で使う場合は、文字数チェックが全角を1文字として数える点だけ必ず補ってください。ダッシュボードが緑でも、Google のカウントでは上限超過になっているケースがあります。
参照ソース
・mikefutia/google-ads-builder — GitHub(SKILL.md / scripts/render_report.py / README.md / LICENSE を実読。2026-08-02時点)
・About responsive search ads — Google Ads Help(見出し30文字・説明文90文字、および全角言語で1文字が2文字としてカウントされる公式記載)