Дата: 2026-05-01
Автор: Claude (research)
Контекст: Сергій побачив google-marketing-solutions/google_ads_mcp у звіті GitHub TOP-20 і питає, чи варто інтегрувати в ad-analytics-hub.
google_ads_mcp — це MCP-сервер на Python 3.12 від команди Google Marketing Solutions, який дозволяє LLM (Gemini CLI / Claude / Cursor) робити GAQL-запити та мутації до Google Ads API напряму через OAuth (user credentials + developer_token). Це НЕ заміна нашому ETL — це інтерактивний layer для агентів, що доповнює Search Campaign Builder. Рекомендація — варіант Б (доповнює стек), інтегрувати ПІСЛЯ того, як Сергій завершить OAuth-setup для Search Campaign Builder v2 (бо вони потребують ОДНІ Й ТІ САМІ credentials: client_id + client_secret + refresh_token + developer_token). Інтеграція MVP — 0.5–1 робочий день після того, як OAuth готовий. ⚠️ Офіційний дисклеймер репо: «NOT an officially supported Google product, experimental, not for production».
Репозиторій: https://github.com/google-marketing-solutions/google_ads_mcp Ліцензія: Apache 2.0 Зрілість: 189 stars, 58 forks, останній реліз v0.6.4 (на момент звіту) Статус: experimental, не production-grade (явний дисклеймер у README)
uv або pipxЧерез user OAuth + developer_token — стандартна схема google-ads-python SDK. У домашній директорії потрібен файл google-ads.yaml:
client_id: ...
client_secret: ...
refresh_token: ...
developer_token: ...
login_customer_id: ... # optional, recommended (для MCC)
Service Account — НЕ підтримується (типове обмеження Google Ads API: SA працює тільки для Workspace-доменних акаунтів через delegation, що нерелевантно для рекламних кабінетів масового користувача).
MCC підтримується через login_customer_id — це той самий механізм, що ми вже плануємо у Search Campaign Builder v2.
Read-only (завжди увімкнено):
SELECT ... FROM ... WHERE ... запити до Google AdsMutation (вимкнено за замовчуванням, вмикається ADS_MCP_ENABLE_MUTATIONS=true):
⚠️ У README немає згадок про:
ADS_MCP_ENABLE_MUTATIONS — true/falseGOOGLE_ADS_CREDENTIALS — шлях до yamlUSE_GOOGLE_OAUTH_ACCESS_TOKEN — опційно, для verify access tokenuv run -m ads_mcp.servermcpServers config (stdio command + args)| Компонент | Метод | Тригер |
|---|---|---|
| MCC CSV downloader | VNC + cookies (/srv/passepartout/google/cookies-google-ads.json) |
cron 0 3 * * * |
BigQuery ad-analytics-hub.ad_data |
SA ad-pipeline-worker@, ключ bigquery-sa.json |
cron-ETL з CSV |
| Daily Delta Monitor | BigQuery → Notion алерти | cron 30 4 |
| Search Campaign Builder v2 | Google Ads API (google-ads SDK) через OAuth |
🔴 OAuth setup чекає Сергія (Client ID + Secret з GCP ad-analytics-hub, Desktop app type) |
| Looker Studio | Cookies-сесія | manual / scheduled email |
| Google Ads Crew (5 агентів) | Gemini CLI, аналіз CSV-даних | manual run |
Архітектура: batch ETL (cookies) → BigQuery → дашборди / алерти. Інтерактив через LLM — поки що тільки на cached даних, не на live API.
| Аспект | Наш стек (зараз) | google_ads_mcp |
|---|---|---|
| Метод підключення кабінетів | Cookies через VNC (MCC dashboard CSV) + (планується) Google Ads API через OAuth | Google Ads API через OAuth (google-ads-python) |
| Авторизація | Cookies для CSV; Service Account для BigQuery; OAuth для Search Builder (todo) | User OAuth: client_id + client_secret + refresh_token + developer_token |
| Хто ініціює запит | Cron (3:00, 3:30, 4:30) — батчевий ETL | LLM (Gemini/Claude) у real-time, через MCP-stdio |
| Read / Write | Read-only (CSV download); Search Builder — read keywords (read-only KeywordPlanIdeaService) |
Read GAQL завжди; Write (create campaign/budget/ad group/ad/keyword) опційно |
| MCC support | Так (через MCC dashboard у браузері) | Так (через login_customer_id у yaml) |
| Latency | T+1 день (нічний cron) | Real-time (секунди — пряма API) |
| Витрати на operational support | Cookies протухають → Сергій логиниться руками періодично; VNC моніториться | Refresh-токен живе довго (роки), мінімум support; ризик — invalid_grant при відкликанні доступу |
| Глибина даних | Тільки те, що Google показує у MCC dashboard CSV (стандартні стовпці) | Усе, що віддає Google Ads API — кастомні GAQL-запити, segments, keyword_view, search_term_view, etc. |
| Інтеграція з n8n / REST | CSV у файлах + BigQuery (n8n легко читає) | Stdio MCP only — для n8n потрібна обгортка (FastAPI wrapper або Gemini CLI як runner) |
| Production-readiness | Працює, але fragile (cookies) | Experimental per disclaimer; коду 189★, малий community |
| Транспорт | HTTP (CSV download) + BigQuery API | stdio (subprocess) |
| Vendor lock-in | Низький (CSV — універсальний формат) | Низький (sdk google-ads — open source, можна переписати на власні скрипти за 1 день) |
Варіант Б — «Доповнює частину нашого стеку, варто інтегрувати, але не зараз»
ad-analytics-hub (Desktop app type). Це блокер №1 для Search Builder, і той самий блокер для MCP.ad-analytics-hubgoogle-ads-python quickstart)/srv/passepartout/google/google-ads.yaml + meta-файлapt install pipx; pipx install uv на VPS.git clone https://github.com/google-marketing-solutions/google_ads_mcp /srv/tools/google-ads-mcp.cd /srv/tools/google-ads-mcp && uv pip sync.cp /srv/passepartout/google/google-ads.yaml ~/.google-ads.yaml (або через GOOGLE_ADS_CREDENTIALS=/srv/passepartout/...).uv run -m ads_mcp.server → у Claude Code прописати mcpServers запис.login_customer_id працює.gaql_query, не CSV».ADS_MCP_ENABLE_MUTATIONS=true + human-in-the-loop confirmation gate.| Ризик | Митigation |
|---|---|
| Refresh-token відкликано (invalid_grant) | Моніторинг + alert у Notion при першій помилці |
| Experimental status — breaking changes у v0.7+ | Pin до v0.6.4, оновлювати свідомо |
| Розкриття developer_token | yaml у passepartout з restrictive perms (600) |
| Gemini галюцинує GAQL → 400 помилка | OK, не data-loss; tracing у логах |
| Quota Google Ads API | Basic token = 15k operations/day; для read-only нашої скейли вистачить |
google-ads-python напряму — той самий SDK, що під капотом MCP. Якщо нам не треба MCP-стандарт, можна написати власний скрипт на 200 рядків. Плюс: повний контроль. Мінус: треба підтримувати самим.MCP займає унікальну нішу: real-time Google Ads API для LLM-агентів, без власного API-коду.