はじめに
前回DifyをGCEにデプロイする記事を書きました。
今回はDifyとCloud RunでデプロイしたMCPサーバーの連携方法、特にローカルMCP前提のGoogleが提供しているGoogle Analytics MCPをリモートMCPサーバーとして立ち上げてセキュアにDifyと連携する方法について解説します。
構築するアーキテクチャ
今回構築するアーキテクチャの全体像は以下の通りです。(前回記事と同じ画像)

Cloud RunでリモートMCPサーバーとして構築します。その際、Difyを構築したVPC・サブネットからの通信のみを許可し、外部からのアクセスはできないように設定します。
弊社ではMCPサーバー管理用のGitHubリポジトリを作成し、GitHub Actionsで自動デプロイできる仕組みを整えました。
以下のようなファイル構成となります。
dify-mcp/
├── mcp-servers.yml # MCPサーバー設定ファイル(デプロイ対象の定義)
│
├── .github/
│ └── workflows/
│ └── cloud-run-deploy.yml # Cloud Runへの自動デプロイワークフロー
│
├── slack-mcp/
│ └── Dockerfile # Slack MCP サーバー用
├── notion-mcp/
│ └── Dockerfile # Notion MCP サーバー用
└── ga-mcp/
└── Dockerfile # Google Analytics MCP サーバー用
SlackやNotionのMCPサーバーも同じ仕組みで構築していますが、今回はGoogle Analyticsのみに絞って解説します。
自動デプロイ
まず初めに、GitHub Actionsを使用した自動デプロイについて解説します。
設定情報をYAMLファイル(mcp-servers.yml)で管理する仕組みとしています。内容は以下のようになります。
servers:
- name: slack
directory: slack-mcp
deploy: false
cpu: 1
memory: 2Gi
vars:
- SLACK_BOT_TOKEN
- SLACK_TEAM_ID
- name: notion
directory: notion-mcp
deploy: false
cpu: 1
memory: 2Gi
vars:
- OPENAPI_MCP_HEADERS
- name: google-analytics
directory: ga-mcp
deploy: true
cpu: 2
memory: 8Gi
vars:
- GOOGLE_PROJECT_ID
Dockerファイルの格納されているディレクトリやデプロイ対象とするかどうか、CPUやメモリ、環境変数名などを設定しています。
環境変数はGitHub ActionsのシークレットとしてGitHubで別途設定してください。
このファイルを読み込んで、以下の自動デプロイ用のGitHub Actionsが動きます。
name: Deploy MCP to Cloud Run
permissions:
id-token: write
contents: read
on:
push:
branches:
- main
env:
GCP_PROJECT_ID: "Google Cloud プロジェクトID"
REGION: asia-northeast1 # 任意のリージョンに適宜置き換えてください
VPC_NAME: main-vpc # Difyを構築したVPC名
SUBNET_NAME: main-subnet # Difyを構築したサブネット名
WIF_PROVIDER: projects/<project-number>/locations/global/workloadIdentityPools/<pool>/providers/<provider>
SERVICE_ACCOUNT: "Google Cloudの認証で使用するサービスアカウント"
CLOUD_RUN_SERVICE_ACCOUNT: "Cloud Runを実行するサービスアカウント"
MIN_INSTANCES: 0
MAX_INSTANCES: 2
jobs:
deploy:
runs-on: ubuntu-latest
env: # ここで設定している環境変数がmcp-servers.ymlで設定しているものと対応します。他のMCPサーバーをデプロイする場合は必要に応じてこの設定を増やしてください。
SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
SLACK_TEAM_ID: ${{ secrets.SLACK_TEAM_ID }}
OPENAPI_MCP_HEADERS: ${{ secrets.OPENAPI_MCP_HEADERS }}
GOOGLE_PROJECT_ID: "Google Cloud プロジェクトID"
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Authenticate to GCP using Workload Identity Federation
uses: google-github-actions/auth@v2
with:
workload_identity_provider: ${{ env.WIF_PROVIDER }}
service_account: ${{ env.SERVICE_ACCOUNT }}
- name: Set up gcloud CLI
uses: google-github-actions/setup-gcloud@v2
- name: Install yq for YAML parsing
run: |
sudo wget -qO /usr/local/bin/yq \
https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64
sudo chmod +x /usr/local/bin/yq
- name: Deploy all MCP services to Cloud Run
shell: bash
run: |
for svc in $(yq e '.servers[] | select(.deploy==true).name' mcp-servers.yml); do
dir=$(yq e ".servers[] | select(.name==\"$svc\").directory" mcp-servers.yml)
keys=( $(yq e ".servers[] | select(.name==\"$svc\").vars[]" mcp-servers.yml) )
memory=$(yq e ".servers[] | select(.name==\"$svc\").memory" mcp-servers.yml)
cpu=$(yq e ".servers[] | select(.name==\"$svc\").cpu" mcp-servers.yml)
declare -a env_vars=()
for key in "${keys[@]}"; do
val="${!key}"
env_vars+=("${key}=${val}")
done
set_env="^|^"$(IFS='|'; echo "${env_vars[*]}")
gcloud run deploy "$svc" \
--source "./$dir" \
--platform managed \
--region "${{ env.REGION }}" \
--port 8080 \
--ingress internal \
--vpc-egress all-traffic \
--network ${{ env.VPC_NAME }} \
--subnet ${{ env.SUBNET_NAME }} \
--allow-unauthenticated \
--set-env-vars "$set_env" \
--min-instances ${{ env.MIN_INSTANCES }} \
--max-instances ${{ env.MAX_INSTANCES }} \
--service-account "${{ env.CLOUD_RUN_SERVICE_ACCOUNT }}" \
--memory "$memory" \
--cpu "$cpu"
done
本記事ではGoogle Cloudの認証周りについては触れません。本記事の仕組みではWorkload Identity 連携を使用していますので、別途公式ドキュメント等を参考に設定してください。
デプロイに関わる部分([Deploy all MCP services to Cloud Run]の処理)について、ピックアップして解説します。
for svc in $(yq e '.servers[] | select(.deploy==true).name' mcp-servers.yml); do
dir=$(yq e ".servers[] | select(.name==\"$svc\").directory" mcp-servers.yml)
keys=( $(yq e ".servers[] | select(.name==\"$svc\").vars[]" mcp-servers.yml) )
memory=$(yq e ".servers[] | select(.name==\"$svc\").memory" mcp-servers.yml)
cpu=$(yq e ".servers[] | select(.name==\"$svc\").cpu" mcp-servers.yml)
declare -a env_vars=()
for key in "${keys[@]}"; do
val="${!key}"
env_vars+=("${key}=${val}")
done
set_env="^|^"$(IFS='|'; echo "${env_vars[*]}")
この部分でmcp-servers.ymlにてdeployをtrueとしたものだけをループ処理しています。
ファイルからそれぞれの値を抽出し、環境変数はパイプ区切りで結合させてgcloudコマンドで使用できる形に変換しています。
gcloud run deploy "$svc" \
--source "./$dir" \
--platform managed \
--region "${{ env.REGION }}" \
--port 8080 \
--ingress internal \
--vpc-egress all-traffic \
--network ${{ env.VPC_NAME }} \
--subnet ${{ env.SUBNET_NAME }} \
--allow-unauthenticated \
--set-env-vars "$set_env" \
--min-instances ${{ env.MIN_INSTANCES }} \
--max-instances ${{ env.MAX_INSTANCES }} \
--service-account "${{ env.CLOUD_RUN_SERVICE_ACCOUNT }}" \
--memory "$memory" \
--cpu "$cpu"
この部分が実際にCloud Runにデプロイしているコマンドになります。1コマンドでデプロイできるので楽ですね。
--ingress internalでVPCネットワーク内からのアクセスのみ許容し、 --vpc-egress all-trafficですべてのアウトバウンド トラフィックを VPC ネットワーク経由で送信させることができます。VPCネットワーク内からのアクセスであれば認証なしで通信できるように--allow-unauthenticatedを設定しています。
VPC、サブネット名はそれぞれ--network --subnetにて設定しています。
これにより、インターネットからのアクセスはさせずにDifyからのみ使用可能なセキュアな環境構築が可能です。
Google Analytics MCPの設定
続いてGoogle Analytics MCPの設定です。
まずはGoogle Cloud側の設定を行います。詳しくはこちらを参照いただければと思いますが、以下2つのAPIを有効にしてください
続いてga-mcpディレクトリに以下のDockerfileを作成します。
FROM python:3.13-slim-bookworm as python-base
# Install uv and Google Analytics MCP
RUN apt-get update && apt-get install -y git curl && \
pip install uv && \
git clone https://github.com/googleanalytics/google-analytics-mcp.git /app/google-analytics-mcp
WORKDIR /app/google-analytics-mcp
RUN uv sync
# Install Node.js and supergateway
FROM python-base
RUN apt-get update && apt-get install -y curl && \
curl -fsSL https://deb.nodesource.com/setup_22.x | bash - && \
apt-get install -y nodejs && \
npm install -g supergateway
ENV PORT=8080
WORKDIR /app/google-analytics-mcp
# Use supergateway to convert stdio to HTTP
# GA MCP command: uv run analytics-mcp (runs in stdio mode by default)
ENTRYPOINT ["supergateway", \
"--stdio", "uv run analytics-mcp", \
"--outputTransport", "streamableHttp", \
"--port", "8080", \
"--streamableHttpPath", "/mcp"]
前提として、2026年1月時点でGoogleが発表しているMCPサーバーはリモートではなくローカルMCPサーバーとなっています。
そのため、Difyで使用するにはリモートMCPサーバー(SSE/HTTP形式)に変換する必要があります。
今回はその変換にSupergatewayを使用しました。Supergatewayはstdio → SSEやStreamable HTTP → stdioなどMCPサーバの変換が可能です。今回はstdio → Streamable HTTPの変換を使用してローカルMCPサーバーのGoogle Analytics MCPをリモートMCPサーバーとして公開しました。
これらのソースファイルを作成して、GitHubでプルリクエスト作成→マージをすると自動的にCloud RunにMCPサーバーがデプロイされます。
デプロイ完了後、DifyでMCPツールの使用設定を行ってください。使用するURLはhttps://<Cloud Runの公開URL>/mcpとなります。
最後に、使用したいGoogle Analyticsのアカウントorプロパティに対して、Cloud Runで使用しているサービスアカウントのメールアドレスに閲覧権限を付与してください。
Difyのエージェントアプリなどでツールとして使用してみると、以下の画像のような結果が得られます。

まとめ
今回はCloud RunにリモートMCPサーバーをデプロイする方法やその管理方法、Google Analytics MCPサーバーをリモートMCPサーバーとして使用するための方法を解説しました。
Google Analyticsを生成AIを通して活用することで、これまでより活用の敷居が下がり、また確認したい数値を素早く得ることができるようになります。
何か皆様の参考になることがあれば幸いです。ご覧いただきありがとうございました!