{"id":187,"date":"2026-08-26T04:52:54","date_gmt":"2026-08-26T04:52:54","guid":{"rendered":"https:\/\/everclif.com\/insights\/?p=187"},"modified":"2026-08-26T14:38:10","modified_gmt":"2026-08-26T14:38:10","slug":"google-analytics-mcp","status":"publish","type":"post","link":"https:\/\/everclif.com\/insights\/google-analytics-mcp\/","title":{"rendered":"Google Analytics MCP Server: What It Is, Why It Matters, and How to Set It Up | EverClif"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"187\" class=\"elementor elementor-187\" data-elementor-settings=\"{&quot;ha_cmc_init_switcher&quot;:&quot;no&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-d7d47b8 e-con-full e-flex e-con e-parent\" data-id=\"d7d47b8\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;_ha_eqh_enable&quot;:false}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-f6e5320 elementor-widget__width-initial elementor-widget elementor-widget-html\" data-id=\"f6e5320\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>Google Analytics MCP Server: What It Is, Why It Matters, and How to Set It Up With Claude<\/title>\n<style>\n:root {\n    --primary: #000080;\n    --accent: #1E90FF;\n    --white: #ffffff;\n    --light: #F5F6F7;\n    --dark: #333333;\n    --amber: #F59E0B;\n    --amber-dark: #D97706;\n    --amber-soft: rgba(245, 158, 11, 0.12);\n}\n\n.ec-blog-post {\n    font-family: 'Satoshi', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;\n    color: var(--dark);\n    line-height: 1.6;\n    font-variation-settings: 'wght' 400;\n}\n\n.ec-blog-post .container {\n    max-width: 1200px;\n    margin: 0 auto;\n    padding: 0 24px;\n}\n\n.ec-blog-post .blog-hero {\n    position: relative;\n    padding: 150px 0 70px;\n    overflow: hidden;\n    background: linear-gradient(135deg, var(--primary) 0%, #14207A 50%, #0E2E8F 100%);\n}\n\n.ec-blog-post .blog-hero-inner {\n    display: grid;\n    grid-template-columns: minmax(0, 1.05fr) minmax(0, 0.95fr);\n    gap: 48px;\n    align-items: center;\n}\n\n.ec-blog-post .blog-hero-text {\n    position: relative;\n    z-index: 1;\n}\n\n.ec-blog-post .blog-hero-media {\n    width: 100%;\n}\n\n.ec-blog-post .blog-hero-img {\n    width: 100%;\n    aspect-ratio: 5 \/ 3;\n    object-fit: cover;\n    display: block;\n    border-radius: 16px;\n    box-shadow: 0 12px 36px rgba(0, 0, 0, 0.25);\n}\n\n.ec-blog-post .blog-hero-eyebrow {\n    display: inline-block;\n    font-size: 13px;\n    font-weight: 700;\n    letter-spacing: 0.5px;\n    text-transform: uppercase;\n    color: var(--white);\n    background: rgba(245, 158, 11, 0.22);\n    border: 1px solid rgba(245, 158, 11, 0.55);\n    padding: 6px 14px;\n    border-radius: 99px;\n    margin-bottom: 20px;\n}\n\n.ec-blog-post .blog-hero-title {\n    font-size: 40px;\n    font-weight: 700;\n    font-variation-settings: 'wght' 700;\n    color: var(--white);\n    line-height: 1.25;\n    margin-bottom: 16px;\n}\n\n.ec-blog-post .blog-hero-meta {\n    font-size: 15px;\n    color: rgba(255, 255, 255, 0.75);\n}\n\n.ec-blog-post .blog-body {\n    padding: 64px 0 40px;\n    background: var(--white);\n}\n\n.ec-blog-post .blog-layout {\n    display: grid;\n    grid-template-columns: 260px minmax(0, 1fr);\n    gap: 64px;\n    align-items: start;\n}\n\n.ec-blog-post .blog-toc {\n    position: sticky;\n    top: 100px;\n    align-self: start;\n    max-height: calc(100vh - 130px);\n    overflow-y: auto;\n}\n\n.ec-blog-post .blog-toc-label {\n    font-size: 12px;\n    font-weight: 700;\n    letter-spacing: 0.6px;\n    text-transform: uppercase;\n    color: var(--accent);\n    margin-bottom: 14px;\n}\n\n.ec-blog-post .blog-toc-list {\n    list-style: none;\n    border-left: 2px solid rgba(30, 144, 255, 0.18);\n}\n\n.ec-blog-post .toc-link {\n    display: block;\n    padding: 7px 0 7px 16px;\n    margin-left: -2px;\n    border-left: 2px solid transparent;\n    font-size: 14.5px;\n    color: var(--dark);\n    text-decoration: none;\n    line-height: 1.4;\n    transition: color 0.2s ease, border-color 0.2s ease;\n}\n\n.ec-blog-post .toc-link--sub {\n    padding-left: 30px;\n    font-size: 13.5px;\n    opacity: 0.85;\n}\n\n.ec-blog-post .toc-link:hover {\n    color: var(--primary);\n}\n\n.ec-blog-post .toc-link.is-active {\n    color: var(--primary);\n    font-weight: 700;\n    border-left-color: var(--amber);\n}\n\n.ec-blog-post .blog-content {\n    max-width: 720px;\n    font-size: 17px;\n    line-height: 1.8;\n    color: var(--dark);\n}\n\n.ec-blog-post .blog-content > p {\n    margin-bottom: 22px;\n}\n\n.ec-blog-post .blog-content h2 {\n    font-size: 30px;\n    font-weight: 700;\n    font-variation-settings: 'wght' 700;\n    color: var(--primary);\n    margin: 52px 0 18px;\n    line-height: 1.3;\n}\n\n.ec-blog-post .blog-content h2:first-of-type {\n    margin-top: 36px;\n}\n\n.ec-blog-post .blog-content h3 {\n    font-size: 22px;\n    font-weight: 700;\n    font-variation-settings: 'wght' 700;\n    color: var(--primary);\n    margin: 38px 0 14px;\n    line-height: 1.35;\n}\n\n.ec-blog-post .blog-content h4 {\n    font-size: 18px;\n    font-weight: 700;\n    color: var(--accent);\n    margin: 28px 0 10px;\n}\n\n.ec-blog-post .blog-content em {\n    color: var(--primary);\n    font-style: italic;\n}\n\n.ec-blog-post .blog-content img {\n    max-width: 100%;\n    height: auto;\n    border-radius: 10px;\n    display: block;\n    margin: 8px 0 24px;\n}\n\n.ec-blog-post .blog-closing-line {\n    font-size: 19px;\n    font-weight: 600;\n    font-style: italic;\n    color: var(--primary);\n}\n\n.ec-blog-post .blog-cta-banner {\n    display: flex;\n    align-items: center;\n    gap: 28px;\n    background: linear-gradient(135deg, var(--primary) 0%, #14207A 50%, #0E2E8F 100%);\n    border-radius: 16px;\n    padding: 32px;\n    margin: 44px 0 48px;\n    box-shadow: 0 10px 30px rgba(0, 0, 128, 0.22);\n}\n\n.ec-blog-post .blog-cta-img {\n    width: 96px;\n    height: 96px;\n    border-radius: 50%;\n    object-fit: cover;\n    border: 3px solid var(--amber);\n    flex-shrink: 0;\n}\n\n.ec-blog-post .blog-cta-body {\n    flex: 1;\n}\n\n.ec-blog-post .blog-cta-text {\n    color: var(--white);\n    font-size: 17px;\n    line-height: 1.6;\n    margin-bottom: 16px;\n}\n\n.ec-blog-post .blog-cta-btn {\n    display: inline-block;\n    padding: 11px 26px;\n    font-size: 16px;\n    font-weight: 700;\n    color: var(--primary);\n    background: linear-gradient(135deg, #FBBF45 0%, var(--amber) 100%);\n    border: 2px solid var(--amber);\n    border-radius: 6px;\n    text-decoration: none;\n    box-shadow: 0 6px 22px rgba(245, 158, 11, 0.4);\n    transition: all 0.3s ease;\n}\n\n.ec-blog-post .blog-cta-btn:hover {\n    transform: translateY(-2px);\n    box-shadow: 0 10px 30px rgba(245, 158, 11, 0.55);\n}\n\n.ec-blog-post .blog-faq {\n    background: var(--light);\n    padding: 80px 0;\n}\n\n.ec-blog-post .blog-faq-container {\n    max-width: 800px;\n}\n\n.ec-blog-post .blog-faq-title {\n    font-size: 34px;\n    font-weight: 700;\n    font-variation-settings: 'wght' 700;\n    color: var(--primary);\n    text-align: center;\n    margin-bottom: 40px;\n}\n\n.ec-blog-post .blog-faq-list {\n    display: flex;\n    flex-direction: column;\n    gap: 14px;\n}\n\n.ec-blog-post .blog-faq-item {\n    background: var(--white);\n    border: 1px solid rgba(30, 144, 255, 0.18);\n    border-radius: 12px;\n    overflow: hidden;\n    box-shadow: 0 2px 10px rgba(30, 144, 255, 0.06);\n    transition: border-color 0.2s ease, box-shadow 0.2s ease;\n}\n\n.ec-blog-post .blog-faq-item.is-open {\n    border-color: var(--amber);\n    box-shadow: 0 6px 18px rgba(245, 158, 11, 0.18);\n}\n\n.ec-blog-post .blog-faq-question {\n    width: 100%;\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n    gap: 16px;\n    background: none;\n    border: none;\n    cursor: pointer;\n    text-align: left;\n    padding: 20px 24px;\n    font-size: 16px;\n    font-weight: 600;\n    color: var(--primary);\n    font-family: inherit;\n}\n\n.ec-blog-post .blog-faq-toggle {\n    flex-shrink: 0;\n    width: 26px;\n    height: 26px;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    border-radius: 50%;\n    background: var(--amber-soft);\n    color: var(--amber-dark);\n    font-size: 18px;\n    font-weight: 700;\n    transition: transform 0.25s ease;\n}\n\n.ec-blog-post .blog-faq-item.is-open .blog-faq-toggle {\n    transform: rotate(45deg);\n}\n\n.ec-blog-post .blog-faq-answer {\n    max-height: 0;\n    overflow: hidden;\n    transition: max-height 0.3s ease;\n}\n\n.ec-blog-post .blog-faq-item.is-open .blog-faq-answer {\n    max-height: 600px;\n}\n\n.ec-blog-post .blog-faq-answer p {\n    padding: 0 24px 22px;\n    color: var(--dark);\n    font-size: 15.5px;\n    line-height: 1.7;\n}\n\n@media (max-width: 900px) {\n    .ec-blog-post .blog-layout {\n        grid-template-columns: 1fr;\n        gap: 32px;\n    }\n\n    .ec-blog-post .blog-toc {\n        position: static;\n        max-height: none;\n        order: -1;\n        border: 1px solid rgba(30, 144, 255, 0.18);\n        border-radius: 12px;\n        padding: 18px 20px;\n    }\n\n    .ec-blog-post .blog-toc-list {\n        max-height: 220px;\n        overflow-y: auto;\n    }\n\n    .ec-blog-post .blog-hero-inner {\n        grid-template-columns: 1fr;\n        gap: 32px;\n    }\n\n    .ec-blog-post .blog-hero-media {\n        max-width: 480px;\n        margin: 0 auto;\n    }\n\n    .ec-blog-post .blog-hero-title {\n        font-size: 32px;\n    }\n}\n\n@media (max-width: 600px) {\n    .ec-blog-post .blog-hero {\n        padding: 140px 0 48px;\n    }\n\n    .ec-blog-post .blog-cta-banner {\n        flex-direction: column;\n        text-align: center;\n    }\n\n    .ec-blog-post .blog-faq-title {\n        font-size: 26px;\n    }\n}\n<\/style>\n<\/head>\n<body>\n<div class=\"ec-blog-post\">\n    <header class=\"blog-hero\">\n        <div class=\"container blog-hero-inner\">\n            <div class=\"blog-hero-text\">\n                <span class=\"blog-hero-eyebrow\">AI &amp; Analytics<\/span>\n                <h1 class=\"blog-hero-title\">Google Analytics MCP Server: What It Is, Why It Matters, and How to Set It Up With Claude<\/h1>\n                <p class=\"blog-hero-meta\">Ashish Raj &middot; 29 July 2026 &middot; 11 min read<\/p>\n            <\/div>\n            <div class=\"blog-hero-media\">\n                <img decoding=\"async\" src=\"https:\/\/everclif.com\/insights\/wp-content\/uploads\/2026\/07\/Google-Analytics-MCP-Server-Diagram--scaled.png\" alt=\"Google Analytics MCP Server: What It Is, Why It Matters, and How to Set It Up With Claude\" class=\"blog-hero-img\">\n            <\/div>\n        <\/div>\n    <\/header>\n\n    <section class=\"blog-body\">\n        <div class=\"container blog-layout\">\n            <aside class=\"blog-toc\">\n                <p class=\"blog-toc-label\">On this page<\/p>\n                <nav aria-label=\"Table of contents\">\n                    <ul class=\"blog-toc-list\">\n                        <li><a href=\"#tldr\" class=\"toc-link\" data-toc-level=\"2\">TL;DR<\/a><\/li>\n<li><a href=\"#what-is\" class=\"toc-link\" data-toc-level=\"2\">What Is the Google Analytics MCP Server, and Why Use It?<\/a><\/li>\n<li><a href=\"#how-it-works\" class=\"toc-link\" data-toc-level=\"2\">How It Actually Works<\/a><\/li>\n<li><a href=\"#why-marketers\" class=\"toc-link\" data-toc-level=\"2\">Why Marketers and Agencies Are Adopting It<\/a><\/li>\n<li><a href=\"#privacy\" class=\"toc-link\" data-toc-level=\"2\">Is Your Client Data Safe? How Privacy Actually Works<\/a><\/li>\n<li><a href=\"#setup\" class=\"toc-link\" data-toc-level=\"2\">How to Get Started With the Google Analytics MCP Server<\/a><\/li>\n<li><a href=\"#comparison\" class=\"toc-link\" data-toc-level=\"2\">Google Analytics MCP vs. the GA4 Interface vs. BI Dashboards<\/a><\/li>\n<li><a href=\"#example-prompts\" class=\"toc-link\" data-toc-level=\"2\">What You Can Actually Ask It<\/a><\/li>\n<li><a href=\"#limitations\" class=\"toc-link\" data-toc-level=\"2\">Limitations Worth Knowing<\/a><\/li>\n<li><a href=\"#final-thoughts\" class=\"toc-link\" data-toc-level=\"2\">Final Thoughts<\/a><\/li>\n<li><a href=\"#faq\" class=\"toc-link\" data-toc-level=\"2\">FAQ<\/a><\/li>\n                    <\/ul>\n                <\/nav>\n            <\/aside>\n\n            <article class=\"blog-content\">\n                \n<h2 id=\"tldr\">TL;DR<\/h2>\n<p>The Google Analytics MCP server is Google\u2019s own official, open-source tool that connects live GA4 data to an AI model like Claude or Gemini through the Model Context Protocol (MCP), an open standard for letting AI assistants call outside tools directly. Instead of opening GA4 and clicking through reports, you ask a question in plain English and the model pulls the real numbers and answers it.<\/p>\n<p>It\u2019s free, read-only, and runs locally on your own machine or server. Setup means enabling two Google Cloud APIs, generating read-only credentials, and pointing an MCP-compatible client, Claude Code, Gemini CLI, or a self-hosted remote connector for Claude.ai, at the server.<\/p>\n<p>On privacy: GA4 is already required to exclude personally identifiable information like names and emails, so the MCP server can\u2019t hand over data that was never collected to begin with. Anthropic\u2019s policy separately excludes MCP and other connector content from the data used to train Claude. What flows through stays inside your conversation.<\/p>\n<h2 id=\"what-is\">What Is the Google Analytics MCP Server, and Why Use It?<\/h2>\n<p>Model Context Protocol, or MCP, is an open standard Anthropic introduced for connecting AI models to outside tools and data sources through one shared interface. Instead of every company building a custom, one-off integration for every AI assistant it wants to support, MCP gives them a single protocol to build against once. Any MCP-compatible client, Claude, Gemini, Cursor, whichever, can then plug into that same server without a separate integration for each one.<\/p>\n<p>The Google Analytics MCP server is Google\u2019s own implementation of that standard for GA4. It\u2019s open-source under the Apache 2.0 license, built and maintained by the Google Analytics team, and it wraps the GA4 Admin API and Data API into a set of tools an AI model can call directly. Point Claude or Gemini at it, and instead of opening GA4, clicking into a report, and exporting a CSV, you just ask: \u201cWhat were my top landing pages last month?\u201d or \u201cHow did organic traffic trend against paid over the last quarter?\u201d The model calls the tool, pulls the real numbers from your property, and answers in plain English.<\/p>\n<p>Why use it instead of just opening GA4 like normal? Because most of what agencies and in-house marketers actually do with analytics data isn\u2019t browsing a dashboard. It\u2019s translating that data into a decision, a slide, or a client email. GA4\u2019s interface is built for exploring metrics, not for answering \u201cwhy did conversions drop on the 14th\u201d in one step. An MCP connection collapses that gap. You still get real GA4 data, not a guess, but the model does the digging, the cross-referencing, and the first draft of the explanation.<\/p>\n<h2 id=\"how-it-works\">How It Actually Works<\/h2>\n<p>Under the hood, the server exposes seven tools, grouped into three jobs.<\/p>\n<h3 id=\"tools\">The Tools It Exposes<\/h3>\n<p><strong>Account and property info.<\/strong> <code>get_account_summaries<\/code> lists which GA4 accounts and properties you have access to, <code>get_property_details<\/code> pulls the specifics of one property, and <code>list_google_ads_links<\/code> shows which Google Ads accounts are linked to it.<\/p>\n<p><strong>Core reporting.<\/strong> <code>run_report<\/code> is the workhorse. It runs a standard GA4 report with whatever dimensions and metrics you ask for. <code>run_funnel_report<\/code> builds a funnel report on the fly, and <code>get_custom_dimensions_and_metrics<\/code> surfaces any custom tracking you\u2019ve set up, so the model knows what\u2019s available before it tries to query it.<\/p>\n<p><strong>Realtime.<\/strong> <code>run_realtime_report<\/code> checks who\u2019s on the site right now, genuinely useful during a launch or a campaign push when you want a pulse check without switching tabs.<\/p>\n<p>That\u2019s the whole toolset. No tool creates, edits, or deletes anything in your GA4 configuration.<\/p>\n<h3 id=\"limitations-read-only\">What It Can\u2019t Do<\/h3>\n<p>Google\u2019s own repo labels it plainly: Experimental, and read-only. It can\u2019t touch your GA4 settings, can\u2019t create audiences, can\u2019t change your data retention window. If a prompt asks the model to \u201cfix\u201d something in your Analytics setup through the MCP connection, it simply can\u2019t \u2014 the scope it authenticates with, <code>analytics.readonly<\/code>, doesn\u2019t allow write access at all.<\/p>\n<p>It also runs locally by default, on your own machine or your own server, not as a hosted service Google operates for you. That matters for the setup section further down. A local, read-only, open-source tool is about as conservative a design as Google could have shipped this with.<\/p>\n\n\n<h2 id=\"why-marketers\">Why Marketers and Agencies Are Adopting It<\/h2>\n<p>Most new GA4 tooling doesn\u2019t catch on this fast. This has, and the reason isn\u2019t really about the AI part. It\u2019s about what it replaces.<\/p>\n\n                <aside class=\"blog-cta-banner\">\n                    <img decoding=\"async\" src=\"\/assets\/founder.jpg\" alt=\"Ashish Raj\" class=\"blog-cta-img\" width=\"120\" height=\"120\">\n                    <div class=\"blog-cta-body\">\n                        <p class=\"blog-cta-text\">I\u2019ve hooked GA4 up to Claude through this exact MCP server for client reporting, and it cuts real hours off the \u201clet me pull that number for you\u201d loop. If you want help getting it set up cleanly, or wiring your team\u2019s reporting around it, happy to talk it through.<\/p>\n                        <a href=\"https:\/\/calendly.com\/anirban-everclif\/30min\" class=\"blog-cta-btn\" target=\"_blank\" rel=\"noopener noreferrer\">Talk to Us<\/a>\n                    <\/div>\n                <\/aside>\n                <p>Nobody outside a data analyst role reliably remembers that \u201cengaged sessions\u201d and \u201cengagement rate\u201d are two different fields, or which report has \u201clanding page\u201d and which has \u201cpage path.\u201d You just describe what you want instead. And most client-reporting time was never really about pulling numbers, it was about turning numbers into a sentence someone would actually read. A connected model can draft that sentence straight from live data instead of from a screenshot pasted into a doc three days ago.<\/p>\n<p>It\u2019s faster for the exploratory stuff too. \u201cWhy did traffic dip on the 14th\u201d used to mean opening three reports and cross-referencing them by hand. Now it\u2019s one prompt, and the model chains a report, then a comparison, then a segment breakdown, without you doing the chaining yourself.<\/p>\n<p>And it costs nothing extra to try. Because it\u2019s Google\u2019s own open-source release, there\u2019s no separate subscription, and it isn\u2019t locked to one AI provider. It behaves the same whether the client on the other end is Claude, Gemini, or something else entirely.<\/p>\n<p>At an agency, all of that shows up in small moments. Catching the question a client is about to ask before the call even starts. Turning a mid-month check-in into an actual conversation instead of a screen share of a dashboard nobody else in the room can read.<\/p>\n<h2 id=\"privacy\">Is Your Client Data Safe? How Privacy Actually Works<\/h2>\n<p>This is usually the first question anyone asks, right after the initial \u201cokay, that\u2019s neat\u201d reaction wears off. It deserves a real answer, not a wave-off. Two separate systems are involved here \u2014 GA4 and Claude \u2014 and each one answers it differently.<\/p>\n<h3 id=\"ga4-pii\">What GA4 Itself Already Keeps Out<\/h3>\n<p>Before any MCP server enters the picture, GA4 is already supposed to be free of anything that identifies a specific person. Google\u2019s terms explicitly prohibit sending personally identifiable information \u2014 names, email addresses, phone numbers, exact home addresses \u2014 to Analytics in the first place, and a compliant implementation shouldn\u2019t have that data sitting in the property at all. What GA4 actually stores is aggregate and pseudonymous: session counts, event names, page paths, device categories, city-level location, channel groupings. So when the MCP server runs a report, it isn\u2019t retrieving a list of who visited your site. GA4 was never holding that list to begin with.<\/p>\n<h3 id=\"claude-data-handling\">What Happens to That Data Inside Claude<\/h3>\n<p>On the Claude side, the relevant fact is Anthropic\u2019s own policy on connector data: content pulled in through connectors, MCP servers included, whether local or remote, is specifically excluded from the data Anthropic uses to train its models. It only becomes part of that pool if someone manually copies it into the chat as pasted text, which isn\u2019t how a tool call works. The numbers a report returns get used to answer the question in that conversation. Nothing more.<\/p>\n<p>Standard conversation-retention rules still apply on top of that. How long a chat is stored depends on your plan and your training-data preference in settings, and that\u2019s worth checking directly in Anthropic\u2019s current privacy documentation rather than taking any blog post\u2019s word for it, since it\u2019s the kind of policy that gets updated. But the specific worry people usually raise, whether an AI model is going to learn from a client\u2019s private traffic numbers, has a clear answer for connector data: no. That\u2019s excluded by design.<\/p>\n<p>Put those two together and the practical picture is this: the data source \u2014 GA4 \u2014 is already stripped of who your visitors are, and the pipe carrying it to Claude doesn\u2019t feed it back into model training. What you\u2019re left with is Claude seeing the same aggregate metrics you\u2019d see in the GA4 UI, just queried in plain English instead of clicked through by hand.<\/p>\n<h2 id=\"setup\">How to Get Started With the Google Analytics MCP Server<\/h2>\n<p>The full step-by-step lives in Google\u2019s GitHub repo, <code>google-analytics-mcp<\/code> under the <code>googleanalytics<\/code> org, but here\u2019s the shape of it.<\/p>\n<h3 id=\"claude-code-setup\">Connecting It to Claude Code<\/h3>\n<p>This is one of the two paths Google documents explicitly. Install <code>pipx<\/code>, enable the Google Analytics Admin API and Data API in a Google Cloud project, set up Application Default Credentials scoped to <code>analytics.readonly<\/code>, then run one command:<\/p>\n<p><code>claude mcp add analytics-mcp --scope user -e \"GOOGLE_APPLICATION_CREDENTIALS=...\" -e \"GOOGLE_PROJECT_ID=...\" -- pipx run analytics-mcp<\/code><\/p>\n<p>Claude Code picks it up as a local MCP server the next time you start a session.<\/p>\n<h3 id=\"claude-ai-setup\">Connecting It to Claude.ai or Claude Desktop<\/h3>\n<p>Here\u2019s the part worth knowing before you try it: the official server runs locally over stdio. It\u2019s designed to run on your own machine, not to be reached over the internet. Claude.ai\u2019s custom connectors, under Settings &gt; Connectors, expect a remote MCP server with a public URL, so pointing claude.ai directly at the GitHub repo as written won\u2019t work out of the box. Claude Desktop can run it locally through its own MCP config file the same way Claude Code does. If you specifically want it inside the claude.ai web interface, you\u2019d need to deploy the server somewhere reachable over the internet first, a small cloud instance or a serverless platform, then add that URL as a custom connector.<\/p>\n<h3 id=\"gemini-setup\">Connecting It to Gemini<\/h3>\n<p>Google\u2019s own instructions default to this path: install Gemini CLI or Gemini Code Assist, add the server to <code>~\/.gemini\/settings.json<\/code> with the same credentials, then type <code>\/mcp<\/code> inside Gemini to confirm it shows up in the list.<\/p>\n<p>Whichever client you use, the credential and API-enablement steps are identical. The client is just the thing asking the questions. The server and the GA4 property underneath it don\u2019t change.<\/p>\n<h2 id=\"comparison\">Google Analytics MCP vs. the GA4 Interface vs. BI Dashboards<\/h2>\n<p>None of this replaces GA4 or your existing dashboards. It sits alongside them, and it\u2019s worth being clear-eyed about where each one actually wins.<\/p>\n<p>The GA4 interface is still the right place for deep, structured exploration, building a report you\u2019ll reuse weekly, or configuring the property itself: events, conversions, audiences. MCP can\u2019t touch configuration at all, so that job isn\u2019t going anywhere. A BI dashboard, Looker Studio or a client-facing report, is still the right place for a fixed set of metrics someone checks on a schedule. It\u2019s built to be glanced at, not conversed with.<\/p>\n<p>Where the MCP connection actually wins is the questions that don\u2019t have a pre-built report sitting there already. The ad hoc \u201cwait, why did this happen\u201d moment. The client call where someone asks something you didn\u2019t prep a slide for. The first-pass analysis before you decide what\u2019s actually worth building a permanent dashboard around.<\/p>\n<h2 id=\"example-prompts\">What You Can Actually Ask It<\/h2>\n<p>A few real prompts that work well once it\u2019s connected:<\/p>\n<ul>\n<li>\u201cWhat were my top five landing pages by sessions last month, and how does that compare to the month before?\u201d<\/li>\n<li>\u201cWere most of my users over the last 90 days logged in or anonymous?\u201d<\/li>\n<li>\u201cBuild me a funnel from homepage view to signup for the last 30 days.\u201d<\/li>\n<li>\u201cWhat\u2019s happening on the site right now?\u201d (this one hits the realtime tool)<\/li>\n<li>\u201cWhat custom dimensions am I already tracking on this property?\u201d<\/li>\n<\/ul>\n<p>The model can chain several of these together in one exchange too. Ask a broad question and it will often run more than one report to answer it properly instead of making you ask each piece separately.<\/p>\n<h2 id=\"limitations\">Limitations Worth Knowing<\/h2>\n<p>A few things worth setting expectations on before you rely on this daily:<\/p>\n<ul>\n<li>It\u2019s labeled Experimental by Google. The tool set and behavior can still change between releases, so don\u2019t wire anything mission-critical to it without a fallback.<\/li>\n<li>It\u2019s read-only, so it won\u2019t fix anything, tag anything, or update your GA4 configuration. You still need someone, or something else, to act on what it finds.<\/li>\n<li>It only sees what the GA4 Data and Admin APIs expose. If something isn\u2019t tracked as an event or a dimension in your property, asking the model about it won\u2019t conjure it into existence. Garbage in, garbage out still applies here like anywhere else.<\/li>\n<li>Running it locally means whoever\u2019s machine it\u2019s on needs their own valid Google Cloud credentials with access to the property. That\u2019s a small setup tax on every new team member who wants to use it directly, part of why a lot of teams end up centralizing it on one shared server instead of everyone running their own copy.<\/li>\n<\/ul>\n<h2 id=\"final-thoughts\">Final Thoughts<\/h2>\n<p>The Google Analytics MCP server isn\u2019t a new analytics platform, and it doesn\u2019t try to be. It\u2019s a narrower, more useful idea: let a model that\u2019s already good at reading and writing sit directly on top of the data you already have, instead of forcing a person to be the translation layer between a dashboard and a decision every single time.<\/p>\n<p>That\u2019s a small architectural change with an outsized effect on how fast a team moves from \u201cI wonder why\u201d to an actual answer. Set it up once, point it at a real property, and the honest test is simple: does asking beat clicking? For most of the questions that come up in a normal week, it does.<\/p>\n<p class=\"blog-closing-line\">The best analytics tool is the one that answers the question you actually asked.<\/p>\n\n            <\/article>\n        <\/div>\n    <\/section>\n    \n        <section class=\"blog-faq\">\n            <div class=\"container blog-faq-container\">\n                <h2 class=\"blog-faq-title\" id=\"faq\">FAQ<\/h2>\n                <div class=\"blog-faq-list\">\n        <div class=\"blog-faq-item\">\n          <button type=\"button\" class=\"blog-faq-question\">\n            <span>Is the Google Analytics MCP server actually made by Google?<\/span>\n            <span class=\"blog-faq-toggle\">+<\/span>\n          <\/button>\n          <div class=\"blog-faq-answer\"><p>Yes. It\u2019s published and maintained by the Google Analytics team under the <code>googleanalytics<\/code> organization on GitHub, released under the Apache 2.0 license. It isn\u2019t a third-party wrapper, though plenty of third-party MCP servers for GA4 exist too, so it\u2019s worth checking which one you\u2019re looking at before assuming they all behave the same way.<\/p><\/div>\n        <\/div>\n        <div class=\"blog-faq-item\">\n          <button type=\"button\" class=\"blog-faq-question\">\n            <span>Does it only work with Gemini, or can I use it with Claude?<\/span>\n            <span class=\"blog-faq-toggle\">+<\/span>\n          <\/button>\n          <div class=\"blog-faq-answer\"><p>Both, by design. MCP is an open standard, not a Google-only or Anthropic-only thing, and Google\u2019s own setup docs include explicit instructions for both Gemini and Claude Code.<\/p><\/div>\n        <\/div>\n        <div class=\"blog-faq-item\">\n          <button type=\"button\" class=\"blog-faq-question\">\n            <span>Can it change my GA4 settings or edit my data?<\/span>\n            <span class=\"blog-faq-toggle\">+<\/span>\n          <\/button>\n          <div class=\"blog-faq-answer\"><p>No. It authenticates with a read-only scope, and every tool it exposes only retrieves information. None of them create, edit, or delete anything in your Analytics configuration.<\/p><\/div>\n        <\/div>\n        <div class=\"blog-faq-item\">\n          <button type=\"button\" class=\"blog-faq-question\">\n            <span>Will my client\u2019s analytics data be used to train Claude?<\/span>\n            <span class=\"blog-faq-toggle\">+<\/span>\n          <\/button>\n          <div class=\"blog-faq-answer\"><p>Per Anthropic\u2019s current policy, no. Data that comes through connectors, MCP servers included, is specifically excluded from the data used for model training, unless someone manually pastes it into the chat as text. Worth confirming against Anthropic\u2019s live privacy documentation if it\u2019s a dealbreaker question for a client, since policies like this do get revised.<\/p><\/div>\n        <\/div>\n        <div class=\"blog-faq-item\">\n          <button type=\"button\" class=\"blog-faq-question\">\n            <span>What does MCP actually stand for?<\/span>\n            <span class=\"blog-faq-toggle\">+<\/span>\n          <\/button>\n          <div class=\"blog-faq-answer\"><p>Model Context Protocol. It\u2019s the open standard, created by Anthropic and adopted well beyond just Claude at this point, that lets an AI model connect to outside tools and data through one consistent interface instead of a custom integration for every pairing.<\/p><\/div>\n        <\/div>\n                <\/div>\n            <\/div>\n        <\/section>\n<\/div>\n<script>\ndocument.querySelectorAll('.blog-faq-item').forEach(function (item) {\n    var question = item.querySelector('.blog-faq-question');\n    if (!question) return;\n    question.addEventListener('click', function () {\n        item.classList.toggle('is-open');\n    });\n});\n<\/script>\n<\/body>\n<\/html>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Web analytics is not an exact science. Here&#8217;s how to read the numbers, label your marketing correctly, and make decisions you can actually trust.<\/p>\n","protected":false},"author":3,"featured_media":203,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-187","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog"],"_links":{"self":[{"href":"https:\/\/everclif.com\/insights\/wp-json\/wp\/v2\/posts\/187","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/everclif.com\/insights\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/everclif.com\/insights\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/everclif.com\/insights\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/everclif.com\/insights\/wp-json\/wp\/v2\/comments?post=187"}],"version-history":[{"count":4,"href":"https:\/\/everclif.com\/insights\/wp-json\/wp\/v2\/posts\/187\/revisions"}],"predecessor-version":[{"id":191,"href":"https:\/\/everclif.com\/insights\/wp-json\/wp\/v2\/posts\/187\/revisions\/191"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/everclif.com\/insights\/wp-json\/wp\/v2\/media\/203"}],"wp:attachment":[{"href":"https:\/\/everclif.com\/insights\/wp-json\/wp\/v2\/media?parent=187"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/everclif.com\/insights\/wp-json\/wp\/v2\/categories?post=187"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/everclif.com\/insights\/wp-json\/wp\/v2\/tags?post=187"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}