Google アナリティクス MCP とは、GA4 の報告や設定を AI が MCP の道具として読めるようにする、Google の実験版の口です。

  • 公式の Google アナリティクス MCP サーバーの道具と、GA4 API・Search Console API との受け持ちの違い
  • 鍵(JSON の鍵)を作らずに、AI の席へ GA4 と Search Console の閲覧を渡す手順
  • 当社が 5 つのサイトの数字を読ませて実際に詰まった所(scope・403・数字の混ざり・行の無い日)

MCP そのものの説明は MCP の一覧 に、AI に仕事を任せる考え方は AIエージェント の頁にまとめています。この頁は、数字を読む口を席に渡す所だけを扱います。

GA4 MCP・GA4 API・Search Console API: どの口で何が読めるか

Google アナリティクス MCP サーバーは、手元で動かす MCP サーバーで、題に「Experimental」(実験版)と書かれています。既定では読むだけで、書く道具(注釈を作る create_property_annotation)は --allow-write を付けた時だけ使えます。公式の道具の一覧に Search Console の道具は在りません。Search Console の数字は、Search Console API を別に撃ちます。

口読める物要る許可(scope)当社の使い方
Google アナリティクス MCP サーバー口座とプロパティの要約、run_report・run_funnel_report・run_realtime_report などanalytics.readonly(書く道具は analytics.edit も)使っていない(下の 2 つを席が直に撃つ)
GA4 Data API(runReport)指標と次元の報告。dimensionFilter で次元の値を絞れるanalytics.readonly か analytics訪問の数を hostName で絞って読む
Search Console API(searchAnalytics/query)検索の表示・クリック。次元は page・query・country・device・searchAppearance・date などwebmasters.readonly か webmasters頁ごと(dimensions=page)に読む

出典: googleanalytics/google-analytics-mcp・Method: properties.runReport・Search Analytics: query(いずれも 2026-10-29 に見た)。当社の使い方の列は社の運用(席に渡している読み方の形・下の節)。

公式の MCP サーバーを使う時は、Google Cloud のプロジェクトで Google Analytics Admin API と Google Analytics Data API を有効にし、Application Default Credentials(ADC)で認証して、pipx run analytics-mcp で起動します。Claude Code へは claude mcp add analytics-mcp に GOOGLE_APPLICATION_CREDENTIALS と GOOGLE_CLOUD_PROJECT を渡して足す、と公式の頁にあります(googleanalytics/google-analytics-mcp・2026-10-29 に見た)。

鍵を作らずに AI の席へ閲覧を渡す: 当社の記録

当社の AI の席(実行席)のサービスアカウントには、Search Console と GA4 の閲覧の権限がもう付いていました。ところが鍵が無く、別のアカウントからの代理発行(getAccessToken)も IAM_PERMISSION_DENIED で読めませんでした(社の実測 2026-10-05)。

鍵は作りませんでした。代わりに、そのサービスアカウントのリソースに roles/iam.serviceAccountTokenCreator を 1 行だけ足しました。プロジェクト全体には付けていません。付けた直後(09:31:33)はまだ拒まれ、09:32:20 に通りました。伝播に 1 分足らずです(社の実測 2026-10-05)。

順やる事確かめ方
1席のサービスアカウントに、GA4 と Search Console の閲覧が付いているか見る付いていても、鍵が無ければ席は読めない
2そのサービスアカウントのリソースに roles/iam.serviceAccountTokenCreator を 1 行足す(プロジェクト全体には付けない)付けた直後は拒まれる事がある。1 分ほど待つ
3代理発行の時に、読む先の scope を付けてトークンを取るSearch Console は webmasters.readonly、GA4 は analytics.readonly
4Search Console に登録の無いサイトを足すsites.list に出て、query が 200 で返る
5GA4 は hostName で絞って読む他のサイトの訪問が混ざっていない

出典: 社の実測 2026-10-05(順 1〜3)・社の運用 2026-10-17(順 4)・社の実測 2026-10-19(順 5)。

Search Console は cloud-platform の scope では通らない

Search Console の API は、cloud-platform の scope のトークンでは通りませんでした。代理発行の時に scope https://www.googleapis.com/auth/webmasters.readonly を付けると通りました。GA4 は https://www.googleapis.com/auth/analytics.readonly です(社の実測 2026-10-05)。公式の頁も、searchAnalytics/query の許可は webmasters.readonly か webmasters としています(Search Analytics: query・2026-10-29 に見た)。

席に渡す台本は、失敗を失敗として出す作りにしています。権限が伝播する前は終了の値が rc=1、HTTP は 401 UNAUTHENTICATED で返りました(社の実測 2026-10-05)。0 件の結果に化けさせず、止まった事が席に分かるようにするためです。

Search Console に無いサイトは 403: 足し方は 1 通り

Search Console に登録していないサイトは、searchAnalytics/query が 403 になります。当社の足し方は次の 1 通りで、2026-10-17 に 5 つのサイトをこの形で揃えました(社の運用 2026-10-17)。

  1. 会社の口座で sc-domain: のプロパティを足す(ドメインのプロパティは sc-domain:example.com の形で書く・Search Analytics: query・2026-10-29 に見た)
  2. 所有の確認をする。自動で通らなければ、DNS に TXT を 1 行足す
  3. 「ユーザーと権限」で、AI の席のサービスアカウントを「制限付き」で足す
  4. sites.list に出て、query が 200 で返れば済み

1 つの GA4 を 5 サイトで分け合うなら、hostName で絞る

当社は 5 つのサイトで GA4 のプロパティを 1 本共有しています。絞らずに読むと、他のサイトと旧名の住所の訪問が混ざります。10/12〜10/18 の週は、旧名の住所の分が総数の約 6% 混ざっていました(社の実測 2026-10-19)。

そこで数は必ず dimensionFilter で hostName を絞って読みます(dimensionFilter は次元の値を絞る項目・Method: properties.runReport・2026-10-29 に見た)。リアルタイムの報告(runRealtimeReport)は hostName を引けなかったので、サイトごとの数には使いません(社の実測 2026-10-19)。

前日 1 日を頁ごとに読むと、行の無い頁が多い

Search Console で前日 1 日分を頁ごとに撃つと、頁の行が在るのは一部だけです。10/27 の 1 日は、測った語の約 2 割の頁にしか行がありませんでした(社の実測 2026-10-28)。

行が無い所は 0 で埋めず、「取得不能(その日の頁の行なし)」と書きます。0 と書くと「表示されなかった」と読めてしまうからです。dataState=all を付けると速報の分も入ります(社の実測 2026-10-28)。公式の頁も、all で新しいデータを含め、final か省いた時は確定したデータだけを返すとしています(Search Analytics: query・2026-10-29 に見た)。

申込の口へのクリックは「参考」として数える

記事から申込の口へのクリックは、GA4 の印 apply_click を hostName × pagePath × linkUrl で数えます。ただしクリックは登録ではないので、登録の数には入れず「参考」としてだけ書きます(社の運用 2026-10-19・2026-10-25)。

当社が席に渡している読み方の形

席には次の形を渡しています(社の運用)。gcloud で代理発行のトークンを取り、Search Console の searchAnalytics/query と GA4 Data API の runReport を撃ちます。山かっこの所は各社の値に置き換えます。

# 1. トークンを取る(読む先の scope を付ける)
gcloud auth print-access-token \
  --impersonate-service-account=<席のサービスアカウント> \
  --scopes=https://www.googleapis.com/auth/webmasters.readonly,https://www.googleapis.com/auth/analytics.readonly

# 2. Search Console: 頁ごとに読む
POST https://www.googleapis.com/webmasters/v3/sites/sc-domain:<ドメイン>/searchAnalytics/query
{ "startDate": "<日付>", "endDate": "<日付>", "dimensions": ["page"], "dataState": "all" }

# 3. GA4: hostName で絞って読む
POST https://analyticsdata.googleapis.com/v1beta/properties/<プロパティ>:runReport
{ "dateRanges": [{ "startDate": "<日付>", "endDate": "<日付>" }],
  "dimensions": [{ "name": "pagePath" }],
  "metrics": [{ "name": "sessions" }],
  "dimensionFilter": { "filter": { "fieldName": "hostName",
    "stringFilter": { "value": "<サイトのホスト名>" } } } }

出典: 形は社の運用(当社が席に渡している読み方)。URL は Search Analytics: query・Method: properties.runReport(2026-10-29 に見た)。

Google の許可を席に渡す時の線は、Google Drive MCP(渡さない操作の決め方)と YouTube MCP(どの scope を頼むか)にも書いています。

よくある質問

Google アナリティクス MCP で Search Console のデータも読めますか?

公式の道具の一覧には、Search Console の道具は在りません(googleanalytics/google-analytics-mcp・2026-10-29 に見た)。Search Console の数字は Search Console API の searchAnalytics/query を、webmasters.readonly の scope で別に撃ちます。

GA4 MCP は AI に GA4 の設定を書き換えさせますか?

既定では読むだけです。書く道具は注釈を作る create_property_annotation で、--allow-write を付けた時だけ使え、analytics.edit の scope も要ります(googleanalytics/google-analytics-mcp・2026-10-29 に見た)。

Search Console API が 403 を返します

そのサイトが Search Console に登録されていないか、席のアカウントがユーザーに足されていない事が多いです。当社は sc-domain: のプロパティを足し、所有を確かめ、席のサービスアカウントを「制限付き」で足して、query が 200 で返る所まで揃えました(社の運用 2026-10-17)。

Search Console API が 401 UNAUTHENTICATED を返します

トークンの scope が違うか、権限の伝播がまだの事があります。当社では cloud-platform の scope では通らず、webmasters.readonly を付けて通りました。権限を足した直後は 1 分足らず拒まれました(社の実測 2026-10-05)。

GA4 の数が他のサイトと混ざります

1 つのプロパティを複数のサイトで共有していると混ざります。runReport の dimensionFilter で hostName を絞って読みます。当社では絞らずに読んだ週に、旧名の住所の分が総数の約 6% 混ざっていました(社の実測 2026-10-19)。

出典

  1. googleanalytics「Google Analytics MCP Server (Experimental)」 https://github.com/googleanalytics/google-analytics-mcp(2026-10-29 に見た・実験版である事・道具の名前・有効にする API・ADC と scope・起動と Claude Code への足し方・既定で読むだけで --allow-write で書く道具が使える事)
  2. Google for Developers「Search Analytics: query」 https://developers.google.com/webmaster-tools/v1/searchanalytics/query(2026-10-29 に見た・要求の URL・許可の scope・dataState・次元・sc-domain: の書き方)
  3. Google for Developers「Method: properties.runReport」 https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/properties/runReport(2026-10-29 に見た・要求の URL・dimensionFilter・許可の scope)
  4. 社の実測 2026-10-05(鍵を作らずに代理発行を通した事・付けた直後の拒否と伝播の時刻・Search Console の scope・伝播前の rc=1 と HTTP 401)
  5. 社の運用 2026-10-17(Search Console に 5 つのサイトを sc-domain: で揃えた手順)
  6. 社の実測 2026-10-19(GA4 のプロパティの共有・旧名の住所の混ざり・runRealtimeReport が hostName を引けない事)
  7. 社の運用 2026-10-19・2026-10-25(apply_click を参考として数える事)
  8. 社の実測 2026-10-28(前日 1 日分の頁ごとの行の在り方・dataState=all)