> ## Documentation Index
> Fetch the complete documentation index at: https://docs.nekt.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Google Ads as an MCP

> Let your AI agents use Google Ads in real time through the Nekt MCP Gateway.

Google Ads is Google's online advertising platform. By connecting it as an MCP, your AI agents can read campaign performance, manage budgets, create or pause ads, and adjust negative keywords in real time.

| | Available |
| :- | :- |
| **Nekt Express** | Yes |
| **GCP** | Yes |
| **AWS** | Yes |

## Adding Google Ads as an MCP

Before you start, make sure the [MCP Server](/mcp-server/setup) is set up. See [MCPs](/mcps/overview) for how MCPs work.

1. Go to **Activate → [MCPs](https://app.nekt.ai/mcps)**, click **New MCP** and choose **Google Ads**.
2. **Name your MCP** and describe what it is used for. The agent reads the description to choose between MCPs of the same provider.
3. **Setup access**. Click the sign-in button and authorize with a Google account that can see the data you want the agent to use. Actions run with that account's permissions.
   * **Sign in with Google** (Required): Sign in with a Google account that has access to the Google Ads accounts you want to read from and manage.
   * **Manager Account ID**: Fill this field if you authenticated using a manager (MCC) account. This value is sent in the login-customer-id header on every API call.
4. **Select tools**. Pick the tools your agents can use. See [Available tools](#available-tools) below.
5. Click **Save**. On Growth and Custom plans, choose who can use it; see [Access levels](/mcps/overview#access-levels).

## Example prompts

* "What was the total spend and conversion count for the 'Spring Sale' campaign over the last 30 days?"
* "Increase the daily budget of the 'Retargeting' campaign by 20 percent."
* "Add 'free' and 'cheap' as negative keywords to the 'Enterprise Software' campaign."
* "Pause all ad groups in the 'Summer Promo' campaign."

## Available tools

Choose which of these tools your agents can use in **Select tools**.

### Read tools

| Tool | Description | Parameters |
| :- | :- | :- |
| `find_geo_targets` | Look up Google Ads location ids by name, for set\_campaign\_geo. Searches place names ("Brasil", "São Paulo", "Rio Grande do Sul") and returns each match with its id, canonical name and type (Country, State, City...). Without this there is no way to discover an id short of hardcod… | `query` (string, required), `locale` (string), `country_code` (string) |
| `get_campaign_performance` | Get per-campaign performance metrics (impressions, clicks, cost, conversions) from Google Ads for a date range (YYYY-MM-DD; defaults to the last 30 days). | `customer_id` (string, required), `end_date` (string), `start_date` (string) |
| `list_accessible_customers` | List the Google Ads customer account ids directly accessible to the authenticated user. | — |
| `list_account_hierarchy` | List all Google Ads client accounts under a customer (useful for manager/MCC accounts). | `customer_id` (string, required) |
| `list_ad_groups` | List ad groups in a Google Ads account, optionally filtered by campaign id. | `customer_id` (string, required), `campaign_id` (string) |
| `list_ads` | List ads in a Google Ads account (responsive search ad texts, final URLs and status), optionally filtered by ad group or campaign id. | `customer_id` (string, required), `ad_group_id` (string), `campaign_id` (string) |
| `list_campaigns` | List campaigns in a Google Ads account with status, type, budget and bidding strategy. | `customer_id` (string, required), `include_removed` (boolean) |
| `list_negative_keywords` | List the negative keywords of one Google Ads negative keyword list (shared\_set\_id) or of one campaign (campaign\_id) — pass exactly one. Returns each term with its criterion\_id, which is what remove\_negative\_keywords takes to undo a negativation. | `customer_id` (string, required), `campaign_id` (string), `shared_set_id` (string) |
| `list_shared_sets` | List the shared sets (negative keyword lists) of a Google Ads account and the campaigns each one is attached to — use it to find the shared\_set\_id to pass to add\_negative\_keywords. | `customer_id` (string, required) |
| `run_gaql` | Run an arbitrary GAQL (Google Ads Query Language) query against a Google Ads account — use for any report or lookup not covered by the other tools; add LIMIT to keep results small. | `query` (string, required), `customer_id` (string, required) |

### Write tools

| Tool | Description | Parameters |
| :- | :- | :- |
| `add_keywords` | Add keywords to a Google Ads ad group; match\_type: BROAD, PHRASE or EXACT. | `keywords` (array, required), `ad_group_id` (string, required), `customer_id` (string, required), `match_type` (string) |
| `add_negative_keywords` | Add negative keywords to a Google Ads account so the given terms stop triggering ads. Pass exactly one target: shared\_set\_id applies the terms to every campaign attached to that negative keyword list (use list\_shared\_sets to find it), campaign\_id blocks them in that one campaign… | `keywords` (array, required), `customer_id` (string, required), `match_type` (string), `campaign_id` (string), `shared_set_id` (string) |
| `attach_shared_set_to_campaign` | Attach a negative keyword list (shared set) to a Google Ads campaign, so every term in the list stops triggering that campaign's ads. | `campaign_id` (string, required), `customer_id` (string, required), `shared_set_id` (string, required) |
| `create_ad_group` | Create an ad group inside a Google Ads campaign; cpc\_bid is the max CPC in the account currency (optional). | `name` (string, required), `campaign_id` (string, required), `customer_id` (string, required), `status` (string), `cpc_bid` (number) |
| `create_campaign` | Create a campaign in Google Ads (created PAUSED by default for safety). channel\_type: SEARCH, DISPLAY, PERFORMANCE\_MAX...; bidding\_strategy: MAXIMIZE\_CLICKS, MAXIMIZE\_CONVERSIONS, MAXIMIZE\_CONVERSION\_VALUE, MANUAL\_CPC or TARGET\_IMPRESSION\_SHARE; dates are YYYY-MM-DD. Bidding lim… | `name` (string, required), `budget_id` (string, required), `customer_id` (string, required), `status` (string), `end_date` (string), `start_date` (string), `target_cpa` (number), `target_roas` (number), `channel_type` (string), `cpc_bid_ceiling` (number), `display_network` (boolean), `search_partners` (boolean), `bidding_strategy` (string), `impression_share_percent` (number), `impression_share_location` (string), `contains_eu_political_advertising` (boolean) |
| `create_campaign_budget` | Create a daily campaign budget in Google Ads; daily\_amount is in the account currency (e.g. 50.0 = R\$50/day). Returns the budget resource name to use in create\_campaign. | `name` (string, required), `customer_id` (string, required), `daily_amount` (number, required), `explicitly_shared` (boolean) |
| `create_responsive_search_ad` | Create a responsive search ad in a Google Ads ad group (created PAUSED by default); 3-15 headlines (max 30 chars each), 2-4 descriptions (max 90 chars each). | `headlines` (array, required), `final_urls` (array, required), `ad_group_id` (string, required), `customer_id` (string, required), `descriptions` (array, required), `path1` (string), `path2` (string), `status` (string) |
| `create_shared_set` | Create a negative keyword list (a shared set) in a Google Ads account. The list blocks nothing until it is attached to campaigns with attach\_shared\_set\_to\_campaign. | `name` (string, required), `customer_id` (string, required) |
| `remove_ads_object` | Permanently remove a Google Ads object; object\_type: campaign, ad\_group, ad, keyword or budget (campaign\_budget is accepted as an alias for budget; ad and keyword also require ad\_group\_id). Removal cannot be undone — the object is kept in historical reports but can never be reac… | `object_id` (string, required), `customer_id` (string, required), `object_type` (string, required), `ad_group_id` (string) |
| `remove_negative_keywords` | Remove negative keywords, so the terms can trigger ads again. Takes criterion ids (get them from list\_negative\_keywords, not the term text) and exactly one target: shared\_set\_id to take them off a negative keyword list, campaign\_id to take them off a single campaign. | `customer_id` (string, required), `criterion_ids` (array, required), `campaign_id` (string), `shared_set_id` (string) |
| `set_campaign_ad_schedule` | Set the days and hours a Google Ads campaign may serve, REPLACING the previous schedule. Each entry is \{"day": "MONDAY", "start\_hour": 9, "end\_hour": 18} and may carry "start\_minute"/"end\_minute", which must be 0, 15, 30 or 45. Hours are 0-24 in the account's timezone; end\_hour… | `schedule` (array, required), `campaign_id` (string, required), `customer_id` (string, required) |
| `set_campaign_device_bid_modifier` | Raise or lower a Google Ads campaign's bids on one device type. device: MOBILE, DESKTOP, TABLET, CONNECTED\_TV or OTHER. modifier is a multiplier — 1.0 is no change, 1.2 bids 20% more, 0.8 bids 20% less, and 0 stops serving on that device entirely. Only the given device is touche… | `device` (string, required), `modifier` (number, required), `campaign_id` (string, required), `customer_id` (string, required) |
| `set_campaign_geo` | Set which locations a Google Ads campaign targets, REPLACING whatever it targeted before. location\_ids come from find\_geo\_targets (Brazil is 2076). Set negative=True to exclude the given locations instead of targeting them — note that this replaces the campaign's exclusions, not… | `campaign_id` (string, required), `customer_id` (string, required), `location_ids` (array, required), `negative` (boolean) |
| `set_campaign_languages` | Set which languages a Google Ads campaign targets, REPLACING whatever it targeted before. Language ids are Google constants — Portuguese is 1014, English 1000, Spanish 1003. This matches the user's Google interface language, not the language the ad is written in. | `campaign_id` (string, required), `customer_id` (string, required), `language_ids` (array, required) |
| `update_ad_group` | Update a Google Ads ad group: status (ENABLED/PAUSED), name and/or max CPC bid in the account currency. | `ad_group_id` (string, required), `customer_id` (string, required), `name` (string), `status` (string), `cpc_bid` (number) |
| `update_ad_status` | Change a Google Ads ad's status: ENABLED to activate or PAUSED to pause it. | `ad_id` (string, required), `status` (string, required), `ad_group_id` (string, required), `customer_id` (string, required) |
| `update_campaign` | Update a Google Ads campaign: status (ENABLED to activate, PAUSED to pause), name, start\_date or end\_date (YYYY-MM-DD). | `campaign_id` (string, required), `customer_id` (string, required), `name` (string), `status` (string), `end_date` (string), `start_date` (string) |
| `update_campaign_bidding` | Change a Google Ads campaign's bidding strategy and its limits. Same arguments as create\_campaign: cpc\_bid\_ceiling for MAXIMIZE\_CLICKS or TARGET\_IMPRESSION\_SHARE, target\_cpa for MAXIMIZE\_CONVERSIONS, target\_roas for MAXIMIZE\_CONVERSION\_VALUE, and the impression\_share pair for TA… | `campaign_id` (string, required), `customer_id` (string, required), `bidding_strategy` (string, required), `target_cpa` (number), `target_roas` (number), `cpc_bid_ceiling` (number), `impression_share_percent` (number), `impression_share_location` (string) |
| `update_campaign_budget` | Update a Google Ads campaign budget's daily amount (account currency) and/or name. | `budget_id` (string, required), `customer_id` (string, required), `name` (string), `daily_amount` (number) |
| `update_campaign_networks` | Choose where a Google Ads search campaign may serve: Google Search itself, Google's search partner sites, and the Display Network. Turning display\_network on makes the ads run on third-party sites — a different surface, not just more of the same one. Turning google\_search off wh… | `campaign_id` (string, required), `customer_id` (string, required), `google_search` (boolean), `display_network` (boolean), `search_partners` (boolean) |

## Troubleshooting

* **Expired or revoked access**: If the MCP shows that it needs to reconnect (for example, if your Google session expired or access was revoked), go to the MCP's page and sign in again.
* **Rate limits**: If your agent encounters a quota error (RESOURCE\_EXHAUSTED), the Google Ads API rate limit has been reached. Wait until the reset time indicated in the error message before trying again.
* **Missing permissions**: Ensure the Google account you used to sign in has the appropriate access levels to read or edit the campaigns you are querying.

## Need help?

Contact our support team if you have trouble connecting Google Ads.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.