Come eseguire il deployment di un server Genkit MCP sicuro su Cloud Run

1. Introduzione

Panoramica

In questo lab, creerai ed eseguirai il deployment di un server Model Context Protocol (MCP). I server MCP sono utili per fornire agli LLM l'accesso a strumenti e servizi esterni. Lo configurerai come un servizio sicuro e pronto per la produzione su Cloud Run, accessibile da più client. Poi ti connetterai al server MCP remoto da Gemini CLI.

In questo lab proverai a:

Utilizzeremo Genkit per creare un server MCP dello zoo con due strumenti: get_animals_by_species e get_animal_details. Genkit offre un modo rapido per creare server e client MCP con Node.js.

Grafico del server MCP di Zoo

Obiettivi didattici

  • Eseguire il deployment del server MCP su Cloud Run.
  • Proteggere l'endpoint del server richiedendo l'autenticazione per tutte le richieste, assicurandoti che solo i client e gli agenti autorizzati possano comunicare con esso.
  • Connetterti all'endpoint del server MCP sicuro da Gemini CLI.

2. Configurazione del progetto

  1. Se non hai già un Account Google, devi crearne uno.
    • Utilizza un account personale anziché un account di lavoro o della scuola. Gli account di lavoro e della scuola potrebbero avere limitazioni che impediscono di abilitare le API necessarie per questo lab.
  2. Accedi a Google Cloud Console.
  3. Abilita la fatturazione nella console Cloud.
    • Il completamento di questo lab dovrebbe costare meno di 1 $in risorse Cloud.
    • Puoi seguire i passaggi alla fine di questo lab per eliminare le risorse ed evitare ulteriori addebiti.
    • I nuovi utenti hanno diritto alla prova senza costi di 300$.
  4. Crea un nuovo progetto o scegli di riutilizzare un progetto esistente.
    • Se visualizzi un errore relativo alla quota del progetto, riutilizza un progetto esistente o eliminalo per crearne uno nuovo.

3. Apri editor di Cloud Shell

  1. Fai clic su questo link per passare direttamente all'editor di Cloud Shell
  2. Se ti viene chiesto di autorizzare in qualsiasi momento, fai clic su Autorizza per continuare. Fai clic per autorizzare Cloud Shell
  3. Se il terminale non viene visualizzato nella parte inferiore dello schermo, aprilo:
    • Fai clic su Visualizza
    • Fai clic su TerminaleApri un nuovo terminale nell'editor di Cloud Shell
  4. Nel terminale, imposta il progetto con questo comando:
    • Formato:
      gcloud config set project [PROJECT_ID]
      
    • Esempio:
      gcloud config set project lab-project-id-example
      
    • Se non ricordi l'ID progetto:
      • Puoi elencare tutti gli ID progetto con:
        gcloud projects list | awk '/PROJECT_ID/{print $2}'
        
      Imposta l'ID progetto nel terminale dell'editor di Cloud Shell
  5. Dovresti visualizzare questo messaggio:
    Updated property [core/project].
    
    Se visualizzi un WARNING e ti viene chiesto Do you want to continue (Y/n)?, probabilmente hai inserito l'ID progetto in modo errato. Premi n, premi Enter e prova a eseguire di nuovo il comando gcloud config set project.

4. Abilita API

Nel terminale, abilita le API:

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

Se ti viene chiesto di autorizzare, fai clic su Autorizza per continuare. Fai clic per autorizzare Cloud Shell

Il completamento di questo comando potrebbe richiedere alcuni minuti, ma alla fine dovrebbe generare un messaggio di successo simile a questo:

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

5. Prepara il progetto JavaScript

  1. Crea una cartella denominata mcp-on-cloudrun per archiviare il codice sorgente per il deployment:
    mkdir mcp-on-cloudrun && cd mcp-on-cloudrun
    
  2. Crea un progetto Node.js con lo strumento npm per generare un file package.json:
    npm init es6 -y
    
    Il comando npm init crea un file package.json per il tuo progetto.
  3. Installa le dipendenze @modelcontextprotocol/sdk, express e zod:
    npm install @modelcontextprotocol/sdk express zod
    

6. Crea il server MCP dello zoo

Per fornire un contesto prezioso per migliorare l'utilizzo degli LLM con MCP, configura un server MCP dello zoo con Genkit, un framework standard per lavorare con il Model Context Protocol. Genkit offre un modo rapido per creare server e client MCP con Node.js. Questo server MCP fornisce dati sugli animali di uno zoo immaginario. Per semplicità, archiviamo i dati in memoria. Per un server MCP di produzione, probabilmente ti consigliamo di fornire dati da origini come database o API.

  1. Esegui il comando seguente per aggiungere Genkit come dipendenza nel file package.json:
    npm install genkit
    
    In questo modo verrà aggiunto un file package-lock.json al progetto.
  2. Esegui il comando seguente per aggiungere la libreria Genkit AI MCP nel file package.json:
    npm install @genkit-ai/mcp
    
  3. Crea e apri un nuovo file index.js per il codice sorgente del server MCP:
    cloudshell edit index.js
    
    Il comando cloudshell edit aprirà il file index.js nell'editor sopra il terminale.
  4. Aggiungi il seguente codice sorgente del server MCP dello zoo nel 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}`);
    });
    

Il codice è completo. È il momento di eseguire il deployment del server MCP su Cloud Run.

7. Deployment in Cloud Run

Ora esegui il deployment di un server MCP su Cloud Run direttamente dal codice sorgente.

  1. Crea un service account denominato mcp-server-sa:
    gcloud iam service-accounts create mcp-server-sa --display-name="MCP Server Service Account"
    
  2. Esegui il comando gcloud per eseguire il deployment dell'applicazione su Cloud Run
    gcloud run deploy zoo-mcp-server \
        --service-account=mcp-server-sa@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com \
        --no-allow-unauthenticated \
        --region=europe-west4 \
        --source=. \
        --labels=dev-tutorial=codelab-mcp
    
    Utilizza il flag --no-allow-unauthenticated per richiedere l'autenticazione. Questo è importante per motivi di sicurezza. Se non richiedi l'autenticazione, chiunque può chiamare il tuo server MCP e potenzialmente causare danni al sistema.
  3. Conferma la creazione di un nuovo repository Artifact Registry. Poiché è la prima volta che esegui il deployment su Cloud Run dal codice sorgente, vedrai:
    Deploying from source requires an Artifact Registry Docker repository to store built containers. A repository named 
    [cloud-run-source-deploy] in region [europe-west4] will be created.
    
    Do you want to continue (Y/n)?
    
    Digita Y e premi Enter. In questo modo verrà creato un repository Artifact Registry per il deployment. Questa operazione è necessaria per archiviare il container Docker del server MCP per il servizio Cloud Run.
  4. Dopo alcuni minuti, vedrai un messaggio simile a:
    Service [zoo-mcp-server] revision [zoo-mcp-server-12345-abc] has been deployed and is serving 100 percent of traffic.
    

Hai eseguito il deployment del server MCP. Ora puoi utilizzarlo.

8. Aggiungi il server MCP remoto a Gemini CLI

Ora che hai eseguito il deployment di un server MCP remoto, puoi connetterti utilizzando varie applicazioni come Google Code Assist o Gemini CLI. In questa sezione, stabiliremo una connessione al nuovo server MCP remoto utilizzando Gemini CLI.

  1. Concedi al tuo account utente l'autorizzazione a chiamare il server MCP remoto.
    gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
        --member=user:$(gcloud config get-value account) \
        --role='roles/run.invoker'
    
  2. Salva le credenziali Google Cloud e il numero di progetto nelle variabili di ambiente da utilizzare nel file di impostazioni di Gemini:
    export PROJECT_NUMBER=$(gcloud projects describe $GOOGLE_CLOUD_PROJECT --format="value(projectNumber)")
    export ID_TOKEN=$(gcloud auth print-identity-token)
    
  3. Apri il file di impostazioni di Gemini CLI
    cloudshell edit ~/.gemini/settings.json
    
  4. Sostituisci il file di impostazioni di Gemini CLI per aggiungere il server MCP di Cloud Run
    {
        "ide": {
            "hasSeenNudge": true
        },
        "mcpServers": {
            "zoo-remote": {
                "httpUrl": "https://zoo-mcp-server-$PROJECT_NUMBER.europe-west4.run.app/mcp",
                "headers": {
                    "Authorization": "Bearer $ID_TOKEN"
                }
            }
        },
        "security": {
            "auth": {
                "selectedType": "cloud-shell"
            }
        }
    }
    

  1. Avvia Gemini CLI in Cloud Shell
    gemini
    
    Potresti dover premere Enter per accettare alcune impostazioni predefinite.Visualizzazione iniziale di Gemini CLI
  2. Chiedi a Gemini di elencare gli strumenti MCP a sua disposizione nel suo contesto.
    /mcp
    
  3. Chiedi a Gemini di trovare qualcosa nello zoo.
    Where can I find penguins?
    
    Gemini CLI dovrebbe sapere di utilizzare il server MCP zoo-remote e ti chiederà se vuoi consentire l'esecuzione di MCP.
  4. Utilizza la freccia giù, quindi premi Enter per selezionare
    Yes, always allow all tools from server "zoo-remote"
    
    Gemini CLI consente strumenti remoti zoo

L'output dovrebbe mostrare la risposta corretta e una casella di visualizzazione che indica che è stato utilizzato il server MCP.

Gemini CLI show zoo mcp server result

Hai fatto! Hai eseguito il deployment di un server MCP remoto su Cloud Run e lo hai testato utilizzando Gemini CLI.

Quando sei pronto per terminare la sessione, digita /quit e premi Enter per uscire da Gemini CLI.

Debug

Se visualizzi un errore simile a questo:

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

È probabile che il token ID sia scaduto e che sia necessario impostare di nuovo ID_TOKEN.

  1. Digita /quit e premi Enter per uscire da Gemini CLI.
  2. Imposta il progetto nel terminale
    gcloud config set project [PROJECT_ID]
    
  3. Esegui di nuovo il comando delle credenziali Google Cloud per ottenere un nuovo ID_TOKEN, poiché il tuo potrebbe essere scaduto.
    export PROJECT_NUMBER=$(gcloud projects describe $GOOGLE_CLOUD_PROJECT --format="value(projectNumber)")
    export ID_TOKEN=$(gcloud auth print-identity-token)
    

9. (Facoltativo) Verifica le chiamate agli strumenti nei log del server

Per verificare che il server MCP di Cloud Run sia stato chiamato, controlla i log del servizio.

gcloud run services logs read zoo-mcp-server --region europe-west4 --limit=5

Dovresti visualizzare un log di output che conferma che è stata effettuata una chiamata allo strumento. 🛠️

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. (Facoltativo) Aggiungi il prompt MCP al server

Un prompt MCP può velocizzare il flusso di lavoro per i prompt che esegui spesso creando un'abbreviazione per un prompt più lungo.

Gemini CLI converte automaticamente i prompt MCP in comandi slash personalizzati, in modo che tu possa richiamare un prompt MCP digitando /prompt_name, dove prompt_name è il nome del prompt MCP.

Crea un prompt MCP in modo da poter trovare rapidamente un animale nello zoo digitando /find animal in Gemini CLI.

  1. Aggiungi questo codice al file index.js sopra la riga // 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. Esegui di nuovo il deployment dell'applicazione su Cloud Run
    gcloud run deploy zoo-mcp-server \
        --service-account=mcp-server-sa@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com \
        --no-allow-unauthenticated \
        --region=europe-west4 \
        --source=. \
        --labels=dev-tutorial=codelab-mcp
    
  3. Aggiorna ID_TOKEN per il server MCP remoto
    export ID_TOKEN=$(gcloud auth print-identity-token)
    
  4. Dopo aver eseguito il deployment della nuova versione dell'applicazione, avvia Gemini CLI.
    gemini
    
  5. Nel prompt, utilizza il nuovo comando personalizzato che hai creato:
    /find --animal="lions"
    

Dovresti vedere che Gemini CLI chiama lo strumento get_animals_by_species e formatta la risposta come indicato dal prompt 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. (Facoltativo) Utilizza Gemini Flash Lite per risposte più rapide

Gemini CLI ti consente di scegliere il modello che stai utilizzando.

  • Gemini 2.5 Pro è il modello di ragionamento all'avanguardia di Google, in grado di ragionare su problemi complessi in codice, matematica e STEM, nonché di analizzare grandi set di dati, codebase e documenti utilizzando un contesto lungo.
  • Gemini 2.5 Flash è il modello migliore di Google in termini di rapporto prezzo/prestazioni, che offre funzionalità complete. 2.5 Flash è ideale per l'elaborazione su larga scala, la bassa latenza, le attività ad alto volume che richiedono pensiero e i casi d'uso agentici.
  • Gemini 2.5 Flash Lite è il modello flash più veloce di Google, ottimizzato per l'efficienza dei costi e il throughput elevato.

Poiché le richieste relative alla ricerca degli animali dello zoo non richiedono pensiero o ragionamento, prova ad accelerare le operazioni utilizzando un modello più veloce.

Crea un prompt MCP in modo da poter trovare rapidamente un animale nello zoo digitando /find animal in Gemini CLI.

  1. Dopo aver eseguito il deployment della nuova versione dell'applicazione, avvia Gemini CLI.
    gemini --model=gemini-2.5-flash-lite
    
  2. Nel prompt, utilizza il nuovo comando personalizzato che hai creato:
    /find --animal="lions"
    

Dovresti comunque vedere che Gemini CLI chiama lo strumento get_animals_by_species e formatta la risposta come indicato dal prompt MCP, ma la risposta dovrebbe apparire molto più velocemente.

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

Obiettivi di approfondimento per metterti alla prova

Per una sfida extra, prova a seguire gli stessi passaggi per creare un prompt per restituire curiosità su specie animali specifiche dello zoo.

Oppure, per una sfida ancora più grande per mettere alla prova ciò che hai imparato, pensa a un'idea per uno strumento che utilizzeresti di frequente ed esegui il deployment di un secondo server MCP remoto. Poi aggiungilo alle impostazioni di Gemini CLI per verificare se funziona.

Debug

Se visualizzi un errore simile a questo:

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

Prova a eseguire /mcp e, se restituisce zoo-remote - Disconnected, potresti dover eseguire di nuovo il deployment o eseguire di nuovo i seguenti comandi:

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

Complimenti! Hai eseguito il deployment e la connessione a un server MCP remoto sicuro.

Continua con il lab successivo

Questo lab è il primo di una serie di tre. Nel secondo lab, utilizzerai il server MCP che hai creato con un agente ADK.

Utilizza un server MCP su Cloud Run con un agente ADK

(Facoltativo) Libera spazio

Se non continuerai con il lab successivo e vuoi liberare spazio da ciò che hai creato, puoi eliminare il progetto Cloud per evitare addebiti aggiuntivi.

Sebbene non siano previsti addebiti per Cloud Run quando il servizio non è in uso, ti potrebbero comunque essere addebitati i costi di archiviazione dell'immagine container in Artifact Registry. L'eliminazione del progetto Cloud interrompe la fatturazione di tutte le risorse utilizzate all'interno del progetto.

Se vuoi, elimina il progetto:

gcloud projects delete $GOOGLE_CLOUD_PROJECT

Potresti anche eliminare le risorse non necessarie dal disco di Cloud Shell. Puoi:

  1. Eliminare la directory del progetto del codelab:
    rm -rf ~/mcp-on-cloudrun
    
  2. Attenzione. Questa azione non può essere annullata. Se vuoi eliminare tutto su Cloud Shell per liberare spazio, puoi eliminare la tua interahome directory. Assicurati che tutto ciò che vuoi conservare sia salvato altrove.
    sudo rm -rf $HOME