vTilt
By roleFoundersKnow what to fix firstMarketersSee what happens after the clickCMOsSee what your budget really buys
By businessSaaSTurn signups into active usersEcommerceSee why shoppers abandon cartsAgenciesProve your work to clientsEnterpriseOne customer record for every team
MeasureWeb AnalyticsFind where buyers leaveSession ReplaySee why they left, not just that they didAdsKnow what paid visitors do nextIntegrationsOne snippet feeds your stack
ThinkPeopleOne profile per customerCustomer MemoryvTilt remembers every visitorSite KnowledgeAnswers and audits from your own pages
ActAsk AIAnswers from real behaviorAI ChatChat that knows the visitorEmail CampaignsEmail from real visits
PricingWhy vTiltDocs
Docs / Google Ads
Getting Started
OverviewInstallInitializeIdentify usersTrack eventsLogout & resetVerify eventsCommon mistakes
Guides
Event forwardingReverse proxyRealtime dashboardSite knowledge
Frontend frameworks
Next.jsNuxt.jsVue.jsReactReact RouterRemixGatsbySvelte / SvelteKitAstroAngularTanStack StartDocusaurus
Backend frameworks
NestJSHonoCloudflare WorkersDjangoFlaskLaravelPhoenixRuby on Rails
Backend languages
PythonPHPRubyElixirGoJava.NET / C#Rust
Stack guides
Vue + PHP
API Reference
Browser SDK
Script bundlesAutocaptureWeb VitalsSession recordingChat widgetFeature readinessRemote configurationDebug logging
Node SDK
Install & setupCapture, identify & aliasContext & shutdownGlobal properties & opt-outError tracking
MCP server
Guides
OverviewAuthenticationOAuthAgent skills (prompts)AI intelligenceSite knowledgeGoogle AdsMeta Ads
Client setup
CursorClaude DesktopVS CodeCodex

Getting Started

OverviewInstallInitializeIdentify usersTrack eventsLogout & resetVerify eventsCommon mistakes

Guides

Event forwardingReverse proxyRealtime dashboardSite knowledge

API Reference

MCP server

OverviewAuthenticationOAuthAgent skills (prompts)AI intelligenceSite knowledgeGoogle AdsMeta Ads
On this page

On this page

  • Connect Google Ads (required first)
  • Permissions
  • Reading account data
  • More read tools
  • Managing the account (writes)
  • One tool for any change: googleadsmutate
  • Typed shortcuts for common workflows
  • Service tools (beyond mutations)
  • Troubleshooting
DocsMCP serverGuidesGoogle Ads

Google Ads

Last updated July 22, 2026

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.

Note

Part of the MCP server docs — the overview lists every MCP tool; this page covers the Google Ads tools and the one-time connection they require.

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).

Important

The Google Ads tools act on your Google Ads advertiser account (campaigns, ad groups, ads, keywords, spend). They are completely separate from vTilt's on-site analytics. run_query reads your website's events; google_ads_search reads your Google Ads account.

Tip

Once a Google Ads account is connected to your pinned project, the 13 core google_ads_* tools appear automatically in tools/list — no enable_toolset step. (This auto-listing is why it works on clients that cache the tool catalogue, like Cursor and Claude.ai.) The 16 typed write shortcuts stay opt-in: add ?toolsets=google-ads-shortcuts (or ?toolsets=all) to your MCP URL to include them (see Selecting toolsets). If the core tools aren't listed, the account isn't connected yet, the project isn't pinned, or your key lacks google_ads:read.

#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.

  1. Open Project → Settings → Google Ads.
  2. Click Connect Google Ads and complete the Google consent screen. vTilt requests the https://www.googleapis.com/auth/adwords scope.
  3. 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.
  4. 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.

Tip

Connecting is a one-time, per-project action done by a workspace admin. Linked accounts and the default selection are shared by everyone using that project's MCP connection.

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:

ActionWho has itWhat it allows
google_ads:readmembers and aboveList accounts, read account data via GAQL
google_ads:writeowners and adminsCreate / 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.

  1. google_ads_get_resource_metadata — pass a resource (e.g. campaign, ad_group_ad, keyword_view) to get the selectable fields.
  2. google_ads_search — assemble a read-only query from resource, fields, and optional conditions, order_by, limit. vTilt builds and validates the GAQL server-side.
  3. 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
}
json

Note

Money is returned in micros — divide cost_micros by 1,000,000 to get the currency amount.

#More read tools

ToolDoes
google_ads_run_gaqlRun a raw GAQL string you assembled yourself (for clauses google_ads_search can't build).
google_ads_plan_keywordsKeyword Planner: discover keyword ideas, historical metrics, or forecasts (action).
google_ads_forecast_reachReach planning: list plannable locations or forecast reach for a budget (action).
google_ads_list_invoicesFetch 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
}
json

Important

Always send validate_only: true first — Google checks the operations and returns any errors without applying them. Then resubmit without it to commit.

Warning

Destructive batches (any remove) and large batches (more than 50 operations) require confirm: true in addition to passing validation. Account-level, billing, and access entities (customer, billing_setup, account_budget, customer_user_access, …) are blocked from google_ads_mutate — manage those in the Google Ads dashboard.

#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:

ToolDoes
google_ads_set_campaign_statusEnable / pause / remove a campaign
google_ads_update_campaign_budgetChange a campaign budget
google_ads_create_ad_group, google_ads_set_ad_group_statusCreate or set the status of an ad group
google_ads_create_responsive_search_ad, google_ads_set_ad_statusAdd a responsive search ad, set ad status
google_ads_add_keyword, google_ads_set_keyword_status, google_ads_add_negative_keywordManage keywords and negatives
google_ads_update_campaign_ai_max, google_ads_update_ad_group_ai_maxConfigure AI Max
google_ads_add_webpage_criterion, google_ads_create_page_feed_asset_set, google_ads_add_page_feed_assetsAI 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_listPerformance Max asset groups, display ads, audience targeting

#Service tools (beyond mutations)

Some Google Ads capabilities aren't plain mutations — they have dedicated tools:

ToolDoes
google_ads_apply_recommendationApply or dismiss a recommendation (find them via google_ads_search).
google_ads_upload_conversionUpload an offline click / call conversion or a conversion adjustment.
google_ads_run_customer_match_jobCreate / fill / run a Customer Match job. Member emails, phones, and addresses are hashed before upload.
google_ads_run_batch_jobCreate, fill, run, and read results of a large asynchronous mutation batch.
google_ads_verify_identityStart or check advertiser identity verification.

Tip

Every write tool accepts validate_only. Set it to true first — Google checks the change and returns any errors without applying it. Then repeat the call without validate_only to commit. This is the safest way to build complex mutations like Performance Max asset groups.

Warning

Setting a status to REMOVED is permanent and cannot be undone. Budget amounts are in micros (e.g. a $50.00 daily budget is 50000000).

#Troubleshooting

MessageMeaningFix
feature_disabled (feature: google_ads)No Google Ads account is connected to this projectConnect one in Project → Settings → Google Ads
invalid_arguments with next: google_ads_list_customersThe customer_id you passed isn't linked to this projectCall google_ads_list_customers and use a listed account
invalid_arguments with details.confirmation_requiredA google_ads_mutate batch has a remove or > 50 opsDry-run with validate_only: true, then resubmit with confirm: true
invalid_arguments listing denied_entitiesThe mutation targets an account/billing/access entityMake that change in the Google Ads dashboard
The core tools don't appear at allThe account isn't connected, no project is pinned, or your key lacks google_ads:readConnect the account in settings / pin a project / check your permissions (the 13 core tools auto-list once connected)
The typed shortcuts don't appeargoogle-ads-shortcuts is opt-in and not pinnedAdd ?toolsets=google-ads-shortcuts (or ?toolsets=all) to your MCP URL
Reconnect prompt in settingsThe Google refresh token was revoked or expiredClick Connect Google Ads again
PreviousSite knowledgeMCP serverNextMeta AdsMCP server