使用 BigQuery MCP 构建 Google 趋势分析师智能体

1. 概览

在此 Codelab 中,您将使用 Google ADK 构建一个 Google 趋势分析师智能体。此代理利用 BigQuery MCP 服务器动态发现并执行查询 Google 趋势公共数据集 (bigquery-public-data.google_trends) 的工具。

学习内容

  • 如何设置项目以进行 ADK 开发。
  • 如何为 BigQuery 启用和使用受管理的 MCP 服务器。
  • 如何构建使用 MCP 工具的智能体。
  • 如何在本地运行代理以进行测试。
  • 如何将代理部署到 Google Cloud Run。

所需条件

  • 启用了结算功能的 Google Cloud 项目
  • 网络浏览器,例如 Chrome
  • Python 3.11+

此 Codelab 适合对 Python 和 Google Cloud 有一定了解的中级开发者。

完成本 Codelab 大约需要 15-20 分钟。

在此 Codelab 中创建的资源费用应低于 5 美元。

2. 设置您的环境

创建 Google Cloud 项目

  1. Google Cloud 控制台的项目选择器页面上,选择或创建一个 Google Cloud 项目
  2. 确保您的 Cloud 项目已启用结算功能。了解如何检查项目是否已启用结算功能

设置环境变量

设置以下环境变量。

export GOOGLE_CLOUD_PROJECT=<INSERT_YOUR_GCP_PROJECT_HERE>
export GOOGLE_GENAI_USE_VERTEXAI=1

注意:设置 GOOGLE_GENAI_USE_VERTEXAI=1 会指示 ADK 使用 Vertex AI,并利用 Cloud IAM 进行身份验证,而不是使用 GEMINI_API_KEY

验证身份并配置 gcloud

登录您的 Google 账号,设置有效项目,并配置应用默认凭证。

gcloud auth login
gcloud auth application-default login

注意gcloud auth login 用于对 gcloud CLI 命令进行身份验证,而 gcloud auth application-default login 用于对本地应用代码进行身份验证。

设置 Google Cloud 项目:

gcloud config set project ${GOOGLE_CLOUD_PROJECT}

启用必要的 API

为 Cloud Run、Artifact Registry、BigQuery 和 Vertex AI 启用所需的 Google Cloud API。

gcloud services enable run.googleapis.com \
                       cloudbuild.googleapis.com \
                       artifactregistry.googleapis.com \
                       bigquery.googleapis.com \
                       aiplatform.googleapis.com

为 BigQuery 启用 MCP

您必须为项目明确启用托管式 MCP 服务器。

gcloud beta services mcp enable bigquery.googleapis.com

创建项目文件夹

首先,为您的代理创建一个根文件夹,并为代理实现创建一个内部文件夹。

mkdir google-trends-agent
cd google-trends-agent
mkdir google_trends

3. 创建代理代码

创建一个名为 google_trends/__init__.py 的空文件:

touch google_trends/__init__.py

然后,创建一个名为 google_trends/agent.py 的文件,并粘贴以下代码:

import os
import textwrap
import warnings
from datetime import date

import google.auth
from google.adk.agents import LlmAgent
from google.adk.apps import App
from google.adk.tools.mcp_tool import McpToolset
from google.adk.tools.mcp_tool.mcp_session_manager import StreamableHTTPConnectionParams
from google.auth.transport.requests import Request

# Suppress experimental ADK credential warnings
warnings.filterwarnings("ignore")

def get_agent_instruction(project_id: str) -> str:
    """Generates a clear and formatted prompt for the data analyst."""
    instruction = f"""
    # ROLE
    You are a Google Search Trends Analyst. Your mission is to provide clear answers using SQL data.

    # DATA CONSTRAINTS
    - BigQuery tool `execute_sql` requires explicit billing project mapping. Use: '{project_id}'.
    - Target dataset strictly: `bigquery-public-data.google_trends`

    # SCHEMA DISCOVERY (CRITICAL)
    1. DO NOT call `get_table_info` or `list_table_ids` (Triggers Permission Errors).
    2. Run `SELECT * FROM table LIMIT 0` via `execute_sql` for field definition mapping.

    # OUTPUT PRESENTATION
    - Render purely as a cleanly aligned Markdown table.
    - Use clear and descriptive headers for each column.
    - Remove conversational preambles. Output only the results.
    """
    return textwrap.dedent(instruction).strip()

def get_auth_headers() -> dict[str, str]:
    """Fetch auth headers for the project using Google Cloud Platform scopes."""
    credentials, _ = google.auth.default(
        scopes=["https://www.googleapis.com/auth/cloud-platform"]
    )
    request = Request()
    credentials.refresh(request)

    return {"Authorization": f"Bearer {credentials.token}"}

def get_todays_date() -> str:
    """Returns today's date in YYYY-MM-DD format."""
    return date.today().isoformat()

# --- Application Initialization ---
project_id = os.environ.get("GOOGLE_CLOUD_PROJECT")
if not project_id:
    raise ValueError("GOOGLE_CLOUD_PROJECT environment variable is not set")

mcp_headers = {
    "Content-Type": "application/json",
    "Accept": "application/json, text/event-stream",
} | get_auth_headers()

# Configure BigQuery Tools via MCP
bq_tools = McpToolset(
    connection_params=StreamableHTTPConnectionParams(
        url="https://bigquery.googleapis.com/mcp",
        headers=mcp_headers,
    )
)

# Initialize the LLM Agent
root_agent = LlmAgent(
    name="google_trends",
    model="gemini-3-flash-preview",
    tools=[get_todays_date, bq_tools],
    instruction=get_agent_instruction(project_id),
)

# Create the ADK App
app = App(name=root_agent.name, root_agent=root_agent)

4. 运行代理

在此步骤中,您将设置本地 Python 虚拟环境、安装依赖项并运行代理,以验证其在您的机器(或 Google Cloud Shell)上的行为。

  • 前往应用根目录 (google-trends-agent)。
  • 创建虚拟环境:
python -m venv mcp_demo_env
source mcp_demo_env/bin/activate
  • 安装所需的 Python 软件包:
pip install google-auth google-adk

我们将使用 ADK Web 来测试新代理。

对于本地开发和测试,请运行以下命令:

adk web

如需在 Google Cloud Shell 中进行开发和测试,请运行以下命令:

adk web --allow_origins="*"

此命令将启动 ADK Web 服务器。您可以使用本地 Web 界面(通常位于 http://localhost:8000)与代理互动。

注意:您也可以使用更简单的 adk run google_trends 命令来测试智能体。

5. 部署到 Cloud Run

请按照以下步骤将代理安全地部署到 Google Cloud Run。

授予权限

Cloud Run 需要获得访问 Vertex AI 和使用 BigQuery MCP 工具的权限。

# Get your project number automatically
PROJECT_NUMBER=$(gcloud projects describe $GOOGLE_CLOUD_PROJECT --format='value(projectNumber)')

# Vertex AI Access: To talk to the Gemini model
gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \
  --member="serviceAccount:${PROJECT_NUMBER}-compute@developer.gserviceaccount.com" \
  --role="roles/aiplatform.user"

# MCP & BigQuery: To execute tools and run SQL jobs
gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \
  --member="serviceAccount:${PROJECT_NUMBER}-compute@developer.gserviceaccount.com" \
  --role="roles/mcp.toolUser"

gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \
  --member="serviceAccount:${PROJECT_NUMBER}-compute@developer.gserviceaccount.com" \
  --role="roles/bigquery.jobUser"

gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \
  --member="serviceAccount:${PROJECT_NUMBER}-compute@developer.gserviceaccount.com" \
  --role="roles/bigquery.dataViewer"

创建 Dockerfile

在项目根目录 (google-trends-agent) 中,创建一个名为 Dockerfile 的文件,并粘贴以下内容:

FROM python:3.11-slim
WORKDIR /app

# Create a non-root user
RUN adduser --disabled-password --gecos "" myuser
USER myuser
ENV PATH="/home/myuser/.local/bin:$PATH"

# Copy the agent folder into the container
COPY --chown=myuser:myuser google_trends/ /app/agents/google_trends/

# Install the python packages
RUN pip install google-auth google-adk

# Set environment variables
ENV GOOGLE_GENAI_USE_VERTEXAI=1

# Expose port
EXPOSE 8080

# Run ADK web server
CMD ["adk", "web", "--port=8080", "--host=0.0.0.0", "/app/agents"]

部署代理

从根目录运行以下命令。这会将您的代理容器化并部署到 Cloud Run。

gcloud run deploy google-trends-agent \
  --source . \
  --region us-west1 \
  --allow-unauthenticated \
  --set-env-vars="GOOGLE_CLOUD_PROJECT=${GOOGLE_CLOUD_PROJECT}"

快速验证

部署完成后,控制台会输出服务网址。在浏览器中打开此网址;您会看到与本地相同的互动式界面,但现在该界面在云端运行!

您还可以监控日志,确保一切顺利运行:

gcloud logging read "resource.type=cloud_run_revision AND resource.labels.service_name=google-trends-agent" --limit 10

6. 清理

为避免持续产生费用,请删除在本 Codelab 中创建的资源。

删除 Cloud Run 服务:

gcloud run services delete google-trends-agent --region us-west1

如果您专门为此 Codelab 创建了一个项目,可以删除整个项目:

gcloud projects delete ${GOOGLE_CLOUD_PROJECT}

您还可以删除与此 Codelab 相关的所有文件:

deactivate
cd ..
rm -rf google-trends-agent

7. 恭喜

恭喜!您已成功构建并部署了 Google 趋势分析师代理。

您学到的内容

  • 如何使用 MCP 动态扩展智能体功能
  • 如何使用 Google ADK 构建和部署 LLM 智能体
  • 如何在 Cloud Run 上部署和扩缩智能体

后续步骤

  • 尝试修改代理以查询不同的 BigQuery 数据集
  • 添加更多 MCP 工具以扩展智能体的功能

参考文档