MCP-Server: Google Analytics fuer Entwickler endlich nuetzlich machen
Wie Model Context Protocol-Server Google Analytics von einem Marketing-Dashboard in eine entwicklerfreundliche Datenquelle verwandeln, die man konversationell abfragen kann.

Google Analytics war schon immer ein Marketing-Tool, das Entwickler tolerieren. Man richtet Tracking ein, konfiguriert Events und uebergibt es dann an jemanden, der tatsaechlich Spass daran hat, durch Dashboards zu klicken. Wenn man selbst Daten braucht — Absprungraten fuer eine bestimmte Seite, Conversion-Funnels fuer ein neues Feature, aktive Nutzer in Echtzeit segmentiert nach Land — klickt man sich durch fuenf verschachtelte Menues, kaempft mit dem GA4-Query-Builder und fragt sich, warum es mehr Aufwand kostet, eine Frage zu stellen, als sie zu beantworten.
Model Context Protocol aendert das grundlegend. Indem man die Reporting-API von GA4 in einen MCP-Server verpackt, kann man seine Analysedaten konversationell ueber Claude oder jeden MCP-kompatiblen KI-Assistenten abfragen. Keine Dashboards. Keine Query-Builder. Einfach fragen, was man wissen will.
Was MCP ist und warum es wichtig ist
Model Context Protocol ist ein offener Standard, der von Anthropic entwickelt wurde und definiert, wie KI-Assistenten mit externen Datenquellen und Tools interagieren. Stellen Sie es sich als USB-C-Anschluss fuer KI vor — eine universelle Schnittstelle, die jedem kompatiblen Assistenten erlaubt, sich mit jeder kompatiblen Datenquelle zu verbinden, ohne fuer jede Paarung individuellen Integrationscode zu benoetigen.
Vor MCP bedeutete die Verbindung eines KI-Assistenten mit Ihren Analysedaten den Bau einer massgeschneiderten Pipeline: Daten in CSV exportieren, in einen Chat einfuegen, hoffen, dass das Kontextfenster gross genug ist. Oder eine individuelle API-Integration bauen, Prompt-Templates schreiben, Authentifizierung selbst handhaben. Jede neue Datenquelle erforderte eine neue Integration.
MCP standardisiert das in drei Konzepte:
- Resources — strukturierte Daten, die der Server bereitstellt (Ihre GA4-Properties, Reports, Dimensionen, Metriken)
- Tools — Aktionen, die die KI aufrufen kann (einen Report ausfuehren, Echtzeitdaten abfragen, verfuegbare Metriken auflisten)
- Prompts — wiederverwendbare Prompt-Templates, die der Server bereitstellt (haeufige Analyse-Queries, vorstrukturiert fuer gute Ergebnisse)
Der Server uebernimmt Authentifizierung, Datenabruf und Antwortformatierung. Der KI-Assistent uebernimmt das Verstaendnis natuerlicher Sprache und die Interpretation der Ergebnisse. Keine Seite muss die Implementierungsdetails der anderen kennen.
Warum das speziell fuer Analytics wichtig ist
Analyseplattformen sind informationsdicht, aber interaktionsarm. GA4 hat ausserordentlich leistungsfaehige Daten — es verfolgt jede Nutzersitzung, jeden Seitenaufruf, jedes Event, jede Conversion ueber Ihr gesamtes Produkt. Aber der Zugriff auf diese Daten erfordert, dass Sie in GA4s Vokabular denken: Dimensionen, Metriken, Segmente, Datumsbereiche, Filter, Vergleiche. Sie muessen Ihre Frage in GA4s Abfragemodell uebersetzen, bevor Sie eine Antwort bekommen.
Ein MCP-Server kehrt das um. Sie stellen Ihre Frage in einfacher Sprache. Die KI uebersetzt sie in die korrekten API-Aufrufe, fuehrt sie aus und interpretiert die Ergebnisse. Die Reibung zwischen "Ich habe eine Frage" und "Ich habe eine Antwort" sinkt von Minuten auf Sekunden.
Einen MCP-Server fuer GA4 bauen
Die Implementierung umfasst drei Schichten: das MCP-Server-Framework, den Google Analytics Data API-Client und die Verbindungslogik, die natuerlichsprachliche Absichten auf API-Aufrufe abbildet.
Projekt-Setup
mkdir ga4-mcp-server
cd ga4-mcp-server
npm init -y
npm install @modelcontextprotocol/sdk @google-analytics/data zod dotenv
npm install -D typescript @types/node
Das @modelcontextprotocol/sdk-Paket stellt das Server-Framework bereit. @google-analytics/data ist Googles offizielle Client-Bibliothek fuer die GA4 Data API (die Reporting-API, nicht die Admin-API). zod uebernimmt die Eingabevalidierung fuer Tool-Parameter.
Authentifizierung mit Google
Die GA4-API-Authentifizierung verwendet ein Google Cloud Service-Konto. Erstellen Sie eines in der Google Cloud Console, laden Sie die JSON-Schluesseldatei herunter und gewaehren Sie ihm "Viewer"-Zugriff auf Ihre GA4-Property.
// src/analytics-client.ts
import { BetaAnalyticsDataClient } from "@google-analytics/data";
const analyticsClient = new BetaAnalyticsDataClient({
keyFilename: process.env.GOOGLE_APPLICATION_CREDENTIALS,
});
const propertyId = process.env.GA4_PROPERTY_ID;
export async function runReport(
dimensions: string[],
metrics: string[],
startDate: string,
endDate: string,
dimensionFilter?: Record<string, string>
) {
const request: any = {
property: `properties/${propertyId}`,
dimensions: dimensions.map((d) => ({ name: d })),
metrics: metrics.map((m) => ({ name: m })),
dateRanges: [{ startDate, endDate }],
};
if (dimensionFilter) {
const filterKey = Object.keys(dimensionFilter)[0];
request.dimensionFilter = {
filter: {
fieldName: filterKey,
stringFilter: {
value: dimensionFilter[filterKey],
matchType: "EXACT",
},
},
};
}
const [response] = await analyticsClient.runReport(request);
return formatReportResponse(response);
}
function formatReportResponse(response: any) {
if (!response.rows || response.rows.length === 0) {
return { data: [], summary: "No data found for the specified query." };
}
const headers = [
...(response.dimensionHeaders?.map((h: any) => h.name) ?? []),
...(response.metricHeaders?.map((h: any) => h.name) ?? []),
];
const rows = response.rows.map((row: any) => {
const values = [
...(row.dimensionValues?.map((v: any) => v.value) ?? []),
...(row.metricValues?.map((v: any) => v.value) ?? []),
];
return Object.fromEntries(headers.map((h, i) => [h, values[i]]));
});
return {
data: rows,
rowCount: response.rowCount,
summary: `Returned ${rows.length} rows.`,
};
}
Der MCP-Server
// src/server.ts
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
import { runReport, getRealtimeData, getAvailableMetrics } from "./analytics-client";
const server = new McpServer({
name: "ga4-analytics",
version: "1.0.0",
});
// Tool: Run a custom report
server.tool(
"run_report",
"Run a Google Analytics 4 report with specified dimensions, metrics, and date range",
{
dimensions: z.array(z.string()).describe("GA4 dimensions like 'pagePath', 'country', 'deviceCategory'"),
metrics: z.array(z.string()).describe("GA4 metrics like 'activeUsers', 'sessions', 'bounceRate'"),
startDate: z.string().describe("Start date in YYYY-MM-DD format or relative like '7daysAgo'"),
endDate: z.string().describe("End date in YYYY-MM-DD format or 'today'"),
filter: z.record(z.string()).optional().describe("Optional dimension filter as key-value pair"),
},
async ({ dimensions, metrics, startDate, endDate, filter }) => {
const result = await runReport(dimensions, metrics, startDate, endDate, filter);
return {
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
};
}
);
// Tool: Get real-time active users
server.tool(
"realtime_users",
"Get current real-time active users, optionally segmented by a dimension",
{
dimension: z.string().optional().describe("Optional dimension to segment by, like 'country' or 'pagePath'"),
},
async ({ dimension }) => {
const result = await getRealtimeData(dimension);
return {
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
};
}
);
// Tool: List available metrics and dimensions
server.tool(
"list_metrics",
"List all available GA4 metrics and dimensions for the connected property",
{},
async () => {
const result = await getAvailableMetrics();
return {
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
};
}
);
// Resource: Property metadata
server.resource(
"property-info",
"ga4://property/info",
async (uri) => ({
contents: [{
uri: uri.href,
mimeType: "application/json",
text: JSON.stringify({
propertyId: process.env.GA4_PROPERTY_ID,
description: "Connected GA4 property for analytics queries",
}),
}],
})
);
async function main() {
const transport = new StdioServerTransport();
await server.connect(transport);
}
main().catch(console.error);
Das gibt dem KI-Assistenten drei Tools: beliebige Reports ausfuehren, Echtzeit-Daten pruefen und entdecken, welche Metriken und Dimensionen verfuegbar sind. Das Discovery-Tool ist wichtig — es laesst die KI die korrekten Feldnamen herausfinden, ohne dass Sie sich merken muessen, ob es activeUsers oder active_users oder totalUsers heisst.
Echtzeit-Daten-Endpoint
// Added to analytics-client.ts
export async function getRealtimeData(dimension?: string) {
const request: any = {
property: `properties/${propertyId}`,
metrics: [{ name: "activeUsers" }],
};
if (dimension) {
request.dimensions = [{ name: dimension }];
}
const [response] = await analyticsClient.runRealtimeReport(request);
return formatReportResponse(response);
}
Echtzeit-Daten sind eines der wertvollsten Features. In einem Dashboard wuerden Sie zum Echtzeit-Bereich navigieren, auf das Laden warten und Zahlen ablesen. Ueber MCP tippen Sie "wie viele Leute sind gerade auf der Seite?" und bekommen in zwei Sekunden eine Antwort.
Echte Queries, die Entwickler tatsaechlich ausfuehren wollen
Theoretische Faehigkeiten sind langweilig. Hier sind die tatsaechlichen Queries, die ich taeglich ausfuehre, und wie sie als konversationelle Anfragen an die KI aussehen:
Traffic-Analyse
"Was sind die Top 10 Seiten nach Sitzungszahl diese Woche, und wie verhaelt sich jede im Vergleich zur letzten Woche?"
Die KI uebersetzt das in zwei runReport-Aufrufe — einen fuer die aktuelle Woche, einen fuer die vorherige Woche — berechnet dann das Delta und praesentiert eine Vergleichstabelle. Im GA4-Interface erfordert das die Konfiguration eines Vergleichsdatumsbereichs, die Auswahl des richtigen Reports, das Hinzufuegen der Seitendimension, die Sortierung nach Sitzungen und die Begrenzung auf 10. Ueber MCP ist es ein Satz.
"Zeig mir den Traffic aus der organischen Suche der letzten 30 Tage, aufgeschluesselt nach Landingpage."
Das wird ein einzelner Report mit sessionDefaultChannelGroup als Dimensionsfilter (gefiltert auf "Organic Search"), landingPagePlusQueryString als Dimension und sessions plus engagedSessions als Metriken.
Conversion-Debugging
"Wie ist die Absprungrate auf /pricing im Vergleich zu /features in den letzten zwei Wochen?"
Zwei gefilterte Report-Aufrufe, Ergebnisse nebeneinander verglichen. Das ist die Art von Frage, die 30 Sekunden dauert, um sie konversationell zu stellen, und 3 Minuten, um sie ueber das GA4-Interface zu beantworten.
"Welche Laender haben die hoechste Conversion-Rate fuer das Signup-Event?"
Ein einzelner Report mit country-Dimension, eventCount-Metrik gefiltert auf das sign_up-Event und sessions zur Berechnung der Conversion-Rate. Die KI kann sogar die Division durchfuehren und Prozentsaetze direkt praesentieren.
Performance-Monitoring
"Wie ist die durchschnittliche Engagement-Zeit pro Sitzung auf Mobil vs. Desktop diesen Monat?"
Segmentiert nach deviceCategory, gemessen an averageSessionDuration und engagedSessions. Einfache Query, aber eine, die in GA4 das Navigieren zum richtigen Report und das Konfigurieren von Segmenten erfordert.
"Gibt es Seiten mit mehr als 1.000 Aufrufen diese Woche, aber einer Engagement-Rate unter 30 %?"
Hier glaenzt die konversationelle Analyse wirklich. Die KI fuehrt den Report aus, filtert die Ergebnisse programmatisch und gibt nur die Seiten zurueck, die beide Kriterien erfuellen. In GA4 muessten Sie in ein Spreadsheet exportieren und manuell filtern, oder eine benutzerdefinierte Exploration erstellen.
Verbindung mit Claude und KI-Assistenten
Claude Desktop-Konfiguration
Sobald Ihr MCP-Server gebaut ist, ist die Verbindung mit Claude Desktop eine Konfigurationsdatei-Bearbeitung:
{
"mcpServers": {
"ga4-analytics": {
"command": "node",
"args": ["/path/to/ga4-mcp-server/dist/server.js"],
"env": {
"GOOGLE_APPLICATION_CREDENTIALS": "/path/to/service-account-key.json",
"GA4_PROPERTY_ID": "123456789"
}
}
}
}
Auf macOS geht das in ~/Library/Application Support/Claude/claude_desktop_config.json. Auf Windows ist es %APPDATA%\Claude\claude_desktop_config.json.
Nach dem Neustart von Claude Desktop erscheinen die GA4-Tools im Tools-Menue. Claude kann sie jetzt direkt in der Konversation aufrufen.
Claude Code-Integration
Fuer Entwickler, die hauptsaechlich im Terminal arbeiten, unterstuetzt Claude Code MCP-Server nativ. Fuegen Sie den Server zu Ihrer .mcp.json des Projekts hinzu:
{
"mcpServers": {
"ga4-analytics": {
"command": "node",
"args": ["./mcp-servers/ga4/dist/server.js"],
"env": {
"GOOGLE_APPLICATION_CREDENTIALS": "./credentials/ga4-service-account.json",
"GA4_PROPERTY_ID": "123456789"
}
}
}
}
Jetzt koennen Sie Analysedaten abfragen, ohne Ihren Editor zu verlassen. Beim Debuggen einer Performance-Regression koennen Sie fragen "wie ist die Absprungrate auf /checkout diese Woche vs. letzte Woche?", ohne den Kontext zum Browser zu wechseln.
Verwendung mit anderen MCP-kompatiblen Clients
Das Schoene an MCP als Standard ist, dass jeder kompatible Client funktioniert. Cursor, Windsurf und andere MCP-unterstuetzende Editoren koennen sich mit demselben Server verbinden. Sie bauen den Server einmal und er funktioniert ueberall.
Praktische Beispiele konversationeller Analyse
Lassen Sie mich einen realen Workflow durchgehen, den ich regelmaessig verwende.
Morgen-Check-in
Ich beginne den Tag, indem ich Claude frage: "Gib mir eine Zusammenfassung des gestrigen Traffics — Gesamtsitzungen, aktive Nutzer, Top 5 Seiten und alle Seiten mit einer Engagement-Rate unter 25 %."
Die KI macht drei Tool-Aufrufe: einen fuer Gesamtmetriken, einen fuer Top-Seiten, einen fuer Seiten mit niedrigem Engagement. Die Antwort sieht ungefaehr so aus:
Gestern: 2.341 Sitzungen von 1.892 einzigartigen Nutzern. Top-Seiten waren /home (580 Sitzungen), /pricing (412), /docs/getting-started (389), /blog/mcp-guide (267), /features (198). Zwei Seiten hatten ein Engagement unter 25 %: /legal/terms (12 %) und /blog/old-post-2024 (22 %).
Das wuerde 5-10 Minuten im GA4-Interface dauern. Ueber MCP dauert es 15 Sekunden.
Feature-Launch-Monitoring
Wenn ich ein neues Feature ausliefere, will ich wissen, ob Leute es finden und nutzen. "Vergleiche den Traffic zu /features/new-dashboard der letzten 3 Tage mit den 3 Tagen vor dem Launch, aufgeschluesselt nach Akquisitionskanal."
Die KI fuehrt den Vergleich durch, identifiziert, welche Kanaele die Entdeckung antreiben (normalerweise hinken Direct und organische Suche in den ersten Tagen nach dem Launch hinter Social und Referral her), und hebt Anomalien hervor.
Debugging von Nutzerbeschwerden
Wenn Nutzer berichten, dass "die Seite sich langsam anfuehlt", kann ich fragen: "Wie ist die durchschnittliche Seitenladezeit nach Seite fuer die letzten 7 Tage, sortiert nach langsamster zuerst?" Wenn GA4 Web-Vitals-Daten hat (ueber das Measurement Protocol oder gtag-Events), kann der MCP-Server das aufdecken, ohne dass ich einen Browser oeffne.
Woechentliche Berichterstattung
"Erstelle einen Woche-ueber-Woche-Vergleich von Sitzungen, neuen Nutzern, Engagement-Rate und Conversion-Rate fuer jede unserer Top 20 Seiten."
Das produziert eine formatierte Tabelle, die ich direkt in eine Slack-Nachricht oder ein Team-Update einfuegen kann. Kein Spreadsheet-Jonglieren, kein Screenshot-Zuschneiden.
Erweiterte Features bauen
Caching-Schicht
Die API von GA4 hat Rate Limits (typischerweise 10 Anfragen pro Minute pro Property fuer den kostenlosen Tier). Fuer einen MCP-Server, der haeufig abgefragt werden koennte, fuegen Sie eine Caching-Schicht hinzu:
import { createHash } from "crypto";
const cache = new Map<string, { data: any; expiry: number }>();
function getCacheKey(dimensions: string[], metrics: string[], startDate: string, endDate: string): string {
const input = JSON.stringify({ dimensions, metrics, startDate, endDate });
return createHash("md5").update(input).digest("hex");
}
export async function cachedRunReport(
dimensions: string[],
metrics: string[],
startDate: string,
endDate: string
) {
const key = getCacheKey(dimensions, metrics, startDate, endDate);
const cached = cache.get(key);
if (cached && cached.expiry > Date.now()) {
return cached.data;
}
const result = await runReport(dimensions, metrics, startDate, endDate);
// Cache for 5 minutes (real-time queries get shorter TTL)
const ttl = startDate === "today" ? 60_000 : 300_000;
cache.set(key, { data: result, expiry: Date.now() + ttl });
return result;
}
Echtzeit-Queries bekommen eine 1-Minuten-TTL. Historische Queries bekommen 5 Minuten. Das haelt Sie gut innerhalb der Rate Limits waehrend einer konversationellen Sitzung, in der die KI moeglicherweise mehrere verwandte Queries schnell hintereinander macht.
Multi-Property-Unterstuetzung
Wenn Sie mehrere Produkte oder Kunden verwalten, erweitern Sie den Server um das Wechseln zwischen GA4-Properties:
server.tool(
"switch_property",
"Switch to a different GA4 property",
{
propertyId: z.string().describe("The GA4 property ID to switch to"),
},
async ({ propertyId }) => {
// Validate access
const properties = await listAccessibleProperties();
if (!properties.includes(propertyId)) {
return {
content: [{ type: "text", text: `No access to property ${propertyId}` }],
};
}
currentPropertyId = propertyId;
return {
content: [{ type: "text", text: `Switched to property ${propertyId}` }],
};
}
);
Jetzt koennen Sie sagen "wechsle zur Staging-Property und zeig mir den gestrigen Traffic", ohne etwas umzukonfigurieren.
Sicherheitsueberlegungen
Der Betrieb eines MCP-Servers, der auf Analysedaten zugreift, bringt mehrere Sicherheitsbedenken mit sich, die bewusst behandelt werden muessen.
Credential-Management
Die Service-Account-Schluesseldatei ist das sensitivste Element. Committen Sie sie nie in die Versionskontrolle. Verwenden Sie Umgebungsvariablen oder einen Secrets Manager. Wenn Sie den MCP-Server lokal betreiben (was der uebliche Fall fuer Claude Desktop ist), speichern Sie die Schluesseldatei ausserhalb Ihres Projektverzeichnisses mit eingeschraenkten Dateiberechtigungen:
chmod 600 /path/to/service-account-key.json
Fuer Team-Umgebungen erwaegen Sie Googles Workload Identity Federation anstelle einer Schluesseldatei. Es eliminiert die statische Credential vollstaendig, indem kurzlebige Tokens verwendet werden, die an die Laufzeit-Identitaet gebunden sind.
Prinzip der minimalen Berechtigung
Das Service-Konto sollte nur Lesezugriff auf GA4 haben. Gewaehren Sie speziell die "Viewer"-Rolle auf GA4-Property-Ebene — nicht die "Editor"- oder "Administrator"-Rolle. Der MCP-Server muss nie Ihre Analysekonfiguration aendern, Audiences erstellen oder Messeinstellungen aendern.
Auf Google Cloud-Projektebene gewaehren Sie nur den analyticsdata.readonly-Scope. Das verhindert, dass das Service-Konto auf andere Google Cloud-Dienste zugreift, selbst wenn der Schluessel kompromittiert wird.
Datenexpositions-Umfang
Seien Sie bewusst darueber, auf welche Daten der MCP-Server zugreifen kann. GA4 kann PII enthalten — Nutzer-IDs, Client-IDs, IP-abgeleitete Geolokation. Ihr MCP-Server sollte Felder strippen oder maskieren, die fuer die Queries, die Sie unterstuetzen moechten, nicht notwendig sind.
const BLOCKED_DIMENSIONS = ["userID", "clientId"];
function validateDimensions(dimensions: string[]) {
const blocked = dimensions.filter((d) => BLOCKED_DIMENSIONS.includes(d));
if (blocked.length > 0) {
throw new Error(`Blocked dimensions for privacy: ${blocked.join(", ")}`);
}
}
Das ist besonders wichtig, wenn andere Teammitglieder mit dem MCP-Server interagieren koennen. Sie wollen verhindern, dass beilaeufige Queries individuelle Nutzerdaten offenlegen koennten.
Transportsicherheit
MCP laeuft derzeit ueber stdio (Standard-Ein-/Ausgabe), wenn es mit Claude Desktop verwendet wird, was bedeutet, dass die Kommunikation innerhalb lokaler Prozessgrenzen stattfindet. Es gibt keine Netzwerk-Exposition. Wenn Sie jedoch einen MCP-Server ueber HTTP bereitstellen (mit dem SSE-Transport), brauchen Sie TLS, Authentifizierungs-Tokens und Rate Limiting — behandeln Sie ihn wie jeden anderen API-Endpoint.
Audit-Logging
Loggen Sie jede Query, die der MCP-Server verarbeitet. Nicht nur aus Sicherheitsgruenden — fuer die Nachvollziehbarkeit. Wenn jemand fragt "wer hat unsere Analysedaten wann abgefragt", sollten Sie eine Antwort haben.
function logQuery(tool: string, params: Record<string, unknown>) {
console.log(JSON.stringify({
timestamp: new Date().toISOString(),
tool,
params,
propertyId: currentPropertyId,
}));
}
Kompromisse und Einschraenkungen
Was gut funktioniert
Konversationelle Analyse eliminiert die GA4-Lernkurve fuer Entwickler. Sie muessen GA4s Dimensions- und Metriknamen, Reporttypen oder Filtersyntax nicht kennen. Die KI uebernimmt die Uebersetzung. Fuer Ad-hoc-Fragen — die Art, die man einmal stellt und nie wiederholt — ist das dramatisch schneller als das Dashboard.
Die Kombination von Analyse mit Entwicklungskontext ist maechtig. Wenn Sie in Claude Code debuggen und gleichzeitig Analysedaten pruefen koennen, wird die Feedback-Schleife enger. Sie sehen den Code, die Fehlerlogs und die Nutzerauswirkung an einem Ort.
Was nicht gut funktioniert
Komplexe Explorationen, die iterative Verfeinerung erfordern, sind im Explore-Interface von GA4 immer noch schneller. Wenn Sie eine Funnel-Analyse mit mehreren Stufen, benutzerdefinierten Segmenten und Vergleichsgruppen bauen, gibt Ihnen der visuelle Builder sofortiges Feedback, das ein konversationelles Interface nicht bieten kann.
Echtzeit-Dashboards mit automatischer Aktualisierung liegen ausserhalb des aktuellen MCP-Modells. MCP ist Request-Response — Sie fragen, es antwortet. Fuer ein live-aktualisierendes Dashboard, das Echtzeit-Nutzer zeigt, ist ein speziell dafuer gebautes Tool wie GA4s Echtzeitansicht oder ein benutzerdefiniertes Grafana-Panel besser.
Datenvolumen ist eine Einschraenkung. Die GA4 Data API gibt bis zu 100.000 Zeilen pro Anfrage zurueck. Fuer Properties mit Millionen von taeglichen Events muessen Sie moeglicherweise bei Dimensionen und Datumsbereichen spezifisch sein, um dieses Limit nicht zu erreichen. Die API hat auch Sampling-Verhalten fuer grosse Datensaetze — Ergebnisse koennen fuer hochkardinalitaere Queries geschaetzt statt exakt sein.
MCP vs. direkte API-Integration
Wenn Sie ein Produkt-Feature bauen, das Analysedaten benoetigt (wie ein Admin-Dashboard fuer Ihr SaaS), verwenden Sie die GA4-API direkt. MCP ist fuer Human-in-the-Loop-Abfragen, nicht fuer programmatische Daten-Pipelines. Der Overhead der natuerlichsprachlichen Uebersetzung und KI-Interpretation ist unnoetig, wenn Sie genau wissen, welche Query ausgefuehrt werden soll.
MCP glaenzt, wenn die Frage unstrukturiert ist, wenn Sie nicht genau wissen, wonach Sie suchen, oder wenn der Aufwand fuer den Bau einer richtigen Integration fuer eine einmalige Frage nicht gerechtfertigt ist. Es ist das Analyse-Aequivalent dazu, einen REPL zu oeffnen, anstatt ein Script zu schreiben.
Erste Schritte
Wenn Sie das selbst ausprobieren moechten, ist der minimale Pfad:
- Erstellen Sie ein Google Cloud-Projekt und aktivieren Sie die Google Analytics Data API.
- Erstellen Sie ein Service-Konto mit Viewer-Zugriff auf Ihre GA4-Property.
- Laden Sie die Service-Account-Key-JSON herunter.
- Klonen oder bauen Sie den MCP-Server wie oben beschrieben.
- Fuegen Sie den Server zu Ihrer Claude Desktop- oder Claude Code-Konfiguration hinzu.
- Beginnen Sie, Fragen zu stellen.
Das gesamte Setup dauert etwa 30 Minuten, wenn Sie bereits eine GA4-Property haben. Die Rendite ist sofort — das erste Mal, wenn Sie eine Antwort auf eine Analysefrage in 5 Sekunden statt 5 Minuten bekommen, werden Sie nicht zum Dashboard zurueckkehren wollen.
Analysedaten sind eines der am meisten ungenutzten Assets in den meisten Entwicklungsteams. Nicht weil sie nicht wertvoll sind, sondern weil der Zugriff immer unbequem genug war, um gelegentliches Abfragen zu entmutigen. MCP beseitigt diese Reibung. Die Daten sind dieselben. Die Fragen sind dieselben. Die Zeit bis zur Antwort ist das, was sich aendert.
Danil Ulmashev
Full Stack Developer
Interesse an einer Zusammenarbeit?