MCP, ADK ve A2A'yı kullanmaya başlama

1. Genel Bakış

Yapay zeka ajanları, bağımsız olarak çalışabilme, öğrenme ve hedeflere ulaşmak için çevreleriyle etkileşim kurma becerileri sayesinde görev otomasyonunda ve karar alma süreçlerinde devrim yaratarak popülerliğini hızla artırıyor.

Peki bir temsilciyi tam olarak nasıl oluşturursunuz? Bu codelab, farklı ülkelerin para birimleri arasında dönüşüm yapabilen bir para birimi aracısı oluşturmayı göstererek başlamanıza yardımcı olacaktır. Ardından bir seyahat acentesi aracısı oluşturup bunu para birimi aracısına bağlayacaksınız. Bu kılavuzun amacı, internette gördüğünüz kısaltmaları (MCP, ADK, A2A) anlamanıza ve bu kısaltmaların nasıl bir araya geldiğini görmenize yardımcı olmak için sizi en yeni teknolojiler konusunda bilgilendirmektir.

Mimari

Model Context Protocol (MCP)

Model Bağlam Protokolü (MCP), uygulamaların LLM'lere bağlam sağlama şeklini standartlaştıran açık bir protokoldür. MCP, yapay zeka modellerini kaynaklara, istemlere ve araçlara bağlamak için standartlaştırılmış bir yöntem sunar.

Agent Development Kit (ADK)

Agent Development Kit (ADK), yapay zeka ajanları geliştirme ve dağıtma için esnek bir düzenleme çerçevesidir. ADK, modele ve dağıtıma bağlı değildir ve diğer çerçevelerle uyumlu olacak şekilde tasarlanmıştır. ADK, geliştiricilerin basit görevlerden karmaşık iş akışlarına kadar çeşitli ajan tabanlı mimariler oluşturmasını, dağıtmasını ve düzenlemesini kolaylaştırmak için ajan geliştirmeyi yazılım geliştirmeye daha çok benzeyecek şekilde tasarlanmıştır.

Agent2Agent (A2A) Protokolü

Agent2Agent (A2A) Protokolü, yapay zeka aracıları arasında sorunsuz iletişim ve işbirliği sağlamak için tasarlanmış açık bir standarttır. MCP, LLM'lerin verilere ve araçlara erişmesi için standartlaştırılmış bir yol sağlarken A2A, ajanların diğer ajanlarla konuşması için standartlaştırılmış bir yol sağlar. A2A, farklı satıcılar tarafından çeşitli çerçeveler kullanılarak oluşturulan aracıların bulunduğu bir dünyada ortak bir dil sunarak bilgi silolarını ortadan kaldırır ve birlikte çalışabilirliği teşvik eder.

Neler öğreneceksiniz?

  • Yerel MCP sunucusu oluşturma
  • MCP sunucusunu Cloud Run'a dağıtma
  • MCP araçlarını kullanan bir temsilciyi Agent Development Kit ile oluşturma
  • ADK aracısını A2A sunucusu olarak kullanıma sunma
  • A2A istemcisi kullanarak A2A sunucusunu test etme
  • A2A protokolü üzerinden başka bir temsilciyle konuşmak için temsilci oluşturma

İhtiyacınız olanlar

  • Chrome veya Firefox gibi bir tarayıcı
  • Faturalandırmanın etkin olduğu bir Google Cloud projesi.

2. Başlamadan önce

Proje oluşturma

Google Cloud projeniz yoksa bir proje oluşturun.

Google Cloud Console'daki proje seçici sayfasında bir Google Cloud projesi seçin veya oluşturun.

Ayrıca Cloud projeniz için faturalandırmanın etkinleştirildiğinden emin olun. Bir projede faturalandırmanın etkin olup olmadığını kontrol etmeyi öğrenin.

Cloud Shell'i etkinleştirme

Google Cloud Shell, doğrudan Google Cloud Console'da sağlanan etkileşimli ve tarayıcı tabanlı bir geliştirme ortamıdır. Araçları yerel olarak yüklemenize gerek kalmadan Google Cloud'u kullanmaya başlamanın en kolay yoludur.

Bu bağlantıyı tıklayarak Cloud Shell'i etkinleştirin. Cloud Shell'deki ilgili düğmeyi tıklayarak Cloud Shell Terminali (bulut komutlarını çalıştırmak için) ile Düzenleyici (projeleri oluşturmak için) arasında geçiş yapabilirsiniz.

Cloud Shell'e bağlandıktan sonra aşağıdaki komutu kullanarak kimliğinizin doğrulandığını ve projenin proje kimliğinize ayarlandığını kontrol edin:

gcloud auth list

gcloud komutunun projeniz hakkında bilgi sahibi olduğunu onaylamak için Cloud Shell'de aşağıdaki komutu çalıştırın.

gcloud config list project

Projenizi ayarlamak için aşağıdaki komutu kullanın:

export PROJECT_ID=<YOUR_PROJECT_ID>
gcloud config set project $PROJECT_ID

Cloud API'lerini etkinleştirme

Aşağıdaki komutu kullanarak gerekli API'leri etkinleştirin. Bu işlem birkaç dakika sürebilir.

gcloud services enable cloudresourcemanager.googleapis.com \
                       servicenetworking.googleapis.com \
                       run.googleapis.com \
                       cloudbuild.googleapis.com \
                       artifactregistry.googleapis.com \
                       aiplatform.googleapis.com \
                       compute.googleapis.com

gcloud komutları ve kullanımı için belgelere bakın.

Kodu alın

Kod deposunu klonlayın:

git clone https://github.com/jackwotherspoon/currency-agent.git
cd currency-agent

Bağımlılıkları yönetmek için kullanılan uv, Cloud Shell'e önceden yüklenmiştir. Ancak codelab'i yerel olarak çalıştırıyorsanız aşağıdaki şekilde yükleyebilirsiniz:

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

Aşağıdaki komutu çalıştırarak ortam değişkenlerini .env dosyasıyla yapılandırın:

echo "GOOGLE_GENAI_USE_ENTERPRISE=TRUE" >> .env \
&& echo "GOOGLE_CLOUD_PROJECT=$PROJECT_ID" >> .env \
&& echo "GOOGLE_CLOUD_LOCATION=global" >> .env

3. Yerel bir MCP sunucusu oluşturma

Para birimi aracınızı düzenlemeye başlamadan önce, aracınızın ihtiyaç duyacağı araçlarınızı kullanıma sunmak için bir MCP sunucusu oluşturursunuz.

MCP sunucusu, belirli özellikleri (ör. döviz kuru getirme) araç olarak kullanıma sunmak için basit programlar yazmanıza olanak tanır. Bir veya daha fazla temsilci, standartlaştırılmış Model Bağlam Protokolü (MCP) kullanarak bu araçlara erişebilir.

FastMCP Python paketi, get_exchange_rate adlı tek bir aracı kullanıma sunan bir MCP sunucusu oluşturmak için kullanılabilir. get_exchange_rate aracı, iki para birimi arasındaki mevcut döviz kurunu almak için internet üzerinden Frankfurter API'ye çağrı yapar.

MCP sunucusunun kodu mcp-server/server.py dosyasında bulunabilir:

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="http",
            host="0.0.0.0",
            port=os.getenv("PORT", 8080),
        )
    )

MCP sunucusunu yerel olarak başlatmak için bir terminal açın ve aşağıdaki komutu çalıştırın (sunucu http://localhost:8080 üzerinde başlatılır):

uv run mcp-server/server.py

MCP sunucusunun düzgün çalıştığını ve get_exchange_rate aracına Model Bağlam Protokolü kullanılarak erişilebildiğini test edin.

Yeni bir terminal penceresinde (böylece yerel MCP sunucusunu durdurmazsınız) aşağıdakileri çalıştırın:

uv run mcp-server/test_server.py

1 ABD dolarının avro cinsinden güncel döviz kurunu görmelisiniz:

--- 🛠️ 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
  }
} ---

Mükemmel! Aracınızın erişebileceği bir araç içeren çalışan bir MCP sunucunuz var.

Bir sonraki istasyona geçmeden önce, başlattığınız terminalde Ctrl+C (veya Mac'te Command+C) komutunu çalıştırarak yerel olarak çalışan MCP sunucusunu durdurun.

4. MCP sunucunuzu Cloud Run'a dağıtma

Artık MCP sunucusunu Cloud Run'a uzak MCP sunucusu olarak dağıtmaya hazırsınız 🚀☁️

MCP sunucusunu uzaktan çalıştırmanın avantajları

Cloud Run'da MCP sunucusunu uzaktan çalıştırmanın çeşitli avantajları vardır:

  • 📈Ölçeklenebilirlik: Cloud Run, gelen tüm istekleri karşılamak için hızlı bir şekilde ölçeği genişletecek şekilde tasarlanmıştır. Cloud Run, MCP sunucunuzu talebe göre otomatik olarak ölçeklendirir.
  • 👥Merkezi sunucu: Merkezi bir MCP sunucusuna erişimi IAM ayrıcalıkları aracılığıyla ekip üyeleriyle paylaşabilirsiniz. Böylece ekip üyeleri, kendi sunucularını yerel olarak çalıştırmak yerine yerel makinelerinden sunucuya bağlanabilir. MCP sunucusunda yapılan değişikliklerden tüm ekip üyeleri yararlanır.
  • 🔐Güvenlik: Cloud Run, kimliği doğrulanmış istekleri zorunlu kılmak için kolay bir yöntem sunar. Bu, MCP sunucunuza yalnızca güvenli bağlantılara izin vererek yetkisiz erişimi engeller.

mcp-server dizinine geçin:

cd mcp-server

MCP sunucusunu Cloud Run'a dağıtın:

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

Hizmetiniz başarıyla dağıtıldıysa aşağıdakine benzer bir mesaj görürsünüz:

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

MCP İstemcilerinin Kimliğini Doğrulama

Kimlik doğrulama gerektirmek için --no-allow-unauthenticated seçeneğini belirlediğinizden, uzak MCP sunucusuna bağlanan tüm MCP istemcilerinin kimlik doğrulaması yapması gerekir.

Host MCP servers on Cloud Run (MCP sunucularını Cloud Run'da barındırma) başlıklı resmi belgelerde, MCP istemcinizi nerede çalıştırdığınıza bağlı olarak bu konuyla ilgili daha fazla bilgi verilmektedir.

Yerel makinenizde uzak MCP sunucusuna kimliği doğrulanmış bir tünel oluşturmak için Cloud Run proxy'sini çalıştırmanız gerekir.

Varsayılan olarak, Cloud Run hizmetlerinin URL'si için tüm isteklerin Cloud Run Çağırıcı (roles/run.invoker) IAM rolüyle yetkilendirilmesi gerekir. Bu IAM politika bağlaması, yerel MCP istemcinizin kimliğini doğrulamak için güçlü bir güvenlik mekanizması kullanılmasını sağlar.

Sizin veya uzak MCP sunucusuna erişmeye çalışan ekip üyelerinin, IAM asıl öğelerine (Google Cloud Hesabı) bağlı roles/run.invoker IAM rolüne sahip olduğundan emin olmanız gerekir.

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

Aşağıdaki çıkışı göreceksiniz:

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

http://127.0.0.1:8080 adresine giden tüm trafik artık doğrulanacak ve uzak MCP sunucusuna yönlendirilecek.

Uzak MCP sunucusunu test etme

Yeni bir terminalde kök klasöre geri dönün ve uzak MCP sunucusunun çalıştığından emin olmak için mcp-server/test_server.py dosyasını yeniden çalıştırın.

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

Sunucuyu yerel olarak çalıştırdığınızda gördüğünüz çıkışa benzer bir çıkış görmeniz gerekir:

--- 🛠️ 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
  }
} ---

Uzak sunucunun gerçekten çağrıldığını doğrulamak istiyorsanız dağıtılan Cloud Run MCP sunucusunun günlüklerine sorgu gönderebilirsiniz:

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

Günlüklerde aşağıdaki çıkışı görmeniz gerekir:

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}}

Uzak bir MCP sunucunuz olduğuna göre artık aracı oluşturmaya geçebilirsiniz. 🤖

5. ADK ile temsilci oluşturma

Dağıtılmış bir MCP sunucunuz var. Şimdi Agent Development Kit (ADK)'yi kullanarak para birimi aracısını oluşturma zamanı.

ADK, aracı oluşturmayı son derece kolaylaştırır ve MCP Araçları için yerleşik destekle MCP sunucularına bağlanmalarına olanak tanır. Para birimi aracısı, ADK'nın MCPToolset sınıfını kullanarak get_exchange_rate aracına erişir.

Para birimi aracısının kodu currency_agent/agent.py konumundadır:

import logging
import os

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

logger.info("--- 🔧 Loading MCP tools from MCP Server... ---")
logger.info("--- 🤖 Creating ADK Currency Agent... ---")

root_agent = LlmAgent(
    model="gemini-3.7-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")
            )
        )
    ],
)

Para birimi aracını hızlıca test etmek için adk web komutunu çalıştırarak erişebileceğiniz ADK'nın geliştirici kullanıcı arayüzünden yararlanabilirsiniz:

uv run adk web --allow_origins "regex:https://.*\.cloudshell\.dev"

Tarayıcıda http://localhost:8000 sayfasına giderek aracı görüntüleyip test edin.

Web kullanıcı arayüzünün sol üst köşesinde aracı olarak currency_agent seçildiğinden emin olun.

ADK Web Kullanıcı Arayüzü

Sohbet alanında temsilcinize "250 Kanada doları kaç ABD doları eder?" gibi bir soru sorun. Temsilcinin yanıt vermeden önce get_exchange_rate MCP aracımızı aradığını görmelisiniz.

ADK Web Currency Agent

Ajan çalışıyor. Para birimi dönüştürme 💸 ile ilgili sorguları işleyebilir.

6. Agent2Agent (A2A) Protokolü

Agent2Agent (A2A) Protokolü, yapay zeka aracıları arasında sorunsuz iletişim ve işbirliği sağlamak için tasarlanmış açık bir standarttır. Bu sayede, farklı çerçeveler kullanılarak ve farklı satıcılar tarafından oluşturulan aracıların ortak bir dilde iletişim kurması sağlanır. Böylece, bilgi siloları ortadan kaldırılır ve birlikte çalışabilirlik teşvik edilir.

A2A Protokolü

A2A, temsilcilerin şunları yapmasına olanak tanır:

  • Keşfedin: Standartlaştırılmış Temsilci Kartları'nı kullanarak diğer temsilcileri bulun ve becerilerini (AgentSkill) ve yeteneklerini (AgentCapabilities) öğrenin.
  • İletişim: Mesaj ve verileri güvenli bir şekilde paylaşın.
  • Ortak çalışma: Karmaşık hedeflere ulaşmak için görevleri devredin ve işlemleri koordine edin.

A2A protokolü, bu iletişimi kolaylaştırmak için "Agent Cards" gibi mekanizmalar kullanır. Bu mekanizmalar, dijital kartvizitler gibi davranarak temsilcilerin yeteneklerini ve bağlantı bilgilerini tanıtmak için kullanabileceği bir araçtır.

A2A Agent Card

Şimdi, diğer temsilciler ve istemciler tarafından çağrılabilmesi için A2A kullanarak para birimi temsilcisini kullanıma sunma zamanı.

A2A Python SDK

A2A Python SDK, yukarıda belirtilen kaynakların her biri için Pydantic modelleri sağlar: AgentSkill, AgentCapabilities ve AgentCard. Bu, A2A protokolüyle geliştirme ve entegrasyonu hızlandırmak için bir arayüz sağlar.

Bir AgentSkill, para birimi aracısının get_exchange_rate için bir aracı olduğunu diğer aracılara nasıl duyuracağınızdır:

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

Ardından, AgentCard bölümünde, ajanın becerileri ve yetenekleri, ajanın işleyebileceği giriş ve çıkış modları gibi ek ayrıntılarla birlikte listelenir:

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

Artık para birimi aracısı ile her şeyi bir araya getirip A2A'nın gücünü gösterme zamanı!

7. Para birimi aracısını A2A sunucusu olarak kullanıma sunma

ADK, A2A protokolünü kullanarak aracı oluşturma ve bağlama sürecini sizin için basitleştirir. Mevcut bir ADK aracısını A2A sunucusu olarak erişilebilir (kullanıma sunma) hale getirmek için ADK'nın to_a2a(root_agent) işlevi kullanılır (Ayrıntılı bilgi için ADK belgelerine bakın).

to_a2a işlevi, mevcut bir aracı A2A ile çalışacak şekilde dönüştürür ve uvicorn aracılığıyla sunucu olarak kullanıma sunulmasını sağlar. Bu, aracınızı üretime geçirmeyi planlıyorsanız göstermek istediğiniz içerikler üzerinde daha sıkı bir kontrol sahibi olacağınız anlamına gelir. to_a2a() işlevi, arka planda A2A Python SDK'yı kullanarak aracı kodunuza göre otomatik olarak bir aracı kartı oluşturur.

Dosyanın içine baktığınızda currency_agent/agent.py, to_a2a kullanımını ve para birimi aracısının yalnızca iki satırlık kodla A2A sunucusu olarak nasıl kullanıldığını görebilirsiniz.

from google.adk.a2a.utils.agent_to_a2a import to_a2a
# ... see file for full code

# Make the agent A2A-compatible
a2a_app = to_a2a(root_agent, port=10000)

A2A sunucusunu çalıştırmak için yeni bir terminalde aşağıdakileri çalıştırın:

uv run uvicorn currency_agent.agent:a2a_app --host localhost --port 10000

Sunucu başarıyla başlatılırsa çıkış, 10000 numaralı bağlantı noktasında çalıştığını belirtecek şekilde aşağıdaki gibi görünür:

[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)

Döviz aracısı artık A2A protokolünü kullanarak diğer aracılar veya istemciler tarafından çağrılabilen bir A2A sunucusu olarak başarıyla çalışıyor.

Uzaktan Aracının Çalıştığını Doğrulama

to_a2a() işlevi tarafından otomatik olarak oluşturulan para birimi aracısının aracı kartı URL'sini ziyaret ederek aracınızın çalışır durumda olduğunu tekrar kontrol edebilirsiniz.

Tarayıcınızda http://localhost:10000/.well-known/agent-card.json adresine gidin.

Aşağıdaki temsilci kartını görmeniz gerekir:

{
  "capabilities": {

  },
  "defaultInputModes": [
    "text/plain"
  ],
  "defaultOutputModes": [
    "text/plain"
  ],
  "description": "An agent that can help with currency conversions",
  "name": "currency_agent",
  "preferredTransport": "JSONRPC",
  "protocolVersion": "0.3.0",
  "skills": [
    {
      "description": "An agent that can help with currency conversions I am a specialized assistant for currency conversions. my 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 I 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.",
      "id": "currency_agent",
      "name": "model",
      "tags": [
        "llm"
      ]
    },
    {
      "description": "Use this to get current exchange rate.\n\nArgs:\n    currency_from: The currency to convert from (e.g., \"USD\").\n    currency_to: The currency to convert to (e.g., \"EUR\").\n    currency_date: The date for the exchange rate or \"latest\". Defaults to \"latest\".\n\nReturns:\n    A dictionary containing the exchange rate data, or an error message if the request fails.",
      "id": "currency_agent-get_exchange_rate",
      "name": "get_exchange_rate",
      "tags": [
        "llm",
        "tools"
      ]
    }
  ],
  "supportsAuthenticatedExtendedCard": false,
  "url": "http://localhost:10000",
  "version": "0.0.1"
}

A2A sunucusunu test etme

Artık A2A'yı kullanarak sunucuya bazı istekler göndererek sunucuyu test edebilirsiniz.

A2A Python SDK'sı, bu işlemi sizin için basitleştiren bir a2a.client.Client sınıfı sağlar.

currency_agent/test_a2aclient.py dosyası, aracı kartının nasıl getirileceğini ve A2A sunucusuna nasıl mesaj gönderileceğini gösteren kodu içerir.

# ... see file for full code

async def get_agent_card():
    """Get the agent card."""
    print(f"🔄 Fetching the agent card at {AGENT_URL}")

    async with httpx.AsyncClient() as httpx_client:
        resolver = A2ACardResolver(
            httpx_client=httpx_client,
            base_url=AGENT_URL,
        )
        public_agent_card = await resolver.get_agent_card()
        print("✅ Successfully fetched the agent card")
    return public_agent_card


async def send_message(text_query: str) -> None:
    """
    Send a text query to the agent and print the response.
    """
    public_agent_card = await get_agent_card()

    print("🔄 Initializing a non-streaming client")
    config = ClientConfig(streaming=False)
    client = await create_client(agent=public_agent_card, client_config=config)

    message = new_text_message(text_query, role=Role.ROLE_USER)
    print("Sending request:")
    request = SendMessageRequest(message=message)
    print(request)

    print("Response:")
    async for chunk in client.send_message(request):
        print(chunk)
    await client.close()

Aşağıdaki komutu kullanarak testleri çalıştırın:

uv run currency_agent/test_a2aclient.py

Başarılı bir test çalıştırması şu sonuçları verir:

🔄 Fetching the agent card at http://localhost:10000
 Successfully fetched the agent card
====================================================
                     AgentCard                      
====================================================
--- General ---
Name        : currency_agent
Description : An agent that can help with currency conversions
Version     : 0.0.1

--- Interfaces ---
  [0] http://localhost:10000  (JSONRPC 1.0)

--- Capabilities ---
Streaming           : False
Push notifications  : False
Extended agent card : False

--- I/O Modes ---
Input  : text/plain
Output : 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
====================================================
🔄 Fetching the agent card at http://localhost:10000
 Successfully fetched the agent card
🔄 Initializing a non-streaming client
Sending request:
message {
  message_id: "5d190c88-336e-4a22-925d-e2af49cf4bad"
  role: ROLE_USER
  parts {
    text: "how much is 100 USD in GBP?"
  }
}

Response:
task {
  id: "e6f311bb-654a-477f-82a9-81c7a48f7b81"
  context_id: "672e351b-0ff3-4aed-a059-868b383c41a0"
  status {
    state: TASK_STATE_COMPLETED
    timestamp {
      seconds: 1787836031
      nanos: 994786000
    }
  }
  artifacts {
    artifact_id: "e0a05ac8-25c7-471c-a33c-1073fe48cbb8"
    parts {
      text: "100 USD is currently equal to approximately **73.37 GBP** (at an exchange rate of 1 USD = 0.73368 GBP)."
    }
  }
  ...

Çalışıyor! A2A istemcisiyle A2A protokolü üzerinden döviz aracısıyla iletişim kurabildiğinizi başarıyla test ettiniz. 🎉

Daha fazla A2A örneği için GitHub'daki a2a-samples deposuna göz atın.

8. Uzak para birimi aracısını A2A üzerinden kullanma

Önceki adımda, A2A üzerinden Currency Agent ile iletişim kurmak için bir A2A istemcisi kullandınız.

Bu adımda, para birimi aracısını başka bir seyahat acentesinden uzaktan nasıl kullanabileceğinizi görelim.

Seyahat acentesinin kodu travel_agent/agent.py içinde yer alır:

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

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. "
    "Whenever a user asks about currency exchange rates or money conversions, "
    "delegate the request to the 'currency_agent' sub-agent."
)

CURRENCY_AGENT_URL = os.getenv("CURRENCY_AGENT_URL", "http://localhost:10000")

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.7-flash",
    name="travel_agent",
    description="A travel assistant that can help plan trips and convert currencies via the remote currency agent.",
    instruction=SYSTEM_INSTRUCTION,
    tools=[AgentTool(agent=currency_remote_agent)],
)

Para Birimi Aracısı'na RemoteA2aAgent kullanılarak nasıl erişildiğine dikkat edin.

Seyahat Acentesi'ni test etmek için adk web komutunu çalıştırın:

uv run adk web --allow_origins "regex:https://.*\.cloudshell\.dev"

Bir tarayıcıda http://localhost:8000 adresine giderek aracıyı görün ve test edin.

Web kullanıcı arayüzünün sol üst köşesinde aracı olarak travel_agent seçildiğinden emin olun.

Sohbet alanında temsilcinize "250 Kanada doları kaç ABD doları eder?" gibi bir soru sorun.

Seyahat Acentesi'nin yanıt vermeden önce currency_agent uzaktan aradığını görmelisiniz.

ADK Web Uzak Para Birimi Aracısı

Ajan çalışıyor. A2A kullanarak uzak bir aracı çağırarak para birimi dönüştürme 💸 ile ilgili sorguları işleyebilir.

9. Tebrikler

Tebrikler! Uzak bir MCP sunucusunu başarıyla oluşturup dağıttınız, Agent Development Kit'i (ADK) kullanarak MCP ile araçlara bağlanan bir döviz aracısı oluşturdunuz ve aracınızı Agent2Agent (A2A) protokolünü kullanarak kullanıma sundunuz. Ardından, A2A kullanarak para birimi ajanıyla uzaktan iletişim kurmak için bir seyahat acentesi oluşturdunuz.

Tam kod dokümanının bağlantısını burada bulabilirsiniz.

Ajanınızı dağıtmak mı istiyorsunuz? Gemini Enterprise Agent Platform'un Agent Runtime'ı, yapay zeka ajanlarını üretime dağıtmak için yönetilen bir deneyim sunar.

İşlediğimiz konular

  • Yerel MCP sunucusu oluşturma
  • MCP sunucusunu Cloud Run'a dağıtma
  • MCP araçlarını kullanan bir temsilciyi Agent Development Kit ile oluşturma
  • ADK aracısını A2A sunucusu olarak kullanıma sunma
  • A2A istemcisi kullanarak A2A sunucusunu test etme
  • A2A protokolü üzerinden başka bir temsilciyle konuşmak için temsilci oluşturma

Temizleme

Bu laboratuvarda kullanılan kaynaklar için Google Cloud hesabınızın ücretlendirilmesini istemiyorsanız şu adımları uygulayın:

  1. Google Cloud Console'da Kaynakları yönetin sayfasına gidin.
  2. Proje listesinde silmek istediğiniz projeyi seçin ve Sil'i tıklayın.
  3. İletişim kutusunda proje kimliğini yazın ve projeyi silmek için Kapat'ı tıklayın.