Cloud Run'da güvenli bir MCP sunucusu dağıtma

1. Giriş

Genel Bakış

Bu laboratuvarda, Model Bağlam Protokolü (MCP) sunucusu oluşturup dağıtacaksınız. MCP sunucuları, LLM'lere harici araçlara ve hizmetlere erişim sağlamak için kullanışlıdır. Bu hizmeti, Cloud Run'da birden fazla istemciden erişilebilen güvenli ve üretime hazır bir hizmet olarak yapılandıracaksınız. Ardından, Antigravity CLI'dan uzak MCP sunucusuna bağlanırsınız.

Yapacaklarınız

get_animals_by_species ve get_animal_details olmak üzere iki aracı olan bir hayvanat bahçesi MCP sunucusu oluşturmak için FastMCP'yi kullanacağız. FastMCP, MCP sunucuları ve istemcileri oluşturmak için hızlı ve Python'a özgü bir yol sunar.

Hayvanat Bahçesi MCP Sunucusu Grafiği

Neler öğreneceksiniz?

  • MCP sunucusunu Cloud Run'a dağıtın.
  • Tüm istekler için kimlik doğrulama gerektirerek sunucunuzun uç noktasını güvenli hale getirin. Böylece yalnızca yetkili istemciler ve aracılar sunucuyla iletişim kurabilir.
  • Antigravity CLI'dan güvenli MCP sunucusu uç noktanıza bağlanma

2. Proje Ayarları

  1. Google Hesabınız yoksa Google Hesabı oluşturmanız gerekir.
    • İş veya okul hesabı yerine kişisel hesap kullanıyorsanız. İş ve okul hesaplarında, bu laboratuvar için gereken API'leri etkinleştirmenizi engelleyen kısıtlamalar olabilir.
  2. Google Cloud Console'da oturum açın.
  3. Yeni bir proje oluşturun veya mevcut bir projeyi yeniden kullanmayı seçin.
    • Proje kotasıyla ilgili bir hata görürseniz yeni bir proje oluşturmak için mevcut bir projeyi yeniden kullanın veya mevcut bir projeyi silin.

3. Cloud Shell Düzenleyici'yi açma

  1. Doğrudan Cloud Shell Düzenleyici'ye gitmek için bu bağlantıyı tıklayın.
  2. Bugün herhangi bir noktada yetkilendirmeniz istenirse devam etmek için Yetkilendir'i tıklayın. Cloud Shell'i yetkilendirmek için tıklayın.
  3. Terminal ekranın alt kısmında görünmüyorsa açın:
    • Görünüm'ü tıklayın.
    • Terminal'i tıklayın.Cloud Shell Düzenleyici'de yeni terminal açma
  4. Terminalde şu komutla projenizi ayarlayın:
    • Biçim:
      gcloud config set project [PROJECT_ID]
      
    • Örnek:
      gcloud config set project lab-project-id-example
      
    • Proje kimliğinizi hatırlamıyorsanız:
      • Tüm proje kimliklerinizi şu komutla listeleyebilirsiniz:
        gcloud projects list | awk '/PROJECT_ID/{print $2}'
        
      Cloud Shell Düzenleyici terminalinde proje kimliğini ayarlama
  5. Şu mesajı görmeniz gerekir:
    Updated property [core/project].
    
    WARNING simgesini görüyorsanız ve Do you want to continue (Y/n)? soruluyorsa proje kimliğini yanlış girmiş olabilirsiniz. n tuşuna, Enter tuşuna basın ve gcloud config set project komutunu tekrar çalıştırmayı deneyin.

4. API'leri etkinleştir

Terminalde API'leri etkinleştirin:

gcloud services enable \
  run.googleapis.com \
  artifactregistry.googleapis.com \
  cloudbuild.googleapis.com

Yetkilendirme istenirse devam etmek için Yetkilendir'i tıklayın. Cloud Shell'i yetkilendirmek için tıklayın.

Bu komutun tamamlanması birkaç dakika sürebilir ancak sonunda aşağıdakine benzer bir başarılı mesaj üretmesi gerekir:

Operation "operations/acf.p2-73d90d00-47ee-447a-b600" finished successfully.

5. Python projenizi hazırlama

  1. Dağıtım için kaynak kodunu depolamak üzere mcp-on-cloudrun adlı bir klasör oluşturun:
    mkdir mcp-on-cloudrun && cd mcp-on-cloudrun
    
  2. uv aracıyla pyproject.toml dosyası oluşturmak için Python projesi oluşturun:
    uv init --description "Example of deploying an MCP server on Cloud Run" --bare --python 3.13
    
    uv init komutu, projeniz için bir pyproject.toml dosyası oluşturur.Dosyanın içeriğini görüntülemek için aşağıdakileri çalıştırın:
    cat pyproject.toml
    
    Çıkış şu şekilde görünmelidir:
    [project]
    name = "mcp-on-cloudrun"
    version = "0.1.0"
    description = "Example of deploying an MCP server on Cloud Run"
    requires-python = ">=3.13"
    dependencies = []
    

6. Hayvanat bahçesi MCP sunucusunu oluşturun

MCP ile LLM'lerin kullanımını iyileştirmek için değerli bağlamlar sağlamak üzere Model Bağlam Protokolü ile çalışmaya yönelik standart bir çerçeve olan FastMCP ile bir hayvanat bahçesi MCP sunucusu oluşturun. FastMCP, Python ile MCP sunucuları ve istemcileri oluşturmak için hızlı bir yol sunar. Bu MCP sunucusu, kurgusal bir hayvanat bahçesindeki hayvanlarla ilgili veriler sağlar. Basitlik için verileri bellekte saklarız. Üretim MCP sunucusu için muhtemelen veritabanları veya API'ler gibi kaynaklardan veri sağlamak istersiniz.

  1. pyproject.toml dosyasına bağımlılık olarak FastMCP'yi eklemek için aşağıdaki komutu çalıştırın:
    uv add fastmcp==2.12.4 --no-sync
    
    Bu işlem, projenize bir uv.lock dosyası ekler.
  2. MCP sunucusu kaynak kodu için yeni bir server.py dosyası oluşturup açın:
    cloudshell edit ~/mcp-on-cloudrun/server.py
    
    cloudshell edit komutu, server.py dosyasını terminalin üstündeki düzenleyicide açar.
  3. server.py dosyasına aşağıdaki hayvanat bahçesi MCP sunucusu kaynak kodunu ekleyin:
    import asyncio
    import logging
    import os
    from typing import List, Dict, Any
    
    from fastmcp import FastMCP
    
    logger = logging.getLogger(__name__)
    logging.basicConfig(format="[%(levelname)s]: %(message)s", level=logging.INFO)
    
    mcp = FastMCP("Zoo Animal MCP Server 🦁🐧🐻")
    
    # Dictionary of animals at the zoo
    ZOO_ANIMALS = [
        {
            "species": "lion",
            "name": "Leo",
            "age": 7,
            "enclosure": "The Big Cat Plains",
            "trail": "Savannah Heights"
        },
        {
            "species": "lion",
            "name": "Nala",
            "age": 6,
            "enclosure": "The Big Cat Plains",
            "trail": "Savannah Heights"
        },
        {
            "species": "lion",
            "name": "Simba",
            "age": 3,
            "enclosure": "The Big Cat Plains",
            "trail": "Savannah Heights"
        },
        {
            "species": "lion",
            "name": "King",
            "age": 8,
            "enclosure": "The Big Cat Plains",
            "trail": "Savannah Heights"
        },
        {
            "species": "penguin",
            "name": "Waddles",
            "age": 2,
            "enclosure": "The Arctic Exhibit",
            "trail": "Polar Path"
        },
        {
            "species": "penguin",
            "name": "Pip",
            "age": 4,
            "enclosure": "The Arctic Exhibit",
            "trail": "Polar Path"
        },
        {
            "species": "penguin",
            "name": "Skipper",
            "age": 5,
            "enclosure": "The Arctic Exhibit",
            "trail": "Polar Path"
        },
        {
            "species": "penguin",
            "name": "Chilly",
            "age": 3,
            "enclosure": "The Arctic Exhibit",
            "trail": "Polar Path"
        },
        {
            "species": "penguin",
            "name": "Pingu",
            "age": 6,
            "enclosure": "The Arctic Exhibit",
            "trail": "Polar Path"
        },
        {
            "species": "penguin",
            "name": "Noot",
            "age": 1,
            "enclosure": "The Arctic Exhibit",
            "trail": "Polar Path"
        },
        {
            "species": "elephant",
            "name": "Ellie",
            "age": 15,
            "enclosure": "The Pachyderm Sanctuary",
            "trail": "Savannah Heights"
        },
        {
            "species": "elephant",
            "name": "Peanut",
            "age": 12,
            "enclosure": "The Pachyderm Sanctuary",
            "trail": "Savannah Heights"
        },
        {
            "species": "elephant",
            "name": "Dumbo",
            "age": 5,
            "enclosure": "The Pachyderm Sanctuary",
            "trail": "Savannah Heights"
        },
        {
            "species": "elephant",
            "name": "Trunkers",
            "age": 10,
            "enclosure": "The Pachyderm Sanctuary",
            "trail": "Savannah Heights"
        },
        {
            "species": "bear",
            "name": "Smokey",
            "age": 10,
            "enclosure": "The Grizzly Gulch",
            "trail": "Polar Path"
        },
        {
            "species": "bear",
            "name": "Grizzly",
            "age": 8,
            "enclosure": "The Grizzly Gulch",
            "trail": "Polar Path"
        },
        {
            "species": "bear",
            "name": "Barnaby",
            "age": 6,
            "enclosure": "The Grizzly Gulch",
            "trail": "Polar Path"
        },
        {
            "species": "bear",
            "name": "Bruin",
            "age": 12,
            "enclosure": "The Grizzly Gulch",
            "trail": "Polar Path"
        },
        {
            "species": "giraffe",
            "name": "Gerald",
            "age": 4,
            "enclosure": "The Tall Grass Plains",
            "trail": "Savannah Heights"
        },
        {
            "species": "giraffe",
            "name": "Longneck",
            "age": 5,
            "enclosure": "The Tall Grass Plains",
            "trail": "Savannah Heights"
        },
        {
            "species": "giraffe",
            "name": "Patches",
            "age": 3,
            "enclosure": "The Tall Grass Plains",
            "trail": "Savannah Heights"
        },
        {
            "species": "giraffe",
            "name": "Stretch",
            "age": 6,
            "enclosure": "The Tall Grass Plains",
            "trail": "Savannah Heights"
        },
        {
            "species": "antelope",
            "name": "Speedy",
            "age": 2,
            "enclosure": "The Tall Grass Plains",
            "trail": "Savannah Heights"
        },
        {
            "species": "antelope",
            "name": "Dash",
            "age": 3,
            "enclosure": "The Tall Grass Plains",
            "trail": "Savannah Heights"
        },
        {
            "species": "antelope",
            "name": "Gazelle",
            "age": 4,
            "enclosure": "The Tall Grass Plains",
            "trail": "Savannah Heights"
        },
        {
            "species": "antelope",
            "name": "Swift",
            "age": 5,
            "enclosure": "The Tall Grass Plains",
            "trail": "Savannah Heights"
        },
        {
            "species": "polar bear",
            "name": "Snowflake",
            "age": 7,
            "enclosure": "The Arctic Exhibit",
            "trail": "Polar Path"
        },
        {
            "species": "polar bear",
            "name": "Blizzard",
            "age": 5,
            "enclosure": "The Arctic Exhibit",
            "trail": "Polar Path"
        },
        {
            "species": "polar bear",
            "name": "Iceberg",
            "age": 9,
            "enclosure": "The Arctic Exhibit",
            "trail": "Polar Path"
        },
        {
            "species": "walrus",
            "name": "Wally",
            "age": 10,
            "enclosure": "The Walrus Cove",
            "trail": "Polar Path"
        },
        {
            "species": "walrus",
            "name": "Tusker",
            "age": 12,
            "enclosure": "The Walrus Cove",
            "trail": "Polar Path"
        },
        {
            "species": "walrus",
            "name": "Moby",
            "age": 8,
            "enclosure": "The Walrus Cove",
            "trail": "Polar Path"
        },
        {
            "species": "walrus",
            "name": "Flippers",
            "age": 9,
            "enclosure": "The Walrus Cove",
            "trail": "Polar Path"
        }
    ]
    
    @mcp.tool()
    def get_animals_by_species(species: str) -> List[Dict[str, Any]]:
        """
        Retrieves all animals of a specific species from the zoo.
        Can also be used to collect the base data for aggregate queries
        of animals of a specific species - like counting the number of penguins
        or finding the oldest lion.
    
        Args:
            species: The species of the animal (e.g., 'lion', 'penguin').
    
        Returns:
            A list of dictionaries, where each dictionary represents an animal
            and contains details like name, age, enclosure, and trail.
        """
        logger.info(f">>> 🛠️ Tool: 'get_animals_by_species' called for '{species}'")
        return [animal for animal in ZOO_ANIMALS if animal["species"].lower() == species.lower()]
    
    @mcp.tool()
    def get_animal_details(name: str) -> Dict[str, Any]:
        """
        Retrieves the details of a specific animal by its name.
    
        Args:
            name: The name of the animal.
    
        Returns:
            A dictionary with the animal's details (species, name, age, enclosure, trail)
            or an empty dictionary if the animal is not found.
        """
        logger.info(f">>> 🛠️ Tool: 'get_animal_details' called for '{name}'")
        for animal in ZOO_ANIMALS:
            if animal["name"].lower() == name.lower():
                return animal
        return {}
    
    if __name__ == "__main__":
        port = int(os.getenv("PORT", 8080))
        logger.info(f"🚀 MCP server started on port {port}")
        asyncio.run(
            mcp.run_async(
                transport="http",
                host="0.0.0.0",
                port=port,
            )
        )
    

Kodunuz tamamlandı. Şimdi MCP sunucusunu Cloud Run'a dağıtma zamanı.

7. Cloud Run'a dağıtma

Şimdi doğrudan kaynak koddan Cloud Run'a bir MCP sunucusu dağıtın.

  1. Cloud Run'a dağıtmak için yeni bir Dockerfile oluşturup açın:
    cloudshell edit ~/mcp-on-cloudrun/Dockerfile
    
  2. server.py dosyasını çalıştırmak için uv aracını kullanmak üzere Dockerfile'a aşağıdaki kodu ekleyin:
    # Use the official Python image
    FROM python:3.13-slim
    
    # Install uv
    COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
    
    # Install the project into /app
    COPY . /app
    WORKDIR /app
    
    # Allow statements and log messages to immediately appear in the logs
    ENV PYTHONUNBUFFERED=1
    
    # Install dependencies
    RUN uv sync
    
    EXPOSE $PORT
    
    # Run the FastMCP server
    CMD ["uv", "run", "server.py"]
    
  3. mcp-server-sa adlı bir hizmet hesabı oluşturun:
    gcloud iam service-accounts create mcp-server-sa --display-name="MCP Server Service Account"
    
  4. Uygulamayı Cloud Run'a dağıtmak için gcloud komutunu çalıştırın.
    cd ~/mcp-on-cloudrun
    gcloud run deploy zoo-mcp-server \
        --service-account=mcp-server-sa@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com \
        --no-allow-unauthenticated \
        --region=us-west1 \
        --source=. \
        --labels=dev-tutorial=codelab-mcp
    
    Kimlik doğrulama gerektirmek için --no-allow-unauthenticated işaretini kullanın. Bu, güvenlik nedeniyle önemlidir. Kimlik doğrulama gerektirmiyorsanız herkes MCP sunucunuzu çağırabilir ve sisteminize zarar verebilir.
  5. Yeni bir Artifact Registry deposunun oluşturulmasını onaylayın. Kaynak koddan Cloud Run'a ilk kez dağıtım yaptığınız için şunları görürsünüz:
    Deploying from source requires an Artifact Registry Docker repository to store built containers. A repository named
    [cloud-run-source-deploy] in region [us-west1] will be created.
    
    Do you want to continue (Y/n)?
    
    Y yazıp Enter tuşuna basın. Bu işlem, dağıtımınız için bir Artifact Registry deposu oluşturur. Bu, Cloud Run hizmeti için MCP sunucusu Docker kapsayıcısının depolanması için gereklidir.
  6. Birkaç dakika sonra şuna benzer bir mesaj görürsünüz:
    Service [zoo-mcp-server] revision [zoo-mcp-server-12345-abc] has been deployed and is serving 100 percent of traffic.
    

MCP sunucunuzu dağıtmış olmanız gerekir. Artık kullanabilirsiniz.

8. Uzak MCP sunucusunu Antigravity CLI'ya ekleme

Uzak bir MCP sunucusunu başarıyla dağıttığınıza göre artık Google Code Assist veya Antigravity CLI gibi çeşitli uygulamaları kullanarak bu sunucuya bağlanabilirsiniz. Bu bölümde, Antigravity CLI'yı kullanarak yeni uzak MCP sunucunuza bağlantı oluşturacağız.

  1. Kullanıcı hesabınıza uzaktaki MCP sunucusunu çağırma izni verin
    gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
        --member=user:$(gcloud config get-value account) \
        --role='roles/run.invoker'
    
  2. Google Cloud kimlik bilgilerinizi ve proje numaranızı, Antigravity Ayarları dosyasında kullanmak üzere ortam değişkenlerine kaydedin:
    export PROJECT_NUMBER=$(gcloud projects describe $GOOGLE_CLOUD_PROJECT --format="value(projectNumber)")
    export ID_TOKEN=$(gcloud auth print-identity-token)
    
  3. Henüz oluşturulmamışsa .gemini/antigravity-cli klasörü oluşturun.
    mkdir -p ~/.gemini/antigravity-cli
    
  4. Uzak MCP sunucusunu Antigravity CLI MCP yapılandırma dosyanıza yazın:
    cat > ~/.gemini/antigravity-cli/mcp_config.json << EOF
    {
        "mcpServers": {
            "zoo-remote": {
                "serverUrl": "https://zoo-mcp-server-${PROJECT_NUMBER}.us-west1.run.app/mcp",
                "headers": {
                    "Authorization": "Bearer ${ID_TOKEN}"
                }
            }
        }
    }
    EOF
    
  5. Antigravity CLI'yı başlatın:
    agy
    
  1. Antigravity CLI ile kimlik doğrulama: İlk başlatma sırasında kimlik doğrulama gereklidir. OAuth'u seçin (Enter tuşuna basın).Antigravity kimlik doğrulama ekranı
  2. Bağlantıyı tıklayın (tıklanamıyorsa Cloud Shell'deki URL'yi vurgulayarak kopyalayın ve tarayıcınıza yapıştırın).
  3. Google Hesabınızda oturum açın
  4. Kodu kopyala
  5. Kodu Cloud Shell Editor terminaline yapıştırın.
  6. Enter tuşuna basın.Antigravity güvenlik kodu istemi
  7. Bazı varsayılan ayarları kabul etmek için Enter tuşuna basın.
  8. Antigravity CLI'nın, bağlamında kullanabileceği MCP araçlarını listelemesini sağlama
    /mcp
    
    İstem kutusuna dönmek için ESC tuşuna basın.
  9. Antigravity CLI'dan hayvanat bahçesinde bir şey bulmasını isteme
    Where can I find penguins?
    
    Antigravity CLI, zoo-remote MCP sunucusunu kullanması gerektiğini bilir ve MCP'nin yürütülmesine izin vermek isteyip istemediğinizi sorar.
  10. Aşağı ok tuşunu kullanın, ardından seçmek için Enter tuşuna basın.
    Yes, always allow all tools from server "zoo-remote"
    
    Antigravity CLI, Zoo uzaktan araçlarına izin veriyor

Çıktıda doğru yanıt ve MCP sunucusunun kullanıldığını gösteren bir görüntüleme kutusu yer almalıdır.

Antigravity CLI show zoo mcp server result

Başardınız! Uzak bir MCP sunucusunu Cloud Run'a başarıyla dağıttınız ve Antigravity CLI kullanarak test ettiniz.

Oturumunuzu sonlandırmaya hazır olduğunuzda /exit yazıp Enter tuşuna basarak Antigravity CLI'dan çıkın.

Hata ayıklama

Şuna benzer bir hata görürseniz:

🔍 Attempting OAuth discovery for 'zoo-remote'...
❌ 'zoo-remote' requires authentication but no OAuth configuration found
Error connecting to MCP server 'zoo-remote': MCP server 'zoo-remote' requires authentication. Please configure OAuth or check server settings.

Kimlik jetonunun zaman aşımına uğramış olması ve ID_TOKEN ayarının tekrar yapılması gerekiyor olabilir.

  1. /exit yazın ve ardından Enter tuşuna basarak Antigravity CLI'dan çıkın.
  2. Terminalinizde projenizi ayarlama
    gcloud config set project [PROJECT_ID]
    
  3. Google Cloud kimlik bilgileri komutunu yeniden çalıştırarak yeni bir ID_TOKEN alın (kimlik bilgilerinizin süresi dolmuş olabilir) ve yapılandırma dosyanızı yeniden yazın:
    export PROJECT_NUMBER=$(gcloud projects describe $GOOGLE_CLOUD_PROJECT --format="value(projectNumber)")
    export ID_TOKEN=$(gcloud auth print-identity-token)
    
    cat > ~/.gemini/antigravity-cli/mcp_config.json << EOF
    

{ "mcpServers": { "zoo-remote": { "serverUrl": "https://zoo-mcp-server-${PROJECT_NUMBER}.us-west1.run.app/mcp", "headers": { "Authorization": "Bearer ${ID_TOKEN}" } } } } EOF ```

9. (İsteğe bağlı) Sunucu günlüklerinde araç çağrılarını doğrulama

Cloud Run MCP sunucunuzun çağrıldığını doğrulamak için hizmet günlüklerini kontrol edin.

gcloud run services logs read zoo-mcp-server --region us-west1 --limit=5

Bir araç çağrısı yapıldığını onaylayan bir çıkış günlüğü görmeniz gerekir. 🛠️

2025-08-05 19:50:31 INFO:     169.254.169.126:39444 - "POST /mcp HTTP/1.1" 200 OK
2025-08-05 19:50:31 [INFO]: Processing request of type CallToolRequest
2025-08-05 19:50:31 [INFO]: >>> 🛠️ Tool: 'get_animals_by_species' called for 'penguin'

10. (İsteğe bağlı) Sunucuya MCP istemi ekleme

Bir MCP istemi, daha uzun bir istem için kısaltma oluşturarak sık çalıştırdığınız istemlerde iş akışınızı hızlandırabilir.

Antigravity CLI, MCP istemlerini otomatik olarak özel eğik çizgi komutlarına dönüştürür. Böylece /prompt_name yazarak bir MCP istemi çağırabilirsiniz. Burada prompt_name, MCP isteminizin adıdır.

Antigravity CLI'ye /find animal yazarak hayvanat bahçesindeki bir hayvanı hızlıca bulabilmek için MCP istemi oluşturun.

  1. Bu kodu, ana korumanın (if __name__ == "__main__":) üstündeki server.py dosyanıza ekleyin.
    @mcp.prompt()
    def find(animal: str) -> str:
        """
        Find which exhibit and trail a specific animal might be located.
        """
    
        return (
            f"Please find the exhibit and trail information for {animal} in the zoo. "
            f"Respond with '[animal] can be found in the [exhibit] on the [trail].'"
            f"Example: Penguins can be found in The Arctic Exhibit on the Polar Path."
        )
    
  2. Uygulamanızı Cloud Run'a yeniden dağıtma
    gcloud run deploy zoo-mcp-server \
        --region=us-west1 \
        --source=. \
        --labels=dev-tutorial=codelab-mcp
    
  3. ID_TOKEN'ınızı yenileyin ve yapılandırma dosyasını yeniden oluşturun:
    export ID_TOKEN=$(gcloud auth print-identity-token)
    export PROJECT_NUMBER=$(gcloud projects describe $GOOGLE_CLOUD_PROJECT --format="value(projectNumber)")
    
    cat > ~/.gemini/antigravity-cli/mcp_config.json << EOF
    

{ "mcpServers": { "zoo-remote": { "serverUrl": "https://zoo-mcp-server-${PROJECT_NUMBER}.us-west1.run.app/mcp", "headers": { "Authorization": "Bearer ${ID_TOKEN}" } } } } EOF ```

  1. Uygulamanızın yeni sürümü dağıtıldıktan sonra Antigravity CLI'yı başlatın.
    agy
    
  2. İstemde, oluşturduğunuz yeni özel komutu kullanın:
    /find lions
    

Antigravity CLI'nın get_animals_by_species aracını çağırdığını ve yanıtı MCP isteminde belirtildiği şekilde biçimlendirdiğini görmelisiniz.

╭───────────────────────────╮
│  > /find lions            │
╰───────────────────────────╯

 ╭───────────────────────────────────────────────────────────────────────────────────────────────────╮
 │ ✔  get_animals_by_species (zoo-remote MCP Server) get_animals_by_species (zoo-remote MCP Server)  │
 │                                                                                                   │
 │    [{"species":"lion","name":"Leo","age":7,"enclosure":"The Big Cat                               │
 │    Plains","trail":"Savannah                                                                      │
 │    Heights"},{"species":"lion","name":"Nala","age":6,"enclosure":"The Big Cat                     │
 │    Plains","trail":"Savannah                                                                      │
 │    Heights"},{"species":"lion","name":"Simba","age":3,"enclosure":"The Big Cat                    │
 │    Plains","trail":"Savannah                                                                      │
 │    Heights"},{"species":"lion","name":"King","age":8,"enclosure":"The Big Cat                     │
 │    Plains","trail":"Savannah Heights"}]                                                           │
 ╰───────────────────────────────────────────────────────────────────────────────────────────────────╯
✦ Lions can be found in The Big Cat Plains on the Savannah Heights.

11. (İsteğe bağlı) Daha hızlı yanıtlar için Gemini Flash Lite'ı kullanma

Antigravity CLI, kullandığınız modeli ve çabayı seçmenize olanak tanır.

Hayvanat bahçesindeki hayvanları bulmayla ilgili istekler düşünme veya akıl yürütme gerektirmediğinden daha hızlı bir model kullanarak süreci hızlandırmayı deneyin.

Önceki bölümde, Antigravity CLI'ye /find animal yazarak hayvanat bahçesindeki bir hayvanı hızlıca bulabilmek için bir MCP istemi oluşturmuştunuz.

  1. Uygulamanızın yeni sürümü dağıtıldıktan sonra Antigravity CLI'yı başlatın.
    agy --model=gemini-3.6-flash --effort=low
    
  2. İstemde, oluşturduğunuz yeni özel komutu kullanın:
    /find lions
    

Antigravity CLI'nın get_animals_by_species aracını çağırdığını ve yanıtı MCP isteminde belirtildiği şekilde biçimlendirdiğini görmeye devam edersiniz ancak yanıt çok daha hızlı görünür.

╭───────────────────────────╮
│  > /find lions            │
╰───────────────────────────╯

 ╭───────────────────────────────────────────────────────────────────────────────────────────────────╮
 │ ✔  get_animals_by_species (zoo-remote MCP Server) get_animals_by_species (zoo-remote MCP Server)  │
 │                                                                                                   │
 │    [{"species":"lion","name":"Leo","age":7,"enclosure":"The Big Cat                               │
 │    Plains","trail":"Savannah                                                                      │
 │    Heights"},{"species":"lion","name":"Nala","age":6,"enclosure":"The Big Cat                     │
 │    Plains","trail":"Savannah                                                                      │
 │    Heights"},{"species":"lion","name":"Simba","age":3,"enclosure":"The Big Cat                    │
 │    Plains","trail":"Savannah                                                                      │
 │    Heights"},{"species":"lion","name":"King","age":8,"enclosure":"The Big Cat                     │
 │    Plains","trail":"Savannah Heights"}]                                                           │
 ╰───────────────────────────────────────────────────────────────────────────────────────────────────╯
✦ Lions can be found in The Big Cat Plains on the Savannah Heights.

Hata ayıklama

Şuna benzer bir hata görürseniz:

✕ Unknown command: /find lions

/mcp komutunu çalıştırmayı deneyin. zoo-remote - Disconnected çıkışı alırsanız yeniden dağıtmanız veya aşağıdaki komutları tekrar çalıştırmanız gerekebilir:

 gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
   --member=user:$(gcloud config get-value account) \
   --role='roles/run.invoker'

export PROJECT_NUMBER=$(gcloud projects describe $GOOGLE_CLOUD_PROJECT --format="value(projectNumber)")
export ID_TOKEN=$(gcloud auth print-identity-token)

cat > ~/.gemini/antigravity-cli/mcp_config.json << EOF
{
   "mcpServers": {
       "zoo-remote": {
           "serverUrl": "https://zoo-mcp-server-${PROJECT_NUMBER}.us-west1.run.app/mcp",
           "headers": {
               "Authorization": "Bearer ${ID_TOKEN}"
           }
       }
   }
}
EOF

12. Sonuç

Tebrikler! Güvenli bir uzak MCP sunucusunu başarıyla dağıtıp bağladınız.

Sonraki laboratuvara geçin.

Bu laboratuvar, üç bölümlük bir serinin ilk laboratuvarıdır. İkinci laboratuvarda, ADK aracısıyla oluşturduğunuz MCP sunucusunu kullanacaksınız.

Cloud Run'da ADK aracısıyla MCP sunucusu kullanma

(İsteğe bağlı) Temizleme

Bir sonraki laboratuvara geçmiyorsanız ve oluşturduğunuz öğeleri temizlemek istiyorsanız ek ücret ödememek için Cloud projenizi silebilirsiniz.

Cloud Run, hizmet kullanılmadığında ücret almaz ancak container görüntüsünü Artifact Registry'de depoladığınız için ücretlendirilebilirsiniz. Cloud projenizi sildiğinizde, bu projede kullanılan tüm kaynaklar için faturalandırma durdurulur.

İsterseniz projeyi silebilirsiniz:

gcloud projects delete $GOOGLE_CLOUD_PROJECT

Ayrıca gereksiz kaynakları cloudshell diskinizden de silebilirsiniz. Şunları yapabilirsiniz:

  1. Codelab proje dizinini silin:
    rm -rf ~/mcp-on-cloudrun
    
  2. Uyarı! Bu işlem geri alınamaz. Yer açmak için Cloud Shell'inizdeki her şeyi silmek istiyorsanız tüm ana dizininizi silebilirsiniz. Saklamak istediğiniz her şeyin başka bir yere kaydedildiğinden emin olun.
    sudo rm -rf $HOME