Creating campaigns, changing budgets and pausing live ads are all in scope, so the credential you hand it is a credential that can spend money — the project's own security notes say to use service accounts in production and rotate refresh tokens. The error handling is the standout: a failure comes back with a retryable flag and a link to Google's documentation for that specific code, which is far more actionable than the raw API's response.
An MCP server over the Google Ads API v20 that covers the operational surface rather than reporting alone: accounts and hierarchy, campaigns, ad groups, ads, assets, shared budgets, keywords and negatives, plus custom GAQL queries. It handles the parts of the API that usually cost you a day — retrying transient errors with exponential backoff, refreshing OAuth tokens automatically, and continuing through a partial failure instead of aborting the batch.
- Accounts listed with their hierarchy — `list_accounts`
- Campaigns created, updated, paused and resumed, with the budget amount and campaign type set on creation — `create_campaign`
- Performance read over a named date range — `get_campaign_performance`
- Arbitrary GAQL executed, which is how you get the report the typed tools do not cover — `run_gaql_query`
- Negative keywords added, including campaign-level negatives for Performance Max, which is a v20 addition — `add_negative_keywords`
- Ad group CRUD, responsive search and expanded text ads, image and text asset management, and shared budgets
- Errors returned with the type and code, whether the failure is retryable, a link to Google's own documentation for it, and a suggested fix
A Google Ads developer token in `GOOGLE_ADS_DEVELOPER_TOKEN` — required for every auth method — plus either the OAuth2 trio `GOOGLE_ADS_CLIENT_ID`, `GOOGLE_ADS_CLIENT_SECRET` and `GOOGLE_ADS_REFRESH_TOKEN`, or a service account via `GOOGLE_ADS_SERVICE_ACCOUNT_PATH` with an optional `GOOGLE_ADS_IMPERSONATED_EMAIL`. Set `GOOGLE_ADS_LOGIN_CUSTOMER_ID` when you work through a manager account. Configuration can live in the environment or in `~/.config/google-ads-mcp/config.json` instead. Python with `pip install -e .`, run as `python -m google-ads-mcp`; `LOG_LEVEL=DEBUG` for detailed logs.
One command plus a key — pip install -e ., then supply credentials
