| Use it for | Don't run your reporting or decisions on it |
|---|---|
| One-off questions you would otherwise build an exploration for | Weekly 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 afterwards | Budget splits between channels: GA4 sees Google's ads best and re-credits past conversions |
| Checking an event still fires after a release | Monitoring: 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 on | Acting on what you find: it can't change budgets, bids or campaigns |
| A quick look before you open GA4 | Team 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.
| Tool | What it does | Reads or writes |
|---|---|---|
get_ | Lists the accounts and properties your Google sign-in can reach | Reads |
get_ | Returns a property's settings, including its time zone and currency | Reads |
list_ | Lists the Google Ads accounts linked to a property | Reads |
list_ | Lists the dated notes on a property's reports | Reads |
get_ | Lists a property's custom dimensions and metrics | Reads |
run_ | Runs a standard Data API report | Reads |
run_ | Runs a funnel report through the Data API's alpha version | Reads |
run_ | Reads events from the last 30 minutes, or 60 on Analytics 360 | Reads |
run_ | Ad cost, clicks, conversions, revenue and return on ad spend by campaign or channel, through the alpha version | Reads |
create_ | Adds a dated note to the property's reports, if the server starts with --allow-write | Writes |
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
- Install the tools. Python 3.10 or later, pipx or uv, and the Google Cloud CLI.
- Enable two APIs. Turn on the Google Analytics Admin API and Data API in your Cloud project.
- Grant access. Give your Google user, or a service account, at least the Viewer role on each property you want to query.
- 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.
- 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
mcpServersvia Settings, Developer, Edit Config, then restart Claude. Use absolute paths, and the full path to pipx fromwhich pipxif 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
| Limit | Standard property | What it means in a chat |
|---|---|---|
| Core tokens per property | 200,000 a day; 40,000 an hour | Long date ranges, many dimensions and busy properties cost more per call. Analytics 360 gets ten times as many. |
| Tokens per project, per property | 14,000 an hour | Everyone querying a property through the same Cloud project shares this. |
| Concurrent requests | 10 per property | Extra parallel calls fail with a quota error. |
| Requests that may be thresholded | 120 an hour | Requests with demographic dimensions count here, among others. |
| Rows per call | 10,000 by default, 250,000 at most | The response's rowCount gives the full total, so a partial page can be spotted. |
| Realtime window | The last 30 minutes | 60 minutes on Analytics 360. |
| Freshness | Daily data usually within 12 hours | Processing 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.readonlyandwebmasters; 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
- Keep the read-only scope. Add
--allow-writeonly if you want annotations. - Grant Viewer only where needed. One property per service account limits mistakes.
- Treat the credentials file as a password. Keep it out of synced folders and repositories.
gcloud auth application-default revokerevokes it on your machine; for a lost laptop, remove the sign-in's access from your Google Account's third-party connections. - Name the property and the dates. Use the property ID and absolute dates, and read the property's time zone and currency first.
- Ask what each number is. Metrics, dimensions, attribution model, rows against
rowCount, and any sampling or threshold flag. - Share one definitions file. Conversions, sessions metric, attribution model and channel rules, loaded through a project or
CLAUDE.md. - Compare before you publish. Check any reported number once in the GA4 interface.
- 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.
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.