GA4 Analytics MCP V2
GA4 Analytics MCP V2
Мультиоператорский коннектор Google Analytics 4 для Claude.ai Custom Connectors, размещённый на Google Cloud Run.
Это версия 2. Она является отдельным приложением от V1. Не используйте повторно секреты V1, OAuth-клиенты, сервисы Cloud Run или удалённые Git-репозитории.
Operator A or Operator B
→ same Claude Custom Connector URL
→ https://<v2-host>/mcp
→ MCP OAuth (Claude → V2)
→ Google OAuth (operator's own Google account)
→ operator credentials + active GA4 property in Firestore
→ GA4 Admin / Data APIsЗдесь нет локального stdio-сервера и нет Supabase.
Архитектура
Связаны два уровня OAuth:
Claude → V2: MCP OAuth 2.1 (метаданные защищённого ресурса, DCR, CIMD, PKCE).
V2 → Google: вход в Google происходит внутри MCP authorize.
subтокена доступа MCP — это субъект (sub) учётной записи Google. Email используется только для отображения.
Каждый оператор имеет:
собственный зашифрованный Google refresh-токен
собственный список доступных ресурсов GA4 (из Google Admin API)
собственный сохранённый активный ресурс
Оператор A не может использовать учётные данные Google оператора B или выбрать ресурс, к которому учётная запись Google A не имеет доступа.
Инструменты MCP
Tool | Purpose |
| Аутентифицированный оператор (email + внутренний operatorId). Без токенов. |
| Ресурсы, видимые этой учётной записи Google, с |
| Текущий выбранный ресурс |
| Переключение после проверки актуального списка разрешений |
| Измерения/метрики для активного или только что авторизованного ресурса |
| Исторический отчёт GA4 |
| Последние ~30 минут |
Инструменты отчётов используют сохранённый активный ресурс, если propertyId не указан. Переданный propertyId принимается только в том случае, если аутентифицированная учётная запись Google имеет к нему доступ, и затем он становится новым активным ресурсом.
Локальная разработка
cd D:\MCP_Servers\Ga4McpV2
npm install
copy .env.example .env.localЗаполните .env.local значениями V2. Не копируйте секреты V1.
Необязательный эмулятор Firestore:
gcloud emulators firestore start --host-port=localhost:8080Установите FIRESTORE_EMULATOR_HOST=localhost:8080 и FIRESTORE_PROJECT_ID в .env.local.
npm run dev
npm test
npm run buildПриложение:
http://localhost:3000MCP:
http://localhost:3000/mcpHealth:
http://localhost:3000/healthGoogle callback:
http://localhost:3000/oauth/google/callback
Claude.ai не может получить доступ к localhost. Разверните V2 в Cloud Run перед добавлением Custom Connector.
Переменные окружения
Variable | Required | Purpose |
| Да | Публичный origin, без завершающего слэша |
| Да | Веб-клиент Google OAuth V2 |
| Да | Секрет Google OAuth V2 |
| Нет | По умолчанию: |
| Да | Подписывает MCP JWT |
| Да | Подписывает Google state и шифрует cookies ожидающей авторизации |
| Да | Шифрует Google refresh-токены при хранении |
| Продакшн | Проект Firestore |
| Локально/тест | Хост эмулятора Firestore |
| Нет | Опциональный предварительно зарегистрированный конфиденциальный клиент Claude |
| Нет | Пара для опционального конфиденциального клиента |
V2 не использует GOOGLE_REFRESH_TOKEN или MCP_AUTH_TOKEN.
Конфигурация Google Cloud
По возможности используйте новый проект Google Cloud. Если вы используете общий проект с V1, всё равно создайте отдельные сервис Cloud Run, репозиторий Artifact Registry, OAuth-клиент и секреты.
Включите:
Cloud Run
Cloud Build
Artifact Registry
Firestore
Secret Manager
Google Analytics Admin API
Google Analytics Data API
Предлагаемые имена ресурсов (заполнители — замените на ваш проект):
Сервис Cloud Run:
ga4-mcp-v2Artifact Registry:
ga4-mcp-v2Коллекция Firestore:
operators
Сервисный аккаунт Cloud Run должен иметь:
roles/datastore.userдля базы данных Firestore V2roles/secretmanager.secretAccessorтолько для секретов V2
Не предоставляйте сервисному аккаунту права администратора Secret Manager или доступ к секретам V1.
Google OAuth-клиент (только V2)
Создайте новое OAuth Web-приложение. Не редактируйте клиент V1.
Экран согласия:
Тип пользователя: External (или Internal для Workspace-only)
Название приложения: что-то вроде
GA4 MCP Connector V2Области доступа:
openidemailhttps://www.googleapis.com/auth/analytics.readonly
Добавляйте тестовых пользователей, пока приложение находится в статусе Testing
Публикация обязательна для не тестовых пользователей, поскольку области доступа Analytics являются чувствительными
Авторизованный URI перенаправления:
https://<v2-cloud-run-url>/oauth/google/callbackЛокально:
http://localhost:3000/oauth/google/callbackClaude Custom Connector
Разверните V2 и установите
APP_BASE_URLв URL Cloud Run.В Claude добавьте Custom Connector.
URL:
https://<v2-host>/mcpКаждый оператор выполняет вход в Google из своей собственной учётной записи Claude.
Если у учётной записи Google несколько ресурсов GA4, они выбирают один. Этот выбор сохраняется, пока они не переключатся.
Тестирование
npm testМодульные тесты покрывают:
Метаданные MCP OAuth, DCR, PKCE и привязанный к Google JWT
subИзоляция операторов (учётные данные и списки разрешённых ресурсов)
Постоянный активный ресурс
Обновление / ротация токенов
Отозванные разрешения Google
Маскирование структурированных логов
Реальные учётные данные V1 не используются.
Развёртывание (не запускайте, пока не запрошено)
Только документация. Развёртывание V1 должно остаться нетронутым.
.\scripts\cloud-run-setup.ps1 -ProjectId YOUR_V2_PROJECT_ID
.\scripts\cloud-run-deploy.ps1 -ProjectId YOUR_V2_PROJECT_ID
.\scripts\cloud-run-set-env.ps1 `
-ProjectId YOUR_V2_PROJECT_ID `
-AppBaseUrl https://YOUR_V2_CLOUD_RUN_URL `
-GoogleClientId YOUR_V2_CLIENT_ID `
-GoogleClientSecret YOUR_V2_CLIENT_SECRET `
-McpTokenSecret YOUR_MCP_TOKEN_SECRET `
-OauthStateSecret YOUR_OAUTH_STATE_SECRET `
-TokenEncryptionKey YOUR_TOKEN_ENCRYPTION_KEYПри подключении сервиса предпочитайте ссылки на Secret Manager для продакшен-секретов вместо значений переменных окружения в открытом виде.
После развёртывания:
Добавьте URI обратного вызова Cloud Run в OAuth-клиент V2.
Убедитесь, что Firestore создан в режиме Native.
Добавьте
https://<v2-host>/mcpв Claude.
Вопросы безопасности
Refresh-токены шифруются с помощью AES-256-GCM перед записью в Firestore.
Инструменты MCP никогда не возвращают access-токены, refresh-токены или коды авторизации.
Журналы маскируют токены, секреты, cookies и коды авторизации.
Идентификаторы ресурсов от Claude проверяются по актуальному списку Admin API для этого оператора.
Инструменты завершаются отказом (fail closed), если к запросу не привязан контекст оператора.
Только HTTPS-cookies в продакшене.
Git
Этот репозиторий предназначен только для V2. remote V1 — git@github.com:devopsbrandmirchi/Ga4McpServer.git, и его никогда нельзя добавлять сюда. Создайте новый репозиторий GitHub, когда будете готовы опубликовать V2.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
GA4 conversion analyst inside Claude — funnel drops, traffic anomalies, device gaps, with numbers.
WHOOP recovery, strain, sleep and workouts in Claude via official WHOOP OAuth. Free, open source.
Self-hosted MCP gateway: turn any API, database or MCP server into AI connectors — no code.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/devopsbrandmirchi/Ga4McpV2'
If you have feedback or need assistance with the MCP directory API, please join our Discord server