{
  "markdown": "# Google Ads Manager MCP\n\n> Unofficial, community-maintained project. Not affiliated with, endorsed by, or sponsored by\n> Google. \"Google Ads\" is a trademark of Google LLC.\n\nA local MCP (Model Context Protocol) server that lets an AI assistant read and manage a Google Ads\naccount: run GAQL reports, create campaigns, pause/enable campaigns, and add keywords.\n\nGoogle also publishes an [official Google Ads MCP server](https://github.com/googleads/google-ads-mcp),\nwhich is **read-only** (reporting/diagnostics only). This project covers the same reporting ground\nand adds **write** support — creating and editing campaigns, budgets, ad groups, keywords, and ads —\ngated behind a draft/confirm safety layer so nothing changes in your account by accident.\n\nEvery write goes through a **draft → confirm** safety flow: the tool that \"creates\" or \"updates\"\nsomething only validates the change against Google's API (`validate_only`) and hands back a\n`draftId` with a preview. Nothing changes in your Ads account until you call `confirm_write` with\nthat `draftId`. Drafts expire after 10 minutes.\n\n## Tools\n\nRead-only:\n- `list_accessible_customers` — which accounts this refresh token can reach\n- `search_gaql` — run any raw GAQL `SELECT` query\n- `get_campaigns` — campaigns with status, budget, and core metrics\n- `get_ad_groups` — ad groups (optionally filtered to a campaign) with metrics\n- `get_keywords` — keyword criteria with match type, status, and metrics\n- `get_search_terms` — actual search terms that triggered your ads, for finding negative keyword candidates\n\nWrite (draft → confirm):\n- `create_campaign` — new campaign + budget, created `PAUSED` unless you say otherwise\n- `update_campaign_status` — enable / pause / remove a campaign\n- `update_campaign_budget` — change an existing campaign's daily budget\n- `add_keywords` — add keyword criteria to an ad group\n- `create_ad_group` — new ad group inside an existing campaign\n- `update_ad_group_status` — enable / pause / remove an ad group\n- `update_keyword_status` — enable / pause / remove a keyword criterion\n- `add_negative_keywords` — add negative keyword criteria to an ad group\n- `create_responsive_search_ad` — new responsive search ad, created `PAUSED` unless you say otherwise\n- `confirm_write` — execute a previously returned `draftId` for real\n\n## Setup\n\n### 1. Google Ads developer token\n\nGoogle Ads → Tools & Settings → **API Center**. Test-account tokens are issued instantly; a\nproduction-level token requires Google's manual review (roughly 1-2 weeks), so apply for that\nearly if you'll use this beyond a test account.\n\n### 2. OAuth client\n\nGoogle Cloud Console → APIs & Services → Credentials → **Create credentials → OAuth client ID**.\nChoose application type **Desktop app**. Copy the client ID and client secret.\n\n### 3. Configure environment\n\n```bash\ncp .env.example .env\n```\n\nFill in `GOOGLE_ADS_CLIENT_ID`, `GOOGLE_ADS_CLIENT_SECRET`, `GOOGLE_ADS_DEVELOPER_TOKEN`, and\n`GOOGLE_ADS_CUSTOMER_ID` (the account this server should manage — 10 digits, dashes optional). If\nthat account is a client under a manager (MCC) account, also set `GOOGLE_ADS_LOGIN_CUSTOMER_ID` to\nthe manager account's ID.\n\n### 4. Get a refresh token\n\n```bash\nnpm install\nnpm run auth\n```\n\nThis opens an authorization URL — open it, sign in with the Google account that has access to\nyour Ads account, approve the `adwords` scope. The script prints a `GOOGLE_ADS_REFRESH_TOKEN`;\nadd it to `.env`.\n\n### 5. Build\n\n```bash\nnpm run build\n```\n\n### 6. Point your MCP client at it\n\nFor Claude Desktop / Claude Code, add to your MCP config:\n\n```json\n{\n  \"mcpServers\": {\n    \"google-ads-manager\": {\n      \"command\": \"node\",\n      \"args\": [\"/absolute/path/to/google ads manger mcp/build/index.js\"],\n      \"env\": {\n        \"GOOGLE_ADS_CLIENT_ID\": \"...\",\n        \"GOOGLE_ADS_CLIENT_SECRET\": \"...\",\n        \"GOOGLE_ADS_DEVELOPER_TOKEN\": \"...\",\n        \"GOOGLE_ADS_REFRESH_TOKEN\": \"...\",\n        \"GOOGLE_ADS_CUSTOMER_ID\": \"...\"\n      }\n    }\n  }\n}\n```\n\n(Or skip the `env` block and just make sure `.env` is populated — the server loads it via\n`dotenv` when run directly, e.g. `npm run dev` during local iteration.)\n\n## Notes\n\n- This is scoped to a **single** Google Ads account (`GOOGLE_ADS_CUSTOMER_ID`). To manage several\n  client accounts under one manager account, either run one instance per customer ID, or extend\n  `googleAdsClient.ts` to accept a `customerId` argument per tool call.\n- New campaigns default to `PAUSED` (`startEnabled: false`) so nothing spends until you explicitly\n  enable it.\n\n## Contributing\n\nIssues and PRs welcome — new report types, negative-keyword-at-campaign-level support, and\nmulti-account (MCC) handling are the most useful next additions.\n\n## License\n\n[MIT](LICENSE)\n",
  "bytes": 4744,
  "sha": "eef75d7075e9738681c493864c3f63a5516d57a691603aba68e33fa34ca50b65",
  "repo_slug": "aleemhaider/google-ads-manager-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_aleemhaider_google_ads_manager_1e97de95/readme"
}