ツールとしてのデータベース: ADK、MCP ツールボックス、Cloud SQL を使用したエージェント RAG

1. はじめに

AI エージェントの有用性は、アクセスできるデータによって決まります。実際のデータのほとんどはデータベースに存在します。通常、エージェントをデータベースに接続するには、接続管理、クエリ ロジック、埋め込みパイプラインをエージェント コード内に記述する必要があります。データベース アクセスを必要とするエージェントはすべてこの作業を繰り返し、クエリを変更するたびにエージェントを再デプロイする必要があります。

この Codelab では、別のアプローチを示します。標準の SQL クエリ、ベクトル類似性検索、自動エンベディング生成など、データベース ツールを YAML ファイルで宣言すると、データベース向け MCP ツールボックスが MCP サーバーとしてすべてのデータベース オペレーションを処理します。エージェント コードは最小限に抑えられます。ツールを読み込み、呼び出すツールを Gemini に決定させます。

作成するアプリの概要

「TechJobs」用の Smart Job Board Assistant - Gemini を搭載した ADK エージェント。開発者が標準フィルタ(役割、技術スタック)を使用して技術職の求人情報を閲覧し、「AI チャットボットの仕事がしたい」などの自然言語の説明で仕事を見つけるのに役立ちます。エージェントは、MCP Toolbox for Databases を介して Cloud SQL PostgreSQL データベースから読み取り、書き込みを行います。MCP Toolbox for Databases は、ベクトル検索の自動エンベディング生成など、すべてのデータベース アクセスを処理します。最終的に、Toolbox とエージェントの両方が Cloud Run で実行されます。

eb6de681c40990c1.jpeg

学習内容

  • MCP(Model Context Protocol)が AI エージェントのツールアクセスを標準化する方法と、データベース向け MCP ツールボックスがこれをデータベース オペレーションに適用する方法
  • ADK エージェントと Cloud SQL PostgreSQL の間のミドルウェアとして MCP Toolbox for Databases を設定する
  • tools.yaml でデータベース ツールを宣言的に定義する - エージェントにデータベース コードは不要
  • ToolboxToolset を使用して、実行中のツールボックス サーバーからツールを読み込む ADK エージェントを構築する
  • Cloud SQL の組み込み embedding() 関数を使用してベクトル エンベディングを生成し、pgvector でセマンティック検索を有効にする
  • 書き込みオペレーションでベクターを自動的に取り込むために valueFromParam 機能を使用する
  • ツールボックス サーバーと ADK エージェントの両方を Cloud Run にデプロイする

前提条件

  • トライアルの請求先アカウントを含む Google Cloud アカウント
  • Python と SQL に関する基本的な知識
  • ADK、MCP Toolbox、pgvector の使用経験は不要です

2. 環境をセットアップする

このステップでは、Cloud Shell 環境を準備し、Google Cloud プロジェクトを構成して、リファレンス リポジトリのクローンを作成します。

Cloud Shell を開く

ブラウザで Cloud Shell を開きます。Cloud Shell には、この Codelab で必要なすべてのツールがプリインストールされた環境が用意されています。プロンプトが表示されたら、[Authorize] をクリックします。

[表示] -> [ターミナル] をクリックしてターミナルを開きます。インターフェースは次のようになります。

86307fac5da2f077.png

これがメイン インターフェースになります。上部に IDE、下部にターミナルが表示されます。

作業ディレクトリを設定する

作業ディレクトリを作成します。この Codelab で記述するコードはすべてここにあります。

mkdir -p ~/build-agent-adk-toolbox-cloudsql
cloudshell workspace ~/build-agent-adk-toolbox-cloudsql && cd ~/build-agent-adk-toolbox-cloudsql

Google Cloud プロジェクトをセットアップする

ロケーション変数を含む .env ファイルを作成します。

# For Vertex AI / Gemini API calls
echo "GOOGLE_CLOUD_LOCATION=global" > .env
# For Cloud SQL, Cloud Run, Artifact Registry
echo "REGION=us-central1" >> .env

プロジェクト設定スクリプトを作業ディレクトリにダウンロードします。

curl -sL https://raw.githubusercontent.com/alphinside/cloud-trial-project-setup/main/setup_verify_trial_project.sh -o setup_verify_trial_project.sh

スクリプトを実行します。トライアルの請求先アカウントを確認し、新しいプロジェクトを作成(または既存のプロジェクトを検証)し、プロジェクト ID を現在のディレクトリの .env ファイルに保存し、gcloud でアクティブ プロジェクトを設定します。

bash setup_verify_trial_project.sh && source .env

このスクリプトによって行われる処理は次のとおりです。

  1. 有効なトライアルの請求先アカウントがあることを確認する
  2. .env に既存のプロジェクトがあるかどうかを確認します(ある場合)。
  3. 新しいプロジェクトを作成するか、既存のプロジェクトを再利用する
  4. トライアルの請求先アカウントをプロジェクトにリンクする
  5. プロジェクト ID を .env に保存する
  6. プロジェクトをアクティブな gcloud プロジェクトとして設定する

Cloud Shell ターミナルのプロンプトで、作業ディレクトリの横にある黄色のテキストを確認して、プロジェクトが正しく設定されていることを確認します。プロジェクト ID が表示されます。

dcba35ce1389f313.png

この Codelab の途中で Cloud Shell セッションがリセットされた場合は、作業ディレクトリに戻り、bash setup_verify_trial_project.sh && source .env を再実行してプロジェクト構成を復元します。ターミナルのプロンプトに黄色のプロジェクト ID テキストが再び表示されることを確認します。

gcloud services enable \
  aiplatform.googleapis.com \
  sqladmin.googleapis.com \
  compute.googleapis.com \
  run.googleapis.com \
  cloudbuild.googleapis.com \
  artifactregistry.googleapis.com
  • Vertex AI APIaiplatform.googleapis.com) - エージェントは Gemini モデルを使用し、ツールボックスはベクトル検索にエンベディング API を使用します。
  • Cloud SQL Admin APIsqladmin.googleapis.com) - PostgreSQL インスタンスをプロビジョニングして管理します。
  • Compute Engine APIcompute.googleapis.com)- Cloud SQL インスタンスの作成に必要です。
  • Cloud Run、Cloud Build、Artifact Registry - この Codelab の後半のデプロイ ステップで使用されます。

3. データベース インスタンスを作成する

この手順では、バックグラウンドで Cloud SQL インスタンスの作成を設定します。チュートリアルを続行している間にプロビジョニングが行われます。

インスタンスの作成を開始する

データベースのパスワードを .env ファイルに追加して、再読み込みします。

echo "DB_PASSWORD=techjobs-pwd-2025" >> .env
source .env

Cloud SQL インスタンスの作成を開始します。これはバックグラウンドで実行されるため、作業を続行できます。

gcloud sql instances create jobs-instance \
  --database-version=POSTGRES_17 \
  --tier=db-custom-1-3840 \
  --edition=ENTERPRISE \
  --region=$REGION \
  --root-password=$DB_PASSWORD \
  --enable-google-ml-integration \
  --database-flags cloudsql.enable_google_ml_integration=on \
  --quiet &
  • db-custom-1-3840 は、ENTERPRISE エディションで最小の専用コア Cloud SQL 階層(1 vCPU、3.75 GB RAM)です。詳しくは、こちらをご覧ください。Vertex AI ML の統合には専用コアが必要です。共有コア階層(db-f1-microdb-g1-small)ではサポートされていません。
  • --root-password は、デフォルトの postgres ユーザーのパスワードを設定します。
  • --enable-google-ml-integration を使用すると、Cloud SQL と Vertex AI の組み込みインテグレーションが有効になり、embedding() 関数を使用して SQL からエンベディング モデルを直接呼び出すことができます。
  • & は、コマンドをバックグラウンドで実行します。

これはバックグラウンドで実行されます。次に、MCP ツールボックスのバイナリをダウンロードします。これは同じターミナルで行うことができます。

Toolbox バイナリをダウンロードする

このチュートリアルでは MCP Toolbox を使用します。幸いなことに、MCP Toolbox には Linux 環境ですぐに使用できるビルド済みバイナリが付属しています。ダウンロードには時間がかかるため、バックグラウンドでダウンロードしましょう

cd ~/build-agent-adk-toolbox-cloudsql
curl -O https://storage.googleapis.com/genai-toolbox/v0.27.0/linux/amd64/toolbox &

このプロセスを現在のタブで実行します(すでにバックグラウンドで実行されていますが、出力は表示されます)。Cloud Shell で新しいターミナルタブを開き(+ アイコンをクリック)、集中できるようにしましょう。

b01e3fbd89f17332.png

作業ディレクトリに再度移動し、以前のセットアップ スクリプトを使用してプロジェクトを有効にします。

cd ~/build-agent-adk-toolbox-cloudsql
bash setup_verify_trial_project.sh && source .env

このステップでは、Python プロジェクトを設定し、依存関係をインストールして、ADK エージェント ディレクトリをスキャフォールディングします。

4. エージェント プロジェクトを初期化する

Python プロジェクトを設定する

uv は、Rust で記述された高速な Python パッケージおよびプロジェクト管理ツールです(uv のドキュメント)。この Codelab では、高速性とシンプルさを実現するためにこれを使用します。

Python プロジェクトを初期化し、必要な依存関係を追加します。

uv init
uv add google-adk==1.25.0 toolbox-adk==0.6.0
  • google-adk - Google の Agent Development Kit(Gemini SDK を含む)
  • toolbox-adk - データベース向け MCP ツールボックスの ADK インテグレーション。

エージェントのディレクトリ構造を作成する

ADK では、特定フォルダ レイアウト(エージェントの名前を付けたディレクトリに __init__.pyagent.py.env を含む)が想定されています。このために、構造をすばやく確立するコマンドが組み込まれています。

uv run adk create jobs_agent \
    --model gemini-2.5-flash \
    --project ${GOOGLE_CLOUD_PROJECT} \
    --region ${GOOGLE_CLOUD_LOCATION}

ディレクトリは次のようになります。

build-agent-adk-toolbox-cloudsql/
├── jobs_agent/
│   ├── __init__.py
│   ├── agent.py
│   └── .env
├── pyproject.toml
├── .env              (project setup — already exists)
└── .venv/

5. 求人情報データベースをシードする

このステップでは、シードデータを書き込み、Cloud SQL インスタンスのプロビジョニングが完了するまで待機し、15 件の求人情報とその説明のエンベディングを jobs テーブルに読み込みます。

シード SQL を記述する

Cloud Shell エディタで、ジョブのリストの内容を含む seed.sql という名前のファイルを作成します。これにより、pgvector サポート付きの jobs テーブルが作成され、テクノロジー企業での求人情報が 15 件挿入されます。

まず、次のコマンドを使用して seed.sql ファイルを作成します。

cloudshell edit seed.sql

次に、これらのスクリプトをファイルにコピーします。

-- seed.sql
-- DISCLAIMER: These job listings are entirely fictional and created for tutorial
-- purposes only. Company names are used for illustrative context — the positions,
-- salaries, and descriptions do not reflect real openings.

CREATE EXTENSION IF NOT EXISTS google_ml_integration;
CREATE EXTENSION IF NOT EXISTS vector;

CREATE TABLE IF NOT EXISTS jobs (
    id SERIAL PRIMARY KEY,
    title VARCHAR NOT NULL,
    company VARCHAR NOT NULL,
    role VARCHAR NOT NULL,
    tech_stack VARCHAR NOT NULL,
    salary_range VARCHAR NOT NULL,
    location VARCHAR NOT NULL,
    openings INTEGER NOT NULL,
    description TEXT NOT NULL,
    description_embedding vector(3072)
);

INSERT INTO jobs (title, company, role, tech_stack, salary_range, location, openings, description) VALUES
('Senior Backend Engineer', 'Stripe', 'Backend', 'Go, PostgreSQL, gRPC, Kubernetes', '$180-250K/year', 'San Francisco, Hybrid', 3,
 'Design and build high-throughput microservices powering payment infrastructure for millions of businesses. Optimize Go services for sub-100ms latency at scale, work with PostgreSQL and Redis for data persistence, and deploy on Kubernetes clusters handling billions of API calls.'),

('Machine Learning Engineer', 'Spotify', 'Data/AI', 'Python, TensorFlow, BigQuery, Vertex AI', '$170-230K/year', 'Stockholm, Remote', 2,
 'Build and deploy ML models for music recommendation and personalization systems serving hundreds of millions of listeners. Design feature pipelines in BigQuery, train models using distributed computing, and serve predictions through real-time APIs processing thousands of requests per second.'),

('Frontend Engineer', 'Vercel', 'Frontend', 'React, TypeScript, Next.js', '$140-190K/year', 'Remote', 4,
 'Build developer-facing dashboard interfaces and deployment tools used by millions of developers worldwide. Create responsive, accessible React components for project management, analytics, and real-time deployment monitoring with a focus on developer experience.'),

('DevOps Engineer', 'Datadog', 'DevOps', 'Terraform, GCP, Docker, Kubernetes, ArgoCD', '$160-220K/year', 'New York, Hybrid', 2,
 'Manage cloud infrastructure powering an observability platform used by thousands of engineering teams. Automate deployment pipelines with ArgoCD, manage multi-cloud Kubernetes clusters, and implement infrastructure-as-code with Terraform across production environments.'),

('Mobile Engineer (Android)', 'Grab', 'Mobile', 'Kotlin, Jetpack Compose, GraphQL', '$120-170K/year', 'Singapore, Hybrid', 3,
 'Develop features for a super-app serving millions of users across Southeast Asia. Build modern Android UIs with Jetpack Compose, integrate GraphQL APIs, and optimize app performance for diverse device capabilities and network conditions.'),

('Data Engineer', 'Airbnb', 'Data', 'Python, Apache Spark, Airflow, BigQuery', '$160-210K/year', 'San Francisco, Hybrid', 2,
 'Build data pipelines that process booking, search, and pricing data for a global travel marketplace. Design ETL workflows with Apache Spark and Airflow, maintain data warehouses in BigQuery, and ensure data quality for analytics and machine learning teams.'),

('Full Stack Engineer', 'Revolut', 'Full Stack', 'TypeScript, Node.js, React, PostgreSQL', '$130-180K/year', 'London, Remote', 5,
 'Build the next generation of financial products making banking accessible to millions of users across 35 countries. Develop real-time trading interfaces with React and WebSockets, build Node.js APIs handling market data streams, and design PostgreSQL schemas for financial transactions.'),

('Site Reliability Engineer', 'Cloudflare', 'SRE', 'Go, Prometheus, Grafana, GCP, Terraform', '$170-230K/year', 'Austin, Hybrid', 2,
 'Ensure 99.99% uptime for a global network handling millions of requests per second. Define SLOs, build monitoring dashboards with Prometheus and Grafana, manage incident response, and automate infrastructure scaling across 300+ data centers worldwide.'),

('Cloud Architect', 'Google Cloud', 'Cloud', 'GCP, Terraform, Kubernetes, Python', '$200-280K/year', 'Seattle, Hybrid', 1,
 'Help enterprises modernize their infrastructure on Google Cloud. Design multi-region architectures, lead migration projects from on-premises to GKE, and build reference implementations using Terraform and Cloud Foundation Toolkit.'),

('Backend Engineer (Payments)', 'Square', 'Backend', 'Java, Spring Boot, PostgreSQL, Kafka', '$160-220K/year', 'San Francisco, Hybrid', 3,
 'Build payment processing systems handling millions of transactions for businesses of all sizes. Design event-driven architectures using Kafka, implement idempotent payment flows with Spring Boot, and ensure PCI-DSS compliance across all services.'),

('AI Engineer', 'Hugging Face', 'Data/AI', 'Python, LangChain, Vertex AI, FastAPI, PostgreSQL', '$150-210K/year', 'Paris, Remote', 2,
 'Build AI-powered tools for the largest open-source ML community. Develop RAG pipelines that index and search model documentation, create conversational agents using LangChain, and deploy AI services with FastAPI on cloud infrastructure.'),

('Platform Engineer', 'Coinbase', 'Platform', 'Rust, Kubernetes, AWS, Terraform', '$180-250K/year', 'Remote', 0,
 'Build the infrastructure platform for a leading cryptocurrency exchange. Develop high-performance matching engines in Rust, manage Kubernetes clusters for microservices, and design CI/CD pipelines that enable rapid feature deployment with zero downtime.'),

('QA Automation Engineer', 'Shopify', 'QA', 'Python, Selenium, Cypress, Jenkins', '$110-160K/year', 'Toronto, Hybrid', 3,
 'Design and maintain automated test suites for a commerce platform powering millions of merchants. Build end-to-end test frameworks with Cypress and Selenium, integrate tests into Jenkins CI pipelines, and establish quality gates that prevent regressions in checkout and payment flows.'),

('Security Engineer', 'CrowdStrike', 'Security', 'Python, SIEM, Kubernetes, Penetration Testing', '$170-240K/year', 'Austin, On-site', 1,
 'Protect enterprise customers from cyber threats on a leading endpoint security platform. Conduct penetration testing, design security monitoring with SIEM tools, implement zero-trust networking in Kubernetes environments, and lead incident response for security events.'),

('Product Engineer', 'GitLab', 'Full Stack', 'Go, React, PostgreSQL, Redis, GCP', '$140-200K/year', 'Remote', 4,
 'Own features end-to-end for an all-in-one DevSecOps platform used by millions of developers. Build Go microservices for CI/CD pipelines, create React frontends for code review and project management, and collaborate with product managers to iterate on user-facing features using data-driven development.');

シード スクリプトは、次の 2 つの PostgreSQL 拡張機能をインストールします。

  • google_ml_integration - embedding() SQL 関数を提供します。この関数は、SQL から Vertex AI エンベディング モデルを直接呼び出します。これは、jobs_db 内で ML 関数を使用できるようにするデータベース レベルの拡張機能です。インスタンスの作成時に設定したインスタンスレベルのフラグ(--enable-google-ml-integration)により、Cloud SQL VM は Vertex AI にアクセスできます。この拡張機能により、特定のデータベース内で SQL 関数を使用できるようになります。
  • vectorpgvector) - エンベディングの保存とクエリ用に vector データ型と距離演算子を追加します。

description_embedding 列は vector(3072) です。これは 3,072 次元のベクトルを保存する pgvector 列です。現時点では NULL です。次のステップで embedding() 関数を使用してエンベディングを生成し、入力します。

データベースの設定を完了する

前の手順で開始した Cloud SQL インスタンスの作成がまだ実行中で、完了していない可能性があります。インスタンスの準備ができていることを確認します。

gcloud sql instances describe jobs-instance --format="value(state)"

次のような内容が出力されます

RUNNABLE

34f5b48006b4cb3a.png

次に、Cloud SQL インスタンスのサービス アカウントに Vertex AI を呼び出す権限を付与します。これは、次のステップで使用する組み込みの embedding() 関数に必要です。

SERVICE_ACCOUNT=$(gcloud sql instances describe jobs-instance --format="value(serviceAccountEmailAddress)")

gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
  --member="serviceAccount:$SERVICE_ACCOUNT" \
  --role="roles/aiplatform.user" \
  --quiet

その後、求人情報専用のデータベースを作成します。

gcloud sql databases create jobs_db --instance=jobs-instance

データベースが作成されたことを確認する出力が表示されます。

Creating Cloud SQL database...done.                                                                         
Created database [jobs_db].
instance: jobs-instance
name: jobs_db
project: workshop-xxxxxxx

データベースを接続してシードする

Cloud SQL Auth Proxy を起動します(cloud-sql-proxy は Cloud Shell にプリインストールされています)。これにより、Cloud Shell から Cloud SQL インスタンスへの安全な認証済み接続が提供されます。

d72e56478b517b5c.jpeg

cloud-sql-proxy ${GOOGLE_CLOUD_PROJECT}:${REGION}:jobs-instance --port 5432 &

プロキシが起動すると、ターミナルに次の出力が表示されます。

... Authorizing with Application Default Credentials
... [workshop-xxxxxx:your-location:jobs-instance] Listening on 127.0.0.1:5432
... The proxy has started successfully and is ready for new connections!

現在のターミナルに、Cloud SQL Proxy のログが継続的に出力されます。Cloud Shell で新しいターミナルタブを開き(+ アイコンをクリック)、集中できるようにしましょう。

b01e3fbd89f17332.png

作業ディレクトリに再度移動し、以前のセットアップ スクリプトを使用してプロジェクトを有効にします。

cd ~/build-agent-adk-toolbox-cloudsql
bash setup_verify_trial_project.sh && source .env

次に、シード スクリプトを実行します。

psql "host=127.0.0.1 port=5432 dbname=jobs_db user=postgres password=$DB_PASSWORD" -f seed.sql

次のようなターミナル出力が表示されます。

CREATE EXTENSION
CREATE EXTENSION
CREATE TABLE
INSERT 0 15

データを確認しましょう

psql "host=127.0.0.1 port=5432 dbname=jobs_db user=postgres password=$DB_PASSWORD" \
  -c "SELECT title, company, role, openings FROM jobs ORDER BY role, title;"

複数のロールにわたって 15 件の求人情報が表示されます。

             title              |    company     |   role    | openings
---------------------------------+----------------+-----------+----------
 Senior Backend Engineer         | Stripe         | Backend   |        3
 Backend Engineer (Payments)     | Square         | Backend   |        3
 Cloud Architect                 | Google Cloud   | Cloud     |        1
 ...
(15 rows)

職務記述書のエンベディングを生成する

jobs テーブルの description_embedding 列は現在 NULL です。Cloud SQL の組み込み google_ml_integration 拡張機能は、SQL から Vertex AI を直接呼び出す embedding() 関数を提供します。Python スクリプトや外部 SDK は必要ありません。

バックグラウンドでエンベディングの生成を開始します。これにより、Vertex AI が呼び出され、15 個の求人情報のそれぞれに対して gemini-embedding-001 モデルを使用して 3,072 次元のベクトルが生成されます。

psql "host=127.0.0.1 port=5432 dbname=jobs_db user=postgres password=$DB_PASSWORD" \
  -c "UPDATE jobs SET description_embedding = embedding('gemini-embedding-001', description)::vector;" &

このスクリプトは次の処理を行います。

  • embedding('gemini-embedding-001', description) - SQL から Vertex AI の Gemini エンベディング モデルを直接呼び出し、各ジョブの description テキストを渡します。これは、シード スクリプトにインストールした google_ml_integration 拡張機能です。
  • ::vector - 返された浮動小数点配列を pgvector の vector 型にキャストして、距離演算子で保存してクエリできるようにします。
  • UPDATE は 15 行すべてで実行され、職務説明ごとに 1 つの 3, 072 次元エンベディングが生成されます。
  • & はコマンドをバックグラウンドで実行するため、Vertex AI がエンベディングを処理している間も作業を続行できます。

以前のバックグラウンド プロセス実行と同様に、現在のターミナルにプロセスのログが出力されます。Cloud Shell で新しいターミナルタブを開き(+ アイコンをクリック)、集中できるようにしましょう。

b01e3fbd89f17332.png

作業ディレクトリに再度移動し、以前のセットアップ スクリプトを使用してプロジェクトを有効にします。

cd ~/build-agent-adk-toolbox-cloudsql
bash setup_verify_trial_project.sh && source .env

その後、次のプロセスに進むことができます。

6. MCP Toolbox for Databases を構成する

このステップでは、MCP Toolbox for Databases を導入し、Cloud SQL インスタンスに接続するように構成して、2 つの標準 SQL クエリツールを定義します。

MCP とは?ツールボックスを使用する理由

e7b9be2e1c98b4db.png

MCP(Model Context Protocol)は、AI エージェントが外部ツールを検出して操作する方法を標準化するオープン プロトコルです。クライアント / サーバー モデルを定義します。エージェントは MCP クライアントをホストし、ツールは MCP サーバーによって公開されます。MCP 互換のクライアントは MCP 互換のサーバーを使用できます。エージェントは、各ツールにカスタム統合コードを必要としません。

d5baa77423f0f465.png

データベース向け MCP ツールボックスは、データベース アクセス専用に構築されたオープンソースの MCP サーバーです。これがないと、データベース接続を開き、接続プールを管理し、SQL インジェクションを防ぐためにパラメータ化されたクエリを作成し、エラーを処理し、そのすべてのコードをエージェント内に埋め込む Python 関数を作成する必要があります。データベース アクセスを必要とするすべてのエージェントがこの作業を繰り返します。クエリを変更すると、エージェントが再デプロイされます。

Toolbox では、YAML ファイルを記述します。各ツールは、パラメータ化された SQL ステートメントにマッピングされます。ツールボックスは、接続プーリング、パラメータ化されたクエリ、認証、オブザーバビリティを処理します。ツールがエージェントから切り離されているため、エージェント コードを変更せずに tools.yaml を編集して Toolbox を再起動することで、クエリを更新できます。同じツールが、ADK、LangGraph、LlamaIndex、または MCP 互換のフレームワークで動作します。

ツールの構成を記述する

次に、Cloud Shell コードエディタで tools.yaml というファイルを作成して、ツールの構成を設定する必要があります。

cloudshell edit tools.yaml

このファイルでは、マルチドキュメント YAML が使用されています。--- で区切られた各ブロックは、スタンドアロン リソースです。すべてのリソースには、リソースの内容(データベース接続の場合は sources、エージェント呼び出し可能なアクションの場合は tools)を宣言する kind と、バックエンド(移行元の場合は cloud-sql-postgres、SQL ベースのツールの場合は postgres-sql)を指定する type があります。ツールは name でソースを参照します。これにより、ツールボックスは実行する接続プールを認識します。環境変数は ${VAR_NAME} 構文を使用し、起動時に解決されます。

次のスクリプトを tools.yaml ファイルにコピーします。

# tools.yaml

# --- Data Source ---
kind: sources
name: jobs-db
type: cloud-sql-postgres
project: ${GOOGLE_CLOUD_PROJECT}
region: ${REGION}
instance: jobs-instance
database: jobs_db
user: postgres
password: ${DB_PASSWORD}

---

このスクリプトでは、次のリソースを定義します。

  • Sourcejobs-db) - Cloud SQL PostgreSQL インスタンスへの接続方法を Toolbox に指示します。cloud-sql-postgres タイプは内部で Cloud SQL コネクタを使用し、認証と安全な接続を自動的に処理します。${GOOGLE_CLOUD_PROJECT}${REGION}${DB_PASSWORD} のプレースホルダは、起動時に環境変数から解決されます。

次に、tools.yaml--- 記号の下に次のスクリプトを追加します。

# --- Tool 1: Search jobs by role and/or tech stack ---
kind: tools
name: search-jobs
type: postgres-sql
source: jobs-db
description: >-
  Search for job listings by role category and/or tech stack.
  Use this tool when the developer wants to browse listings
  by role (e.g., Backend, Frontend, Data) or find jobs
  using a specific technology. Both parameters accept an
  empty string to match all values.
statement: |
  SELECT title, company, role, tech_stack, salary_range, location, openings
  FROM jobs
  WHERE ($1 = '' OR LOWER(role) = LOWER($1))
  AND ($2 = '' OR LOWER(tech_stack) LIKE '%' || LOWER($2) || '%')
  ORDER BY title
  LIMIT 10
parameters:
  - name: role
    type: string
    description: "The role category to filter by (e.g., 'Backend', 'Frontend', 'Data/AI', 'DevOps'). Use empty string for all roles."
  - name: tech_stack
    type: string
    description: "A technology to search for in the tech stack (partial match, e.g., 'Python', 'Kubernetes'). Use empty string for all tech stacks."

---

# --- Tool 2: Get full details for a specific job ---
kind: tools
name: get-job-details
type: postgres-sql
source: jobs-db
description: >-
  Get full details for a specific job listing including its description,
  salary range, location, and number of openings. Use this tool when the
  developer asks about a particular job by title or company.
statement: |
  SELECT title, company, role, tech_stack, salary_range, location, openings, description
  FROM jobs
  WHERE LOWER(title) LIKE '%' || LOWER($1) || '%'
  OR LOWER(company) LIKE '%' || LOWER($1) || '%'
parameters:
  - name: search_term
    type: string
    description: "The job title or company name to look up (partial match supported)."

---

このスクリプトでは、次のリソースを定義します。

  • ツール 1 と 2search-jobsget-job-details) - 標準 SQL クエリツール。各マッピングは、ツール名(エージェントが認識する名前)をパラメータ化された SQL ステートメント(データベースが実行するステートメント)にマッピングします。パラメータは $1$2 位置プレースホルダを使用します。Toolbox はこれらをプリペアド ステートメントとして実行するため、SQL インジェクションを防ぐことができます。

次に、tools.yaml--- 記号の下に次のスクリプトを追加します。

# --- Embedding Model ---
kind: embeddingModels
name: gemini-embedding
type: gemini
model: gemini-embedding-001
dimension: 3072

---

このスクリプトでは、次のリソースを定義します。

  • エンベディング モデルgemini-embedding) - 3,072 次元のテキスト エンベディングを生成するために Gemini の gemini-embedding-001 モデルを呼び出すように Toolbox を構成します。Toolbox は、アプリケーションのデフォルト認証情報(ADC)を使用して認証を行います。Cloud Shell や Cloud Run で API キーは必要ありません。ここで構成する dimension は、データベースのシード用に以前に構成したものと同じである必要があります。

次に、tools.yaml--- 記号の下に次のスクリプトを追加します。

# --- Tool 3: Semantic search by description ---
kind: tools
name: search-jobs-by-description
type: postgres-sql
source: jobs-db
description: >-
  Find jobs that match a natural language description of what the developer
  is looking for. Use this tool when the developer describes their ideal job
  using interests, work style, career goals, or project type rather than a
  specific role or tech stack. Examples: "I want to work on AI chatbots,"
  "a remote job at a fintech startup," "something involving infrastructure
  and reliability."
statement: |
  SELECT title, company, role, tech_stack, salary_range, location, description
  FROM jobs
  WHERE description_embedding IS NOT NULL
  ORDER BY description_embedding <=> $1
  LIMIT 5
parameters:
  - name: search_query
    type: string
    description: "A natural language description of the kind of job the developer is looking for."
    embeddedBy: gemini-embedding

---

このスクリプトでは、次のリソースを定義します。

  • Tool 3search-jobs-by-description) - ベクトル検索ツール。search_query パラメータには embeddedBy: gemini-embedding があります。これは、Toolbox に未加工のテキストをインターセプトしてエンベディング モデルに送信し、結果のベクトルを SQL ステートメントで使用するように指示します。<=> 演算子は pgvector のコサイン距離です。値が小さいほど、説明が類似していることを意味します。

最後に、tools.yaml--- 記号の下に最後のツールを追加します。

# --- Tool 4: Add a new job listing with automatic embedding ---
kind: tools
name: add-job
type: postgres-sql
source: jobs-db
description: >-
  Add a new job listing to the platform. Use this tool when a user asks
  to post a job that is not currently listed.
statement: |
  INSERT INTO jobs (title, company, role, tech_stack, salary_range, location, openings, description, description_embedding)
  VALUES ($1, $2, $3, $4, $5, $6, CAST($7 AS INTEGER), $8, $9)
  RETURNING title, company
parameters:
  - name: title
    type: string
    description: "The job title (e.g., 'Senior Backend Engineer')."
  - name: company
    type: string
    description: "The company name (e.g., 'Stripe', 'Spotify')."
  - name: role
    type: string
    description: "The role category (e.g., 'Backend', 'Frontend', 'Data/AI', 'DevOps')."
  - name: tech_stack
    type: string
    description: "Comma-separated list of technologies (e.g., 'Python, FastAPI, GCP')."
  - name: salary_range
    type: string
    description: "The salary range (e.g., '$150-200K/year')."
  - name: location
    type: string
    description: "Work location and arrangement (e.g., 'Remote')."
  - name: openings
    type: string
    description: "The number of open positions."
  - name: description
    type: string
    description: "A short description of the job (2-3 sentences)."
  - name: description_vector
    type: string
    description: "Auto-generated embedding vector for the job description."
    valueFromParam: description
    embeddedBy: gemini-embedding

このスクリプトでは、次のリソースを定義します。

  • ツール 4add-job) - ベクトル取り込みを示します。description_vector パラメータには、次の 2 つの特別なフィールドがあります。
  • valueFromParam: description - ツールボックスは、description パラメータの値をこのパラメータにコピーします。LLM はこのパラメータを認識しません。
  • embeddedBy: gemini-embedding - ツールボックスは、コピーしたテキストをベクトルに埋め込んでから SQL に渡します。

結果: エージェントがエンベディングについて何も知らなくても、1 つのツール呼び出しで元の説明テキストとそのベクトル エンベディングの両方が保存されます。

マルチドキュメント YAML 形式では、各リソースが --- で区切られます。各ドキュメントには、その内容を定義する kindnametype フィールドがあります。要約すると、次のすべての項目をすでに構成しています。

  • ソース データベースを定義する
  • 標準フィルタを使用してデータベースをクエリするツール(ツール 1 と 2)を定義します。
  • エンベディング モデルを定義する
  • ベクトル検索を行うツール(ツール 3)をデータベースに定義する
  • ベクトルデータの取り込み(ツール 4)を行うツールをデータベースに定義する

エンベディングを確認する

Toolbox を起動する前に、バックグラウンド エンベディングの生成が完了していることを確認します。すべてのジョブにエンベディングが含まれていることを確認します。

psql "host=127.0.0.1 port=5432 dbname=jobs_db user=postgres password=$DB_PASSWORD" \
  -c "SELECT title, (description_embedding IS NOT NULL) AS has_embedding FROM jobs ORDER BY title;"

すべての行の has_embedding 列に t(true)が表示されます。そうでない場合は、すべての行エンベディング作成プロセスが完了するまで待機することを選択できます。

           title            | has_embedding 
-----------------------------+---------------
 AI Engineer                 | t
 Backend Engineer (Payments) | t
 Cloud Architect             | t
 Data Engineer               | t
 DevOps Engineer             | t
 Frontend Engineer           | t
 Full Stack Engineer         | t

ツールボックス サーバーを起動する

セットアップ ステップで、toolbox 実行可能ファイルをすでにダウンロードしています。このバイナリ ファイルが存在し、正常にダウンロードされたことを確認します。存在しない場合は、ダウンロードして完了するまで待ちます。

cd ~/build-agent-adk-toolbox-cloudsql
if [ ! -f toolbox ]; then
  curl -O https://storage.googleapis.com/genai-toolbox/v0.27.0/linux/amd64/toolbox
fi
chmod +x toolbox

必要な環境変数をエクスポートし、Toolbox を起動します。構成にエンベディング モデルが含まれているため、GOOGLE_CLOUD_LOCATION 変数と GOOGLE_GENAI_USE_VERTEXAI 変数が必要です。GOOGLE_GENAI_USE_VERTEXAI は Gemini SDK に Vertex AI を介して(コンシューマー Gemini API ではなく)ルーティングするように指示し、GOOGLE_CLOUD_LOCATION は使用するリージョン エンドポイントを指定します。

export GOOGLE_CLOUD_PROJECT=$GOOGLE_CLOUD_PROJECT
export GOOGLE_CLOUD_LOCATION=$GOOGLE_CLOUD_LOCATION
export GOOGLE_GENAI_USE_VERTEXAI=true
export DB_PASSWORD=$DB_PASSWORD
export REGION=$REGION
./toolbox --tools-file tools.yaml &

次のように、サーバーの準備が整ったことを確認する出力が表示されます。

... INFO "Initialized 0 authServices: " 
... INFO "Initialized 1 embeddingModels: gemini-embedding" 
... INFO "Initialized 4 tools: add-job, search-jobs, get-job-details, search-jobs-by-description" 
...
... INFO "Server ready to serve!"

前の手順と同様に、別のプロセスが生成され、出力が吐き出されます。Cloud Shell で新しいターミナルタブを開き(+ アイコンをクリック)、集中できるようにしましょう。

b01e3fbd89f17332.png

作業ディレクトリに再度移動し、以前のセットアップ スクリプトを使用してプロジェクトを有効にします。

cd ~/build-agent-adk-toolbox-cloudsql
bash setup_verify_trial_project.sh && source .env

ツールを確認する

Toolbox API をクエリして、登録されているすべてのツールを一覧表示します。

curl -s http://localhost:5000/api/toolset | python3 -m json.tool

ツールとその説明とパラメータが表示されます。以下のようにします。

...
       
"search-jobs-by-description": {
            "description": "Find jobs that match a natural language description of what the developer is looking for. Use this tool when the developer describes their ideal job using interests, work style, career goals, or project type rather than a specific role or tech stack. Examples: \"I want to work on AI chatbots,\" \"a remote job at a fintech startup,\" \"something involving infrastructure and reliability.\"",
            "parameters": [
                {
                    "name": "search_query",
                    "type": "string",
                    "required": true,
                    "description": "A natural language description of the kind of job the developer is looking for.",
                    "authSources": []
                }
            ],
            "authRequired": []
        }
...

search-jobs ツールを直接テストします。

curl -s -X POST http://localhost:5000/api/tool/search-jobs/invoke \
  -H "Content-Type: application/json" \
  -d '{"role": "Backend", "tech_stack": ""}' | jq '.result | fromjson'

レスポンスには、シードデータから 2 つのバックエンド エンジニアリング ジョブが含まれているはずです。

[
  {
    "title": "Backend Engineer (Payments)",
    "company": "Square",
    "role": "Backend",
    "tech_stack": "Java, Spring Boot, PostgreSQL, Kafka",
    "salary_range": "$160-220K/year",
    "location": "San Francisco, Hybrid",
    "openings": 3
  },
  {
    "title": "Senior Backend Engineer",
    "company": "Stripe",
    "role": "Backend",
    "tech_stack": "Go, PostgreSQL, gRPC, Kubernetes",
    "salary_range": "$180-250K/year",
    "location": "San Francisco, Hybrid",
    "openings": 3
  }
]

7. ADK エージェントをビルドする

このステップでは、ADK エージェントを実行中の Toolbox サーバーに接続し、標準クエリ、セマンティック検索、ベクトル取り込みの 4 つのツールすべてをテストします。エージェント コードは最小限です。すべてのデータベース ロジックは tools.yaml にあります。

エージェントの環境を構成する

ADK は、前の手順ですでに設定したシェル環境から GOOGLE_GENAI_USE_VERTEXAIGOOGLE_CLOUD_PROJECTGOOGLE_CLOUD_LOCATION を読み取ります。エージェント固有の変数は TOOLBOX_URL のみです。エージェントの .env ファイルに追加します。

echo -e "\nTOOLBOX_URL=http://127.0.0.1:5000" >> jobs_agent/.env

エージェント モジュールを更新する

Cloud Shell エディタで jobs_agent/agent.py を開く

cloudshell edit jobs_agent/agent.py

次のコードで内容を上書きします。

# jobs_agent/agent.py
import os

from google.adk.agents import LlmAgent
from toolbox_adk import ToolboxToolset

TOOLBOX_URL = os.environ.get("TOOLBOX_URL", "http://127.0.0.1:5000")

toolbox = ToolboxToolset(TOOLBOX_URL)

root_agent = LlmAgent(
    name="jobs_agent",
    model="gemini-2.5-flash",
    instruction="""You are a helpful assistant at "TechJobs," a tech job listing platform.

Your job:
- Help developers browse job listings by role or tech stack.
- Provide full details about specific positions, including salary range and number of openings.
- Recommend jobs based on natural language descriptions of what the developer is looking for.
- Add new job listings to the platform when asked.

When a developer asks about a specific job by title or company, use the get-job-details tool.
When a developer asks for a specific role category or tech stack, use the search-jobs tool.
When a developer describes what kind of job they want — by interest area, work style,
career goals, or project type — use the search-jobs-by-description tool for semantic search.
When in doubt between search-jobs and search-jobs-by-description, prefer
search-jobs-by-description — it searches job descriptions and finds more relevant matches.

If a position has no openings (openings is 0), let the developer know
and suggest similar alternatives from the search results.

Be conversational, knowledgeable, and concise.""",
    tools=[toolbox],
)

ここにはデータベース コードはありません。ToolboxToolset は起動時に Toolbox サーバーに接続し、利用可能なすべてのツールを読み込みます。エージェントはツールを名前で呼び出します。Toolbox は、これらの呼び出しを Cloud SQL に対する SQL クエリに変換します。

TOOLBOX_URL 環境変数は、ローカル開発ではデフォルトで http://127.0.0.1:5000 に設定されます。後で Cloud Run にデプロイするときに、Toolbox サービスの Cloud Run URL でこの値をオーバーライドします。コードの変更は必要ありません。

この手順では、2 つの標準ツール(search-jobsget-job-details)のみを参照しています。次のステップで、セマンティック検索ツールと取り込みツールを追加するときに、この手順を拡張します。

エージェントをテストする

ADK 開発 UI を起動します。

cd ~/build-agent-adk-toolbox-cloudsql
uv run adk web

Cloud Shell の [ウェブ プレビュー] 機能を使用するか、ターミナルに表示された URL を Ctrl+クリックして、ターミナルに表示された URL(通常は http://localhost:8000)を開きます。左上のエージェント プルダウンから [jobs_agent] を選択します。

標準クエリをテストする

次のプロンプトを試して、標準 SQL ツールを検証します。

What backend engineering jobs do you have?
Any jobs using Kubernetes?
Tell me about the Cloud Architect position

93ac33e7f73aa0b9.png 240c53376042a916.png

特定のロールや技術スタックにマッピングされない自然言語の説明を試してください。

I want a remote job where I can work on AI and machine learning
Find me something in fintech with good work-life balance
I'm interested in infrastructure and reliability engineering

エージェントは、クエリタイプに基づいて適切なツールを選択しようとします。構造化フィルタは search-jobs を通過し、自然言語の説明は search-jobs-by-description を通過します。

b0ea629f5c9b4c26.png

テスト ベクトルの取り込み

エージェントに新しいジョブを追加するよう依頼します。

Add a new job: 'Robotics Software Engineer' at Boston Dynamics, role Robotics, tech stack: Python, C++, ROS, Computer Vision, salary $160-230K/year, location Waltham MA, Hybrid, 2 openings. Description: Design and implement autonomous navigation and manipulation algorithms for next-generation robots. Work on perception pipelines using computer vision and lidar, develop motion planning software in C++ and Python, and test systems on real hardware in warehouse and logistics environments.

c601a7a9bc0a705b.png

検索してみましょう。

Find me jobs involving autonomous systems and working with physical hardware

エンベディングは INSERT 時に自動的に生成されたため、個別のステップは必要ありません。

5a3d8e6f523dc18b.png

これで、ADK、MCP ツールボックス、CloudSQL を利用した完全に動作するエージェント RAG アプリケーションが完成しました。これで完了です。さらに、これらのアプリを Cloud Run にデプロイしてみましょう。

次に、Ctrl+C キーを 2 回押してプロセスを強制終了し、デベロッパー UI を停止してから続行します。

8. Cloud Run にデプロイする

エージェントとツールボックスはローカルで動作します。このステップでは、両方を Cloud Run サービスとしてデプロイし、インターネット経由でアクセスできるようにします。ツールボックス サービスは Cloud Run で MCP サーバーとして実行され、エージェント サービスがそれに接続します。

デプロイ用に Toolbox を準備する

Toolbox サービスのデプロイ ディレクトリを作成します。

cd ~/build-agent-adk-toolbox-cloudsql
mkdir -p deploy-toolbox
cp toolbox tools.yaml deploy-toolbox/

Toolbox の Dockerfile を作成します。Cloud Shell エディタで deploy-toolbox/Dockerfile を開きます。

cloudshell edit deploy-toolbox/Dockerfile

次のスクリプトをコピーします。

# deploy-toolbox/Dockerfile
FROM debian:bookworm-slim
RUN apt-get update && apt-get install -y ca-certificates && rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY toolbox tools.yaml ./
RUN chmod +x toolbox
EXPOSE 8080
CMD ["./toolbox", "--tools-file", "tools.yaml", "--address", "0.0.0.0", "--port", "8080"]

Toolbox バイナリと tools.yaml は、最小限の Debian イメージにパッケージ化されます。Cloud Run はトラフィックをポート 8080 に転送します。

ツールボックス サービスをデプロイする

cd ~/build-agent-adk-toolbox-cloudsql
gcloud run deploy toolbox-service \
  --source deploy-toolbox/ \
  --region $REGION \
  --set-env-vars "DB_PASSWORD=$DB_PASSWORD,GOOGLE_CLOUD_PROJECT=$GOOGLE_CLOUD_PROJECT,REGION=$REGION,GOOGLE_CLOUD_LOCATION=$GOOGLE_CLOUD_LOCATION,GOOGLE_GENAI_USE_VERTEXAI=true" \
  --allow-unauthenticated \
  --quiet

このコマンドは、ソースを Cloud Build に送信し、コンテナ イメージをビルドして Artifact Registry に push し、Cloud Run にデプロイします。数分かかります。Cloud Shell で新しいターミナルタブを開き([+] アイコンをクリック)、集中できるようにしましょう。

b01e3fbd89f17332.png

作業ディレクトリに再度移動し、以前のセットアップ スクリプトを使用してプロジェクトを有効にします。

cd ~/build-agent-adk-toolbox-cloudsql
bash setup_verify_trial_project.sh && source .env

デプロイ用にエージェントを準備する

ツールボックスのビルド中に、エージェントのデプロイ ファイルを設定します。

プロジェクトのルートに Dockerfile を作成します。Cloud Shell エディタで Dockerfile を開きます。

cloudshell edit Dockerfile

次に、次のコンテンツをコピーします。

# Dockerfile
FROM ghcr.io/astral-sh/uv:python3.12-trixie-slim
WORKDIR /app
COPY pyproject.toml ./
COPY uv.lock ./
RUN uv sync --no-dev
COPY jobs_agent/ jobs_agent/
EXPOSE 8080
CMD ["uv", "run", "adk", "web", "--host", "0.0.0.0", "--port", "8080"]

この Dockerfile は、Python と uv の両方がプリインストールされている ghcr.io/astral-sh/uv をベースイメージとして使用します。pip を介して uv を個別にインストールする必要はありません。

.dockerignore ファイルを作成して、コンテナ イメージから不要なファイルを除外します。

cloudshell edit .dockerignore

次のスクリプトをコピーして貼り付けます。

# .dockerignore
.venv/
__pycache__/
*.pyc
.env
jobs_agent/.env
toolbox
tools.yaml
seed.sql
deploy-toolbox/

エージェント サービスをデプロイする

Toolbox のデプロイが完了するまで待ちます。次のコマンドを使用して Cloud Run URL を取得します。

TOOLBOX_URL=$(gcloud run services describe toolbox-service \
  --region=$REGION \
  --format='value(status.url)')
echo "Toolbox URL: $TOOLBOX_URL"

次のような出力が表示されます。

Toolbox URL: https://toolbox-service-xxxxxx-xx.a.run.app

次に、デプロイされた Toolbox が動作していることを確認します。

curl -s "$TOOLBOX_URL/api/toolset" | python3 -m json.tool | head -5

この例のような出力が表示された場合、デプロイはすでに成功しています。

{
    "serverVersion": "0.27.0+binary.linux.amd64.c5524d3",
    "tools": {
        "add-job": {
            "description": "Add a new job listing to the platform. Use this tool when a user asks to post a job that is not currently listed.",

次に、Toolbox の URL を環境変数として渡して、エージェントをデプロイします。

cd ~/build-agent-adk-toolbox-cloudsql
gcloud run deploy jobs-agent \
  --source . \
  --region $REGION \
  --set-env-vars "TOOLBOX_URL=$TOOLBOX_URL,GOOGLE_CLOUD_PROJECT=$GOOGLE_CLOUD_PROJECT,GOOGLE_CLOUD_LOCATION=$GOOGLE_CLOUD_LOCATION,GOOGLE_GENAI_USE_VERTEXAI=TRUE" \
  --allow-unauthenticated \
  --quiet

エージェント コードは、環境から TOOLBOX_URL を読み取ります(これは以前に設定したものです)。ローカルでは http://127.0.0.1:5000 を指し、Cloud Run では Toolbox サービスの URL を指します。コードを変更する必要はありません。

デプロイしたエージェントをテストする

エージェントの Cloud Run URL を取得します。

AGENT_URL=$(gcloud run services describe jobs-agent \
  --region=$REGION \
  --format='value(status.url)')
echo "Agent URL: $AGENT_URL"

ブラウザでその URL を開きます。ADK デベロッパー UI が読み込まれます。これは、ローカルで使用していたのと同じインターフェースで、Cloud Run で実行されています。

プルダウンから [jobs_agent] を選択してテストします。

What backend engineering jobs do you have?
I want a remote job working on AI and machine learning

どちらのクエリも、デプロイされたサービスを介して機能します。Cloud Run のエージェントが Cloud Run の Toolbox を呼び出し、Cloud SQL にクエリを実行します。

9. おめでとうございます / クリーンアップ

MCP Toolbox for Databases を使用して ADK エージェントと Cloud SQL PostgreSQL を接続するスマートな求人掲示板アシスタントを構築してデプロイしました。このアシスタントは、標準の SQL クエリとセマンティック ベクトル検索の両方を使用します。

学習した内容

  • MCP が AI エージェントのツールアクセスを標準化する方法と、MCP Toolbox for Databases がこれをデータベース オペレーションに適用する方法(カスタム データベース コードを宣言型 YAML 構成に置き換える)
  • cloud-sql-postgres ソースタイプを使用して Cloud SQL PostgreSQL を Toolbox データソースとして構成する方法
  • SQL インジェクションを防ぐパラメータ化されたステートメントを使用して標準 SQL クエリツールを定義する方法
  • pgvector と gemini-embedding-001 を使用してベクトル検索を有効にする方法(クエリ エンベディングを自動化するための embeddedBy パラメータを使用)
  • valueFromParam が自動ベクトル取り込みを可能にする仕組み - LLM がテキストの説明を提供し、Toolbox がテキストとともにベクトルをコピー、埋め込み、保存する
  • ADK の ToolboxToolset が実行中の Toolbox サーバーからツールを読み込み、エージェント コードを最小限に抑え、データベース ロジックを完全に分離する方法
  • ツールボックス MCP サーバーと ADK エージェントの両方を個別のサービスとして Cloud Run にデプロイする方法

クリーンアップ

この Codelab で作成したリソースについて、Google Cloud アカウントに課金されないようにするには、個々のリソースを削除するか、プロジェクト全体を削除します。

最も簡単にクリーンアップするには、プロジェクトを削除します。これにより、プロジェクトに関連付けられているすべてのリソースが削除されます。

gcloud projects delete $GOOGLE_CLOUD_PROJECT

オプション 2: 個々のリソースを削除する

プロジェクトを保持し、この Codelab で作成したリソースのみを削除する場合は:

gcloud run services delete jobs-agent --region=$REGION --quiet
gcloud run services delete toolbox-service --region=$REGION --quiet
gcloud sql instances delete jobs-instance --quiet
gcloud artifacts repositories delete cloud-run-source-deploy --location=$REGION --quiet 2>/dev/null