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のリポジトリ見てやってしまうのが早いかと思いますので、リンクを記載しておきます。
公式リポジトリ
公式ドキュメント
最終的にはEC2のmcp-proxyを経由してDify上で対話できるbotを開発します。
Google Cloud Pratformの設定
まずはGCPの設定をします。サービスアカウントの発行とAPIの有効化の設定が必要です。
GCPのプロジェクトがない場合は下記記事などを参考にして作成してください。
サービスアカウントの発行
GCPにアクセスし、ナビゲーションメニューよりサービスアカウントを選択します。
”サービスアカウントを作成”よりサービスアカウントを作成します。サービスアカウント名は好きなテキストで設定してください。権限などは設定しなくて良いです。するとメールアドレスが発行されるので、メモしておきます。
サービスアカウントを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
以下の記事を参考にしてます。
今回は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を指定します。
最後に回答を生成すれば完成です。
参考記事
公式ドキュメントと今回参考にさせていただいた記事をまとめます。
公式ドキュメント
解説動画
その他参考記事
Discussion