1. Ringkasan
Agen AI berkembang pesat dalam popularitas, merevolusi otomatisasi tugas dan pengambilan keputusan dengan kemampuannya untuk beroperasi secara otonom, belajar, dan berinteraksi dengan lingkungannya untuk mencapai tujuan.
Codelab ini akan membantu Anda memulai dengan membangun sistem multi-agen end-to-end. Anda akan membangun server MCP mata uang, membangun agen mata uang yang menggunakan server MCP dan diekspos melalui protokol Agent2Agent (A2A), membangun agen perjalanan dengan subagen cuaca dalam proses yang menggunakan agen mata uang melalui A2A, dan terakhir men-deploy semua layanan ke Cloud Run.

Teknologi Inti
Model Context Protocol (MCP)
Model Context Protocol (MCP) adalah protokol terbuka yang menstandarkan cara aplikasi memberikan konteks dan alat ke LLM. Anggap MCP seperti port USB-C untuk aplikasi AI: MCP menyediakan cara standar untuk menghubungkan model AI ke sumber data, API, dan alat eksternal.
Dalam codelab ini, currency_mcp_server mengekspos alat get_exchange_rate melalui Streamable HTTP (/mcp), yang didukung oleh Frankfurter API publik.
Agent Development Kit (ADK)
Agent Development Kit (ADK) adalah framework orkestrasi yang fleksibel untuk mengembangkan dan men-deploy agen AI. ADK tidak bergantung model, agnostik deployment, dan dibangun untuk kompatibilitas dengan framework lain. ADK membuat pengembangan agen terasa seperti rekayasa software standar, sehingga memudahkan pembuatan, pengujian, dan orkestrasi alur kerja agentic yang kompleks.
ADK menangani percakapan pengguna, menyajikan UI Web interaktif, terhubung ke alat MCP melalui McpToolset, dan mengelola komunikasi A2A.
Protokol Agent2Agent (A2A)
Agent2Agent (A2A) Protocol adalah standar terbuka yang dirancang untuk memungkinkan komunikasi dan kolaborasi antara agen AI. Sama seperti MCP yang menstandarkan koneksi agen-ke-alat, A2A menstandarkan kolaborasi agen-ke-agen. Di dunia tempat agen dibangun di berbagai framework, lingkungan hosting, dan organisasi, A2A menyediakan bahasa umum untuk penemuan dan delegasi tugas.
ADK mengekspos currency_agent sebagai layanan A2A (to_a2a) dan memungkinkan travel_agent menggunakannya dari jarak jauh sebagai AgentTool (RemoteA2aAgent).
Subagen Lokal vs. Agen A2A Jarak Jauh
Arsitektur ini menyoroti pola penting dalam desain multi-agen:
- Local Agent Tool (
weather_agent): Berjalan dalam proses di dalam orchestrator sebagaiAgentTool, tanpa latensi jaringan atau overhead serialisasi protokol. - Alat Agen Jarak Jauh (
currency_agent): Berjalan sebagai microservice independen, yang dipanggil di seluruh jaringan melalui A2A protocol.
Yang akan Anda pelajari
- Cara membuat dan menguji server MCP lokal menggunakan FastMCP melalui HTTP yang Dapat Di-streaming
- Cara membangun Agen dengan ADK yang menggunakan alat MCP (
McpToolset) - Cara mengekspos agen ADK sebagai server A2A (
to_a2a) - Cara menguji server A2A menggunakan Klien Python A2A (
a2a.client) - Cara membangun agen orkestrator yang menggabungkan alat sub-agen lokal dengan agen A2A jarak jauh
- Cara menjalankan dan menguji sistem multi-agen lengkap secara lokal dengan UI Web ADK
- Cara membuat container dan men-deploy ketiga komponen ke Google Cloud Run
Yang Anda butuhkan
- Browser, seperti Chrome.
- Project Google Cloud yang mengaktifkan penagihan.
2. Sebelum memulai
Membuat project
Jika Anda belum memiliki project Google Cloud, buatlah.
Di Konsol Google Cloud, di halaman pemilih project, pilih atau buat project Google Cloud.
Pastikan juga penagihan diaktifkan untuk project Cloud Anda. Pelajari cara memeriksa apakah penagihan telah diaktifkan pada suatu project.
Mengaktifkan Cloud Shell
Google Cloud Shell adalah lingkungan pengembangan interaktif berbasis browser yang disediakan langsung di dalam Konsol Google Cloud. Ini adalah cara termudah untuk mulai menggunakan Google Cloud tanpa perlu menginstal alat secara lokal.
Aktifkan Cloud Shell dengan mengklik link ini. Anda dapat beralih antara Terminal Cloud Shell (untuk menjalankan perintah cloud) dan Editor (untuk melihat file) dengan mengklik tombol yang sesuai di Cloud Shell.
Setelah terhubung ke Cloud Shell, pastikan Anda telah diautentikasi:
gcloud auth list
Pastikan perintah gcloud mengetahui project Anda:
gcloud config list project
Tetapkan project ID Anda:
export PROJECT_ID=<YOUR_GOOGLE_CLOUD_PROJECT_ID>
gcloud config set project $PROJECT_ID
Aktifkan Cloud API
Aktifkan API yang diperlukan untuk Cloud Run, Cloud Build, Artifact Registry, dan Vertex AI:
gcloud services enable run.googleapis.com \
cloudbuild.googleapis.com \
artifactregistry.googleapis.com \
aiplatform.googleapis.com
Mendapatkan kode
Buat clone repositori dan buka direktori python:
git clone https://github.com/meteatamel/getting-started-mcp-a2a-adk.git
cd getting-started-mcp-a2a-adk/python
Menginstal dependensi dengan uv
uv adalah pengelola paket dan project Python yang cepat. Alat ini sudah diinstal sebelumnya di Cloud Shell. Jika dijalankan secara lokal, Anda dapat menginstalnya sebagai berikut:
# macOS and Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
# Windows (PowerShell)
# powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
Direktori Python disusun sebagai uv terpadu
Workspace. Instal semua dependensi di semua anggota ruang kerja (currency_mcp_server, currency_agent, dan travel_agent) ke dalam satu lingkungan virtual dengan menjalankan:
uv sync
Mengonfigurasi variabel lingkungan
Konfigurasikan variabel lingkungan dalam file .env di direktori python:
Opsi A: Gemini Enterprise (Google Cloud / Cloud Shell)
echo "GOOGLE_GENAI_USE_ENTERPRISE=TRUE" >> .env \
&& echo "GOOGLE_CLOUD_PROJECT=$PROJECT_ID" >> .env \
&& echo "GOOGLE_CLOUD_LOCATION=global" >> .env
Opsi B: Google AI Studio (Kunci API lokal)
Jika Anda lebih suka menggunakan kunci API dari Google AI Studio:
echo "GOOGLE_API_KEY=<your_api_key_here>"<>>/span> .env \
&& echo "GOOGLE_GENAI_USE_ENTERPRISE=FALSE" >> .env
3. Membuat Server MCP Mata Uang
Sebelum membuat agen, Anda akan mempelajari server MCP yang mengekspos alat konversi mata uang terlebih dahulu.
Server MCP memungkinkan Anda menulis program ringan untuk mengekspos kemampuan sebagai alat. Agen (atau beberapa agen) kemudian dapat mengakses alat ini menggunakan Model Context Protocol yang terstandardisasi.
Paket Python FastMCP dapat dimanfaatkan untuk membuat server MCP yang mengekspos satu alat bernama get_exchange_rate. Alat get_exchange_rate memanggil Frankfurter API untuk mendapatkan nilai tukar saat ini antara dua mata uang.
Kode untuk server MCP terletak di currency_mcp_server/server.py:
import asyncio
import logging
import os
import httpx
from fastmcp import FastMCP
logger = logging.getLogger(__name__)
logging.basicConfig(format="[%(levelname)s]: %(message)s", level=logging.INFO)
mcp = FastMCP("Currency MCP Server 💵")
@mcp.tool()
def get_exchange_rate(
currency_from: str = "USD",
currency_to: str = "EUR",
currency_date: str = "latest",
):
"""Use this to get current exchange rate.
Args:
currency_from: The currency to convert from (e.g., "USD").
currency_to: The currency to convert to (e.g., "EUR").
currency_date: The date for the exchange rate or "latest". Defaults to "latest".
Returns:
A dictionary containing the exchange rate data, or an error message if the request fails.
"""
logger.info(
f"--- 🛠️ Tool: get_exchange_rate called for converting {currency_from} to {currency_to} ---"
)
try:
response = httpx.get(
f"https://api.frankfurter.dev/v1/{currency_date}",
params={"from": currency_from, "to": currency_to},
)
response.raise_for_status()
data = response.json()
if "rates" not in data:
logger.error(f"❌ rates not found in response: {data}")
return {"error": "Invalid API response format."}
logger.info(f"✅ API response: {data}")
return data
except httpx.HTTPError as e:
logger.error(f"❌ API request failed: {e}")
return {"error": f"API request failed: {e}"}
except ValueError:
logger.error("❌ Invalid JSON response from API")
return {"error": "Invalid JSON response from API."}
if __name__ == "__main__":
port = int(os.getenv("PORT", 8080))
logger.info(f"🚀 MCP server started on port {port}")
# Could also use 'sse' transport, host="0.0.0.0" required for Cloud Run.
asyncio.run(
mcp.run_async(
transport="http",
host="0.0.0.0",
port=port,
)
)
Memulai server MCP secara lokal
Mulai server MCP di terminal Anda:
uv run python currency_mcp_server/server.py
Server dimulai di port 8080 dengan endpoint HTTP yang Dapat Di-streaming tersedia di /mcp (http://localhost:8080/mcp).
Menguji server MCP
Buka jendela terminal kedua (biarkan server MCP berjalan di jendela pertama), buka folder python (cd getting-started-mcp-a2a-adk/python), lalu jalankan skrip pengujian:
uv run python currency_mcp_server/test_server.py
Skrip pengujian terhubung ke endpoint MCP menggunakan Client FastMCP, mencantumkan alat, dan memanggil get_exchange_rate:
Connecting to MCP server at: http://localhost:8080/mcp
--- 🛠️ Tool found: get_exchange_rate ---
--- 🪛 Calling get_exchange_rate tool for USD to EUR ---
--- ✅ Success: {"amount":1.0,"base":"USD","date":"2026-09-29","rates":{"EUR":0.84919}} ---
Keren! Anda memiliki server MCP yang berfungsi dan mengekspos alat mata uang langsung. Biarkan terminal ini tetap terbuka untuk langkah berikutnya.
4. Membuat Agen Mata Uang dengan ADK
Sekarang saatnya membuat Agen Mata Uang menggunakan Agent Development Kit (ADK).
ADK menyediakan dukungan bawaan untuk alat MCP melalui class McpToolset. Agen Mata Uang terhubung ke server MCP kita menggunakan StreamableHTTPConnectionParams.
Lihat definisi agen mata uang di currency_agent/agent.py:
import logging
import os
from urllib.parse import urlparse
from dotenv import load_dotenv
from google.adk.agents import LlmAgent
from google.adk.a2a.utils.agent_to_a2a import to_a2a
from google.adk.tools.mcp_tool import McpToolset, StreamableHTTPConnectionParams
logger = logging.getLogger(__name__)
logging.basicConfig(format="[%(levelname)s]: %(message)s", level=logging.INFO)
load_dotenv()
SYSTEM_INSTRUCTION = (
"You are a specialized assistant for currency conversions. "
"Your sole purpose is to use the 'get_exchange_rate' tool to answer questions about currency exchange rates. "
"If the user asks about anything other than currency conversion or exchange rates, "
"politely state that you cannot help with that topic and can only assist with currency-related queries. "
"Do not attempt to answer unrelated questions or use tools for other purposes."
)
mcp_server_url = os.getenv("MCP_SERVER_URL", "http://localhost:8080/mcp")
if not mcp_server_url.endswith("/mcp"):
mcp_server_url = f"{mcp_server_url.rstrip('/')}/mcp"
logger.info(f"--- 🔧 Loading MCP tools from MCP Server at {mcp_server_url}... ---")
logger.info("--- 🤖 Creating ADK Currency Agent... ---")
root_agent = LlmAgent(
model="gemini-3.8-flash",
name="currency_agent",
description="An agent that can help with currency conversions",
instruction=SYSTEM_INSTRUCTION,
tools=[
McpToolset(
connection_params=StreamableHTTPConnectionParams(
url=mcp_server_url
)
)
],
)
Perhatikan bagaimana McpToolset secara otomatis menemukan dan memuat alat get_exchange_rate langsung dari server MCP yang berjalan melalui HTTP.
Menguji Agen Mata Uang dengan UI Web ADK
Anda dapat menguji agen secara terpisah menggunakan antarmuka web pengembangan ADK. Di terminal kedua, jalankan:
uv run adk web --allow_origins "*" currency_agent
Buka browser Anda di http://localhost:8000 (atau klik Web Preview di Cloud Shell).

Tanya agen:
"Berapa nilai 250 USD dalam EUR?"
Anda akan melihat agen memanggil alat MCP get_exchange_rate dan menampilkan jumlah yang dikonversi. Hentikan proses adk web menggunakan Ctrl+C sebelum melanjutkan.
5. Protokol Agent2Agent (A2A)
Agent2Agent (A2A) Protocol adalah standar terbuka yang dirancang untuk memungkinkan komunikasi dan kolaborasi antara agen AI.
Dalam sistem multi-agen modern, agen sering kali dibangun menggunakan framework yang berbeda (ADK, LangChain, CrewAI, AutoGen) dan di-deploy di infrastruktur yang berbeda. A2A menghilangkan silo ini dengan menentukan kontrak komunikasi yang terstandardisasi.

Konsep Utama A2A
- Penemuan Agen (Kartu Agen): Setiap agen yang mematuhi standar A2A mengiklankan kapabilitas, mode I/O yang didukung, persyaratan autentikasi, dan keterampilannya melalui file JSON standar yang dihosting di
/.well-known/agent-card.json. - Agent Skills (
AgentSkill): Kemampuan atau alat tertentu yang dapat dijalankan agen. Agen lain membaca keterampilan ini untuk menentukan kapan harus mendelegasikan tugas. - Komunikasi JSON-RPC: Agen bertukar pesan, tugas, dan artefak terstruktur melalui transpor standar seperti HTTP JSON-RPC 2.0.

Pada langkah berikutnya, Anda akan mengekspos Agen Mata Uang ADK sebagai server A2A sehingga agen lain dapat menemukannya dan mendelegasikan tugas konversi mata uang kepadanya.
6. Mengekspos Agen Mata Uang sebagai Server A2A
ADK memudahkan pengubahan LlmAgent apa pun menjadi server yang kompatibel dengan A2A menggunakan fungsi utilitas to_a2a().
Tinjau bagian bawah currency_agent/agent.py:
# Make the agent A2A-compatible
PORT = int(os.getenv("PORT", 8081))
AGENT_URL = os.getenv("AGENT_URL")
if AGENT_URL:
parsed = urlparse(AGENT_URL)
protocol = parsed.scheme or "https"
host = parsed.hostname
port = parsed.port or 443
else:
protocol = "http"
host = "localhost"
port = PORT
a2a_app = to_a2a(root_agent, host=host, port=port, protocol=protocol)
if __name__ == "__main__":
import uvicorn
logger.info(f"🚀 Starting currency_agent on port {PORT}")
uvicorn.run(a2a_app, host="0.0.0.0", port=PORT)
Helper to_a2a() secara otomatis:
- Memeriksa alat dan petunjuk
LlmAgent. - Membuat
AgentCardA2A yang menjelaskan kemampuannya (misalnya,currency_agent-get_exchange_rate). - Membungkus agen dalam aplikasi FastAPI (
a2a_app) yang mendukung endpoint JSON-RPC. - Mengonfigurasi
urlyang diberitahukan di Kartu Agen secara dinamis berdasarkanAGENT_URL(atau localhost).
Memulai Server A2A Agen Mata Uang
Di terminal kedua, mulai agen mata uang:
uv run python currency_agent/agent.py
Server dimulai di port 8081:
[INFO]: --- 🔧 Loading MCP tools from MCP Server at http://localhost:8080/mcp... ---
[INFO]: --- 🤖 Creating ADK Currency Agent... ---
[INFO]: 🚀 Starting currency_agent on port 8081
INFO: Started server process
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:8081 (Press CTRL+C to quit)
Memeriksa Kartu Agen
Di browser Anda, buka endpoint Kartu Agen: http://localhost:8081/.well-known/agent-card.json
Anda akan melihat metadata JSON yang dibuat otomatis:
{
"name": "currency_agent",
"description": "An agent that can help with currency conversions",
"supportedInterfaces": [
{
"url": "http://localhost:8081",
"protocolBinding": "JSONRPC",
"protocolVersion": "1.0"
}
],
"version": "0.0.1",
"capabilities": {
"streaming": true
},
"defaultInputModes": [
"text/plain"
],
"defaultOutputModes": [
"text/plain"
],
"skills": [
{
"id": "currency_agent",
"name": "model",
"description": "An agent that can help with currency conversions",
"tags": [
"llm"
]
},
{
"id": "currency_agent-get_exchange_rate",
"name": "get_exchange_rate",
"description": "Use this to get current exchange rate.",
"tags": [
"llm",
"tools"
]
}
]
}
Melakukan pengujian dengan Klien A2A
Buka terminal ketiga, buka folder python (cd getting-started-mcp-a2a-adk/python), dan uji endpoint A2A menggunakan skrip klien pengujian A2A khusus:
uv run python currency_agent/test_a2aclient.py
Klien me-resolve kartu agen menggunakan A2ACardResolver dan mengirimkan pesan JSON-RPC:
🔄 Fetching the agent card at http://localhost:8081
✅ Successfully fetched the agent card
====================================================
AgentCard
====================================================
Name : currency_agent
Description : An agent that can help with currency conversions
Interfaces : [0] http://localhost:8081 (JSONRPC 1.0)
Skills : currency_agent, currency_agent-get_exchange_rate
====================================================
🔄 Initializing a non-streaming client
Sending request: "how much is 100 USD in GBP?"
Response:
100 USD is currently equal to approximately 73.37 GBP...
Agen Mata Uang kini beroperasi sebagai server A2A yang berfungsi penuh.
7. Membangun Agen Perjalanan
Sekarang Anda akan membangun Agen Perjalanan yang mengatur. Agen ini menunjukkan cara agen ADK dapat dengan mudah menggabungkan dua paradigma alat yang berbeda:
- Local Agent Tool (
weather_agent): Sub-agen ADK dalam proses yang berjalan di runtime Python yang sama, sehingga menghindari latensi jaringan atau serialisasi. - Remote Agent Tool (
currency_agent): Agen eksternal yang terhubung melalui jaringan via A2A protocol menggunakanRemoteA2aAgent.
+-----------------------------+
| travel_agent |
| (Orchestrator with Web UI) |
+--------------+--------------+
|
+---------------------+---------------------+
| (In-process call) | (A2A Network Hop)
v v
+-------------------------+ +-------------------------+
| weather_agent | | currency_agent |
| (Local AgentTool) | | (Remote A2A Agent) |
| Calls wttr.in API | | Calls Currency MCP Svc |
+-------------------------+ +-------------------------+
1. Subagen Cuaca Lokal
Lihat travel_agent/subagents/weather_agent.py:
import logging
import httpx
from google.adk.agents import LlmAgent
logger = logging.getLogger(__name__)
SYSTEM_INSTRUCTION = (
"You are a specialized assistant for providing weather forecasts and conditions for travel destinations. "
"Your sole purpose is to use the 'get_weather' tool to fetch weather information. "
"Provide clear, concise summaries of current weather conditions, temperatures, and forecasts to help travelers pack and plan."
)
def get_weather(location: str = "London") -> dict:
"""Gets the current weather and forecast for a given location or city."""
logger.info(f"--- 🌤️ Tool: get_weather called for {location} ---")
try:
response = httpx.get(
f"https://wttr.in/{location}?format=j1",
headers={"User-Agent": "curl/7.68.0"},
timeout=8.0,
)
response.raise_for_status()
data = response.json()
current = data["current_condition"][0]
return {
"location": location,
"condition": current.get("weatherDesc", [{}])[0].get("value", "Unknown"),
"temperature_celsius": f"{current.get('temp_C', 'N/A')}°C",
"temperature_fahrenheit": f"{current.get('temp_F', 'N/A')}°F",
"humidity": f"{current.get('humidity', 'N/A')}%",
"wind_speed_kmph": f"{current.get('windspeedKmph', 'N/A')} km/h",
}
except Exception as e:
logger.warning(f"⚠️ Weather lookup failed: {e}. Returning simulated estimate.")
return {
"location": location,
"condition": "Partly Cloudy",
"temperature_celsius": "20°C",
"temperature_fahrenheit": "68°F",
"humidity": "55%",
"wind_speed_kmph": "10 km/h",
"note": f"Live data unavailable ({e}); showing estimated conditions.",
}
weather_agent = LlmAgent(
model="gemini-3.8-flash",
name="weather_agent",
description="A local specialist agent that provides current weather reports and forecasts for travel destinations.",
instruction=SYSTEM_INSTRUCTION,
tools=[get_weather],
)
Agen cuaca adalah LlmAgent dengan alat fungsi yang mengambil cuaca real-time dari wttr.in dengan penggantian yang tangguh.
2. Orchestrator Agen Perjalanan
Sekarang lihat travel_agent/agent.py:
import logging
import os
from dotenv import load_dotenv
from google.adk.agents import LlmAgent
from google.adk.tools.agent_tool import AgentTool
from google.adk.agents.remote_a2a_agent import RemoteA2aAgent, AGENT_CARD_WELL_KNOWN_PATH
try:
from travel_agent.subagents.weather_agent import weather_agent
except ImportError:
from subagents.weather_agent import weather_agent
logger = logging.getLogger(__name__)
logging.basicConfig(format="[%(levelname)s]: %(message)s", level=logging.INFO)
load_dotenv()
SYSTEM_INSTRUCTION = (
"You are a helpful travel assistant. You help users plan trips, recommend places, "
"and answer travel-related questions.\n\n"
"- Whenever a user asks about currency exchange rates or money conversions, "
"delegate the request to the 'currency_agent' tool.\n"
"- Whenever a user asks about the weather, climate, or forecasts for a destination, "
"delegate the request to the 'weather_agent' tool."
)
CURRENCY_AGENT_URL = os.getenv("CURRENCY_AGENT_URL", "http://localhost:8081").rstrip("/")
logger.info(
"--- 🔗 Connecting to Remote A2A Currency Agent at %s... ---",
CURRENCY_AGENT_URL,
)
currency_remote_agent = RemoteA2aAgent(
name="currency_agent",
agent_card=f"{CURRENCY_AGENT_URL}{AGENT_CARD_WELL_KNOWN_PATH}",
description="An agent that can help with currency conversions and exchange rates.",
)
logger.info("--- 🤖 Creating ADK Travel Agent... ---")
root_agent = LlmAgent(
model="gemini-3.8-flash",
name="travel_agent",
description="A travel assistant that can help plan trips, check weather forecasts via the local weather agent, and convert currencies via the remote currency agent.",
instruction=SYSTEM_INSTRUCTION,
tools=[
AgentTool(agent=currency_remote_agent),
AgentTool(agent=weather_agent),
],
)
if __name__ == "__main__":
import uvicorn
from google.adk.cli.fast_api import get_fast_api_app
PORT = int(os.getenv("PORT", 8082))
logger.info(f"🚀 Starting travel_agent Web UI on port {PORT}")
app = get_fast_api_app(web=True, allow_origins=["*"], agents_dir=os.path.dirname(__file__) or ".")
uvicorn.run(app, host="0.0.0.0", port=PORT)
Sorotan utama:
RemoteA2aAgentmengambil kartu Agen Mata Uang darihttp://localhost:8081/.well-known/agent-card.json.currency_remote_agentdanweather_agentdigabungkan menggunakanAgentToolADK.- Menjalankan
travel_agent/agent.pyakan langsung mem-booting UI Web ADK di port8082menggunakanget_fast_api_app(web=True).
8. Menjalankan dan Menguji Sistem Multi-Agen secara Lokal
Sekarang Anda telah menyiapkan ketiga komponen tersebut. Mari kita jalankan dan uji sistem lengkap secara lokal.
Menjalankan ketiga layanan
Pastikan layanan berjalan di tiga jendela terminal terpisah (dari direktori getting-started-mcp-a2a-adk/python) dalam urutan berikut:
Terminal 1 (Server MCP Mata Uang):
uv run python currency_mcp_server/server.py
(Berjalan di port 8080)
Terminal 2 (Agen A2A Mata Uang):
uv run python currency_agent/agent.py
(Running on port 8081)
Terminal 3 (Agen Perjalanan dengan UI Web):
uv run python travel_agent/agent.py
(Berjalan di port 8082)
Menguji melalui UI Web ADK
Buka browser Anda di http://localhost:8082 (atau gunakan Web Preview di port 8082 di Cloud Shell).
Ajukan pertanyaan gabungan kepada Agen Perjalanan yang memerlukan kedua alat:
"Saya sedang merencanakan perjalanan ke London. Bagaimana cuacanya dan berapa nilai 200 EUR dalam GBP?"
Tonton alur eksekusi:
- Agen Perjalanan menerima permintaan di UI Web.
- Agen ini mendelegasikan pertanyaan cuaca dalam proses ke
weather_agentlokal, yang mengambil kondisi saat ini dariwttr.in. - Layanan ini mendelegasikan konversi mata uang melalui A2A protocol ke
currency_agentdi port 8081. currency_agentmemanggilcurrency_mcp_serverdi port 8080 melalui MCP untuk mengambil nilai tukar.- Semua hasil akan disintesis dan ditampilkan kepada Anda dalam satu jawaban yang bermanfaat.

Menguji melalui Command Line
Anda juga dapat menguji kueri langsung dari CLI tanpa membuka browser:
uv run adk run travel_agent "What is the weather in London and how much is 100 USD in EUR?"
Setelah semuanya berfungsi dengan lancar di komputer lokal Anda, mari kita deploy seluruh sistem ke Google Cloud Run.
9. Men-deploy Sistem Multi-Agen ke Cloud Run
Setiap komponen memiliki Dockerfile dan pyproject.toml mandiri sehingga dapat di-build dan di-deploy secara independen ke Cloud Run.
Dengan menggunakan gcloud, Anda akan men-deploy setiap layanan dan otomatis menghubungkan URL-nya.
Menetapkan variabel lingkungan
Tetapkan project ID Cloud dan region target Anda:
export PROJECT_ID=<YOUR_GOOGLE_CLOUD_PROJECT_ID>
export REGION=us-central1
Langkah 1: Deploy Server MCP Mata Uang
Deploy server MCP langsung dari sumber:
# 1. Deploy MCP server
gcloud run deploy currency-mcp-server \
--source currency_mcp_server \
--region $REGION \
--allow-unauthenticated
# 2. Capture the deployed MCP server URL
MCP_SERVER_URL=$(gcloud run services describe currency-mcp-server --region $REGION --format='value(status.url)')/mcp
echo "MCP Server URL: $MCP_SERVER_URL"
Langkah 2: Deploy Agen Mata Uang
Karena URL publik currency-agent ditetapkan pada deployment pertamanya, deploy layanan terlebih dahulu, ambil URL-nya, dan perbarui variabel lingkungan AGENT_URL-nya sehingga Kartu Agen A2A-nya memberitahukan alamat HTTPS publik yang benar:
# 1. Deploy Currency Agent connected to the deployed MCP Server
gcloud run deploy currency-agent \
--source currency_agent \
--region $REGION \
--allow-unauthenticated \
--update-env-vars MCP_SERVER_URL="$MCP_SERVER_URL",GOOGLE_GENAI_USE_ENTERPRISE="true",GOOGLE_CLOUD_PROJECT="$PROJECT_ID",GOOGLE_CLOUD_LOCATION="global"
# 2. Capture its assigned Cloud Run URL
CURRENCY_AGENT_URL=$(gcloud run services describe currency-agent --region $REGION --format='value(status.url)')
echo "Currency Agent URL: $CURRENCY_AGENT_URL"
# 3. Update AGENT_URL so the agent advertises its public HTTPS endpoint in its Agent Card
gcloud run services update currency-agent \
--region $REGION \
--update-env-vars AGENT_URL="$CURRENCY_AGENT_URL"
Langkah 3: Men-deploy Agen Perjalanan
Sekarang, deploy agen perjalanan, dengan mengonfigurasinya menggunakan CURRENCY_AGENT_URL:
# 1. Deploy Travel Agent (with ADK Web UI) connected to Currency Agent
gcloud run deploy travel-agent \
--source travel_agent \
--region $REGION \
--allow-unauthenticated \
--update-env-vars CURRENCY_AGENT_URL="$CURRENCY_AGENT_URL",GOOGLE_GENAI_USE_ENTERPRISE="true",GOOGLE_CLOUD_PROJECT="$PROJECT_ID",GOOGLE_CLOUD_LOCATION="global"
# 2. Capture its assigned Cloud Run URL
TRAVEL_AGENT_URL=$(gcloud run services describe travel-agent --region $REGION --format='value(status.url)')
echo "Travel Agent URL: $TRAVEL_AGENT_URL"
10. Menguji Sistem Multi-Agen di Cloud Run
Setelah ketiga microservice di-deploy, mari kita verifikasi setiap lapisan di Cloud Run.
1. Menguji server MCP jarak jauh
Uji server MCP Cloud Run yang di-deploy dari command line Anda:
MCP_SERVER_URL="$MCP_SERVER_URL" uv run python currency_mcp_server/test_server.py
Anda akan melihat alat tersebut tercantum dan berhasil dipanggil di Cloud Run.
2. Menguji Agen Mata Uang melalui A2A
Uji Agen Mata Uang yang di-deploy menggunakan klien pengujian A2A:
AGENT_URL="$CURRENCY_AGENT_URL" uv run python currency_agent/test_a2aclient.py
Klien akan mengambil Kartu Agen jarak jauh dari Cloud Run dan bertukar pesan melalui HTTPS JSON-RPC.
3. Menguji UI Web Agen Perjalanan di Cloud Run
Buka $TRAVEL_AGENT_URL di browser Anda.
UI Web ADK lengkap disajikan langsung dari Cloud Run. Coba tanyakan:
"Saya sedang merencanakan perjalanan ke Tokyo. Bagaimana cuacanya dan berapa nilai 500 USD dalam JPY?"
[Browser]
│
▼ (HTTPS)
[Cloud Run: travel-agent]
├──> Local in-process tool: weather_agent (wttr.in)
└──> A2A JSON-RPC (HTTPS)
│
▼
[Cloud Run: currency-agent]
└──> MCP Streamable HTTP (HTTPS)
│
▼
[Cloud Run: currency-mcp-server] (Frankfurter API)
Ketiga layanan ini diskalakan secara independen di infrastruktur serverless, dan berkomunikasi dengan lancar melalui protokol terbuka.
11. Selamat & Pembersihan
Yang telah Anda capai
Selamat! Anda telah membangun dan men-deploy sistem multi-agen tingkat produksi:
- Model Context Protocol (MCP): Membuat server FastMCP yang mengekspos alat API live melalui Streamable HTTP.
- Agent Development Kit (ADK): Membangun agen modular menggunakan
LlmAgent, menghubungkan alat MCP denganMcpToolset, dan menghosting UI Web ADK. - Protokol Agent2Agent (A2A): Mengekspos agen sebagai layanan A2A (
to_a2a), memublikasikan Kartu Agen (agent-card.json), dan menggunakan agen jarak jauh menggunakanRemoteA2aAgent. - Arsitektur Multi-Agen: Menggabungkan sub-agen dalam proses lokal (
weather_agent) dengan agen jarak jauh terdistribusi (currency_agent). - Deployment Serverless Cloud Run: Memasukkan ketiga layanan ke dalam container dan men-deploy-nya dengan konfigurasi otomatis.
Untuk kode lengkap (termasuk implementasi Python dan Java) dan update mendatang, kunjungi repositori getting-started-mcp-a2a-adk.
Pembersihan
Agar tidak menimbulkan biaya pada akun Google Cloud Anda untuk layanan Cloud Run yang dibuat dalam codelab ini:
Hapus layanan Cloud Run yang di-deploy:
gcloud run services delete currency-mcp-server --region $REGION --quiet
gcloud run services delete currency-agent --region $REGION --quiet
gcloud run services delete travel-agent --region $REGION --quiet
Atau, jika Anda membuat project khusus untuk codelab ini, Anda dapat menonaktifkan seluruh project:
gcloud projects delete $PROJECT_ID