View Categories

How to Query Google Ads with Claude / Cursor via MCP (Google Ads MCP Server Setup)

25 min read

MCP SERVER GOOGLE ADS

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.

No firewall holes One key, every connector Live data, no cache lag Bring your own AI tool

Query 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

No inbound port required — the agent dials out, never the other way around

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:

querystreams-mcp · tool catalog
qs_list_organizationsread
Returns the org bound to the calling key.
qs_list_agentsread
Lists Network Agents and online state.
qs_list_connectorsread
Lists data connectors (one entry per database server or API).
qs_get_connector_schemaread
Returns the cached Google Ads tables and columns the AI can query (campaigns, ad groups, search terms, conversions, audiences), with Schema Intelligence enrichment when available.
qs_profile_tableanalyze
Sample values, distributions, enum detection, semantic types — on demand.
qs_list_saved_queriesread
Pre-built parameterized SQL templates the team trusts. The AI runs them without ever seeing the SQL.
qs_run_saved_queryexecute
Executes a saved query by pattern_key with optional parameter overrides.
qs_run_queryexecute
Executes a SELECT against a connector. Read-only validator runs at the agent, before the database sees the SQL.

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.

Without Schema Intelligence data_source: captured_schema
// what the LLM sees == TABLE: google_ads_performance == Columns: – customer_id bigint NOT NULL – campaign_id bigint NOT NULL – campaign_name varchar(500) – campaign_status varchar(20) – ad_group_id bigint – ad_group_name varchar(500) – device varchar(20) – segments_date date NOT NULL – clicks bigint NOT NULL – impressions bigint NOT NULL – cost_micros bigint NOT NULL – conversions decimal(18,4) Indexes: ix_segments_date, ix_campaign_id Foreign Keys: (none declared in cache) si_recommendation: state: “not_run” what_youre_missing_for_this_call: – cost_micros semantic type (currency in micros) – campaign_status / device enum value lists – Sample values + business domain tagging – Table and column descriptions – AI-discovered relationships across cached Ads tables
With Schema Intelligence data_source: schema_intelligence
// what the LLM sees == TABLE: google_ads_performance [FACT, domain:marketing] == “Daily denormalized Google Ads performance per customer, campaign, ad group, device, and date. cost_micros is currency in micros (1,000,000 = $1).” ai_analyzed_at: 2026-05-05 · ~512,840 rows Columns: – customer_id bigint identifier FK -> ad_accounts.customer_id (100%, conf 0.99) – campaign_id bigint identifier – campaign_name varchar(500) text_content Sample: “Brand – US – Search”, “Performance Max – Holiday” – campaign_status varchar(20) status_code (enum) ENABLED (78%) | PAUSED (19%) | REMOVED (3%) – device varchar(20) status_code (enum) MOBILE (54%) | DESKTOP (38%) | TABLET (8%) – segments_date date date_iso Sample: 2026-05-05, 2026-05-04, 2026-05-03 – clicks bigint counter Range: 0 – 18,744 – impressions bigint counter Range: 0 – 412,338 – cost_micros bigint currency_micros ⚠ divide by 1,000,000 to get USD Sample: 56640000 (= $56.64), 1284000 (= $1.28) – conversions decimal(18,4) counter (fractional) Range: 0.00 – 184.50 · mean 1.84

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.

google_ads_performance: “Daily denormalized
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.

google_ads_performance [FACT, domain:marketing]
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.

cost_micros: currency_micros
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.

campaign_name: [“Brand – US – Search”,
“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.

campaign_status: ENABLED (78%) |
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.

google_ads_performance.customer_id ->
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.

Without Schema Intelligence
— LLM’s first attempt against bare schema: SELECT campaign_name, SUM(cost_micros) AS cost, SUM(conversions) AS convs, SUM(conversions) / SUM(clicks) AS conv_rate FROM google_ads_performance WHERE segments_date >= ‘2026-04-06’ GROUP BY campaign_name ORDER BY cost DESC LIMIT 10 cost reported as $56,640,000 — off by 1,000,000 cost_micros stored in micros (1M = $1) no campaign_status filter — includes PAUSED + REMOVED divide-by-zero risk on rows with no clicks hardcoded date — “last 30 days” should be dynamic
With Schema Intelligence
— LLM’s first attempt with SI enabled: SELECT campaign_name, SUM(cost_micros) / 1000000 AS cost_usd, SUM(conversions) AS convs, ROUND(SUM(conversions) * 100.0 / NULLIF(SUM(clicks), 0), 2) AS conv_rate_pct FROM google_ads_performance WHERE segments_date >= DATE(‘now’, ‘-30 days’) AND campaign_status = ‘ENABLED’ GROUP BY campaign_name ORDER BY cost_usd DESC LIMIT 10 10 rows. Correct first try. cost_micros saw semantic type = currency_micros campaign_status filtered to enum value ‘ENABLED’ NULLIF guards against zero-click campaigns DATE(‘now’, ‘-30 days’) is dialect-correct
Don’t want to run Schema Intelligence? MCP still works — schema tools return bare metadata (types, primary keys, formal foreign keys, indexes) and every degraded response carries an 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 →
Nova AI

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 AI

Prerequisites

Before you start, make sure you have:

  1. A free Query Streams account at my.querystreams.com.
  2. 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.
  3. 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.
  4. 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.
  5. Five minutes.
You only set up the agent once. The same agent that powers Query Streams’ Excel and Google Sheets add-ons, the web Query Builder, and Nova AI also serves MCP. Adding MCP to an existing Query Streams account is just generating a key — the agent and connectors are already running.
1

Generate an MCP key

From the /mcp page in Query Streams, mint a key with the scopes you want.

2

Drop it into your AI client

One JSON snippet for Cursor, Claude, ChatGPT, or Grok. Same key everywhere.

3

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.

Cursor
Cursor ~/.cursor/mcp.json
// Edit ~/.cursor/mcp.json
{
  "mcpServers": {
    "querystreams": {
      "url": "https://mcp.querystreams.com",
      "headers": {
        "X-MCP-Key": "qsmcp_PASTE_KEY_HERE"
      }
    }
  }
}
Claude Desktop
Claude Desktop claude_desktop_config.json
// Settings → Developer → Edit Config
{
  "mcpServers": {
    "querystreams": {
      "url": "https://mcp.querystreams.com",
      "headers": {
        "X-MCP-Key": "qsmcp_PASTE_KEY_HERE"
      }
    }
  }
}
ChatGPT
ChatGPT Apps & Connectors
// 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
Grok Remote MCP Tools
// 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:

“Which campaigns have the best ROI in the last 30 days — cost vs conversions, only enabled?”
ROI
The AI will call qs_get_connector_schema to discover the cached Ads tables, then qs_run_query with a SELECT against 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.
“Show me search terms that converted but aren’t keywords yet — we should add them.”
Negative Keyword Discovery
The AI joins the cached 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.
“What’s our cost per acquisition by ad group this quarter, by device?”
Device CPA
A pivot by 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? +
No — the Network Agent dials one outbound TLS connection (port 443) and your AI client reaches 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? +
Any client that speaks the open Model Context Protocol — Claude Desktop, Claude Code, Cursor, ChatGPT (paid), Grok, Gemini CLI, Windsurf, Zed, and 500+ more. Bring your own AI tool; you don’t have to switch. Full list of supported AI clients →
Can I revoke an MCP key? +
Yes — three independent kill-switches (per-key from the /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? +
MCP execute calls deduct from the same data-realm budget your Excel, Google Sheets, web Query Builder, and Nova AI usage already draws on — one consumption budget across every access method. The size measured for MCP differs. The other clients run over our compressed cloud link (we bill 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? +
Yes — the Network Agent supports both single-account Google Ads and MCC (Manager) authentication. For an MCC, you grant the agent OAuth access to the manager once and the agent surfaces every accessible child account as separate connectors (or as a single unified view if you prefer). Cross-account reporting works through the agent’s denormalized 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? +
A direct Google Ads MCP server (community projects on GitHub do exist, mostly thin GAQL wrappers) is one MCP per data source — and most of them dump raw REST or GAQL fields at the LLM, no SQL surface, no metric-semantics layer. To get Claude reading from Google Ads + your PostgreSQL + your Stripe account + your Snowflake warehouse you’d need four MCP servers configured separately in every AI client, each with its own credentials, each with its own scope model, each with its own audit story. Query Streams MCP is one key reaching every connector your account has paired, and the agent normalises Ads data into clean SQL surfaces with 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? +
It’s rejected at the agent before the cached Ads data sees the SQL. Every 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? +
Yes. Every MCP tool call writes a row to 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? +
No — SI is opt-in per (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? +
Nothing changes client-side — the same key reaches the new connector the moment the agent pairs it (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? +
No — Nova AI is built into the Query Streams portal and works against every connector (Google Ads included) with no MCP setup or config files. Use Nova to chat with your data inside Query Streams; use MCP when you want your own AI client (Claude, Cursor, ChatGPT, …) to reach the same data — same agent, same connectors, same Schema Intelligence underneath. Learn more about Nova AI →

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.

Updated on June 16, 2026

Powered by BetterDocs