Cara men-deploy server MCP Genkit 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 Gemini CLI.

Yang akan Anda lakukan

Kita akan menggunakan Genkit untuk membuat server MCP zoo yang memiliki dua alat: get_animals_by_species dan get_animal_details. Genkit menyediakan cara cepat untuk membangun server dan klien MCP dengan Node.js.

Grafik Server MCP Zoo

Yang akan Anda pelajari

  • Men-deploy server MCP ke Cloud Run.
  • Amankan endpoint server Anda dengan mewajibkan autentikasi untuk semua permintaan, sehingga hanya klien dan agen yang berwenang yang dapat berkomunikasi dengannya.
  • Menghubungkan ke endpoint server MCP yang aman dari Gemini 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. Aktifkan penagihan di Konsol Cloud.
    • Menyelesaikan lab ini akan dikenai biaya kurang dari $1 USD untuk resource Cloud.
    • Anda dapat mengikuti langkah-langkah di akhir lab ini untuk menghapus resource agar tidak dikenai biaya lebih lanjut.
    • Pengguna baru memenuhi syarat untuk mengikuti Uji Coba Gratis senilai$300 USD.
  4. 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. Buka Cloud Shell Editor

  1. Klik link ini untuk langsung membuka Cloud Shell Editor
  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 terminal:
    • Klik Lihat
    • 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 ingat 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)?, berarti Anda kemungkinan telah memasukkan ID project 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

Pemrosesan perintah ini mungkin membutuhkan waktu beberapa menit, tetapi pada akhirnya akan menghasilkan pesan keberhasilan yang mirip dengan yang berikut:

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

5. Menyiapkan project JavaScript

  1. Buat folder bernama mcp-on-cloudrun untuk menyimpan kode sumber untuk deployment:
    mkdir mcp-on-cloudrun && cd mcp-on-cloudrun
    
  2. Buat project Node.js dengan alat npm untuk menghasilkan file package.json:
    npm init es6 -y
    
    Perintah npm init akan membuat file package.json untuk project Anda.
  3. Instal dependensi @modelcontextprotocol/sdk, express, dan zod:
    npm install @modelcontextprotocol/sdk express zod
    

6. Membuat server MCP kebun binatang

Untuk memberikan konteks berharga dalam meningkatkan penggunaan LLM dengan MCP, siapkan server MCP kebun binatang dengan Genkit — framework standar untuk bekerja dengan Model Context Protocol. Genkit menyediakan cara cepat untuk membangun server dan klien MCP dengan Node.js. Server MCP ini menyediakan data tentang hewan di kebun binatang fiktif. Untuk mempermudah, kita 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 Genkit sebagai dependensi dalam file package.json:
    npm install genkit
    
    Tindakan ini akan menambahkan file package-lock.json ke project Anda.
  2. Jalankan perintah berikut untuk menambahkan library MCP AI Genkit dalam file package.json:
    npm install @genkit-ai/mcp
    
  3. Buat dan buka file index.js baru untuk kode sumber server MCP:
    cloudshell edit index.js
    
    Perintah cloudshell edit akan membuka file index.js di editor di atas terminal.
  4. Tambahkan kode sumber server MCP zoo berikut dalam file index.js:
    import express from 'express';
    import { genkit, z } from 'genkit';
    import { createMcpServer } from '@genkit-ai/mcp';
    import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
    
    // Dictionary of animals at the zoo
    const 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"
        }
    ];
    
    // Initialize Genkit
    const ai = genkit({});
    
    // Define tools using Genkit
    ai.defineTool(
        {
            name: 'get_animals_by_species',
            description: "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.",
            inputSchema: z.object({ species: z.string() }),
        },
        async ({ species }) => {
            console.log(`>>> 🛠️ Tool: 'get_animals_by_species' called for '${species}'`);
            const animals = ZOO_ANIMALS.filter(animal => animal.species.toLowerCase() === species.toLowerCase());
            return animals;
        }
    );
    
    ai.defineTool(
        {
            name: 'get_animal_details',
            description: "Retrieves the details of a specific animal by its name.",
            inputSchema: z.object({ name: z.string() }),
        },
        async ({ name }) => {
            console.log(`>>> 🛠️ Tool: 'get_animal_details' called for '${name}'`);
            const animal = ZOO_ANIMALS.find(a => a.name.toLowerCase() === name.toLowerCase());
            return animal;
        }
    );
    
    // Create Genkit MCP server wrapper
    const mcpWrapper = createMcpServer(ai, {
        name: 'zoo-animal-server',
        version: '1.0.0',
    });
    
    // HTTP server mode
    const app = express();
    app.use(express.json());
    
    // Initialize Genkit MCP server once
    const mcpServerPromise = mcpWrapper.setup().then(() => mcpWrapper.server);
    
    app.post('/mcp', async (req, res) => {
        console.log('/mcp Received:', req.body);
        console.log('Using HTTP transport mode.');
    
        const server = await mcpServerPromise;
    
        const transport = new StreamableHTTPServerTransport({
            sessionIdGenerator: undefined,
        });
    
        if (!server) {
            console.error('MCP Server not initialized correctly.');
            res.sendStatus(500);
            return;
        }
    
        await server.connect(transport);
        await transport.handleRequest(req, res, req.body);
    
        res.on('close', () => {
            console.log('Request closed');
            transport.close();
        });
    });
    
    app.get('/mcp', async (req, res) => {
        console.log('Received GET MCP request');
        res.sendStatus(405);
    });
    
    app.delete('/mcp', async (req, res) => {
        console.log('Received DELETE MCP request');
        res.sendStatus(405);
    });
    
    // Start the server
    const PORT = process.env.PORT || 8080;
    app.listen(PORT, () => {
        console.log(`Zoo Animal MCP server listening on 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 akun layanan bernama mcp-server-sa:
    gcloud iam service-accounts create mcp-server-sa --display-name="MCP Server Service Account"
    
  2. Jalankan perintah gcloud untuk men-deploy aplikasi ke Cloud Run
    gcloud run deploy zoo-mcp-server \
        --service-account=mcp-server-sa@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com \
        --no-allow-unauthenticated \
        --region=europe-west1 \
        --source=. \
        --labels=dev-tutorial=codelab-mcp
    
    Gunakan flag --no-allow-unauthenticated untuk mewajibkan autentikasi. Hal ini penting karena alasan keamanan. Jika Anda tidak memerlukan autentikasi, siapa pun dapat memanggil server MCP Anda dan berpotensi menyebabkan kerusakan pada sistem Anda.
  3. 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 [europe-west1] will be created.
    
    Do you want to continue (Y/n)?
    
    Ketik Y, lalu 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.
  4. 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 Gemini CLI

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

  1. Beri akun pengguna Anda izin 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 Gemini:
    export PROJECT_NUMBER=$(gcloud projects describe $GOOGLE_CLOUD_PROJECT --format="value(projectNumber)")
    export ID_TOKEN=$(gcloud auth print-identity-token)
    
  3. Membuka file Setelan Gemini CLI
    cloudshell edit ~/.gemini/settings.json
    
  4. Mengganti file setelan Gemini CLI untuk menambahkan server MCP Cloud Run
    {
        "ide": {
            "hasSeenNudge": true
        },
        "mcpServers": {
            "zoo-remote": {
                "httpUrl": "https://zoo-mcp-server-$PROJECT_NUMBER.europe-west1.run.app/mcp",
                "headers": {
                    "Authorization": "Bearer $ID_TOKEN"
                }
            }
        },
        "security": {
            "auth": {
                "selectedType": "cloud-shell"
            }
        }
    }
    

  1. Mulai Gemini CLI di Cloud Shell
    gemini
    
    Anda mungkin perlu menekan Enter untuk menerima beberapa setelan default.Tampilan awal Gemini CLI
  2. Meminta Gemini mencantumkan alat MCP yang tersedia untuknya sesuai konteksnya
    /mcp
    
  3. Minta Gemini menemukan sesuatu di kebun binatang
    Where can I find penguins?
    
    Gemini CLI harus mengetahui cara menggunakan Server MCP zoo-remote dan akan menanyakan apakah Anda ingin mengizinkan eksekusi MCP.
  4. Gunakan panah bawah, lalu tekan Enter untuk memilih
    Yes, always allow all tools from server "zoo-remote"
    
    Mengizinkan alat jarak jauh zoo Gemini CLI

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

Hasil Gemini CLI show zoo mcp server

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

Jika Anda siap mengakhiri sesi, ketik /quit, lalu tekan Enter untuk keluar dari Gemini 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 perlu menyetel ID_TOKEN lagi.

  1. Ketik /quit, lalu tekan Enter untuk keluar dari Gemini 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 sudah habis.
    export PROJECT_NUMBER=$(gcloud projects describe $GOOGLE_CLOUD_PROJECT --format="value(projectNumber)")
    export ID_TOKEN=$(gcloud auth print-identity-token)
    

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

Gemini 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 agar Anda dapat dengan cepat menemukan hewan di kebun binatang dengan mengetik /find animal ke Gemini CLI.

  1. Tambahkan kode ini ke file index.js Anda di atas baris // Create Genkit MCP server wrapper:
    ai.definePrompt(
        {
            name: 'find',
            description: 'Find which exhibit and trail a specific animal is located.',
            inputSchema: z.object({ animal: z.string() }),
        },
        async ({ animal }) => {
            console.log(`>>> 💬 Prompt: 'find' called'`);
            return {
                messages: [
                    {
                        role: 'user',
                        content: [
                            { text: `Please find the exhibit and trail information for ${animal} in the zoo. Respond with '[animal] can be found in the [exhibit] on the [trail].' Example: Penguins can be found in The Arctic Exhibit on the Polar Path.` }
                        ]
                    }
                ]
            };
        }
    );
    
  2. Men-deploy ulang aplikasi Anda ke Cloud Run
    gcloud run deploy zoo-mcp-server \
        --service-account=mcp-server-sa@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com \
        --no-allow-unauthenticated \
        --region=europe-west1 \
        --source=. \
        --labels=dev-tutorial=codelab-mcp
    
  3. Memperbarui ID_TOKEN untuk server MCP jarak jauh Anda
    export ID_TOKEN=$(gcloud auth print-identity-token)
    
  4. Setelah aplikasi versi baru Anda di-deploy, mulai Gemini CLI.
    gemini
    
  5. Dalam perintah, gunakan perintah kustom baru yang Anda buat:
    /find --animal="lions"
    

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

╭───────────────────────────╮
│  > /find --animal="lion"  │
╰───────────────────────────╯

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

Gemini CLI memungkinkan Anda memilih model yang Anda gunakan.

  • Gemini 2.5 Pro adalah model pemikiran tercanggih dari Google, yang mampu melakukan penalaran atas masalah kompleks dalam kode, matematika, dan STEM, serta menganalisis set data, codebase, dan dokumen besar menggunakan konteks panjang.
  • Gemini 2.5 Flash adalah model terbaik Google dalam hal performa harga, yang menawarkan kemampuan serba guna. 2.5 Flash paling cocok untuk pemrosesan skala besar, tugas bervolume tinggi dengan latensi rendah yang memerlukan penalaran, dan kasus penggunaan berbasis agen.
  • Gemini 2.5 Flash Lite adalah model flash tercepat Google yang dioptimalkan untuk efisiensi biaya dan throughput tinggi.

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

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

  1. Setelah aplikasi versi baru Anda di-deploy, mulai Gemini CLI.
    gemini --model=gemini-2.5-flash-lite
    
  2. Dalam perintah, gunakan perintah kustom baru yang Anda buat:
    /find --animal="lions"
    

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

╭───────────────────────────╮
│  > /find --animal="lion"  │
╰───────────────────────────╯

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

Tujuan Tambahan untuk Menguji Diri Anda

Untuk tantangan tambahan, lihat apakah Anda dapat mengikuti langkah-langkah yang sama untuk membuat perintah guna menampilkan fakta menarik tentang spesies hewan tertentu di kebun binatang.

Atau, sebagai latihan yang lebih menantang untuk menguji apa yang telah Anda pelajari, buat ide untuk alat yang akan sering Anda gunakan dan deploy server MCP jarak jauh kedua. Kemudian, tambahkan ke setelan Gemini CLI Anda untuk melihat apakah berfungsi.

Proses debug

Jika Anda melihat error seperti ini:

✕ Unknown command: /find --animal="lions"

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

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)

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 seri tiga bagian. Di lab kedua, Anda akan menggunakan server MCP yang dibuat dengan Agen ADK.

Menggunakan Server MCP di Cloud Run dengan Agen ADK

(Opsional) Membersihkan

Jika Anda tidak melanjutkan ke lab berikutnya dan ingin menghapus 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 ditagih atas penyimpanan image container di Artifact Registry. Menghapus project Cloud akan menghentikan penagihan untuk semua resource yang digunakan dalam project tersebut.

Jika Anda ingin, hapus project:

gcloud projects delete $GOOGLE_CLOUD_PROJECT

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

  1. Hapus direktori project codelab:
    rm -rf ~/mcp-on-cloudrun
    
  2. Peringatan! Tindakan berikutnya ini tidak dapat diurungkan. Jika ingin menghapus semua yang ada di Cloud Shell untuk mengosongkan ruang penyimpanan, Anda dapat menghapus seluruhdirektori beranda. Berhati-hatilah agar semua yang ingin Anda simpan disimpan di tempat lain.
    sudo rm -rf $HOME