Google Analytics MCP: GA4 in Claude, and the numbers to check

Google's official server lets Claude query GA4 in plain language. Every number it returns depends on choices the model makes for you, so treat each one as a first draft.

The verdict

Google's GA4 MCP server is useful for one person exploring GA4 in plain language, then checking the answer in GA4. It is not a system to run your reporting or your media decisions on:

  • The model sets the numbers. It picks the attribution model and the date basis for ad reports, so two chats can report different ROAS for the same month. It usually names metrics from memory. In one published test, on an early version, it queried the wrong year and reported AI-source sessions up 35% while they fell.
  • It sees one source, and GA4 sees Google best. GA4 sees Google's ads more completely than Meta's or TikTok's, and re-credits past conversions. Without the platforms' data and your shop's orders, a broken tag and a weak channel look alike.
  • It runs when someone asks, or on one person's schedule, and a failed run can look successful. Alerts a team keeps reading need per-market baselines and every cause checked in order. A chat assistant isn't deterministic; you can write that order into a prompt or skill, but nothing enforces it.
  • It is Experimental, runs on one person's computer unless someone hosts it, and can't act on your campaigns. No budget, bid or pause; Google's Google Ads MCP server is read-only too. Large data costs API spend or subscription usage on every run.

Every platform's number, reconciled ↓

Use it forDon't run your reporting or decisions on it
One-off questions you would otherwise build an exploration forWeekly KPI or board reports: dates, attribution model and metric names can change with each chat
Funnel drop-offs and landing-page checks, verified in GA4 afterwardsBudget splits between channels: GA4 sees Google's ads best and re-credits past conversions
Checking an event still fires after a releaseMonitoring: it runs when asked or on one person's schedule, and a failed run can still show green
Adding release annotations, with the write flag onActing on what you find: it can't change budgets, bids or campaigns
A quick look before you open GA4Team or agency reporting: credentials, definitions and schedules sit with one person by default

What the GA4 MCP is good for

For example, checked in GA4 afterwards:

  • “Which landing pages had more than 1,000 sessions from paid social in September 2026 and an engagement rate under 40%?”
  • “Build a funnel from view_item to add_to_cart, begin_checkout and purchase for 1 to 30 September, split by device. Where is the biggest drop?”
  • “Is the purchase event still firing after the checkout release 20 minutes ago?”

GA4's own Ask Advisor, in beta, answers similar questions inside a property set to English, with no setup. If you export GA4 to BigQuery, Google also hosts a BigQuery MCP server, and SQL on the export avoids the Data API's row limits, though BigQuery bills for queries. Fixed queries on the export remove the parameter and partial-page problems in limit 2; the attribution, cross-channel, alerting and ownership limits remain. A large company can build its own alerting on the export. It takes a machine-learning engineer, a backend engineer and a data engineer, then months of work with the marketing team to get the alerts and suggestions right, and maintenance after that. It’s a product, not a script one person writes in two weeks.

Where the GA4 MCP stops

1. Two chats can give two ROAS figures for the same month

In the conversions tool, the model picks the attribution model, data-driven or last click, and whether each metric counts by conversion date or by interaction date. Google says this alpha feature “may not be available to your Google Analytics property” (Data API). Google Ads dates conversions differently again; see why Google Ads and GA4 report different conversions.

2. A report can show growth while traffic falls

Coupler.io, which sells data connectors, published a test of Claude with this server in December 2025 and updated it in July 2026. Asked to compare October with November 2025, the query used 2024-10-01 and stopped at a 1,000-row limit. Claude reported AI-source sessions up 35%; GA4 showed a fall. It used an early server version with Claude Opus 4.1 and Sonnet 4.5, but the causes apply to any model:

  • Parameters. The model picks the dates, filters and row limit. No tool in Google's local server returns the standard metrics and dimensions for a standard report, so the model usually names them from memory.
  • Partial pages. A report cut at a row limit looks complete unless someone compares the rows returned with rowCount. Nothing in the server checks that every page was read.
  • Arithmetic in the chat. Sums over hundreds of rows go wrong easily in the conversation. Doing them in code removes most of this cause.
  • The connector itself. Server code can be wrong too: a popular Search Console server reported growth as decline until a September 2026 fix (see Search Console below).
  • Definitions. An engaged session lasts over 10 seconds by default, has a key event or two or more page views. GA4 calls important site actions key events and keeps “conversion” for actions used to measure ads (Analytics Help). “Source” can be session-, user- or event-scoped.

Each response does say whether GA4 sampled the data, applied thresholds or rolled rows into “(other)” (Data API reference). The model mentions those flags only if it looks for them.

3. Budget calls inherit Google's view of the channels

Auto-tagging identifies Google Ads clicks, and their cost arrives through the account link. A Meta or TikTok visit counts as paid only if its UTM tags are right, and GA4 never sees their ads viewed without a click, though it counts engaged views on YouTube ads (Analytics Help). Google Ads credits imported GA4 key events to Google's paid channels by default; GA4's own reports default to paid and organic channels (Analytics Help).

Credit also moves after the fact, and the move looks like a change in performance. Data-driven attribution can reassign a key event for up to 7 days (Analytics Help), attributed figures can update for up to 12 days (Analytics Help), and a change of reporting attribution model “applies to historical and future data” (Analytics Help). Only data GA4 doesn't control, such as your shop's orders, catches it. Each ad platform reports differently again (see why Meta conversions don't match GA4).

None of these figures is what the ads caused, and the gap runs both ways. In eBay's paid-search experiments, returns were “a fraction of conventional non-experimental estimates” (Blake, Nosko and Tadelis, Econometrica 2015); across 640 Meta tests, Haus found 7-day-click reporting under-crediting Meta. Measuring what the ads caused takes an incrementality test.

4. A drop gets blamed on the wrong channel

If key events fall on every channel at once, the cause is usually shared: the site, checkout, the consent banner, tracking or demand itself. If only Meta traffic falls, start with Meta's delivery and tagging. GA4 shows which channels fell, but not whether a tag broke, orders were lost or Meta's delivery changed; that takes the ad platforms and your shop's orders side by side. You can add Meta's ads MCP server and Google's Google Ads MCP server to the same chat, but each reports under its own attribution settings, and the model reconciles them from scratch in every conversation.

Promotion calendars, stock plans, margins and targets mostly live outside GA4 and the ad platforms. Pasted into a chat, they stay per chat and per person, and go stale unless someone updates them every week.

5. An alert that is slightly off stops being read

Getting alerts right is hard even on a simple account. A threshold on sessions is quick to set. One that allows for holidays, promotions and each market without hiding the drops that matter is not. Across several channels, products and markets, an alert a team keeps reading needs a baseline per market and season, few false alarms and the likely cause attached. A performance marketer works through the likely causes in a fixed order.

A chat assistant works differently. Its answers change between runs: in one 2024 study on benchmark tasks, five models at “deterministic” settings varied by up to 15% in accuracy on the same tasks over ten runs (Atil et al.). You can write the order of checks into a prompt or skill, but nothing enforces it, so the assistant can answer with the first plausible cause.

6. A daily check can fail and still show green

Local scheduled tasks in Claude's desktop app can use MCP servers added to Claude Code, but run only while the app is open and the computer awake. A missed run gets one catch-up on wake, possibly hours late (Anthropic). Cloud scheduled tasks need it hosted as a connector, or declared in a repository's .mcp.json with credentials in an environment visible to anyone who uses it. A run marked Succeeded only means “the session ended without Claude Code reporting a failure” (Anthropic), so an expired Google sign-in can leave the run looking green.

7. The cost grows with the data, and the setup leaves with one person

A busy property's data is large. Pushed through a model every day, it costs tokens on the API, and on a subscription each scheduled run draws down the same usage limits as interactive sessions (Anthropic).

Unless someone hosts it for the team, the credentials file, client config and saved definitions sit on one laptop, and a scheduled task belongs to one person's account. At an agency, one Google sign-in often reaches every client's property, so a long chat can query the wrong one, and client data in each answer passes to the AI provider under your account's terms. Memory and chats stay in that person's account; shared projects help, but there is no shared record of who approved what and why.

8. Campaign names written by strangers reach the model

Anyone can open your site with an invented campaign name in the URL, and GA4 records it; page paths, referrers and Search Console queries work the same way. An assistant that holds your private data, reads that text and can also send data out can be steered by hidden instructions into leaking it, the combination Simon Willison calls the lethal trifecta. No case involving a GA4 server has been published.

What it takes to run it

Google's Analytics team publishes the server on GitHub under the Apache 2.0 licence, installed from PyPI as analytics-mcp, and its README calls it “Experimental”. Version 0.8.0 came out on 22 October 2026. It runs locally: your MCP client starts it with pipx or uvx and talks to it over standard input and output (stdio), and Analytics is missing from Google's list of the remote MCP servers it hosts. The PyPI package named google-analytics-mcp is a separate community project, although Google's package installs a command with that name, so keep --from analytics-mcp in any uvx command.

ToolWhat it doesReads or writes
get_account_summariesLists the accounts and properties your Google sign-in can reachReads
get_property_detailsReturns a property's settings, including its time zone and currencyReads
list_google_ads_linksLists the Google Ads accounts linked to a propertyReads
list_property_annotationsLists the dated notes on a property's reportsReads
get_custom_dimensions_and_metricsLists a property's custom dimensions and metricsReads
run_reportRuns a standard Data API reportReads
run_funnel_reportRuns a funnel report through the Data API's alpha versionReads
run_realtime_reportReads events from the last 30 minutes, or 60 on Analytics 360Reads
run_conversions_reportAd cost, clicks, conversions, revenue and return on ad spend by campaign or channel, through the alpha versionReads
create_property_annotationAdds a dated note to the property's reports, if the server starts with --allow-writeWrites

Source code of version 0.8.0 and Google's developer guide, checked 25 October 2026.

Setup: a terminal, a Cloud project and five steps

  1. Install the tools. Python 3.10 or later, pipx or uv, and the Google Cloud CLI.
  2. Enable two APIs. Turn on the Google Analytics Admin API and Data API in your Cloud project.
  3. Grant access. Give your Google user, or a service account, at least the Viewer role on each property you want to query.
  4. Sign in with Application Default Credentials and the Analytics read-only scope. Google's command also requests the broad cloud-platform scope, so the credentials file carries access to your Google Cloud resources too. With user credentials, set a quota project.
  5. Add the server to your client, as below.
gcloud auth application-default login \
  --scopes="https://www.googleapis.com/auth/analytics.readonly,https://www.googleapis.com/auth/cloud-platform"
gcloud auth application-default set-quota-project YOUR_PROJECT_ID

If Google blocks the sign-in, create a desktop OAuth client and add --client-id-file, as Google's README shows. If its consent screen is External and left in Testing, the refresh token expires after seven days (Google Identity).

  • Claude Desktop. Add the server to mcpServers via Settings, Developer, Edit Config, then restart Claude. Use absolute paths, and the full path to pipx from which pipx if the app can't find it.
    "analytics-mcp": {
      "command": "pipx",
      "args": ["run", "analytics-mcp"],
      "env": {
        "GOOGLE_APPLICATION_CREDENTIALS": "/absolute/path/to/credentials.json",
        "GOOGLE_CLOUD_PROJECT": "YOUR_PROJECT_ID"
      }
    }
  • Claude Code. Run this, then check the connection with /mcp.
    claude mcp add analytics-mcp --scope user \
      -e GOOGLE_APPLICATION_CREDENTIALS="/absolute/path/to/credentials.json" \
      -e GOOGLE_CLOUD_PROJECT="YOUR_PROJECT_ID" \
      -- pipx run analytics-mcp
  • Claude in the browser, and Cowork. Custom connectors connect from Anthropic's cloud, so the server must be “reachable over the public internet” (Claude Help Centre). That means hosting Google's server yourself behind sign-in, or using a hosted third-party connector that passes your data through its vendor.
  • ChatGPT. ChatGPT connects to remote MCP servers only. OpenAI's Secure MCP Tunnel can start a local stdio server from inside your network. OpenAI's help page limits full MCP to Business, Enterprise and Edu workspaces; Pro gets read and fetch.

The Data API limits it runs under

LimitStandard propertyWhat it means in a chat
Core tokens per property200,000 a day; 40,000 an hourLong date ranges, many dimensions and busy properties cost more per call. Analytics 360 gets ten times as many.
Tokens per project, per property14,000 an hourEveryone querying a property through the same Cloud project shares this.
Concurrent requests10 per propertyExtra parallel calls fail with a quota error.
Requests that may be thresholded120 an hourRequests with demographic dimensions count here, among others.
Rows per call10,000 by default, 250,000 at mostThe response's rowCount gives the full total, so a partial page can be spotted.
Realtime windowThe last 30 minutes60 minutes on Analytics 360.
FreshnessDaily data usually within 12 hoursProcessing can still take 24 to 48 hours, and some data arrives up to 7 days late, so yesterday's figures still move.

Google's Data API quotas, API basics, realtime basics and data freshness pages, checked 25 October 2026.

Updates break it overnight. On 28 July 2026 a new release of the MCP Python SDK crashed fresh installs of Google's GA4 server, which hadn't capped that dependency; version 0.7.0 fixed it the next day (issue 199). The most-starred Search Console server failed to start the same day (issue 41).

Search Console: no official server, and the token is yours to guard

When we checked on 25 October 2026, Search Console appeared neither among the MCP servers Google hosts nor in Google's index of open-source ones. Community servers use the public Search Console API, so check four things before you install one:

  • The scope. The API offers webmasters.readonly and webmasters; the second can also submit and delete sitemaps and add or remove sites. Prefer the first. The most-starred open-source server, with about 2,000 GitHub stars, requests the full scope and keeps its delete tools off unless you set a flag.
  • Where the token lives. Most keep a token file or service-account key on disk, readable by anyone who copies it until you revoke it.
  • The service account's role. A restricted user can read Performance data (Search Console Help).
  • Remote mode. Over HTTP, one popular server we read accepted requests without a token unless you configured one.

The server code can be wrong as well as the model. The most-starred one reported growth as decline when comparing two periods (issue 42), ignored the sort setting (issue 54) and returned PASS for a page whose rich results Google fails (issue 48). The maintainer fixed all three in version 0.4.0 on 15 September 2026.

Each Search Analytics request returns at most 25,000 rows, 1,000 by default, and Google says the API “does not guarantee to return all data rows but rather top ones” (Search Console API). Query rows leave out rare, anonymised queries, so they usually add up to less than the site's total clicks (Search Central).

Eight habits, and who keeps them

  1. Keep the read-only scope. Add --allow-write only if you want annotations.
  2. Grant Viewer only where needed. One property per service account limits mistakes.
  3. Treat the credentials file as a password. Keep it out of synced folders and repositories. gcloud auth application-default revoke revokes it on your machine; for a lost laptop, remove the sign-in's access from your Google Account's third-party connections.
  4. Name the property and the dates. Use the property ID and absolute dates, and read the property's time zone and currency first.
  5. Ask what each number is. Metrics, dimensions, attribution model, rows against rowCount, and any sampling or threshold flag.
  6. Share one definitions file. Conversions, sessions metric, attribution model and channel rules, loaded through a project or CLAUDE.md.
  7. Compare before you publish. Check any reported number once in the GA4 interface.
  8. Separate reading from acting. Never let one unattended run both read outside text and act, such as sending email or editing ad accounts.

The running tally: a credentials file with Cloud access, a re-sign-in every seven days if your own OAuth client stays in Testing, a quota project shared by everyone on it, a definitions file to keep current, a check of every number before it is reported, and someone who notices when an update breaks the server, each with an owner.

Every platform's number, reconciled

Nupact reports each platform's figure next to the reconciled one, with the gap visible.

Built for teams spending at least €500k a year on performance marketing. Nupact connects to the ad platforms through their APIs and official sign-in and reads GA4 alongside them. Platform-reported numbers sit next to numbers reconciled against your own attributed data or, where you've run them, incrementality test results, so nobody rebuilds the comparison in a chat each week.

Nupact flags anomalies on every KPI with deep learning, then runs fixed root-cause checks, the same ones in the same order every time, the way a performance marketer works through them. Alerts reach Slack, Teams or email with the root cause diagnosed and the fix drafted, for what is slipping and for what is ready to scale. Home-built tools often stall: at a listed company with billions in revenue, the data team built an optimisation tool, mostly with Claude, and delivered it quickly. The search team barely uses it: most of its suggestions aren’t useful, improving them needs the team’s feedback, and other priorities always win.

Nupact's memory belongs to the company: every decision and what came of it survives handovers and agency switches. Today Nupact acts on Google Ads, Meta, TikTok and Amazon Ads; DSPs and other connected platforms are monitored and reported on, and we keep adding platforms Nupact can act on. Agencies get daily checks across every client account and dashboards shared with clients under the agency's own logo: see Nupact for agencies.

GA4 and Search Console MCP FAQ

Is google-analytics-mcp on PyPI Google's server?

No. Google's package is analytics-mcp, which also installs a google-analytics-mcp command. The PyPI package named google-analytics-mcp is a separate community project, so keep --from analytics-mcp in any uvx command.

Can the GA4 MCP change my Analytics settings or my campaigns?

No. Its one write tool, added in version 0.8.0, creates annotations on reports, and only when the server starts with the allow-write flag and your sign-in has the edit scope and the Marketer or Editor role. Google's Google Ads MCP server is read-only too. Acting on campaigns means a third-party server holding a write token, or Ask Advisor in Google Ads (beta), which makes changes only with your approval and isn't available in manager accounts.

Does the Google Analytics MCP work with ChatGPT?

Not directly. ChatGPT connects only to remote MCP servers, and Google's runs on your own machine. OpenAI's Secure MCP Tunnel can connect a local server from inside your network, and full MCP access is limited to Business, Enterprise and Edu workspaces.

Is there an official Search Console MCP server?

Not as of 25 October 2026. Google lists none among the MCP servers it hosts or its open-source ones. Community servers use the public Search Console API, so check which scope each requests and where it stores your token.

Beyond the chat

Use the chat to explore GA4. Let Nupact check every ad account around the clock.

On day one, Nupact's first account audit shows budget leaking into stale assets and tracking that broke, with the fixes drafted.