0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

前回DifyをGCEにデプロイする記事を書きました。

今回はDifyとCloud RunでデプロイしたMCPサーバーの連携方法、特にローカルMCP前提のGoogleが提供しているGoogle Analytics MCPをリモートMCPサーバーとして立ち上げてセキュアにDifyと連携する方法について解説します。

構築するアーキテクチャ

今回構築するアーキテクチャの全体像は以下の通りです。(前回記事と同じ画像)
architecture-qiita.drawio.png

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)で管理する仕組みとしています。内容は以下のようになります。

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が動きます。

cloud-run-deploy.yml
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にてdeploytrueとしたものだけをループ処理しています。
ファイルからそれぞれの値を抽出し、環境変数はパイプ区切りで結合させて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 internalVPCネットワーク内からのアクセスのみ許容し、 --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を作成します。

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 → SSEStreamable 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のエージェントアプリなどでツールとして使用してみると、以下の画像のような結果が得られます。
image.png

まとめ

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

何か皆様の参考になることがあれば幸いです。ご覧いただきありがとうございました!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?