Cara men-deploy server MCP yang aman di Cloud Run

1. Pengantar

Ringkasan

Di lab ini, Anda akan membangun dan men-deploy server Model Context Protocol (MCP). Server MCP berguna untuk memberi LLM akses ke alat dan layanan eksternal. Anda akan mengonfigurasinya sebagai layanan yang aman dan siap produksi di Cloud Run yang dapat diakses dari beberapa klien. Kemudian, Anda akan terhubung ke server MCP jarak jauh dari Antigravity CLI.

Yang akan Anda lakukan

Kita akan menggunakan FastMCP untuk membuat server MCP kebun binatang yang memiliki dua alat: get_animals_by_species dan get_animal_details. FastMCP menyediakan cara cepat dan Pythonic untuk membangun server dan klien MCP.

Grafik Server MCP Zoo

Yang akan Anda pelajari

  • Men-deploy server MCP ke Cloud Run.
  • Mengamankan endpoint server Anda dengan mewajibkan autentikasi untuk semua permintaan, sehingga hanya klien dan agen yang diotorisasi yang dapat berkomunikasi dengannya.
  • Menghubungkan ke endpoint server MCP yang aman dari Antigravity CLI

2. Penyiapan Project

  1. Jika belum memiliki Akun Google, Anda harus membuat Akun Google.
    • Gunakan akun pribadi, bukan akun kantor atau sekolah. Akun kantor dan sekolah mungkin memiliki batasan yang mencegah Anda mengaktifkan API yang diperlukan untuk lab ini.
  2. Login ke Konsol Google Cloud.
  3. Buat project baru atau pilih untuk menggunakan kembali project yang ada.
    • Jika Anda melihat error tentang kuota project, gunakan kembali project yang ada atau hapus project yang ada untuk membuat project baru.

3. Membuka Cloud Shell Editor

  1. Klik link ini untuk membuka Cloud Shell Editor secara langsung
  2. Jika diminta untuk memberikan otorisasi kapan saja hari ini, klik Authorize untuk melanjutkan. Klik untuk memberikan otorisasi pada Cloud Shell
  3. Jika terminal tidak muncul di bagian bawah layar, buka:
    • Klik View
    • Klik TerminalMembuka terminal baru di Cloud Shell Editor
  4. Di terminal, tetapkan project Anda dengan perintah ini:
    • Format:
      gcloud config set project [PROJECT_ID]
      
    • Contoh:
      gcloud config set project lab-project-id-example
      
    • Jika Anda tidak dapat mengingat project ID Anda:
      • Anda dapat mencantumkan semua project ID Anda dengan:
        gcloud projects list | awk '/PROJECT_ID/{print $2}'
        
      Menetapkan project ID di terminal Cloud Shell Editor
  5. Anda akan melihat pesan ini:
    Updated property [core/project].
    
    Jika Anda melihat WARNING dan diminta Do you want to continue (Y/n)?, kemungkinan Anda telah memasukkan project ID dengan salah. Tekan n, tekan Enter, lalu coba jalankan perintah gcloud config set project lagi.

4. Mengaktifkan API

Di terminal, aktifkan API:

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

Jika diminta untuk memberikan otorisasi, klik Authorize untuk melanjutkan. Klik untuk memberikan otorisasi pada Cloud Shell

Perintah ini mungkin memerlukan waktu beberapa menit untuk diselesaikan, tetapi pada akhirnya akan menghasilkan pesan yang berhasil seperti ini:

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

5. Menyiapkan project Python Anda

  1. Buat folder bernama mcp-on-cloudrun untuk menyimpan kode sumber untuk deployment:
    mkdir mcp-on-cloudrun && cd mcp-on-cloudrun
    
  2. Buat project Python dengan alat uv untuk membuat file pyproject.toml:
    uv init --description "Example of deploying an MCP server on Cloud Run" --bare --python 3.13
    
    Perintah uv init membuat file pyproject.toml untuk project Anda.Untuk melihat konten file, jalankan perintah berikut:
    cat pyproject.toml
    
    Output-nya akan terlihat seperti berikut:
    [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. Membuat server MCP kebun binatang

Untuk memberikan konteks yang berharga dalam meningkatkan penggunaan LLM dengan MCP, siapkan server MCP kebun binatang dengan FastMCP — framework standar untuk menggunakan Model Context Protocol. FastMCP menyediakan cara cepat untuk membangun server dan klien MCP dengan Python. Server MCP ini menyediakan data tentang hewan di kebun binatang fiktif. Untuk mempermudah, kita akan menyimpan data dalam memori. Untuk server MCP produksi, Anda mungkin ingin menyediakan data dari sumber seperti database atau API.

  1. Jalankan perintah berikut untuk menambahkan FastMCP sebagai dependensi dalam file pyproject.toml:
    uv add fastmcp==2.12.4 --no-sync
    
    Tindakan ini akan menambahkan file uv.lock ke project Anda.
  2. Buat dan buka file server.py baru untuk kode sumber server MCP:
    cloudshell edit ~/mcp-on-cloudrun/server.py
    
    Perintah cloudshell edit akan membuka file server.py di editor di atas terminal.
  3. Tambahkan kode sumber server MCP kebun binatang berikut dalam file server.py:
    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,
            )
        )
    

Kode Anda sudah selesai. Sekarang saatnya men-deploy server MCP ke Cloud Run.

7. Men-deploy ke Cloud Run

Sekarang, deploy server MCP ke Cloud Run langsung dari kode sumber.

  1. Buat dan buka Dockerfile baru untuk men-deploy ke Cloud Run:
    cloudshell edit ~/mcp-on-cloudrun/Dockerfile
    
  2. Sertakan kode berikut dalam Dockerfile untuk menggunakan alat uv dalam menjalankan file server.py:
    # 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. Buat akun layanan bernama mcp-server-sa:
    gcloud iam service-accounts create mcp-server-sa --display-name="MCP Server Service Account"
    
  4. Jalankan perintah gcloud untuk men-deploy aplikasi ke Cloud Run
    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
    
    Gunakan flag --no-allow-unauthenticated untuk mewajibkan autentikasi. Hal ini penting karena alasan keamanan. Jika Anda tidak mewajibkan autentikasi, siapa pun dapat memanggil server MCP Anda dan berpotensi menyebabkan kerusakan pada sistem Anda.
  5. Konfirmasi pembuatan repositori Artifact Registry baru Karena ini adalah pertama kalinya Anda men-deploy ke Cloud Run dari kode sumber, Anda akan melihat:
    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)?
    
    Ketik Y dan tekan Enter. Tindakan ini akan membuat repositori Artifact Registry untuk deployment Anda. Hal ini diperlukan untuk menyimpan container Docker server MCP untuk layanan Cloud Run.
  6. Setelah beberapa menit, Anda akan melihat pesan seperti:
    Service [zoo-mcp-server] revision [zoo-mcp-server-12345-abc] has been deployed and is serving 100 percent of traffic.
    

Anda telah men-deploy server MCP. Sekarang Anda dapat menggunakannya.

8. Menambahkan Server MCP Jarak Jauh ke Antigravity CLI

Setelah berhasil men-deploy server MCP jarak jauh, Anda dapat terhubung ke server tersebut menggunakan berbagai aplikasi seperti Google Code Assist atau Antigravity CLI. Di bagian ini, kita akan membuat koneksi ke server MCP jarak jauh baru Anda menggunakan Antigravity CLI.

  1. Berikan izin akun pengguna Anda untuk memanggil server MCP jarak jauh
    gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
        --member=user:$(gcloud config get-value account) \
        --role='roles/run.invoker'
    
  2. Simpan kredensial Google Cloud dan nomor project Anda dalam variabel lingkungan untuk digunakan dalam file Setelan Antigravity:
    export PROJECT_NUMBER=$(gcloud projects describe $GOOGLE_CLOUD_PROJECT --format="value(projectNumber)")
    export ID_TOKEN=$(gcloud auth print-identity-token)
    
  3. Buat folder .gemini/antigravity-cli jika belum dibuat
    mkdir -p ~/.gemini/antigravity-cli
    
  4. Tulis server MCP jarak jauh ke file konfigurasi MCP Antigravity CLI Anda:
    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. Mulai Antigravity CLI:
    agy
    
  1. Lakukan autentikasi dengan Antigravity CLI: Selama startup awal, autentikasi diperlukan. Pilih OAuth (tekan Enter).Layar autentikasi antigravitasi
  2. Klik link (jika tidak dapat diklik, tandai URL di Cloud Shell untuk menyalinnya, lalu tempelkan ke browser Anda)
  3. Login ke Akun Google Anda
  4. Salin kodenya
  5. Tempel kode ke terminal Cloud Shell Editor
  6. Tekan Enter.Perintah kode keamanan antigravitasi
  7. Tekan Enter untuk menerima beberapa setelan default.
  8. Minta Antigravity CLI mencantumkan alat MCP yang tersedia untuknya sesuai konteksnya
    /mcp
    
    Tekan ESC untuk kembali ke kotak perintah.
  9. Minta Antigravity CLI menemukan sesuatu di kebun binatang
    Where can I find penguins?
    
    Antigravity CLI harus mengetahui cara menggunakan Server MCP zoo-remote dan akan menanyakan apakah Anda ingin mengizinkan eksekusi MCP.
  10. Gunakan panah bawah, lalu tekan Enter untuk memilih
    Yes, always allow all tools from server "zoo-remote"
    
    Antigravity CLI mengizinkan alat jarak jauh zoo

Output akan menampilkan jawaban yang benar dan kotak tampilan yang menunjukkan bahwa server MCP digunakan.

Antigravity CLI show zoo mcp server result

Anda telah melakukannya. Anda telah berhasil men-deploy server MCP jarak jauh ke Cloud Run dan mengujinya menggunakan Antigravity CLI.

Jika Anda siap mengakhiri sesi, ketik /exit, lalu tekan Enter untuk keluar dari Antigravity CLI.

Proses debug

Jika Anda melihat error seperti ini:

🔍 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.

Kemungkinan Token ID telah habis masa berlakunya dan memerlukan penetapan ID_TOKEN lagi.

  1. Ketik /exit, lalu tekan Enter untuk keluar dari Antigravity CLI.
  2. Tetapkan project Anda di terminal
    gcloud config set project [PROJECT_ID]
    
  3. Jalankan kembali perintah kredensial Google Cloud untuk mendapatkan ID_TOKEN baru karena masa berlakunya mungkin telah berakhir, dan tulis ulang file konfigurasi Anda:
    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. (Opsional) Memverifikasi Panggilan Alat di Log Server

Untuk memverifikasi bahwa server MCP Cloud Run Anda dipanggil, periksa log layanan.

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

Anda akan melihat log output yang mengonfirmasi bahwa panggilan alat dilakukan. 🛠️

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. (Opsional) Menambahkan perintah MCP ke Server

Perintah MCP dapat mempercepat alur kerja Anda untuk perintah yang sering Anda jalankan dengan membuat singkatan untuk perintah yang lebih panjang.

Antigravity CLI secara otomatis mengonversi perintah MCP menjadi perintah garis miring kustom sehingga Anda dapat memanggil perintah MCP dengan mengetik /prompt_name dengan prompt_name adalah nama perintah MCP Anda.

Buat perintah MCP sehingga Anda dapat menemukan hewan di kebun binatang dengan cepat dengan mengetik /find animal ke Antigravity CLI.

  1. Tambahkan kode ini ke file server.py Anda di atas penjaga utama (if __name__ == "__main__":)
    @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. Deploy ulang aplikasi Anda ke Cloud Run
    gcloud run deploy zoo-mcp-server \
        --region=us-west1 \
        --source=. \
        --labels=dev-tutorial=codelab-mcp
    
  3. Perbarui ID_TOKEN Anda dan buat ulang file konfigurasi:
    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. Setelah versi baru aplikasi Anda di-deploy, mulai Antigravity CLI.
    agy
    
  2. Di perintah, gunakan perintah kustom baru yang Anda buat:
    /find lions
    

Anda akan melihat bahwa Antigravity CLI memanggil alat get_animals_by_species dan memformat respons sesuai petunjuk perintah MCP.

╭───────────────────────────╮
│  > /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. (Opsional) Menggunakan Gemini Flash Lite untuk respons yang lebih cepat

Antigravity CLI memungkinkan Anda memilih model dan upaya yang Anda gunakan.

Karena permintaan yang terkait dengan menemukan hewan kebun binatang tidak memerlukan pemikiran atau penalaran, coba percepat dengan menggunakan model yang lebih cepat.

Di bagian sebelumnya, Anda membuat perintah MCP sehingga Anda dapat menemukan hewan di kebun binatang dengan cepat dengan mengetik /find animal ke Antigravity CLI.

  1. Setelah versi baru aplikasi Anda di-deploy, mulai Antigravity CLI.
    agy --model=gemini-3.6-flash --effort=low
    
  2. Di perintah, gunakan perintah kustom baru yang Anda buat:
    /find lions
    

Anda akan tetap melihat bahwa Antigravity CLI memanggil alat get_animals_by_species dan memformat respons sesuai petunjuk perintah MCP, tetapi jawabannya akan muncul jauh lebih cepat.

╭───────────────────────────╮
│  > /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.

Proses debug

Jika Anda melihat error seperti ini:

✕ Unknown command: /find lions

Coba jalankan /mcp dan jika output-nya zoo-remote - Disconnected, Anda mungkin harus men-deploy ulang, atau menjalankan perintah berikut lagi:

 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. Kesimpulan

Selamat! Anda telah berhasil men-deploy dan terhubung ke server MCP jarak jauh yang aman.

Lanjutkan ke lab berikutnya

Lab ini adalah lab pertama dalam rangkaian tiga bagian. Di lab kedua, Anda akan menggunakan server MCP yang Anda buat dengan Agen ADK.

Menggunakan Server MCP di Cloud Run dengan Agen ADK

(Opsional) Membersihkan

Jika Anda tidak melanjutkan ke lab berikutnya dan ingin membersihkan apa yang telah Anda buat, Anda dapat menghapus project Cloud untuk menghindari biaya tambahan.

Meskipun Cloud Run tidak mengenakan biaya saat layanannya tidak digunakan, Anda mungkin tetap dikenai biaya atas penyimpanan image container di Artifact Registry. Menghapus project Cloud akan menghentikan penagihan untuk semua resource yang digunakan dalam project tersebut.

Jika Anda mau, hapus project:

gcloud projects delete $GOOGLE_CLOUD_PROJECT

Anda mungkin juga ingin menghapus resource yang tidak diperlukan dari disk cloudshell. Anda dapat:

  1. Menghapus direktori project codelab:
    rm -rf ~/mcp-on-cloudrun
    
  2. Peringatan! Tindakan berikutnya tidak dapat diurungkan. Jika Anda ingin menghapus semua yang ada di Cloud Shell untuk mengosongkan ruang, Anda dapat menghapus seluruh direktori utama. Pastikan semua yang ingin Anda simpan disimpan di tempat lain.
    sudo rm -rf $HOME