On this page
Google Ads
Last updated
Connect a Google Ads account to a vTilt project, then read and manage campaigns, ad groups, ads, keywords, and Performance Max through the vTilt MCP server — no separate Google Ads MCP server required.
vTilt can manage your Google Ads account through the same MCP endpoint your AI client already uses for analytics. There is no second server to run: the google_ads_* tools live in the google-ads toolset (plus an optional typed-shortcuts toolset). Calls succeed only after you connect an account in project settings (otherwise the server returns feature_disabled).
#Connect Google Ads (required first)
The Google Ads tools stay hidden until a project has a connected account; once connected, the 13-tool core is auto-listed for that project.
- Open Project → Settings → Google Ads.
- Click Connect Google Ads and complete the Google consent screen. vTilt requests the
https://www.googleapis.com/auth/adwordsscope. - After the redirect, vTilt discovers the accounts you can access and lists them. Pick the default account the tools should use when a call doesn't name one.
- If you manage accounts through an MCC (manager account), set the manager (login) customer id.
vTilt stores the OAuth refresh token encrypted at rest and holds the platform developer token server-side. Your AI client never sees or sends credentials — tool inputs accept neither a refresh token nor a user id.
To stop access, click Disconnect on the same page — vTilt deletes the stored token and linked accounts. Enabled tools stay in tools/list; calls return feature_disabled until you connect again.
After switch_project, check features.google_ads in the tool response (or call get_context). Enable the google-ads toolset, then call google_ads_* tools as soon as that flag is true — re-run tools/list only if your MCP client caches the catalog.
#Permissions
Google Ads access is gated by a dedicated google_ads permission resource:
| Action | Who has it | What it allows |
|---|---|---|
google_ads:read | members and above | List accounts, read account data via GAQL |
google_ads:write | owners and admins | Create / update / pause / remove campaigns, ad groups, ads, keywords, and more |
Write tools additionally require a write-scoped credential (an mcp:write OAuth scope or a personal API key with write access), and every write is recorded in the project audit log.
#Reading account data
Always learn the valid fields before querying — the tools steer you to do this so you never guess field names.
google_ads_get_resource_metadata— pass aresource(e.g.campaign,ad_group_ad,keyword_view) to get the selectable fields.google_ads_search— assemble a read-only query fromresource,fields, and optionalconditions,order_by,limit. vTilt builds and validates the GAQL server-side.google_ads_list_customers— see which accounts are linked to the project.
Every tool takes an optional customer_id (dashed 123-456-7890 or digits 1234567890 — both work). Omit it to use the project's default account.
A search for the last 30 days of campaign spend looks like:
{
"resource": "campaign",
"fields": [
"campaign.id",
"campaign.name",
"metrics.cost_micros",
"metrics.clicks"
],
"conditions": [
"campaign.status = 'ENABLED'",
"segments.date DURING LAST_30_DAYS"
],
"order_by": "metrics.cost_micros DESC",
"limit": 25
}#More read tools
| Tool | Does |
|---|---|
google_ads_run_gaql | Run a raw GAQL string you assembled yourself (for clauses google_ads_search can't build). |
google_ads_plan_keywords | Keyword Planner: discover keyword ideas, historical metrics, or forecasts (action). |
google_ads_forecast_reach | Reach planning: list plannable locations or forecast reach for a budget (action). |
google_ads_list_invoices | Fetch account invoices for a billing setup + month (invoices aren't available through GAQL). |
#Managing the account (writes)
#One tool for any change: google_ads_mutate
For any create, update, or remove on any entity, use google_ads_mutate (in the core google-ads toolset). You pass raw operations and vTilt forwards them to Google:
{
"operations": [
{
"campaign_criterion_operation": {
"create": {
"campaign": "customers/1234567890/campaigns/111",
"negative": true,
"keyword": { "text": "free", "match_type": "BROAD" }
}
}
}
],
"validate_only": true
}#Typed shortcuts for common workflows
These live in the separate google-ads-shortcuts toolset, which is opt-in: add ?toolsets=google-ads-shortcuts (or ?toolsets=all) to your MCP URL to include them. They wrap google_ads_mutate with a friendlier schema for the most common changes — everything they do is also expressible through google_ads_mutate, so the focused 13-tool core (auto-listed when an account is connected) is enough for most workflows:
| Tool | Does |
|---|---|
google_ads_set_campaign_status | Enable / pause / remove a campaign |
google_ads_update_campaign_budget | Change a campaign budget |
google_ads_create_ad_group, google_ads_set_ad_group_status | Create or set the status of an ad group |
google_ads_create_responsive_search_ad, google_ads_set_ad_status | Add a responsive search ad, set ad status |
google_ads_add_keyword, google_ads_set_keyword_status, google_ads_add_negative_keyword | Manage keywords and negatives |
google_ads_update_campaign_ai_max, google_ads_update_ad_group_ai_max | Configure AI Max |
google_ads_add_webpage_criterion, google_ads_create_page_feed_asset_set, google_ads_add_page_feed_assets | AI Max / DSA webpage targeting and page feeds |
google_ads_create_pmax_asset_group, google_ads_create_responsive_display_ad, google_ads_add_ad_group_user_list | Performance Max asset groups, display ads, audience targeting |
#Service tools (beyond mutations)
Some Google Ads capabilities aren't plain mutations — they have dedicated tools:
| Tool | Does |
|---|---|
google_ads_apply_recommendation | Apply or dismiss a recommendation (find them via google_ads_search). |
google_ads_upload_conversion | Upload an offline click / call conversion or a conversion adjustment. |
google_ads_run_customer_match_job | Create / fill / run a Customer Match job. Member emails, phones, and addresses are hashed before upload. |
google_ads_run_batch_job | Create, fill, run, and read results of a large asynchronous mutation batch. |
google_ads_verify_identity | Start or check advertiser identity verification. |
#Troubleshooting
| Message | Meaning | Fix |
|---|---|---|
feature_disabled (feature: google_ads) | No Google Ads account is connected to this project | Connect one in Project → Settings → Google Ads |
invalid_arguments with next: google_ads_list_customers | The customer_id you passed isn't linked to this project | Call google_ads_list_customers and use a listed account |
invalid_arguments with details.confirmation_required | A google_ads_mutate batch has a remove or > 50 ops | Dry-run with validate_only: true, then resubmit with confirm: true |
invalid_arguments listing denied_entities | The mutation targets an account/billing/access entity | Make that change in the Google Ads dashboard |
| The core tools don't appear at all | The account isn't connected, no project is pinned, or your key lacks google_ads:read | Connect the account in settings / pin a project / check your permissions (the 13 core tools auto-list once connected) |
| The typed shortcuts don't appear | google-ads-shortcuts is opt-in and not pinned | Add ?toolsets=google-ads-shortcuts (or ?toolsets=all) to your MCP URL |
| Reconnect prompt in settings | The Google refresh token was revoked or expired | Click Connect Google Ads again |