1. Giriş
Yapay zeka ajanlarının faydası, erişebildikleri verilerle sınırlıdır. Gerçek dünyadaki verilerin çoğu veritabanlarında bulunur ve aracıları veritabanlarına bağlamak genellikle bağlantı yönetimi, sorgu mantığı ve yerleştirme işlem hatlarını aracı kodunuza yazmak anlamına gelir. Veritabanı erişimi gerektiren her aracı bu çalışmayı tekrarlar ve her sorgu değişikliği, aracının yeniden dağıtılmasını gerektirir.
Bu codelab'de farklı bir yaklaşım gösterilmektedir. Veritabanı araçlarınızı (standart SQL sorguları, vektör benzerliği araması ve hatta otomatik yerleştirme oluşturma) bir YAML dosyasında beyan edersiniz. Veritabanları için MCP Araç Kutusu, tüm veritabanı işlemlerini bir MCP sunucusu olarak yönetir. Aracı kodunuz minimum düzeyde kalır: Araçları yükleyin, hangisinin çağrılacağına Gemini karar versin.
Ne oluşturacaksınız?
"TechJobs" için Akıllı İş İlanı Asistanı: Geliştiricilerin standart filtreleri (rol, teknoloji yığını) kullanarak teknoloji iş ilanlarına göz atmasına ve "Yapay zeka chatbot'ları üzerinde çalışacağım uzaktan bir iş istiyorum" gibi doğal dil açıklamalarıyla işleri keşfetmesine yardımcı olan, Gemini destekli bir ADK aracısı. Aracı, tüm veritabanı erişimini (vektör araması için otomatik yerleştirme oluşturma dahil) işleyen MCP Toolbox for Databases aracılığıyla Cloud SQL PostgreSQL veritabanından okuma ve veritabanına yazma işlemleri yapar. Sonunda hem araç kutusu hem de aracı Cloud Run'da çalışır.
Neler öğreneceksiniz?
- MCP (Model Context Protocol) standardının yapay zeka aracılarına yönelik araç erişimini nasıl standartlaştırdığı ve MCP Toolbox for Databases'in bunu veritabanı işlemlerine nasıl uyguladığı
- Bir ADK aracısı ile Cloud SQL PostgreSQL arasında ara katman yazılımı olarak MCP Toolbox for Databases'i ayarlama
- Veritabanı araçlarını
tools.yamliçinde bildirimsel olarak tanımlayın. Temsilcinizde veritabanı kodu bulunmaz. ToolboxToolsetkullanarak çalışan bir Araç Kutusu sunucusundan araç yükleyen bir ADK aracısı oluşturma- Cloud SQL'in yerleşik
embedding()işlevini kullanarak vektör yerleştirmeleri oluşturma vepgvectorile semantik aramayı etkinleştirme - Yazma işlemlerinde otomatik vektör alımı için
valueFromParamözelliğini kullanma - Hem Toolbox sunucusunu hem de ADK aracısını Cloud Run'a dağıtma
Ön koşullar
- Deneme faturalandırma hesabına sahip bir Google Cloud hesabı
- Python ve SQL hakkında temel düzeyde bilgi
- ADK, MCP Toolbox veya
pgvectorile ilgili deneyim gerekmez.
2. Ortamınızı ayarlama
Bu adımda Cloud Shell ortamınız hazırlanır, Google Cloud projeniz yapılandırılır ve referans deposu klonlanır.
Cloud Shell'i açma
Tarayıcınızda Cloud Shell'i açın. Cloud Shell, bu codelab için ihtiyacınız olan tüm araçların bulunduğu önceden yapılandırılmış bir ortam sağlar. İstendiğinde Yetkilendir'i tıklayın.
Ardından, terminali açmak için "Görünüm" -> "Terminal"i tıklayın. Arayüzünüz aşağıdaki gibi görünmelidir.

Bu, ana arayüzümüz olacak. Üstte IDE, altta terminal yer alacak.
Çalışma dizininizi ayarlama
Çalışma dizininizi oluşturun. Bu codelab'de yazdığınız tüm kodlar burada bulunur:
mkdir -p ~/build-agent-adk-toolbox-cloudsql
cloudshell workspace ~/build-agent-adk-toolbox-cloudsql && cd ~/build-agent-adk-toolbox-cloudsql
Google Cloud projenizi oluşturun
Konum değişkenlerini içeren .env dosyasını oluşturun:
# For Vertex AI / Gemini API calls
echo "GOOGLE_CLOUD_LOCATION=global" > .env
# For Cloud SQL, Cloud Run, Artifact Registry
echo "REGION=us-central1" >> .env
Proje kurulum komut dosyasını çalışma dizininize indirin:
curl -sL https://raw.githubusercontent.com/alphinside/cloud-trial-project-setup/main/setup_verify_trial_project.sh -o setup_verify_trial_project.sh
Komut dosyasını çalıştırın. Deneme faturalandırma hesabınızı doğrular, yeni bir proje oluşturur (veya mevcut bir projeyi doğrular), proje kimliğinizi geçerli dizindeki bir .env dosyasına kaydeder ve gcloud'de etkin projeyi ayarlar.
bash setup_verify_trial_project.sh && source .env
Komut dosyası:
- Etkin bir deneme faturalandırma hesabınız olduğunu doğrulayın.
.enviçinde mevcut bir proje olup olmadığını kontrol edin (varsa)- Yeni bir proje oluşturun veya mevcut projeyi yeniden kullanın
- Deneme faturalandırma hesabını projenize bağlama
- Proje kimliğini
.envdosyasına kaydedin. - Projeyi etkin
gcloudprojesi olarak ayarlayın
Cloud Shell terminal isteminde çalışma dizininizin yanındaki sarı metni kontrol ederek projenin doğru şekilde ayarlandığını doğrulayın. Proje kimliğiniz gösterilmelidir.

Cloud Shell oturumunuz bu codelab sırasında herhangi bir noktada sıfırlanırsa çalışma dizininize geri dönün ve proje yapılandırmanızı geri yüklemek için bash setup_verify_trial_project.sh && source .env komutunu yeniden çalıştırın. Sarı proje kimliği metninin terminal isteminde yeniden göründüğünü onaylayın.
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): Aracınız Gemini modellerini, Araç Kutusu ise vektör araması için yerleştirme API'sini kullanır. - Cloud SQL Admin API (
sqladmin.googleapis.com): PostgreSQL örneği sağlarsınız ve yönetirsiniz. - Compute Engine API (
compute.googleapis.com): Cloud SQL örnekleri oluşturmak için gereklidir. - Cloud Run, Cloud Build, Artifact Registry: Bu codelab'in ilerleyen bölümlerinde dağıtım adımında kullanılır.
3. Veritabanı örneğini oluşturma
Bu adım, Cloud SQL örneği oluşturma işlemini arka planda ayarlar. Siz eğitime devam ederken sağlama işlemi yapılır.
Örnek oluşturma işlemini başlatma
Veritabanı şifresini .env dosyanıza ekleyin ve dosyayı yeniden yükleyin:
echo "DB_PASSWORD=techjobs-pwd-2025" >> .env
source .env
Cloud SQL örneği oluşturma işlemini başlatın. Bu işlem arka planda çalışır, böylece çalışmaya devam edebilirsiniz:
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,ENTERPRISEsürümündeki en küçük ayrılmış çekirdekli Cloud SQL katmanıdır (1 vCPU, 3,75 GB RAM). Daha fazla bilgiyi burada bulabilirsiniz. Vertex AI ML entegrasyonu için özel bir çekirdek gerekir. Paylaşılan çekirdek katmanları (db-f1-micro,db-g1-small) bu entegrasyonu desteklemez.--root-password, varsayılanpostgreskullanıcısının şifresini ayarlar.--enable-google-ml-integration, Cloud SQL'in Vertex AI ile yerleşik entegrasyonunu etkinleştirir. Bu entegrasyon,embedding()işlevini kullanarak doğrudan SQL'den yerleştirme modellerini çağırmanıza olanak tanır.&, komutu arka planda çalıştırır.
Bu işlem arka planda çalışır. Ardından, MCP Toolbox ikilisini indirelim. Bu işlemi aynı terminalde yapabilirsiniz.
Toolbox ikilisini indirin
Bu eğitimde MCP Toolbox'ı kullanacağız. Neyse ki bu araç, Linux ortamında kullanıma hazır önceden oluşturulmuş bir ikili dosya ile birlikte gelir. Bu işlem biraz zaman alacağından dosyayı arka planda indirelim.
cd ~/build-agent-adk-toolbox-cloudsql
curl -O https://storage.googleapis.com/genai-toolbox/v0.27.0/linux/amd64/toolbox &
Bu işlemin geçerli sekmede çalışmasına izin verin (işlem zaten arka planda çalıştırılır ancak çıkış yine de gösterilir). Daha iyi odaklanabilmek için Cloud Shell'de yeni bir terminal sekmesi açalım (artı simgesini tıklayın).

Çalışma dizininize tekrar gidin ve önceki kurulum komut dosyasını kullanarak projeyi etkinleştirin.
cd ~/build-agent-adk-toolbox-cloudsql
bash setup_verify_trial_project.sh && source .env
Bu adımda Python projesi ayarlanır, bağımlılıklar yüklenir ve ADK aracısı dizini oluşturulur.
4. Aracı projesini başlatma
Python projesini oluşturma
uv, Rust ile yazılmış hızlı bir Python paketi ve proje yöneticisidir ( uv dokümanları ). Bu codelab'de hız ve basitlik için kullanılır.
Bir Python projesi başlatın ve gerekli bağımlılıkları ekleyin:
uv init
uv add google-adk==1.25.0 toolbox-adk==0.6.0
google-adk— Gemini SDK dahil olmak üzere Google'ın Agent Development Kit'itoolbox-adk— Veritabanları için MCP Araç Kutusu'nda ADK entegrasyonu.
Temsilci dizin yapısını oluşturma
ADK, belirli bir klasör düzeni bekler: __init__.py, agent.py ve .env içeren, temsilcinizin adını taşıyan bir dizin. Bu konuda yardımcı olmak için yapıyı hızlıca oluşturmaya yönelik yerleşik bir komut vardır:
uv run adk create jobs_agent \
--model gemini-2.5-flash \
--project ${GOOGLE_CLOUD_PROJECT} \
--region ${GOOGLE_CLOUD_LOCATION}
Dizininiz artık şu şekilde görünmelidir:
build-agent-adk-toolbox-cloudsql/ ├── jobs_agent/ │ ├── __init__.py │ ├── agent.py │ └── .env ├── pyproject.toml ├── .env (project setup — already exists) └── .venv/
5. İş ilanı veritabanını doldurma
Bu adımda başlangıç verileri yazılır, Cloud SQL örneğinin sağlama işleminin tamamlanması beklenir ve jobs tablosuna 15 iş ilanı ile açıklamalarının yerleştirilmesi yüklenir.
Başlangıç SQL'ini yazma
Cloud Shell Düzenleyici'de iş listeleme içeriğini içeren seed.sql adlı bir dosya oluştururuz. Bu işlem, pgvector destekli jobs tablosunu oluşturur ve teknoloji şirketlerindeki 15 iş ilanını ekler.
İlk olarak, aşağıdaki komutu kullanarak seed.sql dosyasını oluşturun:
cloudshell edit seed.sql
Ardından bu komut dosyalarını dosyaya kopyalayın.
-- 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.');
Başlangıç komut dosyası iki PostgreSQL uzantısı yükler:
google_ml_integration: Vertex AI yerleştirme modellerini doğrudan SQL'den çağıranembedding()SQL işlevini sağlar. Bu,jobs_dbiçinde makine öğrenimi işlevlerini kullanılabilir hale getiren bir veritabanı düzeyinde uzantıdır. Örnek oluşturma sırasında ayarladığınız örnek düzeyindeki işaret (--enable-google-ml-integration), Cloud SQL VM'nin Vertex AI'ye ulaşmasına olanak tanır. Bu uzantı, SQL işlevlerini söz konusu veritabanında kullanılabilir hâle getirir.vector(pgvector): Yerleştirmeleri depolamak ve sorgulamak içinvectorveri türünü ve mesafe operatörlerini ekler.
description_embedding sütunu, vector(3072) (3072 boyutlu vektörleri depolayan bir pgvector sütunu) olur. Şu anda NULL'dur. Bir sonraki adımda embedding() işlevini kullanarak yerleştirmeler oluşturup dolduracaksınız.
Veritabanı kurulumunu tamamlama
Önceki adımda başlattığınız Cloud SQL örneği oluşturma işlemi hâlâ devam ediyor ve henüz tamamlanmamış olabilir. Örneğin hazır olduğunu doğrulayın:
gcloud sql instances describe jobs-instance --format="value(state)"
Aşağıdaki çıkışı görmeniz gerekir.
RUNNABLE

Ardından, Cloud SQL örneğinin hizmet hesabına Vertex AI'ı çağırma izni verin. Bu, sonraki adımda kullanacağınız yerleşik embedding() işlevi için gereklidir:
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
Ardından, iş ilanları için özel bir veritabanı oluşturun:
gcloud sql databases create jobs_db --instance=jobs-instance
Veritabanının oluşturulduğunu onaylayan bir çıkış görmeniz gerekir:
Creating Cloud SQL database...done. Created database [jobs_db]. instance: jobs-instance name: jobs_db project: workshop-xxxxxxx
Veritabanını bağlama ve doldurma
Cloud SQL Auth Proxy'yi başlatın (cloud-sql-proxy, Cloud Shell'e önceden yüklenmiştir). Bu, Cloud Shell'den Cloud SQL örneğinize güvenli ve kimliği doğrulanmış bir bağlantı sağlar:

cloud-sql-proxy ${GOOGLE_CLOUD_PROJECT}:${REGION}:jobs-instance --port 5432 &
Proxy başlatılırsa terminalde şu çıkışı görürsünüz:
... 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!
Şu anda geçerli terminal, Cloud SQL Proxy'nin günlüğünü sürekli olarak çıkarıyor. Daha iyi odaklanabilmek için Cloud Shell'de yeni bir terminal sekmesi açalım (artı simgesini tıklayın).

Çalışma dizininize tekrar gidin ve önceki kurulum komut dosyasını kullanarak projeyi etkinleştirin.
cd ~/build-agent-adk-toolbox-cloudsql
bash setup_verify_trial_project.sh && source .env
Ardından, başlangıç komut dosyasını çalıştırın.
psql "host=127.0.0.1 port=5432 dbname=jobs_db user=postgres password=$DB_PASSWORD" -f seed.sql
Şuna benzer bir terminal çıkışı görürsünüz:
CREATE EXTENSION CREATE EXTENSION CREATE TABLE INSERT 0 15
Verileri doğrulayalım
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;"
Birden fazla rolde 15 iş ilanı görürsünüz:
title | company | role | openings ---------------------------------+----------------+-----------+---------- Senior Backend Engineer | Stripe | Backend | 3 Backend Engineer (Payments) | Square | Backend | 3 Cloud Architect | Google Cloud | Cloud | 1 ... (15 rows)
İş tanımları için yerleştirilmiş öğeler oluşturma
jobs tablosundaki description_embedding sütunu şu anda NULL. Cloud SQL'in yerleşik google_ml_integration uzantısı, Python komut dosyası veya harici SDK gerektirmeden Vertex AI'ı doğrudan SQL'den çağıran bir embedding() işlevi sağlar.
Arka planda yerleştirme oluşturma işlemini başlatın. Bu işlem, 15 iş açıklamasının her biri için gemini-embedding-001 modelini kullanarak 3.072 boyutlu bir vektör oluşturmak üzere Vertex AI'ı çağırır:
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;" &
Bu komut dosyası şunları yapar:
embedding('gemini-embedding-001', description)— Her işindescriptionmetnini ileterek doğrudan SQL'den Vertex AI'ın Gemini yerleştirme modelini çağırır. Bu, başlangıç komut dosyasına yüklediğinizgoogle_ml_integrationuzantısıdır.::vector: Döndürülen kayan nokta dizisini, pgvector'ınvectortürüne yayınlar. Böylece, mesafe operatörleriyle depolanabilir ve sorgulanabilir.UPDATE, 15 satırın tamamında çalışarak her iş açıklaması için 3.072 boyutlu bir yerleştirme oluşturur.&, komutu arka planda çalıştırır. Böylece Vertex AI yerleştirmeleri işlerken çalışmaya devam edebilirsiniz.
Önceki arka plan işlemi yürütme işlemlerinde olduğu gibi, mevcut terminalde işlemin günlüğü çıkışı yapılır. Daha iyi odaklanabilmek için Cloud Shell'de yeni bir terminal sekmesi açalım (artı simgesini tıklayın).

Çalışma dizininize tekrar gidin ve önceki kurulum komut dosyasını kullanarak projeyi etkinleştirin.
cd ~/build-agent-adk-toolbox-cloudsql
bash setup_verify_trial_project.sh && source .env
Ardından, bir sonraki işleme geçebiliriz.
6. Veritabanları için MCP Toolbox'ı yapılandırma
Bu adımda, Veritabanları için MCP Araç Kutusu tanıtılır, Cloud SQL örneğinize bağlanacak şekilde yapılandırılır ve iki standart SQL sorgu aracı tanımlanır.
ÇMY nedir ve neden Araç Kutusu'nu kullanmalısınız?

MCP (Model Context Protocol), yapay zeka temsilcilerinin harici araçları keşfetme ve bunlarla etkileşime girme şeklini standartlaştıran açık bir protokoldür. Bir istemci-sunucu modeli tanımlar: Aracı, bir MCP istemcisine ev sahipliği yapar ve araçlar MCP sunucuları tarafından kullanıma sunulur. MCP ile uyumlu herhangi bir istemci, MCP ile uyumlu herhangi bir sunucuyu kullanabilir. Aracının her araç için özel entegrasyon koduna ihtiyacı yoktur.

MCP Toolbox for Databases, özellikle veritabanı erişimi için oluşturulmuş açık kaynaklı bir MCP sunucusudur. Bu olmadan, veritabanı bağlantılarını açan, bağlantı havuzlarını yöneten, SQL eklemeyi önlemek için parametreli sorgular oluşturan, hataları işleyen ve tüm bu kodu aracınıza yerleştiren Python işlevleri yazmanız gerekirdi. Veritabanı erişimi gereken her temsilci bu çalışmayı tekrarlar. Bir sorguyu değiştirmek, temsilcinin yeniden dağıtılması anlamına gelir.
Araç kutusu ile bir YAML dosyası yazarsınız. Her araç, parametrelendirilmiş bir SQL ifadesiyle eşlenir. Toolbox, bağlantı havuzunu, parametreli sorguları, kimlik doğrulamayı ve gözlemlenebilirliği yönetir. Araçlar, aracıdan ayrılır. tools.yaml düzenleyip Toolbox'ı yeniden başlatarak sorguyu güncelleyin. Aracı koduna dokunmayın. Aynı araçlar ADK, LangGraph, LlamaIndex veya MCP ile uyumlu herhangi bir çerçevede çalışır.
Araç yapılandırmasını yazma
Şimdi, araç yapılandırmamızı ayarlamak için Cloud Shell Düzenleyici'de tools.yaml adlı bir dosya oluşturmamız gerekiyor.
cloudshell edit tools.yaml
Dosyada çok dokümanlı YAML kullanılır. --- ile ayrılan her blok bağımsız bir kaynaktır. Her kaynağın, ne olduğunu bildiren bir kind (veritabanı bağlantıları için sources, aracı tarafından çağrılabilir işlemler için tools) ve arka ucu belirten bir type (kaynak için cloud-sql-postgres, SQL tabanlı araçlar için postgres-sql) vardır. Bir araç, kaynağına name ile referans verir. Bu sayede Araç Kutusu, hangi bağlantı havuzunun yürütüleceğini bilir. Ortam değişkenleri ${VAR_NAME} söz dizimini kullanır ve başlatma sırasında çözümlenir.
Şimdi aşağıdaki komut dosyalarını önce tools.yaml dosyasına kopyalayalım.
# 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}
---
Buradaki komut dosyası aşağıdaki kaynağı tanımlar:
- Kaynak (
jobs-db): Toolbox'ın Cloud SQL PostgreSQL örneğinize nasıl bağlanacağını belirtir.cloud-sql-postgrestürü, kimlik doğrulama ve güvenli bağlantıları otomatik olarak işleyerek dahili olarak Cloud SQL bağlayıcısını kullanır.${GOOGLE_CLOUD_PROJECT},${REGION}ve${DB_PASSWORD}yer tutucuları, başlangıçta ortam değişkenlerinden çözümlenir.
Ardından, tools.yaml dosyasındaki --- sembolünün altına aşağıdaki komut dosyasını ekleyin.
# --- 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)."
---
Buradaki komut dosyası aşağıdaki kaynağı tanımlar:
- 1. ve 2. araçlar (
search-jobs,get-job-details): Standart SQL sorgu araçları. Her biri bir araç adını (aracının gördüğü) parametreli bir SQL ifadesiyle (veritabanının yürüttüğü) eşler. Parametreler$1,$2konumsal yer tutucularını kullanır. Araç kutusu, bunları hazırlanmış ifadeler olarak yürütür. Bu sayede SQL yerleştirme önlenir.
Devam edelim ve tools.yaml dosyasında --- sembolünün altına aşağıdaki komut dosyasını ekleyin.
# --- Embedding Model ---
kind: embeddingModels
name: gemini-embedding
type: gemini
model: gemini-embedding-001
dimension: 3072
---
Buradaki komut dosyası aşağıdaki kaynağı tanımlar:
- Yerleştirme modeli (
gemini-embedding): Araç Kutusu'nu, 3.072 boyutlu metin yerleştirmeleri oluşturmak için Gemini'ıngemini-embedding-001modelini çağıracak şekilde yapılandırır. Araç kutusu, kimlik doğrulamak için Uygulama Varsayılan Kimlik Bilgileri'ni (ADC) kullanır. Cloud Shell veya Cloud Run'da API anahtarı gerekmez. Burada yapılandırılandimension, veritabanını doldurmak için daha önce yapılandırdığımızdimensionile aynı olmalıdır.
Devam edelim ve tools.yaml dosyasında --- sembolünün altına aşağıdaki komut dosyasını ekleyin.
# --- 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
---
Buradaki komut dosyası aşağıdaki kaynağı tanımlar:
- 3. Araç (
search-jobs-by-description): Vektör arama aracı.search_queryparametresindeembeddedBy: gemini-embeddingbulunur. Bu parametre, Araç Kutusu'na ham metni yakalamasını, yerleştirme modeline göndermesini ve sonuçtaki vektörü SQL ifadesinde kullanmasını söyler.<=>operatörü, pgvector'ın kosinüs uzaklığıdır. Daha küçük değerler, daha benzer açıklamalar anlamına gelir.
Son olarak, tools.yaml dosyasında --- simgesinin altına son aracı ekleyin.
# --- 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
Buradaki komut dosyası aşağıdaki kaynağı tanımlar:
- 4. Araç (
add-job): Vektör alımını gösterir.description_vectorparametresinin iki özel alanı vardır: valueFromParam: description: Araç kutusu,descriptionparametresindeki değeri bu parametreye kopyalar. LLM bu parametreyi hiçbir zaman görmez.embeddedBy: gemini-embedding: Araç kutusu, kopyalanan metni SQL'e iletmeden önce bir vektöre yerleştirir.
Sonuç: Bir araç çağrısı, hem ham açıklama metnini hem de vektör yerleştirmesini depolar. Böylece, aracı yerleştirmeler hakkında hiçbir şey bilmez.
Çok dokümanlı YAML biçimi, her kaynağı --- ile ayırır. Her dokümanda, ne olduğunu tanımlayan kind, name ve type alanları bulunur. Özetle, aşağıdaki öğelerin tümünü zaten yapılandırdık:
- Kaynak veritabanını tanımlama
- Veritabanına standart filtreyle sorgu göndermek için araçlar ( 1. ve 2. araç ) tanımlayın.
- Yerleştirme modelini tanımlama
- Veritabanında vektör araması yapacak aracı tanımlayın ( tool 3 ).
- Vektör verilerini veritabanına aktarmak için aracı tanımlayın ( 4. araç ).
Yerleştirmeleri doğrulama
Araç kutusunu başlatmadan önce arka plan yerleştirme oluşturma işleminin tamamlandığını onaylayın. Tüm işlerin artık yerleştirmeleri olduğunu kontrol edin:
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;"
Her satırın has_embedding sütununda t (doğru) gösterilmelidir. Aksi takdirde, tüm satır yerleştirme oluşturma işlemi tamamlanana kadar bekleyebilirsiniz.
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
Araç kutusu sunucusunu başlatma
Kurulum adımında toolbox yürütülebilir dosyasını zaten indirdik. Bu ikili dosyanın mevcut olduğundan ve başarıyla indirildiğinden emin olun. Aksi takdirde dosyayı indirip işlemin tamamlanmasını bekleyin.
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
Gerekli ortam değişkenlerini dışa aktarın ve Toolbox'ı başlatın. Yapılandırma bir yerleştirme modeli içerdiğinden GOOGLE_CLOUD_LOCATION ve GOOGLE_GENAI_USE_VERTEXAI değişkenleri gereklidir. GOOGLE_GENAI_USE_VERTEXAI, Gemini SDK'ya Vertex AI üzerinden (tüketici Gemini API'si yerine) yönlendirme yapmasını söyler. GOOGLE_CLOUD_LOCATION ise hangi bölgesel uç noktanın kullanılacağını belirtir.
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 &
Aşağıda gösterildiği gibi, sunucunun hazır olduğunu onaylayan bir çıkış görmeniz gerekir:
... 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!"
Önceki adımda olduğu gibi bu adımda da başka bir işlem başlatılır ve çıkışlar oluşturulur. Daha iyi odaklanabilmek için Cloud Shell'de yeni bir terminal sekmesi açalım (artı simgesini tıklayın).

Çalışma dizininize tekrar gidin ve önceki kurulum komut dosyasını kullanarak projeyi etkinleştirin.
cd ~/build-agent-adk-toolbox-cloudsql
bash setup_verify_trial_project.sh && source .env
Araçları doğrulama
Kayıtlı tüm araçları listelemek için Araç Kutusu API'sini sorgulayın:
curl -s http://localhost:5000/api/toolset | python3 -m json.tool
Açıklamaları ve parametreleriyle birlikte araçları görürsünüz. Aşağıda gösterildiği gibi
...
"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 aracını doğrudan test edin:
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'
Yanıt, başlangıç verilerinizdeki iki arka uç mühendisliği işini içermelidir.
[
{
"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 aracısını oluşturma
Bu adımda ADK aracısı, çalışan Toolbox sunucusuna bağlanır ve dört aracın (standart sorgular, semantik arama ve vektör alımı) tümü test edilir. Aracı kodu minimum düzeydedir: Tüm veritabanı mantığı tools.yaml içinde yer alır.
Temsilcinin ortamını yapılandırma
ADK, kabuk ortamından GOOGLE_GENAI_USE_VERTEXAI, GOOGLE_CLOUD_PROJECT ve GOOGLE_CLOUD_LOCATION değerlerini okur. Bu değerleri önceki adımda ayarlamıştınız. Temsilciye özgü tek değişken TOOLBOX_URL'dır. Bu değişkeni, temsilcinin .env dosyasına ekleyin:
echo -e "\nTOOLBOX_URL=http://127.0.0.1:5000" >> jobs_agent/.env
Aracı modülünü güncelleme
Cloud Shell Düzenleyici'de jobs_agent/agent.py dosyasını açın.
cloudshell edit jobs_agent/agent.py
ve içeriğin üzerine aşağıdaki kodu yazın:
# 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],
)
Burada veritabanı kodu olmadığını unutmayın. ToolboxToolset, başlangıçta Araç Kutusu sunucusuna bağlanır ve mevcut tüm araçları yükler. Aracı, araçları adıyla çağırır. Araç kutusu, bu çağrıları Cloud SQL'e karşı SQL sorgularına çevirir.
TOOLBOX_URL ortam değişkeni, yerel geliştirme için varsayılan olarak http://127.0.0.1:5000 değerini alır. Daha sonra Cloud Run'a dağıtım yaptığınızda, bu URL'yi Toolbox hizmetinin Cloud Run URL'siyle geçersiz kılarsınız. Kodda değişiklik yapmanız gerekmez.
Talimatta şu anda yalnızca iki standart araç (search-jobs ve get-job-details) referans olarak verilmektedir. Semantik arama ve alım araçlarını eklediğinizde talimatı genişleteceksiniz.
Temsilciyi test etme
ADK geliştirici kullanıcı arayüzünü başlatın:
cd ~/build-agent-adk-toolbox-cloudsql
uv run adk web
Cloud Shell'in Web Önizleme özelliğini kullanarak veya terminalde gösterilen URL'yi Ctrl + tıklayarak terminalde gösterilen URL'yi (genellikle http://localhost:8000) açın. Sol üst köşedeki aracı açılır listesinden jobs_agent'ı seçin.
Standart sorguları test etme
Standart SQL araçlarını doğrulamak için aşağıdaki istemleri deneyin:
What backend engineering jobs do you have?
Any jobs using Kubernetes?
Tell me about the Cloud Architect position

Semantik aramayı test etme
Belirli bir role veya teknoloji yığınına karşılık gelmeyen doğal dil açıklamalarını deneyin:
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
Temsilci, sorgu türüne göre doğru aracı seçmeye çalışır: Yapılandırılmış filtreler search-jobs, doğal dil açıklamaları ise search-jobs-by-description üzerinden geçer.

Vektör beslemeyi test etme
Temsilciden yeni bir iş eklemesini isteyin:
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.

Şimdi aramayı deneyin:
Find me jobs involving autonomous systems and working with physical hardware
Yerleştirme, INSERT sırasında otomatik olarak oluşturuldu. Ayrı bir adım gerekmez.

Artık ADK, MCP Toolbox ve CloudSQL'u kullanan, tam işlevsel bir Agentic RAG uygulamanız var. Tebrikler! Şimdi bu uygulamaları Cloud Run'a dağıtmak için bir adım daha atalım.
Şimdi devam etmeden önce Ctrl+C tuşlarına iki kez basarak işlemi sonlandırıp geliştirici kullanıcı arayüzünü durduralım.
8. Cloud Run'a dağıt
Aracı ve Araç Kutusu yerel olarak çalışır. Bu adımda her ikisi de Cloud Run hizmeti olarak dağıtılır. Böylece internet üzerinden erişilebilirler. Araç kutusu hizmeti, Cloud Run'da bir MCP sunucusu olarak çalışır ve aracı hizmeti buna bağlanır.
Araç kutusunu dağıtıma hazırlama
Araç kutusu hizmeti için bir dağıtım dizini oluşturun:
cd ~/build-agent-adk-toolbox-cloudsql
mkdir -p deploy-toolbox
cp toolbox tools.yaml deploy-toolbox/
Araç kutusu için Dockerfile'ı oluşturun. Cloud Shell Düzenleyici'de deploy-toolbox/Dockerfile dosyasını açın:
cloudshell edit deploy-toolbox/Dockerfile
Aşağıdaki komut dosyasını bu dosyaya kopyalayın.
# 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"]
Araç kutusu ikilisi ve tools.yaml, minimum Debian görüntüsüne paketlenir. Cloud Run, trafiği 8080 numaralı bağlantı noktasına yönlendirir.
Araç Kutusu hizmetini dağıtma
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
Bu komut, kaynağı Cloud Build'e gönderir, bir container görüntüsü oluşturur, görüntüyü Artifact Registry'ye aktarır ve Cloud Run'a dağıtır. Bu işlem birkaç dakika sürer. Daha iyi odaklanabilmek için Cloud Shell'de yeni bir terminal sekmesi açalım (artı simgesini tıklayın).

Çalışma dizininize tekrar gidin ve önceki kurulum komut dosyasını kullanarak projeyi etkinleştirin.
cd ~/build-agent-adk-toolbox-cloudsql
bash setup_verify_trial_project.sh && source .env
Aracı dağıtıma hazırlama
Araç kutusu oluşturulurken aracının dağıtım dosyalarını ayarlayın.
Proje kökünde Dockerfile oluşturun. Cloud Shell Düzenleyici'de Dockerfile dosyasını açın:
cloudshell edit Dockerfile
Ardından, aşağıdaki içeriği kopyalayın.
# 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"]
Bu Dockerfile, temel görüntü olarak ghcr.io/astral-sh/uv kullanır. Bu görüntüde hem Python hem de uv önceden yüklenmiştir. Bu nedenle, uv'ı pip aracılığıyla ayrı olarak yüklemeniz gerekmez.
Gereksiz dosyaları kapsayıcı görüntüsünden hariç tutmak için .dockerignore dosyası oluşturun:
cloudshell edit .dockerignore
Ardından, aşağıdaki komut dosyasını kopyalayıp yapıştırın.
# .dockerignore
.venv/
__pycache__/
*.pyc
.env
jobs_agent/.env
toolbox
tools.yaml
seed.sql
deploy-toolbox/
Temsilci hizmetini dağıtma
Araç kutusu dağıtımının tamamlanmasını bekleyin. Aşağıdaki komutu kullanarak Cloud Run URL'sini alın.
TOOLBOX_URL=$(gcloud run services describe toolbox-service \
--region=$REGION \
--format='value(status.url)')
echo "Toolbox URL: $TOOLBOX_URL"
Aşağıdakine benzer bir çıkış görürsünüz:
Toolbox URL: https://toolbox-service-xxxxxx-xx.a.run.app
Ardından, dağıtılan araç kutusunun çalıştığını doğrulayalım:
curl -s "$TOOLBOX_URL/api/toolset" | python3 -m json.tool | head -5
Çıktı bu örnekteki gibi gösteriliyorsa dağıtım zaten başarılı olmuştur.
{
"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.",
Ardından, Toolbox URL'sini ortam değişkeni olarak ileterek aracı dağıtalım:
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
Aracı kodu, ortamdan TOOLBOX_URL değerini okur (bunu daha önce ayarlamış olmanız gerekir). Yerel olarak http://127.0.0.1:5000'ya, Cloud Run'da ise Toolbox hizmeti URL'sine yönlendirir. Kod değişikliği gerekmez.
Dağıtılan temsilciyi test etme
Temsilcinin Cloud Run URL'sini alın:
AGENT_URL=$(gcloud run services describe jobs-agent \
--region=$REGION \
--format='value(status.url)')
echo "Agent URL: $AGENT_URL"
URL'yi tarayıcınızda açın. ADK geliştirici kullanıcı arayüzü yüklenir. Bu arayüz, yerel olarak kullandığınız arayüzün Cloud Run'da çalışan sürümüdür.
Açılır menüden jobs_agent'ı seçin ve test edin:
What backend engineering jobs do you have?
I want a remote job working on AI and machine learning
Her iki sorgu da dağıtılan hizmetler üzerinden çalışır: Cloud Run'daki aracı, Cloud Run'daki araç kutusunu çağırır ve bu araç kutusu Cloud SQL'i sorgular.
9. Tebrikler / Temizleme
Hem standart SQL sorgularını hem de semantik vektör aramayı kullanarak bir ADK aracısı ile Cloud SQL PostgreSQL arasında köprü kurmak için MCP Toolbox for Databases'i kullanan akıllı bir iş ilanı panosu asistanı oluşturup dağıttınız.
Öğrendikleriniz
- MCP'nin yapay zeka aracıları için araç erişimini nasıl standartlaştırdığı ve MCP Toolbox for Databases'in bunu özellikle veritabanı işlemlerine nasıl uyguladığı (özel veritabanı kodunu bildirimsel YAML yapılandırmasıyla değiştirme)
cloud-sql-postgreskaynak türünü kullanarak Cloud SQL PostgreSQL'i Toolbox veri kaynağı olarak yapılandırma- SQL yerleştirilmesini önleyen parametreli ifadelerle standart SQL sorgu araçları tanımlama
- Otomatik sorgu yerleştirme için
embeddedByparametresiyle birlikte pgvector vegemini-embedding-001kullanarak vektör aramasını etkinleştirme valueFromParamile otomatik vektör alımı nasıl sağlanır? LLM, metin açıklaması sağlar ve Araç Kutusu, vektörü metinle birlikte sessizce kopyalar, yerleştirir ve depolar.- ADK'nın
ToolboxToolset, çalışan bir Toolbox sunucusundan araçları nasıl yüklediği, aracı kodunu minimumda tuttuğu ve veritabanı mantığını tamamen ayrıştırdığı - Hem Toolbox MCP sunucusunu hem de ADK aracısını ayrı hizmetler olarak Cloud Run'a dağıtma
Temizleme
Bu codelab'de oluşturulan kaynaklar için Google Cloud hesabınızın ücretlendirilmesini istemiyorsanız kaynakları tek tek veya projenin tamamını silebilirsiniz.
1. seçenek: Projeyi silme (önerilir)
Temizlemenin en kolay yolu projeyi silmektir. Bu işlem, projeyle ilişkili tüm kaynakları kaldırır.
gcloud projects delete $GOOGLE_CLOUD_PROJECT
2. seçenek: Kaynakları tek tek silme
Projeyi korumak ancak yalnızca bu codelab'de oluşturulan kaynakları kaldırmak istiyorsanız:
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
