Query Google Ads with Claude or Cursor via the Google Ads MCP server.
A 5-minute google ads mcp setup that lets your AI tool ask plain-English questions about your campaigns, ad groups, and search terms. The Query Streams agent caches the Google Ads API into local SQL surfaces, so the LLM sees real tables instead of REST endpoints — and Schema Intelligence handles the metric vocabulary (cost in micros, status enums, device splits) so the SQL is right on the first try.
Ask Nova, get SQL + charts
Meet Nova Database REST APIOne key per partner. No credentials shared.
Build an API AutomationScheduled sync to 6+ platforms
Explore API to SQLQuery APIs with SQL, no code
Explore AI Database MCPClaude, Cursor, ChatGPT & Grok talk to your data
Connect AIQuery Streams is a secure, real-time data integration platform that brings every database and SaaS API in your account into Claude, Cursor, ChatGPT, and Grok — through a single MCP key with no firewall changes. This guide walks through the google ads mcp path specifically, so your AI tool can answer plain-English questions about campaigns, ad groups, search terms, and conversions without you exporting reports out of the Google Ads UI or building yet another GAQL query in the Ads Editor. The Network Agent pulls Ads API data into a local DuckDB cache, so the LLM sees clean SQL surfaces (campaigns, keywords, search terms, conversions) instead of raw REST and GAQL. Learn more at QueryStreams.com and sign up for free to start asking your AI tool real Google Ads questions.
What the Query Streams Google Ads MCP server gives you
Other “Google Ads MCP” servers on the open-source landscape connect the AI tool directly to the Ads API and push raw GAQL at it. That works, but it pushes a Google OAuth token into your AI client’s config, leaves the LLM staring at REST resources and field selectors instead of SQL, scopes the AI tool to only Google Ads, and gives you no audit trail of what the AI actually asked. The Query Streams google ads mcp server solves a wider problem: one key, every connector, full audit trail, the agent normalises Ads data into SQL surfaces, and the AI tool never holds your Google credentials.
Zero inbound firewall holes
The Network Agent opens a single outbound encrypted cloud link to Query Streams. Your AI client connects to the cloud, never to your Google Ads OAuth or your network. No port to open, no IP to allowlist, no VPN.
One key, every connector
The same MCP key reaches Google Ads alongside every other database and SaaS API your account has connected. Add a Stripe or PostgreSQL connector tomorrow and the AI tool sees it next to your campaigns without re-keying.
Schema Intelligence baked in
The AI sees AI-curated descriptions, semantic types (currency in micros, status enums, device splits), sample values, and discovered foreign keys for every Google Ads field — not just GAQL field names. It writes accurate SQL the first try, including the cost_micros / 1000000 conversion that bare-schema LLMs miss.
Read-only enforced at the agent
Even a hallucinating LLM can’t pause a campaign, change a bid, or alter an ad group through Query Streams MCP. The Network Agent rejects anything that isn’t SELECT, WITH, or EXPLAIN before it reaches the cached Ads tables — and Google Ads mutate operations are never exposed to the MCP surface in the first place.
Per-key rate limits
Default 60 requests per minute and 10 execute calls per minute, configurable per key. A runaway AI tool-call loop hits a token bucket, not your Google Ads API quota, your developer-token throttle, or your wallet.
How it works without opening firewall ports
The Query Streams Network Agent installs once on any host with internet access (the Ads API is reachable from anywhere) and dials one outbound TLS link to the cloud — it calls the Google Ads API with GAQL under the hood, caches the response in a local DuckDB so the AI sees clean SQL surfaces (google_ads_performance, keywords, search_terms, conversions, audiences) instead of REST envelopes, and the AI tool never sees your Google OAuth token, customer ID, or developer token. how the outbound-only connection works →
AI Client
Cursor, Claude,
ChatGPT, Grok
QS MCP Server
Streamable HTTP
X-MCP-Key auth
Network Agent
On your network
Cloud link out
Google Ads API
cached as SQL
via DuckDB
The MCP key you give Cursor or Claude is scoped (read / analyze / execute), revocable at any time, and rate-limited per-key. The AI tool calls these MCP tools to do its work:
pattern_key with optional parameter overrides.Why Schema Intelligence makes Query Streams MCP different
Most “MCP for Google Ads” servers in the open-source landscape hand your AI tool the same GAQL field reference Google publishes for developers — or worse, the raw information_schema of whatever cache they keep. Field names. Data types. Maybe a primary key. The LLM is left to guess that cost_micros needs to be divided by 1,000,000, that campaign_status is an enum of ENABLED / PAUSED / REMOVED, or that segments_date is the right partition column for “last 30 days.” That’s why the first SQL most LLMs write against a bare Ads schema is wrong — not because the LLM is bad, but because it doesn’t have the data it needs to be right (and an off-by-1,000,000 in cost is the kind of mistake that becomes a slack message).
Query Streams MCP returns that same cached Ads schema enriched with what we call Schema Intelligence (SI) — AI-curated metadata that’s generated by running profiling queries against your actual Google Ads data before the AI client ever asks. When SI is enabled on the Google Ads connector, every schema tool the AI calls (qs_get_connector_schema, qs_get_table_schema, qs_profile_table, qs_get_relationships) returns the bare cached schema plus six layers of curated knowledge. The LLM stops guessing.
To make this concrete, here is what the AI client gets back from a single qs_get_table_schema call against the Google Ads connector’s google_ads_performance table — the denormalized campaign + ad-group + date view that drives 90% of reporting questions — first without Schema Intelligence, then with it.
The six layers Schema Intelligence adds
Each layer addresses a specific class of question the LLM would otherwise have to guess at. SI is opt-in per (connector, database) pair and runs as a one-time profiling pass against your data — it does not change your schema, does not write to your database, and refreshes incrementally when your schema changes.
AI-curated descriptions
Plain-English purpose for every database, schema, table, and column — generated once, refreshed when your schema changes. Confidence-scored; user-authored descriptions always win.
Ads performance per campaign + device.”
Table classifications
Each table tagged FACT (transactional events), DIM (descriptive reference), or LOOKUP (small code maps), plus a business domain — marketing, sales, hr, seo, finance, support, and 14 more.
ad_accounts [DIM, domain:marketing]
Semantic types per column
Eighteen types — currency, currency_micros, email, date_iso, status_code, percentage, ranking_position, identifier, url, and more. The AI generates dialect-correct SQL appropriate to each type, including the cost_micros / 1000000 conversion no bare-schema LLM gets right.
conversions: counter · segments_date: date_iso
Sample values from real data
Random rows surfaced to the LLM so it recognises patterns no schema can show — formatting conventions, encoded values, naming styles, and the actual shape of your campaign names.
“Performance Max – Holiday”, “RLSA – High LTV”]
Enum detection with distributions
Low-cardinality columns (50 or fewer distinct values, at most 5% of rows unique) mapped to their full value list with row counts. The AI never guesses casing or spelling on Google Ads enums.
PAUSED (19%) | REMOVED (3%)
Implicit foreign-key discovery
Cross-table data overlap analysis finds joins that aren’t declared as DDL constraints. Stored alongside formal FKs with confidence scores, returned by qs_get_relationships.
ad_accounts.customer_id (100% overlap, conf 0.99)
Same prompt, different SQL
The proof is in the SQL the AI tool actually writes. Same Cursor session, same Claude model, same prompt — “Which campaigns spent the most in the last 30 days, with conversion rate, only enabled campaigns?” Without Schema Intelligence the LLM has to guess. With it, the LLM knows the cost is in micros, the status enum needs filtering, and a NULLIF guard is needed.
si_recommendation block telling the AI what it’s missing, including a one-call option to enable SI mid-conversation via qs_request_si_analysis. how Schema Intelligence runs and how long it takes →
MCP not for you? Try Nova AI instead.
Skip the JSON config entirely: Nova AI is built into the Query Streams web portal and asks the same plain-English Google Ads questions (“which keywords are wasting budget this month?”) across every connector you’ve added — same agent, same read-only enforcement, same Schema Intelligence, no MCP plumbing.
Meet Nova AIPrerequisites
Before you start, make sure you have:
- A free Query Streams account at my.querystreams.com.
- The Query Streams Network Agent installed on a machine with internet access — see Download the Query Streams Agent. The Google Ads API is reachable from anywhere, so the agent doesn’t need to live on a specific network.
- A Google Ads connector configured against the agent — see the existing API Connector Setup guides for OAuth pairing (single account or MCC manager). The agent holds the Google OAuth token, your customer ID, and your developer token; the AI tool never touches any of them.
- Any MCP-capable AI client. We’ll show Cursor, Claude Desktop, ChatGPT, and Grok in this guide; if you use Windsurf, Zed, Continue, Cline, VS Code Copilot, Codex, or Goose, the config block is essentially the same.
- Five minutes.
Drop it into your AI client
One JSON snippet for Cursor, Claude, ChatGPT, or Grok. Same key everywhere.
Ask a question
“Which campaigns have the best ROI this month?” — the AI calls the right tools, you get the answer.
Step 1: Generate an MCP key in Query Streams
Sign in to Query Streams and open the MCP page (or sign in first at my.querystreams.com and click MCP in the left navigation). Click Generate key, give the key a recognizable name (something like cursor-laptop or claude-desktop), and pick the scopes you want this key to have:
read— the AI can browse connectors and read schema. Required for everything else.analyze— the AI can profile tables and discover relationships (sample values, distributions, semantic types). Optional but strongly recommended for paid-search work, where understanding the shape of your campaign data and metric semantics (cost in micros, status enums) matters.execute— the AI can actually run SQL. Without this, the AI is read-only against schema metadata only.
For a typical “let Claude analyse my Google Ads data” workflow, all three scopes are appropriate. For a key you’re handing to a teammate or a less-trusted client, drop execute and let them browse only. You can revoke any key at any time from the same page; the AI client will see MCP_KEY_REVOKED on its next call and stop working immediately. There’s no propagation delay.
Copy the key now — Query Streams shows it once, then stores only a hash. If you lose it, generate a new one. The key looks like qsmcp_ followed by 48 random characters and is what your AI client sends in the X-MCP-Key request header.
Step 2: Add Query Streams MCP to your AI client
The configuration is the same shape across every MCP-capable client — an MCP server entry pointing at https://mcp.querystreams.com with your key in the X-MCP-Key header. Pick your client below.
// Edit ~/.cursor/mcp.json { "mcpServers": { "querystreams": { "url": "https://mcp.querystreams.com", "headers": { "X-MCP-Key": "qsmcp_PASTE_KEY_HERE" } } } }
// Settings → Developer → Edit Config { "mcpServers": { "querystreams": { "url": "https://mcp.querystreams.com", "headers": { "X-MCP-Key": "qsmcp_PASTE_KEY_HERE" } } } }
// Settings → Apps & Connectors → Add MCP Server URL https://mcp.querystreams.com Auth header X-MCP-Key Header value qsmcp_PASTE_KEY_HERE // Requires a paid ChatGPT plan // (Plus / Pro / Team / Enterprise).
// Grok → Settings → Tools { "mcp_servers": [{ "name": "querystreams", "url": "https://mcp.querystreams.com", "auth_header": "X-MCP-Key", "auth_value": "qsmcp_..." }] }
Restart your AI client. On its next start it will discover the eight Query Streams MCP tools listed above and surface them in its tool palette. In Cursor and Claude Desktop you can verify by typing “list connectors” — the AI should call qs_list_connectors and return your Google Ads connector (or each child account if you paired an MCC) along with anything else you have configured.
Step 3: Ask the AI a Google Ads question
You don’t write SQL — the AI does. You ask a question, the AI picks the right MCP tool, the agent runs the query against your cached Google Ads data, and the answer comes back as text plus tables. Three example prompts to try first:
google_ads_performance that divides cost_micros by 1,000,000, sums conversions and revenue, filters campaign_status = 'ENABLED' and segments_date to the last 30 days, then computes ROAS or CPA per campaign. You’ll see the result table inline plus a written interpretation — which campaigns are scaling efficiently, which are inefficient at current spend, and which are stuck in the “low cost, low conversion” zone where Schema Intelligence’s enum detection guided the agent to filter out PAUSED + REMOVED automatically.search_terms table to keywords on the search_term text, filters to terms with conversions in the last 30 days that don’t have an exact-match keyword, and sorts by conversions descending. Below the table the AI will typically annotate which terms look like high-quality intent (long-tail, branded, problem-focused) and propose adding them as exact-match keywords. The opposite query — “which search terms are wasting budget with zero conversions over $50 spend?” — is the negative-keyword half of the same workflow and the AI handles it the same way.ad_group_name and device with cost-in-USD, conversions, and CPA (cost / conversions). The AI tool will usually highlight the device splits that diverge most from the campaign mean — mobile CPA outliers are common on Performance Max and broad-match keyword groups — and propose a follow-up: “want me to break this down by hour of day for the worst-performing ad group?” Schema Intelligence’s enum detection on device ensures the AI never produces “Mobile” / “mobile” / “mobile_phones” splits when Google Ads only emits MOBILE, DESKTOP, TABLET.The first time the AI calls a tool, your client may pop up a confirmation prompt asking you to approve the tool call — that’s MCP’s standard consent flow, not anything Query Streams adds. Approve once and the AI proceeds with the rest of the conversation freely. You can revisit the consent at any time in your client’s settings.
Honest billing notice: MCP usage is charged on uncompressed bytes
Query Streams’ Excel add-in, Google Sheets add-on, web Query Builder, and Nova AI all run over our compressed cloud link — we measure and bill compressedBytes against your data realm. The MCP transport (Streamable HTTP per the official MCP spec) does not reliably support compression end-to-end across every client and intermediate proxy, so we measure and bill uncompressedBytes for MCP traffic.
- What this means: a 2 MB Google Ads daily aggregate query (campaign + ad group + day for 90 days, all your accounts) costs ~2 MB of your data realm when fetched via MCP, vs. ~300–400 KB via Excel / Sheets / Nova / the Query Builder. Google Ads data compresses well — campaign names, status enums, and device labels repeat across rows, so LZ4 over the cloud link typically achieves 5–7x reduction on the other transports. Same data, different transport, different billable size.
- What this isn’t: a markup or a punishment for using MCP. We pass through actual bytes shipped. The other clients are cheaper because compression works reliably on those transports; we don’t punish you for the protocol choice, but we have to be transparent about the cost shape.
- What you can do: for very large recurring exports (e.g. multi-year campaign + keyword + search-term cross-tabs), prefer the Excel / Sheets / Nova path. For interactive AI tool calls (the typical 100–5,000 row Google Ads aggregate that fits in an LLM context), MCP is the right choice and the cost difference is in cents.
Frequently asked questions
Do I need to open ports or run a VPN to use this? +
https://mcp.querystreams.com from the public internet, so if outbound HTTPS works on the agent host, MCP works with no inbound rules, port-forwarding, or VPN. See how the outbound-only connection works →
Which AI tools can I use with Query Streams MCP? +
Can I revoke an MCP key? +
/mcp page, per-org via plan settings, and platform-level), none of which need a database password rotation or agent restart. More on MCP key security →
How is MCP usage billed against my data realm? +
compressedBytes); MCP runs over Streamable HTTP, which doesn’t reliably support compression end-to-end through every client and proxy, so we bill uncompressedBytes. A 2 MB Google Ads daily aggregate returned to Excel typically costs ~300–400 KB of your data realm (Ads data with repeated campaign names + status enums compresses 5–7x via LZ4); the same 2 MB result returned to Cursor over MCP costs ~2 MB. We’re transparent about it because we’d rather you know up front than be surprised at the end of the billing cycle.
Does Query Streams MCP work with my Google Ads MCC (manager) account? What about cross-account reporting? +
google_ads_performance table: the LLM can write a single SELECT with WHERE customer_id IN (...) across many child accounts and get one consolidated result back. That’s the workflow that’s painful to do in the Google Ads UI (which makes you switch accounts manually) and impossible to do efficiently in raw GAQL (which is per-customer-id) — the agent does the per-customer fan-out under the hood, caches the per-account responses, and exposes the union as a single SQL surface. One MCC + child set is one OAuth grant on the agent; refresh tokens cycle automatically. If your agency manages multiple unrelated MCCs, each MCC is a separate connector and the LLM picks the right one by name.
How does this differ from running an open-source Google Ads MCP server myself? +
cost_micros semantic typing baked in. You also pick up Schema Intelligence, agent-layer read-only enforcement, per-key rate limits, audit trail in event_logs, and the same data-realm billing pipeline you already use — none of which a direct MCP gives you.
What happens if the AI tries to write or delete data? +
qs_run_query call is parsed by a hardcoded read-only validator that allows only SELECT, WITH, and EXPLAIN statements; anything else returns READONLY_VIOLATION and never reaches the cached Google Ads tables. The validator runs in the agent process, not in the cloud, so a compromised cloud surface couldn’t bypass it. There’s a second layer of safety on top: Google Ads write/mutate operations (pausing campaigns, changing bids, adjusting budgets) are simply not exposed to the MCP surface in the first place — the agent only ever issues read-shaped GAQL to the Google Ads API. So even if the validator were somehow bypassed, the LLM has nothing it could call to mutate your account.
Can I see what the AI actually asked? +
event_logs with the org, user, key, scope, latency, and result code. The org-admin can answer “who used MCP last week, which connector, and what did they ask?” with a single query. Note that we log the tool name and metadata, not the SQL text or returned rows — those flow through the cloud link and never land in cloud logs. The Google Ads API doesn’t expose an OAuth-app-readable change-history surface to third-party callers, so for Google Ads the agent’s event_logs is the cleanest audit you can get of “what did the AI ask, against which child account, when?” — the answer is in your own database, not gated behind a Google admin console you might not own.
Do I have to run Schema Intelligence to use Query Streams MCP? +
(connector, database) pair and MCP works without it (the AI gets bare schema and an si_recommendation block, and can enable SI mid-conversation via qs_request_si_analysis); with it on, the AI gets six layers of curated metadata so it writes correct Google Ads SQL — including the cost_micros / 1000000 conversion and campaign_status enum filtering — on the first try. The six layers and run-time details are covered above in “The six layers Schema Intelligence adds.” How Schema Intelligence powers the MCP server →
What if I add another connector later, like Stripe or PostgreSQL? +
qs_list_connectors picks it up automatically). One config block buys your whole account, present and future. Why one key covers every connector →
Do I have to set up MCP just to chat with my data? +
Get started
Connect your AI tool to your Google Ads data in five minutes.
One MCP key reaches Google Ads, every database, and every other API connector in your Query Streams account — with full audit trail, per-key rate limits, MCC-aware cross-account reporting, and zero firewall changes. Claude, Cursor, ChatGPT, and Grok all work out of the box.
Related guides: Download the Query Streams Agent | API Connector Setup | All MCP Server guides | Nova AI text-to-SQL
Category: MCP Server
Tags: mcp, claude, cursor, google-ads, paid-search, ppc, marketing-analytics, api-connector
Meta Description: Query Google Ads with Claude or Cursor via MCP. Cached SQL surfaces, MCC support, no firewall holes. Free.


