renue

ARTICLE

広告運用AIエージェント実装ガイド【2026年版】— ツール設計・SQLホワイトリスト・マルチテナント分離の本番アーキテクチャ

公開日: 2026/4/6

広告運用AIエージェントを「動くデモ」ではなく「本番で運用できる品質」で実装するには、カスタムツール設計、SQLホワイトリスト、マルチテナント分離、認証情報の安全な管理、Rate Limitといった複数のレイヤーが必要となる。本記事では、renueが自社プロダクトとして実装している広告運用AIエージェントの設計パターンをもとに、本格実装で必要な考慮事項を解説する。単なる「Claude APIを叩くチャットボット」ではなく、エンタープライズ品質の広告運用エージェントを作るためのガイドである。

本番品質の広告運用AIエージェントに必要な8レイヤー

レイヤー役割主要技術
1. カスタムツール定義エージェントが呼べる業務操作を定義Anthropic Tool Schema
2. System Prompt設計エージェントの行動指針と出力形式プロンプトテンプレート
3. SQLホワイトリストエージェントのDB操作を安全に制限クエリパーサー + 許可テーブルリスト
4. マルチテナント分離組織/プロジェクト単位のリソース保護verifyResourceOrg / org_idスコープ
5. 認証情報DB管理広告プラットフォーム認証の安全な保存AES-256-GCM暗号化
6. Rate LimitAI生成・チャット呼び出しの保護ユーザー/IP単位の制限
7. 選択肢応答曖昧指示を聞き返す仕組みchoices JSON block
8. 監査ログ広告配信変更の追跡ad_submission_audit_log

レイヤー1: カスタムツール定義 — エージェントの業務を定義する

広告運用AIエージェントが「何ができるか」は、Anthropic Tool Schemaで定義するカスタムツールで決まる。renueの実装では以下のカテゴリのツールを提供している。

データ取得ツール

  • get_ad_metrics: 広告メトリクス(imp/click/cost/conv/CTR/CVR/CPA/ROAS)を取得。日次/サマリー切替、期間・媒体・キャンペーンで絞り込み
  • get_kpi_dashboard: KPIダッシュボードの全体サマリー、予算消化率、チャネル別パフォーマンス、仮説一覧
  • list_campaigns: キャンペーン一覧取得。ステータス/媒体/プロダクトで絞り込み
  • list_ads: 広告一覧取得

操作ツール

  • update_ad_status: 広告ステータス変更(active/paused/removed)
  • update_campaign_status: キャンペーンステータス変更
  • generate_creative_image: AIによる画像生成・入れ替え

分析・検索ツール

  • sql_query: ホワイトリスト内のテーブルに対するSELECT限定のSQL実行(後述)

Tool Schemaの例

{
  "name": "get_ad_metrics",
  "description": "広告メトリクス(imp/click/cost/conv/CTR/CVR/CPA/ROAS)を取得する",
  "input_schema": {
    "type": "object",
    "properties": {
      "campaign_id": { "type": "number" },
      "platform": {
        "type": "string",
        "enum": ["google", "meta", "tiktok", "x"]
      },
      "date_from": { "type": "string", "description": "YYYY-MM-DD" },
      "date_to": { "type": "string" },
      "granularity": {
        "type": "string",
        "enum": ["daily", "summary"]
      }
    }
  }
}

スキーマを厳密に定義することで、LLMが不正な引数でツールを呼び出すことを防げる。

レイヤー2: System Promptによる行動指針の明示

本番品質のエージェントは「何ができるか」だけでなく「どう振る舞うか」を明示する必要がある。

行動指針の例

  • 金額は日本円で3桁区切り(例: ¥1,234,567)
  • 指標はパーセント表記(例: CTR 3.5%、CVR 1.2%)
  • レポートは「概要→チャネル別詳細→改善ポイント」の構成
  • 広告のステータス変更など重要な操作の前は、必ず対象を確認
  • 上限金額(spending_limits)は参照のみで変更不可

曖昧指示への対応

「成果を教えて」「広告を止めて」のような曖昧な指示には、勝手に推測で実行せず、必ず選択肢を提示して聞き返す仕組みが重要である。

「どの期間の成果を確認しますか?」
```choices
["今日", "昨日", "今週", "今月", "直近7日間", "直近30日間"]
```

このようにAIが自分で選択肢を提示することで、ユーザーは曖昧な指示から安全に具体的な操作へ進める。選択肢の文言はそのままユーザー入力として扱えるよう設計する。

レイヤー3: SQLホワイトリスト — 汎用SQL実行ツールを安全に提供する

エージェントに自由にSQLを書かせると強力だが、重大なセキュリティリスクがある。renueの実装では以下の制限を設けている。

許可テーブル方式(ホワイトリスト)

実行可能なテーブルを明示的にリスト化し、それ以外へのクエリは拒否する。

  • org_idスコープ: ad_metrics_daily, ai_prompts, conversion_events, marketing_budgets, pdca_hypotheses, products 等
  • project_idスコープ: sales_campaigns, marketing_creatives, spending_limits, brand_assets, creative_generations 等
  • 間接テーブル(親とのJOIN必須): product_personas→products, unified_ad_groups→sales_campaigns 等

アクセス禁止テーブル

認証系テーブル(users, organizations, org_members, sessions, accounts 等)には一切アクセスさせない。認証情報の漏洩を防ぐ絶対的なガード。

SELECT以外の禁止

INSERT/UPDATE/DELETE/DROPは全て拒否する。データ変更が必要な場合は、専用のツール(update_ad_status等)を経由させる。これにより監査ログが確実に残る。

レイヤー4: マルチテナント分離 — 組織間のデータを絶対に混ぜない

広告運用AIエージェントを複数の組織で利用するSaaSにする場合、テナント分離が最重要である。1件でもデータ漏洩があればプロダクトの信頼が失墜する。

renueの実装パターン

  • verifyResourceProject(table, id, projectIds, orgId): orgIdは必須引数、省略不可
  • verifyResourceOrg(table, id, orgId): orgスコープリソースの検証
  • verifyFileOwnership(key, orgId, projectIds): S3ファイルのorg_id絞り込み
  • requireOrg(): 全APIルートでorgIdとprojectIdsを取得
  • 外部キー検証: リクエストボディの hypothesis_id, campaign_id 等は所有権検証してからINSERT

重要な設計原則

  • テナント分離コードは一度実装したら変更・再実装しない(セキュリティ監査の対象)
  • org_id絞り込みをアプリケーション層で徹底する(DBレベルでRow Level Securityを使わない場合は特に重要)
  • 全てのクエリにorg_idの絞り込みが入っているかを定期的に監査する

レイヤー5: 広告プラットフォーム認証情報のDB管理

Google Ads、Meta、TikTok、X Ads等の認証情報(APIキー、リフレッシュトークン、シークレット)をどこに保存するかは重大な設計判断である。

やってはいけないこと

  • `.env`ファイルに直書き(複数組織で共有される場合は致命的)
  • コードから`process.env`で直接参照(レガシー変数が残っている場合でも参照禁止)
  • 平文でDBに保存

推奨パターン(renueの実装)

  • `project_ad_platform_accounts`テーブルで組織・プロジェクト単位に管理
  • トークンはAES-256-GCMで暗号化してDBに保存
  • renue自身の認証情報も例外なくDB管理(自社運用と顧客運用を同じ仕組みで扱う)
  • 認証情報取得時は`org_id + project_id`で絞り込み

レイヤー6: Rate Limit — AI生成の暴走とコスト爆発を防ぐ

AI生成機能は1回の呼び出しが高コストになるため、Rate Limitが必須である。renueの実装では以下の4カテゴリに制限をかけている。

  • agentChat: チャット対話
  • imageGeneration: 画像生成
  • videoGeneration: 動画生成(Sora等)
  • totpVerify: 2FA認証(ブルートフォース対策)

Rate Limitはユーザー単位/IP単位/組織単位で多層的に設計する。特に動画生成はコストが高いため厳しめに設定する。

レイヤー7: 監査ログ — 広告配信変更の完全な追跡

AIエージェントが広告のステータス変更、予算変更、クリエイティブ入れ替えを行う場合、すべてのアクションを監査ログに記録する必要がある。

必須の記録項目

  • 実行者(user_id)
  • 実行時刻
  • 対象リソース(campaign_id, ad_id, creative_id等)
  • 変更前後の状態
  • AI経由か手動かの区別
  • AI判断の根拠(どのプロンプト・ツール呼び出しの結果か)

renueの実装では`ad_submission_audit_log`テーブルで広告提出の監査ログを完全に記録しており、トラブル発生時に原因を特定できる体制を作っている。

レイヤー8: 広告プラットフォームAPIの抽象化

Google Ads、Meta Ads、TikTok Ads、X AdsはそれぞれAPIが異なるため、統一インターフェースで抽象化する必要がある。

renueの抽象化レイヤー

`lib/ad-platforms/`ディレクトリ配下に媒体別のクライアント(`google-ads.ts`, `meta-ads.ts`, `tiktok-ads.ts`, `x-ads.ts`)と、共通インターフェース(`index.ts`)を実装している。これにより、エージェント側は「どの媒体か」を気にせず、統一的なメソッドで操作できる。

sanitize.tsによる入力検証

AIエージェントが生成したパラメータを各プラットフォームに渡す前に、必ずsanitizeする。不正な値(例: 負の予算、無効なステータス)を事前に弾くことで、API呼び出しエラーを防ぐ。

Next.js + API Routes構成の推奨

renueの実装ではNext.js App RouterのAPI Routesでバックエンドを実装している。主な理由は以下の通り。

  • フロントエンドと同じTypeScriptで統一できる
  • 認証ミドルウェアをフロント・APIで共有できる
  • SWR/SWR Mutationとの相性が良い
  • Chakra UI v2との統合が容易

DBアクセスは`lib/db.ts`のMySQLコネクションプール経由、ファイルアップロードは`lib/storage.ts`のS3クライアント(本番S3 or 開発用MinIO)経由で統一している。

開発時の認証ルール

3段階の認可チェック

  • requireAuth(): ログイン必須
  • requireOrg(): 組織所属が必須(org_idとproject_idsを取得)
  • requireAdmin(): 管理者のみ

2FA(TOTP)の本番必須化

本番環境では2FA必須とする。認証情報へのアクセス、管理操作、APIキー管理など、セキュリティクリティカルな操作は必ず2FAで保護する。

CSRF対策

Origin/Refererチェックにより、外部サイトからのCSRF攻撃を防ぐ。Next.js標準のCSRF対策に加え、セキュリティヘッダー(X-Frame-Options等)も明示的に設定する。

renueのアプローチ — Self-DX Firstによる広告AIエージェント

renueは「Self-DX First」の方針のもと、広告代理AIエージェントを自社プロダクトとして開発・運用している。社内12業務(採用・経理・PMO・評価など)を553のAIツールで自動化済み(2026年1月時点)であり、広告代理AIエージェントはその中でも最も機能が豊富なプロダクトの一つである(全て公開情報)。

公開されている特徴

  • 6媒体統合(Google・Meta・X・TikTok・LINE・YouTube)
  • マージン1〜2%(従来型代理店の最大90%以上削減)
  • クリエイティブ管理機能内蔵(生成→QA→配信→実績取り込みまで一気通貫)
  • マルチテナントSaaS設計(複数組織で安全に利用可能)
  • TypeScript + Next.js + MySQLで構築
  • Anthropic Claude APIをメインLLMとして利用

導入時のよくある失敗パターン

  • ツールを定義せずに汎用チャットで対応しようとする: エージェントが推測で動き、誤操作のリスクが高い
  • SQLを無制限に書かせる: 認証情報や他テナントのデータが漏洩する
  • マルチテナント分離を後回しにする: 後から実装すると全API routeの書き直しが必要
  • 認証情報を.envに残す: 複数組織での運用ができない
  • Rate Limitを設定しない: AI生成コストが爆発する
  • 監査ログを記録しない: トラブル時に原因追跡できない
  • 曖昧な指示をそのまま実行する: 意図しない操作が発生する

よくある質問

Claude Agent SDKと自前実装、どちらが良い?

本格的なマルチテナントSaaSを作るなら、Next.js + Anthropic SDKで自前実装するのが柔軟性が高い。Claude Agent SDKはPython中心で、Hookやストリーミング配信が強力だが、複雑なテナント分離・認証・UIとの統合は自前実装の方が扱いやすい。

SQLホワイトリストを維持するコストは?

許可テーブルが増減するたびに更新が必要だが、これは「セキュリティコスト」として割り切るべきである。間違ったテーブルへのアクセスを許してしまうリスクに比べれば、メンテナンスコストは軽微である。

マルチテナント分離のベストプラクティスは?

アプリケーション層でorg_id絞り込みを徹底する。ヘルパー関数(verifyResourceOrg等)に統一し、個別のAPI routeで直接クエリを書かない。また、定期的にコードレビューで「org_idの絞り込みがあるか」をチェックする文化が重要。

どのLLMを使うべき?

2026年現在、Anthropic Claude(Opus/Sonnet)がツール呼び出しと構造化出力で最も安定している。OpenAI GPT-4oやGoogle Gemini 2.0も選択肢だが、LLMごとにTool Schemaの扱いが微妙に異なるため、本番では1つに統一するのが運用上楽である。

開発開始から本番リリースまでの期間は?

本格実装の場合、最低3〜6ヶ月は必要。特にマルチテナント分離・認証・Rate Limit・監査ログのセキュリティレイヤー実装に時間がかかる。機能だけなら1〜2ヶ月で動くものが作れるが、本番運用に耐えるにはセキュリティレイヤーが必須である。