Memulai MCP, ADK, dan A2A

Mulai Menggunakan MCP, ADK, dan A2A

Tentang codelab ini

subjectTerakhir diperbarui Jun 25, 2025
account_circleDitulis oleh Jack Wotherspoon

1. Ringkasan

Agen AI semakin populer dan merevolusi otomatisasi tugas dan pengambilan keputusan dengan kemampuannya untuk beroperasi secara otonom, belajar, dan berinteraksi dengan lingkungannya untuk mencapai tujuan.

Namun, bagaimana cara membuat agen? Codelab ini akan membantu Anda memulai dengan menunjukkan cara membuat agen mata uang yang dapat mengonversi mata uang dari berbagai negara. Dengan tujuan untuk mempelajari teknologi terbaru guna membantu Anda memahami akronim yang mungkin Anda lihat di internet (MCP, ADK, A2A).

Arsitektur

Model Context Protocol (MCP)

Model Context Protocol (MCP) adalah protokol terbuka yang menstandardisasi cara aplikasi memberikan konteks ke LLM. MCP menyediakan cara standar untuk menghubungkan model AI ke resource, perintah, dan alat.

Agent Development Kit (ADK)

Agent Development Kit (ADK) adalah framework orkestrasi fleksibel untuk mengembangkan dan men-deploy agen AI. ADK tidak bergantung pada model, tidak bergantung pada deployment, dan dibuat agar kompatibel dengan framework lain. ADK dirancang agar pengembangan agen terasa lebih seperti pengembangan software, sehingga memudahkan developer membuat, men-deploy, dan mengatur arsitektur agentic yang berkisar dari tugas sederhana hingga alur kerja yang kompleks.

Protokol Agent2Agent (A2A)

Protokol Agent2Agent (A2A) adalah standar terbuka yang dirancang untuk memungkinkan komunikasi dan kolaborasi yang lancar antar-agen AI. Sama seperti MCP yang menyediakan cara standar untuk memberi LLM akses ke data dan alat, A2A menyediakan cara standar bagi agen untuk berkomunikasi dengan agen lain. Di dunia tempat agen dibuat menggunakan berbagai framework dan oleh vendor yang berbeda, A2A menyediakan bahasa umum, menghilangkan batasan, dan mendorong interoperabilitas.

Yang akan Anda pelajari

  • Cara membuat server MCP lokal
  • Men-deploy server MCP ke Cloud Run
  • Cara membangun Agen dengan Agent Development Kit yang menggunakan alat MCP
  • Cara mengekspos agen ADK sebagai Server A2A
  • Menguji Server A2A menggunakan Klien A2A

Yang Anda butuhkan

  • Browser, seperti Chrome atau Firefox
  • Project Google Cloud yang mengaktifkan penagihan.

2. Sebelum memulai

Membuat project

  1. Di Konsol Google Cloud, di halaman pemilih project, pilih atau buat project Google Cloud.
  2. Pastikan penagihan diaktifkan untuk project Cloud Anda. Pelajari cara memeriksa apakah penagihan telah diaktifkan pada suatu project.
  3. Aktifkan Cloud Shell dengan mengklik link ini. Anda dapat beralih antara Terminal Cloud Shell (untuk menjalankan perintah cloud) dan Editor (untuk membangun project) dengan mengklik tombol yang sesuai dari Cloud Shell.
  4. Setelah terhubung ke Cloud Shell, Anda dapat memeriksa bahwa Anda sudah diautentikasi dan project sudah ditetapkan ke project ID Anda menggunakan perintah berikut:
gcloud auth list
  1. Jalankan perintah berikut di Cloud Shell untuk mengonfirmasi bahwa perintah gcloud mengetahui project Anda.
gcloud config list project
  1. Gunakan perintah berikut untuk menyetel project Anda:
export PROJECT_ID=<YOUR_PROJECT_ID>
gcloud config set project $PROJECT_ID
  1. Aktifkan API yang diperlukan menggunakan perintah berikut. Tindakan ini memerlukan waktu beberapa menit.
gcloud services enable cloudresourcemanager.googleapis.com \
                       
servicenetworking.googleapis.com \
                       
run.googleapis.com \
                       
cloudbuild.googleapis.com \
                       
artifactregistry.googleapis.com \
                       
aiplatform.googleapis.com \
                       
compute.googleapis.com
  1. Pastikan Anda memiliki Python 3.10+

Lihat dokumentasi untuk mempelajari perintah gcloud dan penggunaannya.

3. Penginstalan

  1. Meng-cloning repository
git clone https://github.com/jackwotherspoon/currency-agent.git
cd currency-agent
  1. Instal uv (digunakan untuk mengelola dependensi):
# macOS and Linux
curl -LsSf https://astral.sh/uv/install.sh | sh

# Windows (uncomment below line)
# powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
  1. Konfigurasi variabel lingkungan (melalui file .env):

Buat file .env dengan menjalankan perintah berikut:

echo "GOOGLE_GENAI_USE_VERTEXAI=TRUE" >> .env \
&& echo "GOOGLE_CLOUD_PROJECT=$PROJECT_ID" >> .env \
&& echo "GOOGLE_CLOUD_LOCATION=us-central1" >> .env

4. Membuat Server MCP lokal

Sebelum mengatur agen mata uang, Anda harus membuat server MCP terlebih dahulu untuk mengekspos alat yang akan dibutuhkan agen.

Server MCP memungkinkan Anda menulis program ringan untuk mengekspos kemampuan tertentu (seperti mengambil nilai tukar mata uang) sebagai alat. Kemudian, satu atau beberapa agen dapat mengakses alat ini menggunakan Model Context Protocol (MCP) standar.

Paket Python FastMCP dapat dimanfaatkan untuk membuat server MCP yang mengekspos satu alat bernama get_exchange_rate. Alat get_exchange_rate melakukan panggilan melalui internet ke Frankfurter API untuk mendapatkan nilai tukar saat ini antara dua mata uang.

Kode untuk server MCP dapat ditemukan di file mcp-server/server.py:

import logging
import os

import httpx
from fastmcp import FastMCP

# Set up logging
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.app/{currency_date}',
           
params={'from': currency_from, 'to': currency_to},
       
)
       
response.raise_for_status()

       
data = response.json()
       
if 'rates' not in data:
           
return {'error': 'Invalid API response format.'}
       
logger.info(f'✅ API response: {data}')
       
return data
   
except httpx.HTTPError as e:
       
return {'error': f'API request failed: {e}'}
   
except ValueError:
       
return {'error': 'Invalid JSON response from API.'}

if __name__ == "__main__":
   
logger.info(f"🚀 MCP server started on port {os.getenv('PORT', 8080)}")
   
# Could also use 'sse' transport, host="0.0.0.0" required for Cloud Run.
   
asyncio.run(
       
mcp.run_async(
           
transport="streamable-http",
           
host="0.0.0.0",
           
port=os.getenv("PORT", 8080),
       
)
   
)

Untuk memulai server MCP secara lokal, buka terminal dan jalankan perintah berikut (server akan dimulai di http://localhost:8080):

uv run mcp-server/server.py

Uji apakah server MCP berfungsi dengan baik dan alat get_exchange_rate dapat diakses menggunakan Model Context Protocol.

Di jendela terminal baru (agar Anda tidak menghentikan server MCP lokal), jalankan perintah berikut:

uv run mcp-server/test_server.py

Anda akan melihat nilai tukar saat ini dari 1 USD (dolar AS) ke EUR (Euro):

--- 🛠️ Tool found: get_exchange_rate ---
--- 🪛 Calling get_exchange_rate tool for USD to EUR ---
--- Success: {
 
"amount": 1.0,
 
"base": "USD",
 
"date": "2025-05-26",
 
"rates": {
   
"EUR": 0.87866
 
}
} ---

Keren! Anda berhasil memiliki server MCP yang berfungsi dengan alat yang dapat diakses oleh agen Anda.

Sebelum melanjutkan ke stasiun berikutnya, hentikan server MCP yang berjalan secara lokal dengan menjalankan Ctrl+C (atau Command+C di Mac) di terminal tempat Anda memulainya.

5. Men-deploy Server MCP ke Cloud Run

Sekarang Anda siap men-deploy server MCP sebagai server MCP jarak jauh ke Cloud Run 🚀☁️

Manfaat menjalankan server MCP dari jarak jauh

Menjalankan server MCP dari jarak jauh di Cloud Run dapat memberikan beberapa manfaat:

  • 📈Skalabilitas: Cloud Run dibuat untuk meningkatkan kapasitas dengan cepat untuk menangani semua permintaan yang masuk. Cloud Run akan menskalakan server MCP Anda secara otomatis berdasarkan permintaan.
  • 👥Server terpusat: Anda dapat membagikan akses ke server MCP terpusat dengan anggota tim melalui hak istimewa IAM, sehingga mereka dapat terhubung ke server tersebut dari komputer lokal mereka, bukan menjalankan server mereka sendiri secara lokal. Jika perubahan dilakukan pada server MCP, semua anggota tim akan mendapatkan manfaatnya.
  • 🔐Keamanan: Cloud Run menyediakan cara mudah untuk mewajibkan permintaan terautentikasi. Tindakan ini memungkinkan hanya koneksi aman ke server MCP Anda, sehingga mencegah akses tidak sah.

Ubah ke direktori mcp-server:

cd mcp-server

Men-deploy server MCP ke Cloud Run:

gcloud run deploy mcp-server --no-allow-unauthenticated --region=us-central1 --source .

Jika layanan Anda berhasil di-deploy, Anda akan melihat pesan seperti berikut:

Service [mcp-server] revision [mcp-server-12345-abc] has been deployed and is serving 100 percent of traffic.

Mengautentikasi Klien MCP

Karena Anda menentukan --no-allow-unauthenticated untuk mewajibkan autentikasi, setiap klien MCP yang terhubung ke server MCP jarak jauh harus melakukan autentikasi.

Dokumen resmi untuk Menghosting server MCP di Cloud Run memberikan informasi selengkapnya tentang topik ini, bergantung pada tempat Anda menjalankan klien MCP.

Anda harus menjalankan proxy Cloud Run untuk membuat tunnel terautentikasi ke server MCP jarak jauh di komputer lokal Anda.

Secara default, URL layanan Cloud Run mengharuskan semua permintaan diotorisasi dengan peran IAM Cloud Run Invoker (roles/run.invoker). Binding kebijakan IAM ini memastikan bahwa mekanisme keamanan yang kuat digunakan untuk mengautentikasi klien MCP lokal Anda.

Anda harus memastikan bahwa Anda atau anggota tim yang mencoba mengakses server MCP jarak jauh memiliki peran IAM roles/run.invoker yang terikat ke pokok IAM (akun Google Cloud) mereka.

gcloud run services proxy mcp-server --region=us-central1

Anda akan melihat output berikut:

Proxying to Cloud Run service [mcp-server] in project [<YOUR_PROJECT_ID>] region [us-central1]
http://127.0.0.1:8080 proxies to https://mcp-server-abcdefgh-uc.a.run.app

Semua traffic ke http://127.0.0.1:8080 kini akan diautentikasi dan diteruskan ke server MCP jarak jauh.

Menguji server MCP jarak jauh

Di terminal baru, kembali ke folder root dan jalankan ulang file mcp-server/test_server.py untuk memastikan server MCP jarak jauh berfungsi.

cd ..
uv run mcp-server/test_server.py

Anda akan melihat output yang serupa seperti saat menjalankan server secara lokal:

--- 🛠️ Tool found: get_exchange_rate ---
--- 🪛 Calling get_exchange_rate tool for USD to EUR ---
--- Success: {
 
"amount": 1.0,
 
"base": "USD",
 
"date": "2025-05-26",
 
"rates": {
   
"EUR": 0.87866
 
}
} ---

Anda dapat membuat kueri log server MCP Cloud Run yang di-deploy jika ingin memverifikasi bahwa server jarak jauh memang dipanggil:

gcloud run services logs read mcp-server --region us-central1 --limit 5

Anda akan melihat output berikut di log:

2025-06-04 14:28:29,871 [INFO]: --- 🛠️ Tool: get_exchange_rate called for converting USD to EUR ---
2025-06-04 14:28:30,610 [INFO]: HTTP Request: GET https://api.frankfurter.app/latest?from=USD&to=EUR "HTTP/1.1 200 OK"
2025-06-04 14:28:30,611 [INFO]: API response: {'amount': 1.0, 'base': 'USD', 'date': '2025-06-03', 'rates': {'EUR': 0.87827}}

Setelah memiliki server MCP jarak jauh, Anda dapat melanjutkan ke pembuatan agen. 🤖

6. Membuat Agen dengan Agent Development Kit (ADK)

Anda telah men-deploy server MCP, sekarang saatnya membuat agen mata uang menggunakan Agent Development Kit (ADK).

Agent Development Kit baru saja merilis rilis stabil v1.0.0. Tonggak pencapaian ini menandakan bahwa Python ADK kini siap digunakan dalam produksi, menawarkan platform yang andal dan tangguh bagi developer untuk membangun dan men-deploy agen mereka dengan percaya diri di lingkungan aktif.

ADK membuat pembuatan agen menjadi sangat ringan dan memungkinkan agen terhubung dengan mudah ke server MCP dengan dukungan bawaan untuk Alat MCP. Agen mata uang akan mengakses alat get_exchange_rate menggunakan class MCPToolset ADK.

Kode untuk agen mata uang terletak di currency_agent/agent.py:

import logging
import os

from dotenv import load_dotenv
from google.adk.agents import LlmAgent
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."
)

def create_agent() -> LlmAgent:
    """Constructs the ADK currency conversion agent."""
   
logger.info("--- 🔧 Loading MCP tools from MCP Server... ---")
   
logger.info("--- 🤖 Creating ADK Currency Agent... ---")
   
return LlmAgent(
       
model="gemini-2.5-flash",
       
name="currency_agent",
       
description="An agent that can help with currency conversions",
       
instruction=SYSTEM_INSTRUCTION,
       
tools=[
           
MCPToolset(
               
connection_params=StreamableHTTPConnectionParams(
                   
url=os.getenv("MCP_SERVER_URL", "http://localhost:8080/mcp")
               
)
           
)
       
],
   
)


root_agent = create_agent()

Untuk menguji agen mata uang dengan cepat, Anda dapat memanfaatkan UI dev ADK, yang diakses dengan menjalankan adk web:

uv run adk web

Di browser, buka http://localhost:8000 untuk melihat dan menguji agen.

Pastikan currency_agent dipilih sebagai agen di pojok kiri atas UI web.

UI Web ADK

Tanyakan kepada agen di area chat, misalnya "Berapa nilai 250 CAD dalam USD?". Anda akan melihat agen memanggil alat MCP get_exchange_rate kami sebelum memberikan respons.

ADK Web Currency Agent

Agen berhasil! Alat ini dapat menangani kueri yang berkaitan dengan konversi mata uang 💸.

7. Protokol Agent2Agent (A2A)

Protokol Agent2Agent (A2A) adalah standar terbuka yang dirancang untuk memungkinkan komunikasi dan kolaborasi yang lancar antar-agen AI. Hal ini memungkinkan agen yang dibangun menggunakan berbagai framework dan oleh vendor yang berbeda, untuk berkomunikasi satu sama lain dalam bahasa yang sama, sehingga menghilangkan batasan dan meningkatkan interoperabilitas.

Protokol A2A

A2A memungkinkan agen untuk:

  • Temukan: Temukan agen lain dan pelajari keterampilan (AgentSkill) dan kemampuannya (AgentCapabilities) menggunakan Kartu Agen standar.
  • Berkomunikasi: Bertukar pesan dan data dengan aman.
  • Berkolaborasi: Mendelegasikan tugas dan mengoordinasikan tindakan untuk mencapai sasaran yang kompleks.

Protokol A2A memfasilitasi komunikasi ini melalui mekanisme seperti "Kartu Agen" yang berfungsi sebagai kartu nama digital yang dapat digunakan agen untuk mengiklankan kemampuan dan informasi koneksi mereka.

Kartu Agen A2A

Sekarang saatnya mengekspos agen mata uang menggunakan A2A sehingga dapat dipanggil oleh agen dan klien lain.

A2A Python SDK

A2A Python SDK menyediakan model Pydantic untuk setiap resource yang disebutkan di atas; AgentSkill, AgentCapabilities, dan AgentCard. Hal ini menyediakan antarmuka untuk mempercepat pengembangan dan integrasi dengan protokol A2A.

AgentSkill adalah cara Anda mengiklankan kepada agen lain bahwa agen mata uang memiliki alat untuk get_exchange_rate:

# A2A Agent Skill definition
skill = AgentSkill(
   
id='get_exchange_rate',
   
name='Currency Exchange Rates Tool',
   
description='Helps with exchange values between various currencies',
   
tags=['currency conversion', 'currency exchange'],
   
examples=['What is exchange rate between USD and GBP?'],
)

Kemudian, sebagai bagian dari AgentCard, keterampilan dan kemampuan agen akan dicantumkan bersama dengan detail tambahan seperti mode input dan output yang dapat ditangani agen:

# A2A Agent Card definition
agent_card = AgentCard(
   
name='Currency Agent',
   
description='Helps with exchange rates for currencies',
   
url=f'http://{host}:{port}/',
   
version='1.0.0',
   
defaultInputModes=["text"],
   
defaultOutputModes=["text"],
   
capabilities=AgentCapabilities(streaming=True),
   
skills=[skill],
)

Antarmuka AgentExecutor menangani logika inti tentang cara agen A2A memproses permintaan dan membuat respons/peristiwa. A2A Python SDK menyediakan class dasar abstrak a2a.server.agent_execution.AgentExecutor yang perlu Anda terapkan.

Saatnya menggabungkan semuanya dengan agen mata uang dan menunjukkan kehebatan A2A.

8. Server A2A Currency Agent

Sekarang Anda akan melihat beberapa bagian kode dan melihat bagaimana berbagai bagian yang membentuk server A2A bekerja sama.

Di dalam file currency_agent/agent_executor.py, Anda memiliki class ADKAgentExecutor yang diturunkan dari class abstrak A2A AgentExecutor. Library ini menangani pemanggilan agen ADK dengan memanggil runner ADK, memproses permintaan ke agen, dan mengonversi bolak-balik antara google.genai.types yang digunakan ADK dan a2a.types yang digunakan A2A.

# ... see file for full code

class ADKAgentExecutor(AgentExecutor):
    """An AgentExecutor that runs an ADK agent."""

   
def __init__(self, runner: Runner, card: AgentCard):
       
self.runner = runner
       
self._card = card
       
self._running_sessions = {}

   
def _run_agent(
       
self, session_id, new_message: types.Content
   
) -> AsyncGenerator[Event, None]:
       
return self.runner.run_async(
           
session_id=session_id, user_id="self", new_message=new_message
       
)

   
async def _process_request(
       
self,
       
new_message: types.Content,
       
session_id: str,
       
task_updater: TaskUpdater,
   
) -> None:
       
session = await self._upsert_session(
           
session_id,
       
)
       
session_id = session.id
       
# Run through all events within the request.
       
async for event in self._run_agent(session_id, new_message):
           
if event.is_final_response():
               
parts = convert_genai_parts_to_a2a(event.content.parts)
               
logger.debug("✅ Yielding final response: %s", parts)
               
await task_updater.add_artifact(parts)
               
await task_updater.complete()
               
break
           
# If the agent is not making a function call, yield an update.
           
if not event.get_function_calls():
               
logger.debug("⏳ Yielding update response")
               
await task_updater.update_status(
                   
TaskState.working,
                   
message=task_updater.new_agent_message(
                       
convert_genai_parts_to_a2a(event.content.parts),
                   
),
               
)
           
else:
               
logger.debug("➡️ Skipping event")

   
async def execute(
       
self,
       
context: RequestContext,
       
event_queue: EventQueue,
   
):
       
# Run the agent until either complete or the task is suspended.
       
updater = TaskUpdater(event_queue, context.task_id, context.context_id)
       
# Immediately notify that the task is submitted.
       
if not context.current_task:
           
updater.submit()
       
updater.start_work()
       
await self._process_request(
           
types.UserContent(
               
parts=convert_a2a_parts_to_genai(context.message.parts),
           
),
           
context.context_id,
           
updater,
       
)
       
logger.debug("--- 💵💱💶 [Currency] execute exiting ---")

# ... see file for full code

Di dalam currency_agent/__main__.py, Anda akan melakukan inisialisasi AgentSkill, AgentCard, dan membuat agen mata uang ADK. Di sini juga Anda menyiapkan dan memulai server A2A.

A2A Python SDK menyediakan class A2AFastAPIApplication yang menyederhanakan cara menjalankan server HTTP yang kompatibel dengan A2A. Aplikasi ini menggunakan FastAPI untuk framework web dan biasanya dijalankan dengan server ASGI seperti Uvicorn.

# ... see file for full code
@click.command()
@click.option("--host", "host", default="localhost")
@click.option("--port", "port", default=10000)
def main(host: str, port: int):
   
# Verify one of Google AI Studio or Vertex AI is being used
   
if os.getenv("GOOGLE_GENAI_USE_VERTEXAI") != "TRUE" and not os.getenv(
       
"GOOGLE_API_KEY"
   
):
       
raise ValueError(
           
"GOOGLE_API_KEY environment variable not set and "
           
"GOOGLE_GENAI_USE_VERTEXAI is not TRUE."
       
)

   
# A2A Agent Skill definition
   
skill = AgentSkill(
       
id="get_exchange_rate",
       
name="Currency Exchange Rates Tool",
       
description="Helps with exchange values between various currencies",
       
tags=["currency conversion", "currency exchange"],
       
examples=["What is exchange rate between USD and GBP?"],
   
)

   
# A2A Agent Card definition
   
agent_card = AgentCard(
       
name="Currency Agent",
       
description="Helps with exchange rates for currencies",
       
url=f"http://{host}:{port}/",
       
version="1.0.0",
       
defaultInputModes=["text"],
       
defaultOutputModes=["text"],
       
capabilities=AgentCapabilities(streaming=True),
       
skills=[skill],
   
)

   
# Create the ADK runner and executor.
   
runner = Runner(
       
app_name=agent_card.name,
       
agent=root_agent,
       
artifact_service=InMemoryArtifactService(),
       
session_service=InMemorySessionService(),
       
memory_service=InMemoryMemoryService(),
   
)
   
agent_executor = ADKAgentExecutor(runner, agent_card)

   
request_handler = DefaultRequestHandler(
       
agent_executor=agent_executor,
       
task_store=InMemoryTaskStore(),
   
)

   
server = A2AFastAPIApplication(
       
agent_card=agent_card, http_handler=request_handler
   
)

   
uvicorn.run(server.build(), host=host, port=port)
# ... see file for full code

Untuk menjalankan server A2A, di terminal baru, jalankan perintah berikut:

uv run currency_agent/

Jika server berhasil dimulai, output akan terlihat seperti berikut yang menunjukkan bahwa server berjalan di port 10000:

[INFO]: --- 🔧 Loading MCP tools from MCP Server... ---
[INFO]: --- 🤖 Creating ADK Currency Agent... ---
INFO:     Started server process [45824]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://localhost:10000 (Press CTRL+C to quit)

Agen mata uang kini berhasil berjalan sebagai server A2A, dengan kemampuan untuk dipanggil oleh agen atau klien lain menggunakan protokol A2A.

Menguji Server A2A

Sekarang Anda dapat menguji server dengan mengirimkan beberapa permintaan menggunakan A2A.

A2A Python SDK menyediakan class a2a.client.A2AClient yang menyederhanakan hal ini untuk Anda.

File currency_agent/test_client.py berisi kode yang berjalan melalui beberapa kasus pengujian berbeda terhadap server A2A.

# ... see file for full code

# Example test using A2AClient
async def run_single_turn_test(client: A2AClient) -> None:
    """Runs a single-turn non-streaming test."""

   
send_message_payload = create_send_message_payload(text="how much is 100 USD in CAD?")
   
request = SendMessageRequest(
       
id=str(uuid4()), params=MessageSendParams(**send_message_payload)
   
)

   
print("--- ✉️  Single Turn Request ---")
   
# Send Message
   
response: SendMessageResponse = await client.send_message(request)
   
print_json_response(response, "📥 Single Turn Request Response")
   
if not isinstance(response.root, SendMessageSuccessResponse):
       
print("received non-success response. Aborting get task ")
       
return

   
if not isinstance(response.root.result, Task):
       
print("received non-task response. Aborting get task ")
       
return

   
task_id: str = response.root.result.id
   
print("--- ❔ Query Task ---")
   
# query the task
   
get_request = GetTaskRequest(id=str(uuid4()), params=TaskQueryParams(id=task_id))
   
get_response: GetTaskResponse = await client.get_task(get_request)
   
print_json_response(get_response, "📥 Query Task Response")

# ----- Main Entrypoint (Create client --> Run tests) -----
async def main() -> None:
    """Main function to run the tests."""
   
print(f'--- 🔄 Connecting to agent at {AGENT_URL}... ---')
   
try:
       
async with httpx.AsyncClient() as httpx_client:
           
client = await A2AClient.get_client_from_agent_card_url(
               
httpx_client, AGENT_URL
           
)
           
print('--- ✅ Connection successful. ---')

           
await run_single_turn_test(client)
           
await run_streaming_test(client)
           
await run_multi_turn_test(client)

   
except Exception as e:
       
traceback.print_exc()
       
print(f'--- ❌ An error occurred: {e} ---')
       
print('Ensure the agent server is running.')

Jalankan pengujian menggunakan perintah berikut:

uv run currency_agent/test_client.py

Eksekusi pengujian yang berhasil akan menghasilkan hal berikut:

--- 🔄 Connecting to agent at http://localhost:10000... ---
--- Connection successful. ---
--- ✉️ Single Turn Request ---
--- 📥 Single Turn Request Response ---
{"id":"3bc92d7b-d857-4e93-9ff0-b2fb865f6e35","jsonrpc":"2.0","result":{"artifacts":[{"artifactId":"35e89e14-b977-4397-a23b-92c84bc32379","parts":[{"kind":"text","text":"Based on the current exchange rate, 1 USD is equivalent to 1.3704 CAD. Therefore, 100 USD would be 137.04 CAD.\n"}]}],"contextId":"2d66f277-152c-46ef-881d-7fe32866e9f5","history":[{"contextId":"2d66f277-152c-46ef-881d-7fe32866e9f5","kind":"message","messageId":"59819269f7d04849b0bfca7d43ec073c","parts":[{"kind":"text","text":"how much is 100 USD in CAD?"}],"role":"user","taskId":"52ae2392-84f5-429a-a14b-8413d3d20d97"},{"contextId":"2d66f277-152c-46ef-881d-7fe32866e9f5","kind":"message","messageId":"286095c6-12c9-40cb-9596-a9676d570dbd","parts":[],"role":"agent","taskId":"52ae2392-84f5-429a-a14b-8413d3d20d97"}],"id":"52ae2392-84f5-429a-a14b-8413d3d20d97","kind":"task","status":{"state":"completed"}}}

// ...

--- Single Turn Streaming Request ---
--- Streaming Chunk ---
{"id":"21239a5f-abbf-4a5e-a249-c101eb1dfbdd","jsonrpc":"2.0","result":{"contextId":"f268ad8c-b3bf-4439-9a64-5e02dfbb9a62","final":false,"kind":"status-update","status":{"state":"submitted"},"taskId":"761d2275-d58b-46f8-9c8d-68cd72e0667d"}}

--- Streaming Chunk ---
{"id":"21239a5f-abbf-4a5e-a249-c101eb1dfbdd","jsonrpc":"2.0","result":{"contextId":"f268ad8c-b3bf-4439-9a64-5e02dfbb9a62","final":false,"kind":"status-update","status":{"state":"working"},"taskId":"761d2275-d58b-46f8-9c8d-68cd72e0667d"}}

--- Streaming Chunk ---
{"id":"21239a5f-abbf-4a5e-a249-c101eb1dfbdd","jsonrpc":"2.0","result":{"contextId":"f268ad8c-b3bf-4439-9a64-5e02dfbb9a62","final":false,"kind":"status-update","status":{"message":{"contextId":"f268ad8c-b3bf-4439-9a64-5e02dfbb9a62","kind":"message","messageId":"25f5f972-9475-4e4a-a08d-e13f521d7462","parts":[],"role":"agent","taskId":"761d2275-d58b-46f8-9c8d-68cd72e0667d"},"state":"working"},"taskId":"761d2275-d58b-46f8-9c8d-68cd72e0667d"}}

--- Streaming Chunk ---
{"id":"21239a5f-abbf-4a5e-a249-c101eb1dfbdd","jsonrpc":"2.0","result":{"artifact":{"artifactId":"35e89e14-b977-4397-a23b-92c84bc32379","parts":[{"kind":"text","text":"The current exchange rate is 1 EUR to 164.15 JPY. So, 50 EUR would be 8207.5 JPY.\n"}]},"contextId":"f268ad8c-b3bf-4439-9a64-5e02dfbb9a62","kind":"artifact-update","taskId":"761d2275-d58b-46f8-9c8d-68cd72e0667d"}}

// ...

--- 🚀 First turn completed, no further input required for this test case. ---

Berhasil! Anda telah berhasil menguji bahwa Anda dapat berkomunikasi dengan agen mata uang melalui server A2A. 🎉

Lihat repositori a2a-samples di GitHub untuk melihat kasus penggunaan yang lebih canggih.

Ingin men-deploy agen Anda? Vertex AI Agent Engine memberikan pengalaman terkelola untuk men-deploy agen AI ke produksi.

9. Selamat

Selamat! Anda telah berhasil membuat dan men-deploy server MCP jarak jauh, membuat agen mata uang menggunakan Agent Development Kit (ADK) yang terhubung ke alat menggunakan MCP, dan mengekspos agen Anda menggunakan protokol Agent2Agent (A2A). Agen mata uang kini tersedia untuk berinteraksi dengan agen lain dari framework apa pun menggunakan A2A.

Berikut adalah link ke dokumentasi kode lengkap.

Yang telah kita bahas

  • Cara membuat server MCP lokal
  • Men-deploy server MCP ke Cloud Run
  • Cara membangun Agen dengan Agent Development Kit yang menggunakan alat MCP
  • Cara mengekspos agen ADK sebagai Server A2A
  • Menguji Server A2A menggunakan Klien A2A

Pembersihan

Agar tidak menimbulkan biaya pada akun Google Cloud Anda untuk resource yang digunakan dalam lab ini, ikuti langkah-langkah berikut:

  1. Di Konsol Google Cloud, buka halaman Manage resources.
  2. Dalam daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
  3. Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.