Database sebagai Alat: RAG Agentic dengan ADK, MCP Toolbox, dan Cloud SQL

1. Pengantar

Kualitas agen AI bergantung pada data yang dapat diaksesnya. Sebagian besar data dunia nyata berada di database — dan menghubungkan agen ke database biasanya berarti menulis pengelolaan koneksi, logika kueri, dan menyematkan pipeline di dalam kode agen Anda. Setiap agen yang memerlukan akses database mengulangi pekerjaan ini, dan setiap perubahan kueri memerlukan deployment ulang agen.

Codelab ini menunjukkan pendekatan yang berbeda. Anda mendeklarasikan alat database dalam file YAML — kueri SQL standar, penelusuran kemiripan vektor, bahkan pembuatan embedding otomatis — dan MCP Toolbox for Databases menangani semua operasi database sebagai server MCP. Kode agen Anda tetap minimal: muat alat, biarkan Gemini memutuskan alat mana yang akan dipanggil.

Yang akan Anda bangun

Asisten Papan Lowongan Pintar untuk "TechJobs" — agen ADK yang didukung oleh Gemini yang membantu developer menjelajahi daftar lowongan di bidang teknologi menggunakan filter standar (peran, stack teknologi) dan menemukan lowongan melalui deskripsi bahasa alami seperti "Saya ingin bekerja dari jarak jauh sebagai developer chatbot AI". Agen membaca dan menulis ke database Cloud SQL PostgreSQL sepenuhnya melalui MCP Toolbox for Databases, yang menangani semua akses database — termasuk pembuatan penyematan otomatis untuk penelusuran vektor. Pada akhirnya, Toolbox dan agen akan berjalan di Cloud Run.

eb6de681c40990c1.jpeg

Yang akan Anda pelajari

  • Cara MCP (Model Context Protocol) menstandardisasi akses alat untuk agen AI, dan cara MCP Toolbox for Databases menerapkan hal ini pada operasi database
  • Menyiapkan MCP Toolbox for Databases sebagai middleware antara agen ADK dan Cloud SQL PostgreSQL
  • Tentukan alat database secara deklaratif di tools.yaml — tidak ada kode database di agen Anda
  • Membangun agen ADK yang memuat alat dari server Toolbox yang sedang berjalan menggunakan ToolboxToolset
  • Buat embedding vektor menggunakan fungsi embedding() bawaan Cloud SQL dan aktifkan penelusuran semantik dengan pgvector
  • Gunakan fitur valueFromParam untuk penyerapan vektor otomatis pada operasi tulis
  • Men-deploy server Toolbox dan agen ADK ke Cloud Run

Prasyarat

  • Akun Google Cloud dengan akun penagihan uji coba
  • Pemahaman dasar tentang Python dan SQL
  • Tidak diperlukan pengalaman sebelumnya dengan ADK, MCP Toolbox, atau pgvector

2. Menyiapkan Lingkungan Anda

Langkah ini menyiapkan lingkungan Cloud Shell, mengonfigurasi project Google Cloud, dan meng-clone repositori referensi.

Buka Cloud Shell

Buka Cloud Shell di browser Anda. Cloud Shell menyediakan lingkungan yang telah dikonfigurasi sebelumnya dengan semua alat yang Anda perlukan untuk codelab ini. Klik Authorize saat diminta untuk

Kemudian, klik "View" -> "Terminal" untuk membuka terminal.Antarmuka Anda akan terlihat mirip dengan ini

86307fac5da2f077.png

Ini akan menjadi antarmuka utama kita, IDE di atas, terminal di bawah

Menyiapkan direktori kerja Anda

Buat direktori kerja Anda. Semua kode yang Anda tulis dalam codelab ini ada di sini:

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

Menyiapkan project Google Cloud

Buat file .env dengan variabel lokasi:

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

Download skrip penyiapan project ke direktori kerja Anda:

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

Jalankan skrip. Skrip ini memverifikasi akun penagihan uji coba Anda, membuat project baru (atau memvalidasi project yang ada), menyimpan project ID Anda ke file .env di direktori saat ini, dan menetapkan project aktif di gcloud.

bash setup_verify_trial_project.sh && source .env

Skrip akan:

  1. Pastikan Anda memiliki akun penagihan uji coba yang aktif
  2. Periksa project yang ada di .env (jika ada)
  3. Buat project baru atau gunakan kembali project yang sudah ada
  4. Menautkan akun penagihan uji coba ke project Anda
  5. Simpan project ID ke .env
  6. Menetapkan project sebagai project gcloud yang aktif

Pastikan project disetel dengan benar dengan memeriksa teks berwarna kuning di samping direktori kerja Anda di perintah terminal Cloud Shell. Project ID Anda akan ditampilkan.

dcba35ce1389f313.png

Jika sesi Cloud Shell Anda direset kapan saja selama codelab ini, kembali ke direktori kerja Anda dan jalankan kembali bash setup_verify_trial_project.sh && source .env untuk memulihkan konfigurasi project Anda. Pastikan teks project ID berwarna kuning muncul kembali di prompt terminal.

gcloud services enable \
  aiplatform.googleapis.com \
  sqladmin.googleapis.com \
  compute.googleapis.com \
  run.googleapis.com \
  cloudbuild.googleapis.com \
  artifactregistry.googleapis.com
  • Vertex AI API (aiplatform.googleapis.com) — agen Anda menggunakan model Gemini, dan Toolbox menggunakan embedding API untuk penelusuran vektor.
  • Cloud SQL Admin API (sqladmin.googleapis.com) — Anda menyediakan dan mengelola instance PostgreSQL.
  • Compute Engine API (compute.googleapis.com) — diperlukan untuk membuat instance Cloud SQL.
  • Cloud Run, Cloud Build, Artifact Registry — digunakan dalam langkah deployment nanti di codelab ini

3. Membuat Instance Database

Langkah ini menyiapkan pembuatan instance Cloud SQL di latar belakang — instance akan disediakan saat Anda melanjutkan tutorial.

Mulai pembuatan instance

Tambahkan sandi database ke file .env Anda dan muat ulang:

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

Mulai pembuatan instance Cloud SQL. Proses ini berjalan di latar belakang sehingga Anda dapat terus bekerja:

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 adalah tingkat Cloud SQL dengan core khusus terkecil (1 vCPU, RAM 3,75 GB) dalam edisi ENTERPRISE. Anda dapat membaca detail selengkapnya di sini. Core khusus diperlukan untuk integrasi ML Vertex AI — tingkat core bersama (db-f1-micro, db-g1-small) tidak mendukungnya.
  • --root-password menyetel sandi untuk pengguna postgres default.
  • --enable-google-ml-integration memungkinkan integrasi bawaan Cloud SQL dengan Vertex AI, yang memungkinkan Anda memanggil model embedding langsung dari SQL menggunakan fungsi embedding().
  • & menjalankan perintah di latar belakang.

Proses ini akan berjalan di latar belakang. Selanjutnya, download program biner MCP Toolbox. Anda dapat melakukannya di terminal yang sama

Download biner Toolbox

Kita akan menggunakan MCP Toolbox dalam tutorial ini. Untungnya, MCP Toolbox dilengkapi dengan biner bawaan yang siap digunakan di lingkungan Linux. Mari kita download di latar belakang karena prosesnya cukup lama

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

Biarkan proses ini berjalan di tab saat ini (kita sudah menjalankannya di latar belakang, tetapi output akan tetap ditampilkan). Mari buka tab terminal baru di Cloud Shell (klik ikon +) agar kita bisa lebih fokus.

b01e3fbd89f17332.png

Buka direktori kerja Anda lagi dan aktifkan project menggunakan skrip penyiapan sebelumnya.

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

Langkah ini menyiapkan project Python, menginstal dependensi, dan membuat struktur direktori agen ADK

4. Melakukan Inisialisasi Project Agen

Menyiapkan project Python

uv adalah pengelola project dan paket Python yang cepat dan ditulis dalam Rust ( dokumentasi uv ). Codelab ini menggunakannya untuk kecepatan dan kesederhanaan.

Inisialisasi project Python dan tambahkan dependensi yang diperlukan:

uv init
uv add google-adk==1.25.0 toolbox-adk==0.6.0
  • google-adk — Agent Development Kit Google, termasuk Gemini SDK
  • toolbox-adk — Integrasi ADK untuk MCP Toolbox for Databases.

Buat struktur direktori agen

ADK mengharapkan tata letak folder tertentu: direktori yang dinamai sesuai agen Anda yang berisi __init__.py, agent.py, dan .env. Untuk membantu hal ini, ada perintah bawaan untuk membuat struktur dengan cepat:

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

Direktori Anda sekarang akan terlihat seperti ini:

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

5. Menambahkan Data Listingan Lowongan

Langkah ini menulis data awal, menunggu instance Cloud SQL selesai di-provisioning, dan memuat tabel jobs dengan 15 listingan pekerjaan dan penyematan deskripsinya

Tulis SQL seed

Kita akan membuat file bernama seed.sql di Cloud Shell Editor dengan konten listingan pekerjaan. Tindakan ini akan membuat tabel jobs dengan dukungan pgvector dan menyisipkan 15 daftar lowongan di perusahaan teknologi.

Pertama, buat file seed.sql menggunakan perintah berikut:

cloudshell edit seed.sql

Kemudian, salin skrip ini ke dalam file

-- 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.');

Skrip awal menginstal dua ekstensi PostgreSQL:

  • google_ml_integration — menyediakan fungsi SQL embedding(), yang memanggil model embedding Vertex AI langsung dari SQL. Ini adalah ekstensi tingkat database yang membuat fungsi ML tersedia di dalam jobs_db. Flag tingkat instance (--enable-google-ml-integration) yang Anda tetapkan selama pembuatan instance memungkinkan VM Cloud SQL menjangkau Vertex AI — ekstensi ini membuat fungsi SQL tersedia dalam database tertentu ini.
  • vector (pgvector) — menambahkan jenis data vector dan operator jarak untuk menyimpan dan membuat kueri penyematan.

Kolom description_embedding adalah vector(3072) — kolom pgvector yang menyimpan vektor 3072 dimensi. Untuk saat ini, kolom tersebut adalah NULL; Anda akan membuat dan mengisi embedding pada langkah berikutnya menggunakan fungsi embedding().

Selesaikan penyiapan database

Pembuatan instance Cloud SQL yang Anda mulai pada langkah sebelumnya mungkin masih berjalan dan belum selesai. Pastikan instance sudah siap:

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

Anda akan melihat output berikut:

RUNNABLE

34f5b48006b4cb3a.png

Selanjutnya, berikan izin kepada akun layanan instance Cloud SQL untuk memanggil Vertex AI. Hal ini diperlukan untuk fungsi embedding() bawaan yang akan Anda gunakan di langkah berikutnya:

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

Setelah itu, buat database khusus untuk listingan pekerjaan:

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

Anda akan melihat output yang mengonfirmasi bahwa database telah dibuat:

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

Menghubungkan dan mengisi database

Mulai Proxy Auth Cloud SQL (cloud-sql-proxy telah diinstal sebelumnya di Cloud Shell). Hal ini memberikan koneksi yang aman dan diautentikasi dari Cloud Shell ke instance Cloud SQL Anda:

d72e56478b517b5c.jpeg

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

Jika proxy dimulai, Anda akan melihat output ini di terminal:

... 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!

Sekarang terminal saat ini akan menampilkan log proxy Cloud SQL secara berkelanjutan. Mari buka tab terminal baru di Cloud Shell (klik ikon +) agar kita bisa lebih fokus.

b01e3fbd89f17332.png

Buka direktori kerja Anda lagi dan aktifkan project menggunakan skrip penyiapan sebelumnya.

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

Kemudian, jalankan skrip seed

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

Anda akan melihat output terminal seperti ini

CREATE EXTENSION
CREATE EXTENSION
CREATE TABLE
INSERT 0 15

Mari kita verifikasi data

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;"

Anda akan melihat 15 listingan pekerjaan di berbagai peran:

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

Membuat embedding untuk deskripsi pekerjaan

Kolom description_embedding dalam tabel jobs saat ini adalah NULL. Ekstensi google_ml_integration bawaan Cloud SQL menyediakan fungsi embedding() yang memanggil Vertex AI langsung dari SQL — tidak memerlukan skrip Python atau SDK eksternal.

Mulai pembuatan embedding di latar belakang. Kode ini memanggil Vertex AI untuk membuat vektor 3072 dimensi menggunakan model gemini-embedding-001 untuk setiap 15 deskripsi pekerjaan:

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;" &

Berikut yang dilakukan skrip:

  • embedding('gemini-embedding-001', description) — memanggil model embedding Gemini Vertex AI langsung dari SQL, dengan meneruskan teks description setiap tugas. Ini adalah ekstensi google_ml_integration yang Anda instal dalam skrip awal.
  • ::vector — mentransmisikan array float yang ditampilkan ke jenis vector pgvector sehingga dapat disimpan dan dikueri dengan operator jarak.
  • UPDATE berjalan di semua 15 baris, menghasilkan satu sematan 3072 dimensi per deskripsi pekerjaan.
  • & menjalankan perintah di latar belakang sehingga Anda dapat terus bekerja saat Vertex AI memproses sematan.

Seperti eksekusi proses latar belakang sebelumnya, terminal saat ini akan menampilkan log proses. Mari buka tab terminal baru di Cloud Shell (klik ikon +) agar kita bisa lebih fokus.

b01e3fbd89f17332.png

Buka direktori kerja Anda lagi dan aktifkan project menggunakan skrip penyiapan sebelumnya.

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

Kemudian, kita dapat melanjutkan ke proses berikutnya

6. Mengonfigurasi MCP Toolbox for Databases

Langkah ini memperkenalkan MCP Toolbox for Databases, mengonfigurasinya untuk terhubung ke instance Cloud SQL Anda, dan menentukan dua alat kueri SQL standar.

Apa itu MCP dan mengapa menggunakan Toolbox?

e7b9be2e1c98b4db.png

MCP (Model Context Protocol) adalah protokol terbuka yang menstandarkan cara agen AI menemukan dan berinteraksi dengan alat eksternal. Model ini menentukan model klien-server: agen menghosting klien MCP, dan alat diekspos oleh server MCP. Klien yang kompatibel dengan MCP dapat menggunakan server yang kompatibel dengan MCP — agen tidak memerlukan kode integrasi kustom untuk setiap alat.

d5baa77423f0f465.png

MCP Toolbox for Databases adalah server MCP open source yang dibuat khusus untuk akses database. Tanpa itu, Anda akan menulis fungsi Python yang membuka koneksi database, mengelola kumpulan koneksi, membuat kueri berparameter untuk mencegah injeksi SQL, menangani error, dan menyematkan semua kode tersebut di dalam agen Anda. Setiap agen yang memerlukan akses database mengulangi pekerjaan ini. Mengubah kueri berarti men-deploy ulang agen.

Dengan Toolbox, Anda menulis file YAML. Setiap alat dipetakan ke pernyataan SQL berparameter. Toolbox menangani penggabungan koneksi, kueri berparameter, autentikasi, dan kemampuan observasi. Alat tidak terikat dengan agen — perbarui kueri dengan mengedit tools.yaml dan memulai ulang Toolbox, tanpa menyentuh kode agen. Alat yang sama berfungsi di ADK, LangGraph, LlamaIndex, atau framework yang kompatibel dengan MCP.

Menulis konfigurasi alat

Sekarang, kita perlu membuat file bernama tools.yaml di Cloud Shell Editor untuk menyiapkan konfigurasi alat

cloudshell edit tools.yaml

File menggunakan YAML multi-dokumen — setiap blok yang dipisahkan oleh --- adalah resource mandiri. Setiap resource memiliki kind yang menyatakan apa resource tersebut (sources untuk koneksi database, tools untuk tindakan yang dapat dipanggil agen) dan type yang menentukan backend (cloud-sql-postgres untuk sumber, postgres-sql untuk alat berbasis SQL). Alat mereferensikan sumbernya dengan name, sehingga Toolbox mengetahui kumpulan koneksi mana yang akan dijalankan. Variabel lingkungan menggunakan sintaksis ${VAR_NAME} dan diselesaikan saat startup.

Sekarang, salin skrip berikut terlebih dahulu ke dalam file 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}

---

Skrip ini menentukan resource berikut:

  • Sumber (jobs-db) — memberi tahu Toolbox cara terhubung ke instance Cloud SQL PostgreSQL Anda. Jenis cloud-sql-postgres menggunakan konektor Cloud SQL secara internal, menangani autentikasi dan koneksi yang aman secara otomatis. Placeholder ${GOOGLE_CLOUD_PROJECT}, ${REGION}, dan ${DB_PASSWORD} di-resolve dari variabel lingkungan saat startup.

Selanjutnya, tambahkan skrip berikut di bawah simbol --- dalam 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)."

---

Skrip ini menentukan resource berikut:

  • Alat 1 dan 2 (search-jobs, get-job-details) — alat kueri SQL standar. Setiap peta nama alat (yang dilihat agen) ke pernyataan SQL berparameter (yang dieksekusi database). Parameter menggunakan placeholder posisi $1, $2. Toolbox menjalankan perintah ini sebagai pernyataan yang sudah disiapkan, sehingga mencegah injeksi SQL.

Lanjutkan, tambahkan skrip berikut di bawah simbol --- dalam tools.yaml

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

---

Skrip ini menentukan resource berikut:

  • Model embedding (gemini-embedding) — mengonfigurasi Toolbox untuk memanggil model gemini-embedding-001 Gemini guna membuat embedding teks 3072 dimensi. Toolbox menggunakan Kredensial Default Aplikasi (ADC) untuk melakukan autentikasi — tidak memerlukan kunci API di Cloud Shell atau Cloud Run. Mencatat bahwa dimension yang dikonfigurasi di sini harus sama dengan yang sebelumnya kita konfigurasi untuk mengisi database

Lanjutkan, tambahkan skrip berikut di bawah simbol --- dalam 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

---

Skrip ini menentukan resource berikut:

  • Alat 3 (search-jobs-by-description) — alat penelusuran vektor. Parameter search_query memiliki embeddedBy: gemini-embedding, yang memberi tahu Toolbox untuk mencegat teks mentah, mengirimkannya ke model embedding, dan menggunakan vektor yang dihasilkan dalam pernyataan SQL. Operator <=> adalah jarak kosinus pgvector — nilai yang lebih kecil berarti deskripsi yang lebih mirip.

Terakhir, tambahkan alat terakhir di bawah simbol --- di 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

Skrip ini menentukan resource berikut:

  • Alat 4 (add-job) — menunjukkan penyerapan vektor. Parameter description_vector memiliki dua kolom khusus:
  • valueFromParam: description — Toolbox menyalin nilai dari parameter description ke parameter ini. LLM tidak pernah melihat parameter ini.
  • embeddedBy: gemini-embedding — Toolbox menyematkan teks yang disalin ke dalam vektor sebelum meneruskannya ke SQL.

Hasilnya: satu panggilan alat menyimpan teks deskripsi mentah dan sematan vektornya, tanpa agen mengetahui apa pun tentang sematan.

Format YAML multi-dokumen memisahkan setiap resource dengan ---. Setiap dokumen memiliki kolom kind, name, dan type yang menentukan isinya. Singkatnya, kita telah mengonfigurasi semua hal berikut:

  • Menentukan database sumber
  • Tentukan alat ( alat 1 dan 2 ) untuk membuat kueri database dengan filter standar
  • Menentukan model embedding
  • Menentukan alat untuk melakukan penelusuran vektor ( tool 3 ) ke database
  • Tentukan alat untuk melakukan penyerapan data vektor ( alat 4 ) ke database

Memverifikasi sematan

Sebelum memulai Toolbox, pastikan pembuatan penyematan latar belakang telah selesai. Pastikan semua tugas kini memiliki penyematan:

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;"

Setiap baris harus menampilkan t (benar) di kolom has_embedding. Jika tidak, Anda dapat memilih untuk menunggu hingga semua proses pembuatan sematan baris selesai

           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

Mulai server Toolbox

Pada langkah penyiapan, kita telah mendownload file yang dapat dieksekusi toolbox. Pastikan file biner ini ada dan berhasil didownload. Jika tidak, download file tersebut dan tunggu hingga selesai

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

Ekspor variabel lingkungan yang diperlukan dan mulai Toolbox. Variabel GOOGLE_CLOUD_LOCATION dan GOOGLE_GENAI_USE_VERTEXAI diperlukan karena konfigurasi mencakup model embedding — GOOGLE_GENAI_USE_VERTEXAI memberi tahu Gemini SDK untuk merutekan melalui Vertex AI (bukan Gemini API konsumen), dan GOOGLE_CLOUD_LOCATION memberi tahu endpoint regional mana yang akan digunakan.

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 &

Anda akan melihat output yang mengonfirmasi bahwa server sudah siap seperti yang ditunjukkan di bawah:

... 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!"

Seperti langkah sebelumnya, langkah ini akan memunculkan proses lain dan menghasilkan output. Mari buka tab terminal baru di Cloud Shell (klik ikon +) agar kita bisa lebih fokus.

b01e3fbd89f17332.png

Buka direktori kerja Anda lagi dan aktifkan project menggunakan skrip penyiapan sebelumnya.

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

Memverifikasi alat

Kueri Toolbox API untuk mencantumkan semua alat terdaftar:

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

Anda akan melihat alat beserta deskripsi dan parameternya. Seperti yang ditunjukkan di bawah

...
       
"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": []
        }
...

Uji alat search-jobs secara langsung:

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'

Respons harus berisi dua lowongan pekerjaan backend engineer dari data awal Anda.

[
  {
    "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. Membangun Agen ADK

Langkah ini menghubungkan agen ADK ke server Toolbox yang sedang berjalan dan menguji keempat alat — kueri standar, penelusuran semantik, dan penyerapan vektor. Kode agennya minimal: semua logika database berada di tools.yaml.

Mengonfigurasi lingkungan agen

ADK membaca GOOGLE_GENAI_USE_VERTEXAI, GOOGLE_CLOUD_PROJECT, dan GOOGLE_CLOUD_LOCATION dari lingkungan shell, yang sudah Anda tetapkan pada langkah sebelumnya. Satu-satunya variabel khusus agen adalah TOOLBOX_URL — tambahkan ke file .env agen:

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

Memperbarui modul agen

Buka jobs_agent/agent.py di Cloud Shell Editor

cloudshell edit jobs_agent/agent.py

dan timpa konten dengan kode berikut:

# 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],
)

Perhatikan bahwa tidak ada kode database di sini — ToolboxToolset terhubung ke server Toolbox saat startup dan memuat semua alat yang tersedia. Agen memanggil alat berdasarkan nama; Toolbox menerjemahkan panggilan tersebut menjadi kueri SQL terhadap Cloud SQL.

Variabel lingkungan TOOLBOX_URL secara default adalah http://127.0.0.1:5000 untuk pengembangan lokal. Saat men-deploy ke Cloud Run nanti, Anda akan mengganti URL ini dengan URL Cloud Run layanan Toolbox — tidak perlu mengubah kode.

Saat ini, petunjuk hanya merujuk pada dua alat standar (search-jobs dan get-job-details). Anda akan memperluasnya pada langkah berikutnya saat menambahkan alat penyerapan dan penelusuran semantik.

Menguji agen

Mulai UI dev ADK:

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

Buka URL yang ditampilkan di terminal (biasanya http://localhost:8000) menggunakan fitur Pratinjau Web Cloud Shell atau ctrl + klik URL yang ditampilkan di terminal. Pilih jobs_agent dari dropdown agen di sudut kiri atas.

Menguji kueri standar

Coba perintah ini untuk memverifikasi alat SQL standar:

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

93ac33e7f73aa0b9.png 240c53376042a916.png

Coba deskripsi bahasa alami yang tidak dipetakan ke peran atau tumpukan teknologi tertentu:

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

Agen akan mencoba memilih alat yang tepat berdasarkan jenis kueri: filter terstruktur diproses melalui search-jobs, deskripsi bahasa alami diproses melalui search-jobs-by-description.

b0ea629f5c9b4c26.png

Menguji penyerapan vektor

Minta agen untuk menambahkan tugas baru:

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

Sekarang coba telusuri:

Find me jobs involving autonomous systems and working with physical hardware

Penyematan dibuat secara otomatis selama INSERT — tidak diperlukan langkah terpisah.

5a3d8e6f523dc18b.png

Sekarang, Anda sudah memiliki aplikasi RAG Agentic yang berfungsi penuh menggunakan ADK, MCP Toolbox, dan CloudSQL. Selamat! Mari kita lanjutkan langkah-langkah untuk men-deploy aplikasi ini ke Cloud Run.

Sekarang, hentikan UI dev dengan menghentikan proses dengan menekan Ctrl+C dua kali sebelum melanjutkan.

8. Men-deploy ke Cloud Run

Agen dan Toolbox berfungsi secara lokal. Langkah ini men-deploy keduanya sebagai layanan Cloud Run sehingga dapat diakses melalui internet. Layanan Toolbox berjalan sebagai server MCP di Cloud Run, dan layanan agen terhubung ke layanan tersebut.

Menyiapkan Toolbox untuk deployment

Buat direktori deployment untuk layanan Toolbox:

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

Buat Dockerfile untuk Toolbox. Buka deploy-toolbox/Dockerfile di Cloud Shell Editor:

cloudshell edit deploy-toolbox/Dockerfile

Kemudian, salin skrip berikut ke dalamnya

# 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"]

Biner Toolbox dan tools.yaml dikemas ke dalam image Debian minimal. Cloud Run merutekan traffic ke port 8080.

Men-deploy layanan Toolbox

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

Perintah ini mengirimkan sumber ke Cloud Build, membangun image container, mengirimkannya ke Artifact Registry, dan men-deploy-nya ke Cloud Run. Proses ini memerlukan waktu beberapa menit. Buka tab terminal baru di Cloud Shell (klik ikon +) agar kita dapat lebih fokus.

b01e3fbd89f17332.png

Buka direktori kerja Anda lagi dan aktifkan project menggunakan skrip penyiapan sebelumnya.

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

Menyiapkan agen untuk deployment

Saat Toolbox membangun, siapkan file deployment agen.

Buat Dockerfile di root project. Buka Dockerfile di Cloud Shell Editor:

cloudshell edit Dockerfile

Kemudian, salin konten berikut

# 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 ini menggunakan ghcr.io/astral-sh/uv sebagai image dasar, yang mencakup Python dan uv yang telah diinstal sebelumnya — tidak perlu menginstal uv secara terpisah melalui pip.

Buat file .dockerignore untuk mengecualikan file yang tidak diperlukan dari image container:

cloudshell edit .dockerignore

Kemudian, salin skrip berikut ke dalamnya

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

Men-deploy layanan agen

Tunggu hingga deployment Toolbox selesai. Ambil URL Cloud Run-nya menggunakan perintah berikut

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

Anda akan melihat output yang serupa seperti ini

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

Kemudian, mari kita verifikasi bahwa Toolbox yang di-deploy berfungsi:

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

Jika output yang ditampilkan seperti contoh ini, deployment sudah berhasil

{
    "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.",

Selanjutnya, kita akan men-deploy agen, dengan meneruskan URL Toolbox sebagai variabel lingkungan:

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

Kode agen membaca TOOLBOX_URL dari lingkungan (Anda telah menyiapkannya sebelumnya). Secara lokal, variabel ini mengarah ke http://127.0.0.1:5000; di Cloud Run, variabel ini mengarah ke URL layanan Toolbox. Tidak perlu mengubah kode.

Menguji agen yang di-deploy

Ambil URL Cloud Run agen:

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

Buka URL di browser Anda. UI dev ADK dimuat — antarmuka yang sama yang telah Anda gunakan secara lokal, kini berjalan di Cloud Run.

Pilih jobs_agent dari dropdown dan uji:

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

Kedua kueri berfungsi melalui layanan yang di-deploy: agen di Cloud Run memanggil Toolbox di Cloud Run, yang mengkueri Cloud SQL.

9. Selamat / Pembersihan

Anda telah membuat dan men-deploy asisten papan lowongan kerja pintar yang menggunakan MCP Toolbox for Databases untuk menghubungkan agen ADK dan Cloud SQL PostgreSQL — dengan kueri SQL standar dan penelusuran vektor semantik.

Yang telah Anda pelajari

  • Cara MCP menstandardisasi akses alat untuk agen AI, dan cara MCP Toolbox for Databases menerapkannya secara khusus pada operasi database — menggantikan kode database kustom dengan konfigurasi YAML deklaratif
  • Cara mengonfigurasi Cloud SQL PostgreSQL sebagai sumber data Toolbox menggunakan jenis sumber cloud-sql-postgres
  • Cara menentukan alat kueri SQL standar dengan pernyataan berparameter yang mencegah injeksi SQL
  • Cara mengaktifkan penelusuran vektor menggunakan pgvector dan gemini-embedding-001, dengan parameter embeddedBy untuk penyematan kueri otomatis
  • Cara valueFromParam memungkinkan penyerapan vektor otomatis — LLM memberikan deskripsi teks, dan Toolbox secara diam-diam menyalin, menyematkan, dan menyimpan vektor bersama teks
  • Cara ToolboxToolset ADK memuat alat dari server Toolbox yang sedang berjalan, sehingga kode agen tetap minimal dan logika database sepenuhnya terpisah
  • Cara men-deploy server MCP Toolbox dan agen ADK ke Cloud Run sebagai layanan terpisah

Pembersihan

Agar tidak menimbulkan biaya pada akun Google Cloud Anda untuk resource yang dibuat dalam codelab ini, Anda dapat menghapus setiap resource atau menghapus seluruh project.

Cara termudah untuk membersihkan adalah dengan menghapus project. Tindakan ini akan menghapus semua resource yang terkait dengan project.

gcloud projects delete $GOOGLE_CLOUD_PROJECT

Opsi 2: Menghapus resource satu per satu

Jika Anda ingin mempertahankan project, tetapi hanya menghapus resource yang dibuat di codelab ini:

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