🎉

Dify×Google Analytics MCPで記事のデータ分析対話botを作ってみた

に公開

7月にGoogle アナリティクス Model Context Protocol(MCP)が発表されて以降、軽く触って終わっていたので今回はDifyアプリを作るところまでやってみる

最初にできたものを共有

以下画像のようにDifyでGoogle Analyticsのデータについて質問すると回答してくれるbotを作りました。今回はその作り方を詳しく解説します。

※白塗りの部分には実際のタイトルや記事スラッグ、ページビュー数が表示されています

開発背景

マーケティング部署の人に『使えますか?』と聞かれたのがきっかけ。ローカルではすぐできましたが、非エンジニアでも使えるようにDify経由で利用できるようにしたその過程をまとめます。

関連するサービスは

  • Google Analytics
  • Amazon Web Service
  • Google Cloud Platform

になります。

エンジニアの方はGithubのリポジトリ見てやってしまうのが早いかと思いますので、リンクを記載しておきます。

公式リポジトリ
https://github.com/googleanalytics/google-analytics-mcp?tab=readme-ov-file

公式ドキュメント
https://developers.google.com/analytics/devguides/MCP?hl=ja

最終的にはEC2のmcp-proxyを経由してDify上で対話できるbotを開発します。

Google Cloud Pratformの設定

まずはGCPの設定をします。サービスアカウントの発行とAPIの有効化の設定が必要です。

GCPのプロジェクトがない場合は下記記事などを参考にして作成してください。
https://dev.classmethod.jp/articles/google-cloud-start/

サービスアカウントの発行

GCPにアクセスし、ナビゲーションメニューよりサービスアカウントを選択します。
https://console.cloud.google.com/

”サービスアカウントを作成”よりサービスアカウントを作成します。サービスアカウント名は好きなテキストで設定してください。権限などは設定しなくて良いです。するとメールアドレスが発行されるので、メモしておきます。

サービスアカウントをGoogle Analyticsに招待

管理ページのアクセス管理より、先ほど発行されたメールアドレスを招待します。閲覧権限で問題ないです。アカウントのアクセス管理に入り、右上の青色のプラスボタンより招待できます。

サービスアカウントの秘密鍵をjsonで作成

作成されたメールアドレスをクリックすると詳細ページに入ります。
鍵を選択しキーを追加してjson形式の秘密鍵を新規作成してください。

APIの有効化

Google Analytics MCPを使用するためにAPIを有効化します。

ナビゲーションメニュー→APIとサービス→APIライブラリの順に遷移します。
下記2つのAPIが有効化されていることを確認します。

  • Google Analytics Admin API
  • Google Analytics Data API

これでGCP側の設定は完了です。

AWSの設定

公式で解説されているMCPサーバーの利用方法ではローカルでMCPサーバーを立ち上げる必要があるため、CursorでMCPの設定することに慣れていない人やターミナルが使い慣れていない人には使いにくいです。

そのため今回は、mcp-proxyを使ってEC2でMCPサーバーを構築し、Dify経由で自然言語で対話できるような開発を行います。

EC2でmcp-proxyを設定する

社内の誰でもいつでもアクセスできるように、EC2上にリモート MCPを構築していきます。

今回はamazonlinux2でt3.microでサーバーを構築します。

まずはpyenvとvenvをインストールします。

依存環境をインストール

sudo yum install -y git gcc zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel tk-devel libffi-devel xz-devel

pyenvをクローン

git clone https://github.com/pyenv/pyenv.git ~/.pyenv

PATHを設定

sed -Ei -e '/^([^#]|$)/ {a \
export PYENV_ROOT="$HOME/.pyenv"
a \
export PATH="$PYENV_ROOT/bin:$PATH"
a \
' -e ':a' -e '$!{n;ba};}' ~/.bash_profile

echo 'eval "$(pyenv init --path)"' >> ~/.bash_profile
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.profile
echo 'eval "$(pyenv init --path)"' >> ~/.profile
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
source .bash_profile

最後にインストール確認をします。

pyenv --version

以下の記事を参考にしてます。
https://qiita.com/Freegon13/items/9c9447751e3094a64055

今回はPython3.12を使うのでpython3.12をインストールします

pyenv install 3.12

少し時間がかかるので待ちます。

インストールが完了したらバージョンを変更し、確認します。

pyenv global 3.12.11
python -V

指定したバージョンが表示されていれば成功です。

次に、今回使用する環境を作ります。

python -m venv ga4-mcp-env
source ga4-mcp-env/bin/activate

python -m pip install pipx
python -m pipx ensurepath

google analytics mcpとmcp proxyをインストールします。
合わせて、先ほど作成したキーのjsonファイルも配置します。(保存場所は適宜調整してください)

mkdir ga-mcp
vim ga-mcp/sa.json

pipx install analytics-mcp
pipx install mcp-proxy

ここまでで環境構築は完了です。
最後にmcpサーバーを立ち上げます。

mcp-proxy \
  --host 0.0.0.0 \
  --port 8080 \
  -e GOOGLE_APPLICATION_CREDENTIALS ~/ga-mcp/sa.json \
  pipx run analytics-mcp

Difyの設定

立ち上がったリモートMCPサーバーにDifyからアクセスします。
(今回は細かいセキュリティ関係の設定は省いていますが、MCPのアクセスやアプリへのアクセスは適切に制御することをお勧めします)

ツールのMCPの箇所から設定します。

サーバーURLは今回立ち上げたEC2のパブリックURLを設定します。
追加して承認をクリックします。

認証済みとなれば成功です。

Difyでチャットbotを作る

まずはパラメータを生成します。MCPとしては以下パラメータが設定できるようですが、今回は簡略化のために必須項目であるdate_ranges, dimensions, metricsの3つだけ出力させます。

  • date_ranges array[object]
  • dimensions array[string]
  • metrics array[string]
  • metric_filter object
  • order_bys array[object]
  • limit
  • offset
  • currency_code
  • currency_code

パラメータ出力に役立つのが構造化出力です。出力を定義できる上に、出力値が変数として利用可能なため、後のノードで利用しやすくなります。

コピペ用のjsonも記載します。

{
  "additionalProperties": false,
  "properties": {
    "date_ranges": {
      "description": "レポート対象の日付範囲(複数可)",
      "items": {
        "additionalProperties": false,
        "properties": {
          "end_date": {
            "format": "date",
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "start_date": {
            "format": "date",
            "type": "string"
          }
        },
        "required": [
          "start_date",
          "end_date"
        ],
        "type": "object"
      },
      "minItems": 1,
      "type": "array"
    },
    "dimensions": {
      "items": {
        "type": "string"
      },
      "minItems": 0,
      "type": "array"
    },
    "metrics": {
      "items": {
        "type": "string"
      },
      "minItems": 0,
      "type": "array"
    }
  },
  "required": [
    "date_ranges",
    "dimensions",
    "metrics"
  ],
  "type": "object"
}

ここで生成されたパラメータをMCPノードに引き継ぎます。

最後にユーザーへの回答を生成します。ポイントは、

  • 取得時に使用したパラメータを引き渡す
  • MCPでの取得データはメモリ機能を利用してjsonとして引き渡す

の2点です。

パラメータを引き渡さないとどんな値でリクエストしたかがLLMに伝わりません。また、MCPの出力テキストは空なので、jsonを引き渡す必要があります。ただし、Userの入力欄ではなぜかjsonが指定できないのでメモリをオンにしてjsonを指定します。

最後に回答を生成すれば完成です。

参考記事

公式ドキュメントと今回参考にさせていただいた記事をまとめます。

公式ドキュメント
https://github.com/googleanalytics/google-analytics-mcp?tab=readme-ov-file
https://developers.google.com/analytics/devguides/MCP?hl=ja

解説動画
https://www.youtube.com/watch?v=nS8HLdwmVlY

その他参考記事
https://qiita.com/Freegon13/items/9c9447751e3094a64055

Discussion