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 |
| 4 | Search Console に登録の無いサイトを足す | sites.list に出て、query が 200 で返る |
| 5 | GA4 は 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)。
- 会社の口座で
sc-domain:のプロパティを足す(ドメインのプロパティはsc-domain:example.comの形で書く・Search Analytics: query・2026-10-29 に見た) - 所有の確認をする。自動で通らなければ、DNS に TXT を 1 行足す
- 「ユーザーと権限」で、AI の席のサービスアカウントを「制限付き」で足す
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)。
出典
- googleanalytics「Google Analytics MCP Server (Experimental)」 https://github.com/googleanalytics/google-analytics-mcp(2026-10-29 に見た・実験版である事・道具の名前・有効にする API・ADC と scope・起動と Claude Code への足し方・既定で読むだけで
--allow-writeで書く道具が使える事) - Google for Developers「Search Analytics: query」 https://developers.google.com/webmaster-tools/v1/searchanalytics/query(2026-10-29 に見た・要求の URL・許可の scope・dataState・次元・
sc-domain:の書き方) - 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)
- 社の実測 2026-10-05(鍵を作らずに代理発行を通した事・付けた直後の拒否と伝播の時刻・Search Console の scope・伝播前の rc=1 と HTTP 401)
- 社の運用 2026-10-17(Search Console に 5 つのサイトを
sc-domain:で揃えた手順) - 社の実測 2026-10-19(GA4 のプロパティの共有・旧名の住所の混ざり・runRealtimeReport が hostName を引けない事)
- 社の運用 2026-10-19・2026-10-25(
apply_clickを参考として数える事) - 社の実測 2026-10-28(前日 1 日分の頁ごとの行の在り方・dataState=all)