AI Agents Analytics

如何构建 Google Analytics MCP 服务器

Alejandro Rioja
Alejandro Rioja
3 分钟阅读
TL;DR

先试试 Google 官方的 GA4 MCP 服务器:它还是实验版,用 Python 在本地运行,只在自己电脑上用 GA4 的话就够了。要自己构建,就用 MCP TypeScript SDK 和 @google-analytics/data 写一个 run_report 工具,用 gcloud 加 analytics.readonly 范围登录,再用 claude mcp add 注册。难的是为别人托管:你需要 MCP 的 OAuth 流程、Google 对敏感范围的应用验证(未验证的应用最多 100 个用户),还要做缓存,才能控制在 Data API 按媒体资源计算的配额之内。

免费新闻通讯

每周三。28,400+ 读者。纯干货。

一个在你笔记本电脑上运行的 GA4 MCP 服务器,一个下午就能做完。一个能让别人登录使用的服务器,工作量要大得多。这篇指南先给你一个下午就能完成的版本,再列出大版本涉及哪些事情,方便你判断自己需要哪一个。

目录

展开目录

先看看官方服务器

Google 发布了自己的 Google Analytics MCP 服务器,目前仍标注为实验版。它用 Python 在你自己的电脑上运行,使用前要在 Google Cloud 项目里启用 Google Analytics Admin API 和 Data API。它自带 run_report、run_realtime_report、run_funnel_report,以及查询账号、媒体资源、自定义维度和 Google Ads 关联的工具。如果你只需要 GA4,而且只在自己电脑上用,就用它:

bash
gcloud auth application-default login \
  --scopes https://www.googleapis.com/auth/analytics.readonly,https://www.googleapis.com/auth/cloud-platform \
  --client-id-file=YOUR_CLIENT_JSON_FILE

pipx run analytics-mcp

Google 的设置页面会一步步带你配置 Cloud 项目,README 里也有给 Claude Code 用的完整 claude mcp add 命令。它没有托管版,所以只能在能运行 Python 的地方使用。

如果你想要按自己的问题定制的工具、想在一个回答里汇总多个数据源,或者想让团队和客户也能用这个服务器,那就自己构建。

你需要准备

  • 一个启用了 Google Analytics Data API 的 Google Cloud 项目(五分钟搞定)。
  • 在该项目里创建的桌面应用类型 OAuth 客户端 ID,下载为 JSON。--client-id-file 指向的就是这个文件。
  • Node 22 或更高版本,这是当前 @google-analytics/data 包的要求。
  • 你要登录的 Google 账号对该 GA4 媒体资源拥有查看者权限。

第 1 步:一个能跑任何报告的工具

先只做一个工具:run_report。Claude 已经知道 GA4 的指标名和维度名,所以一个灵活的工具就能覆盖大多数问题。等你看清自己真正会问哪些问题,再把它拆成更专门的工具。

建好文件夹,登录一次。第二条 gcloud 命令不能省:Google 的 Analytics API 会拒绝没有指定配额项目的用户凭据。

bash
mkdir ga4-mcp && cd ga4-mcp
npm init -y && npm pkg set type=module
npm install @modelcontextprotocol/sdk @google-analytics/data zod

gcloud auth application-default login \
  --scopes https://www.googleapis.com/auth/analytics.readonly,https://www.googleapis.com/auth/cloud-platform \
  --client-id-file=YOUR_CLIENT_JSON_FILE
gcloud auth application-default set-quota-project YOUR_PROJECT_ID

然后把下面的代码保存为 ga4.ts:

typescript
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import { BetaAnalyticsDataClient } from '@google-analytics/data';
import { z } from 'zod';

const ga = new BetaAnalyticsDataClient(); // Application Default Credentials
const server = new McpServer({ name: 'ga4', version: '1.0.0' });

server.registerTool(
  'run_report',
  {
    description:
      'Run a GA4 report. Uses GA4 Data API metric and dimension names. ' +
      'Dates accept YYYY-MM-DD, "28daysAgo", "yesterday", "today".',
    inputSchema: {
      propertyId: z.string().describe('Numeric GA4 property ID, e.g. 123456789'),
      metrics: z.array(z.string()).describe('e.g. ["sessions", "engagedSessions"]'),
      dimensions: z.array(z.string()).default([]).describe('e.g. ["sessionDefaultChannelGroup"]'),
      startDate: z.string().default('28daysAgo'),
      endDate: z.string().default('today'),
    },
  },
  async ({ propertyId, metrics, dimensions, startDate, endDate }) => {
    const [res] = await ga.runReport({
      property: `properties/${propertyId}`,
      dateRanges: [{ startDate, endDate }],
      metrics: metrics.map((name) => ({ name })),
      dimensions: dimensions.map((name) => ({ name })),
      limit: 100,
    });
    // Turn GA's nested rows into plain { dimension: value, metric: value } objects.
    const rows = (res.rows ?? []).map((row) => {
      const out: Record<string, string> = {};
      row.dimensionValues?.forEach((v, i) => (out[dimensions[i]] = v.value ?? ''));
      row.metricValues?.forEach((v, i) => (out[metrics[i]] = v.value ?? ''));
      return out;
    });
    return { content: [{ type: 'text', text: JSON.stringify({ rowCount: res.rowCount, rows }) }] };
  },
);

await server.connect(new StdioServerTransport());

文件里没有任何密钥。客户端会使用 gcloud 刚保存的登录信息,每次调用都以你的身份、用你的查看者权限执行。

第 2 步:添加到 Claude

在 Claude Code 里,一条命令就能注册。文件请写完整路径。加上 --scope user 后所有项目都能用;不加的话,它只会在你运行命令的那个文件夹里加载:

bash
claude mcp add --scope user ga4 -- npx -y tsx /full/path/to/ga4-mcp/ga4.ts

然后问它:“在媒体资源 123456789 里,上个月哪些渠道带来的互动会话最多?”Claude 会自己挑指标、调用工具,再给你解释返回的数据行。如果用的是 Claude Desktop,同一个服务器要写进配置文件;配置文件在哪里,我的第一个 MCP 服务器指南里有说明。

第 3 步:难在哪里

上面的一切都以你的身份、在你的电脑上运行。一旦要在别的地方运行,下面这些就变了:

  1. 托管和 OAuth。 claude.ai 和手机 App 访问不到你笔记本上的服务器。托管的服务器需要 MCP 的 OAuth 流程,让每个用户登录自己的 Google 账号,还需要一个安全的地方保存他们的刷新令牌。
  2. Google 的应用验证。 analytics.readonly 属于敏感范围。在 Google 验证你的应用之前,每个用户都会看到“未经验证的应用”警告,用户数上限是 100 人。验证需要放在你自己域名上的隐私权政策、演示登录过程的视频、每个范围的书面理由,以及一轮审核。
  3. 配额。 Data API 按媒体资源计算令牌:标准媒体资源每小时 40,000、每天 200,000,而单个 Cloud 项目在每个媒体资源上每小时最多用 14,000,同时最多 10 个请求。大多数请求只消耗 10 个令牌或更少。但日期范围长、维度多、流量大的媒体资源消耗更多,而且代理发报告的速度远比一个人在 GA4 里点来点去快。托管之后,每次调用都从你项目的份额里扣,所以加上 returnPropertyQuota: true 看清每个请求的消耗,把重复的结果缓存起来,报告尽量做小。

SiteWide 负责托管和登录。它的 Google 验证还在进行中,所以目前在 SiteWide 上连接 GA4 也会出现同样的未经验证应用页面。如果你不想自己搭这些,直接连接 SiteWide。

让 Claude 来构建

在一个空文件夹里打开 Claude Code,把下面这段粘贴进去。代码是英文的,所以提示词也保留英文:

code
Build me a TypeScript MCP server for Google Analytics 4 using @modelcontextprotocol/sdk and @google-analytics/data. Give it one tool, run_report, that takes a property id, metrics, dimensions and a date range. Authenticate with Application Default Credentials. Then give me the exact gcloud command to log in with the analytics.readonly scope, and register the server with `claude mcp add`. Don't invent metric names: link me to Google's API schema page so I can check them.

在相信结果之前,把它用到的每个指标和维度都拿去和 Google 的 API 架构页面核对一遍。编造的名称在代码里看起来没问题,要等 API 拒绝时才会报错。

广告
继续阅读

相关文章

继续阅读

将AI实战手册发送到您的邮箱

每周三。28,400+ 读者。纯干货。

↵ ↵ 查看全部结果 esc esc 关闭