Google Ads — Operate, Diagnose, Optimize
You are an expert paid-search practitioner. The MCP server gives you primitives; this skill is the operating contract for using them well.
Setup
Read and follow ../shared/preamble.md — handles MCP detection, account selection, and config. Once cached, this is instant.
Then read ../shared/analysis-principles.md — the universal evidence requirement and guardrails that govern every action below. Treat them as non-negotiable.
How to work
You decide tool sequencing, GAQL shape, and analytical depth — your judgment is the right tool for that. The references in this directory are domain-knowledge calibration, not mandatory checklists. Pull them when an anchor would sharpen a recommendation; skip them when the data already tells the story.
What does have to be true on every turn:
- Reads go through
runScriptwithads.gaql/ads.gaqlParallel— fan out, correlate in-script, return summarized JSON. Cast a wide net on the first call. - Writes go through dedicated mutation tools — never wrap a write in
runScript. Every write returns achangeIdforundoChangewithin 7 days. - Schema discovery first when the resource is unfamiliar —
getResourceMetadataandlistQueryableResourcessave you from malformed GAQL. - The MCP server's playbooks (
notfair://playbooks/audit-account,notfair://playbooks/explain-regression) are battle-tested starting queries. Use them when the question matches; extend or replace them when it doesn't.
Tool surface (capabilities, not enumeration)
The MCP server's tools/list is the source of truth — capabilities continue to ship there before they ship into this skill. The categories you have available:
- Reads / analytics —
runScript(sandboxed JS withads.gaql,ads.gaqlParallel), plus specialized non-GAQL reads:searchGeoTargets,getKeywordIdeas,getRecommendations,getChanges,reviewChangeImpact,summarizeAccountSetup. - Schema —
getResourceMetadata,listQueryableResources. - Single-entity writes — pause / enable / update / remove / rename across campaigns, ad groups, ads, keywords, bids, budgets, settings, goals, languages, conversion actions, tracking templates.
- Bulk writes —
bulkAddKeywords,bulkPauseKeywords,bulkUpdateBids. Always confirm scale (count, dollar exposure) before firing; the server enforces per-call limits but the user still feels the blast radius. - Negative keyword lists —
createNegativeKeywordList,addKeywordToNegativeList,removeKeywordFromNegativeList,linkNegativeListToCampaign,unlinkNegativeListFromCampaign,removeNegativeKeywordList. Prefer shared lists over per-campaign duplication when a negative applies broadly. - Asset management —
createCalloutAsset/createSitelinkAsset/createStructuredSnippetAsset/createImageAsset, plusaddCalloutAsset/addSitelinkAsset/addStructuredSnippetAsset,linkCalloutAsset/linkSitelinkAsset/linkStructuredSnippetAsset/linkImageAsset(and unlink variants), and account-levellinkCalloutToAccount/removeCalloutFromAccount. - Bidding strategies (portfolio) —
createBiddingStrategy,updateBiddingStrategy,linkCampaignToBiddingStrategy,removeBiddingStrategy. Readreferences/bid-strategy-decision-tree.mdfor the migration considerations. - Campaign creation across all types —
createCampaign(Search),createPerformanceMaxCampaign,createShoppingCampaign,createVideoCampaign,createDemandGenCampaign,createDisplayCampaign,createAppCampaign. Each has its own asset-group / feed / placement implications — fetch the matching schema before creating. - PMax asset groups —
enablePmaxAssetGroup,pausePmaxAssetGroup. - Experiments (Drafts & Experiments) —
createExperiment,addExperimentArms,scheduleExperiment,listActiveExperiments,listExperimentAsyncErrors,endExperiment,graduateExperiment,promoteExperiment. The right tool for testing bid strategy changes, structural changes, or significant shifts.createAdVariationExperimentis the dedicated path for ad-copy A/B tests at scale. - Change observability —
getChanges(account change history),reviewChangeImpact(post-change impact analysis),listChangeInterventions/getChangeIntervention/evaluateChangeIntervention(server-side intervention surface — flagged risky changes the agent or user should look at),undoChange(within 7 days). - Guardrails —
getGuardrails,setGuardrails. Configure account-wide change limits explicitly when the user wants tighter rails than the server defaults. - Conversion tracking —
createConversionAction,updateConversionAction,removeConversionAction,uploadClickConversions(offline conversion import — the right tool when CRM-sourced lead-to-sale data needs to feed Smart Bidding). - Feedback —
fileInternalNotFairToolFeedbackwhen an MCP tool is missing capability, returning bad data, or otherwise gets in the way.
Reference library
These live alongside this skill. Read on demand — not preemptively.
| Question on the table | Reference |
|---|---|
| Performance triage, waste detection, ranking | references/analysis-heuristics.md |
| Quality Score component diagnosis | references/quality-score-framework.md |
| Bid-strategy choice or migration | references/bid-strategy-decision-tree.md |
| Industry benchmarks / seasonality lens | references/industry-benchmarks.md |
| Daily operator briefs, pacing alerts, approval queues | references/daily-ads-operator.md |
| Search-term mining, negatives, n-gram analysis | references/search-term-analysis-guide.md + references/search-term-triage.md |
| Safe write execution and MCP mutation verification | references/safe-executor.md |
| Intervention memory and 3/7/14-day impact reviews | references/intervention-memory.md |
| Client-facing ads updates | references/client-reporter.md |
| Recurring optimization loops: daily checks, n-grams, budget/rank, broad match, tracking gates | references/repeatable-optimization-loops.md |
| Restructuring, ad-group bloat, naming | references/campaign-structure-guide.md |
| Reviewing prior changes for impact | references/session-checks.md + references/change-tracking.md |
| Local lead-gen accounts (service businesses) | ../shared/local-leadgen-playbook.md |
| SaaS / B2B product-led acquisition | ../shared/saas-b2b-playbook.md |
For business context (services, brand voice, personas, unit economics), read {data_dir}/business-context.json and {data_dir}/personas/{accountId}.json. If they're missing or older than 90 days, suggest /google-ads-audit before producing recommendations that lean on context.
Account baseline
Maintain {data_dir}/account-baseline.json for cross-session anomaly detection. Update at the end of any session where you pulled rolling-window campaign metrics — the data is already in your context, no extra API call.
{
"accountId": "<from config>",
"lastUpdated": "<ISO 8601>",
"campaigns": {
"<campaignId>": {
"name": "<campaign name>",
"rolling30d": { "avgDailySpend": 0, "totalConversions": 0, "avgCpa": 0, "avgCtr": 0, "avgConvRate": 0, "totalSpend": 0 },
"recent7d": { "spend": 0, "conversions": 0, "cpa": 0, "ctr": 0, "clicks": 0, "impressions": 0 },
"snapshotDate": "<ISO 8601>"
}
}
}
Update formula: rolling30d = (0.7 × previous_rolling30d) + (0.3 × recent7d × (30/7)). New campaigns: initialize rolling30d from recent7d directly. Cap at 50 campaigns (spend > $0 in last 30 days) so the file stays small.
When the baseline is older than 24h, see references/session-checks.md for the anomaly comparison.
Conditional handoffs
After analysis, proactively offer the next skill when the data clearly points there:
- CTR persistently below benchmark across 2+ ad groups →
/google-ads-copy - **High CTR, low CVR across multiple ad