Как развернуть безопасный сервер Genkit MCP в Cloud Run

1. Введение

Обзор

В этой лабораторной работе вы создадите и развернете сервер протокола контекста модели (MCP). Серверы MCP полезны для предоставления студентам магистратуры доступа к внешним инструментам и сервисам. Вы настроите его как безопасный, готовый к использованию в производственной среде сервис в Cloud Run, к которому можно будет получить доступ с нескольких клиентов. Затем вы подключитесь к удаленному серверу MCP из командной строки Gemini.

Что вы будете делать

Мы будем использовать Genkit для создания MCP-сервера для зоопарка , который будет содержать два инструмента: get_animals_by_species и get_animal_details . Genkit предоставляет быстрый способ создания MCP-серверов и клиентов с помощью Node.js.

Графика сервера Zoo MCP

Что вы узнаете

  • Разверните сервер MCP в Cloud Run.
  • Защитите конечную точку вашего сервера, требуя аутентификации для всех запросов, чтобы гарантировать, что только авторизованные клиенты и агенты могут взаимодействовать с ним.
  • Подключитесь к защищенной конечной точке вашего сервера MCP из Gemini CLI.

2. Настройка проекта

  1. Если у вас еще нет учетной записи Google, вам необходимо ее создать .
    • Используйте личный аккаунт вместо рабочего или учебного. Рабочие и учебные аккаунты могут иметь ограничения, которые не позволят вам включить API, необходимые для этой лабораторной работы.
  2. Войдите в консоль Google Cloud .
  3. Включите выставление счетов в облачной консоли.
    • Выполнение этой лабораторной работы должно обойтись менее чем в 1 доллар США в виде облачных ресурсов.
    • В конце этой лабораторной работы вы можете выполнить действия по удалению ресурсов, чтобы избежать дальнейших списаний средств.
    • Новые пользователи могут воспользоваться бесплатной пробной версией стоимостью 300 долларов США .
  4. Создайте новый проект или выберите вариант повторного использования существующего проекта.
    • Если вы видите ошибку, связанную с квотой проекта, используйте существующий проект повторно или удалите существующий проект, чтобы создать новый.

3. Откройте редактор Cloud Shell.

  1. Нажмите на эту ссылку, чтобы перейти непосредственно в редактор Cloud Shell.
  2. Если сегодня вам будет предложено авторизоваться, нажмите «Авторизовать» , чтобы продолжить. Нажмите, чтобы авторизовать Cloud Shell.
  3. Если терминал не отображается внизу экрана, откройте его:
    • Нажмите «Просмотреть».
    • Нажмите «Терминал» Откройте новый терминал в редакторе Cloud Shell.
  4. В терминале настройте свой проект с помощью этой команды:
    • Формат:
      gcloud config set project [PROJECT_ID]
      
    • Пример:
      gcloud config set project lab-project-id-example
      
    • Если вы не помните идентификатор своего проекта:
      • Вы можете вывести список всех идентификаторов ваших проектов с помощью:
        gcloud projects list | awk '/PROJECT_ID/{print $2}'
        
      Установите идентификатор проекта в терминале редактора Cloud Shell.
  5. Вы должны увидеть следующее сообщение:
    Updated property [core/project].
    
    Если вы видите WARNING и вас спрашивают Do you want to continue (Y/n)? , то, скорее всего, вы неправильно ввели идентификатор проекта. Нажмите n , затем Enter и попробуйте снова выполнить команду gcloud config set project .

4. Включите API.

В терминале включите API:

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

Если появится запрос на авторизацию, нажмите «Авторизовать» , чтобы продолжить. Нажмите, чтобы авторизовать Cloud Shell.

Выполнение этой команды может занять несколько минут, но в итоге должно отобразиться сообщение об успешном завершении, похожее на это:

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

5. Подготовьте свой JavaScript-проект.

  1. Создайте папку с именем mcp-on-cloudrun для хранения исходного кода, необходимого для развертывания:
    mkdir mcp-on-cloudrun && cd mcp-on-cloudrun
    
  2. Создайте проект Node.js с помощью инструмента npm , чтобы сгенерировать файл package.json :
    npm init es6 -y
    
    Команда npm init создаёт файл package.json для вашего проекта.
  3. Установите зависимости @modelcontextprotocol/sdk , express и zod :
    npm install @modelcontextprotocol/sdk express zod
    

6. Создайте сервер MCP для зоопарка.

Чтобы обеспечить ценный контекст для улучшения использования LLM с MCP, настройте сервер MCP для зоопарка с помощью Genkit — стандартного фреймворка для работы с протоколом контекста модели. Genkit предоставляет быстрый способ создания серверов и клиентов MCP с помощью Node.js. Этот сервер MCP предоставляет данные о животных в вымышленном зоопарке. Для простоты мы храним данные в памяти. Для производственного сервера MCP вам, вероятно, потребуется предоставлять данные из таких источников, как базы данных или API.

  1. Выполните следующую команду, чтобы добавить Genkit в качестве зависимости в файл package.json :
    npm install genkit
    
    Это добавит файл package-lock.json в ваш проект.
  2. Выполните следующую команду, чтобы добавить библиотеку Genkit AI MCP в файл package.json :
    npm install @genkit-ai/mcp
    
  3. Создайте и откройте новый файл index.js для исходного кода сервера MCP:
    cloudshell edit index.js
    
    Команда cloudshell edit откроет файл index.js в редакторе, расположенном над терминалом.
  4. Добавьте следующий исходный код сервера zoo MCP в файл 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}`);
    });
    

Ваш код готов! Теперь пора развернуть сервер MCP в Cloud Run.

7. Развертывание в облаке

Теперь разверните сервер MCP в Cloud Run непосредственно из исходного кода.

  1. Создайте учетную запись службы с именем mcp-server-sa :
    gcloud iam service-accounts create mcp-server-sa --display-name="MCP Server Service Account"
    
  2. Выполните команду gcloud , чтобы развернуть приложение в 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
    
    Используйте флаг --no-allow-unauthenticated чтобы потребовать аутентификацию. Это важно по соображениям безопасности. Если аутентификация не требуется, любой может обратиться к вашему MCP-серверу и потенциально нанести ущерб вашей системе.
  3. Подтвердите создание нового репозитория Artifact Registry. Поскольку вы впервые развертываете приложение в Cloud Run из исходного кода, вы увидите следующее:
    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)?
    
    Введите Y и нажмите Enter . Это создаст репозиторий Artifact Registry для вашего развертывания. Это необходимо для хранения контейнера Docker сервера MCP для службы Cloud Run.
  4. Через несколько минут вы увидите сообщение следующего вида:
    Service [zoo-mcp-server] revision [zoo-mcp-server-12345-abc] has been deployed and is serving 100 percent of traffic.
    

Вы развернули свой MCP-сервер. Теперь вы можете им пользоваться.

8. Добавьте удаленный сервер MCP в Gemini CLI.

Теперь, когда вы успешно развернули удаленный сервер MCP, вы можете подключиться к нему с помощью различных приложений, таких как Google Code Assist или Gemini CLI. В этом разделе мы установим соединение с вашим новым удаленным сервером MCP с помощью Gemini CLI .

  1. Предоставьте вашей учетной записи пользователя разрешение на обращение к удаленному серверу MCP.
    gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
        --member=user:$(gcloud config get-value account) \
        --role='roles/run.invoker'
    
  2. Сохраните свои учетные данные Google Cloud и номер проекта в переменных среды для использования в файле настроек Gemini:
    export PROJECT_NUMBER=$(gcloud projects describe $GOOGLE_CLOUD_PROJECT --format="value(projectNumber)")
    export ID_TOKEN=$(gcloud auth print-identity-token)
    
  3. Откройте файл настроек Gemini CLI.
    cloudshell edit ~/.gemini/settings.json
    
  4. Замените файл настроек Gemini CLI, чтобы добавить сервер Cloud Run MCP.
    {
        "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. Запустите интерфейс командной строки Gemini в Cloud Shell.
    gemini
    
    Возможно, вам потребуется нажать Enter , чтобы принять некоторые настройки по умолчанию. Первоначальный просмотр Gemini CLI
  2. Пусть Gemini перечислит доступные ей инструменты MCP в контексте её деятельности.
    /mcp
    
  3. Попросите Близнецов найти что-нибудь в зоопарке.
    Where can I find penguins?
    
    Интерфейс командной строки Gemini должен знать, что нужно использовать сервер MCP zoo-remote , и спросит, хотите ли вы разрешить выполнение MCP.
  4. Воспользуйтесь стрелкой вниз, затем нажмите Enter , чтобы выбрать
    Yes, always allow all tools from server "zoo-remote"
    
    Gemini CLI позволяет использовать удаленные инструменты Zoo.

В результате должен отобразиться правильный ответ и окно, указывающее на использование сервера MCP.

Gemini CLI show zoo mcp server result

У вас получилось! Вы успешно развернули удаленный сервер MCP в Cloud Run и протестировали его с помощью Gemini CLI.

Когда вы будете готовы завершить сессию, введите /quit и нажмите Enter , чтобы выйти из Gemini CLI.

Отладка

Если вы видите ошибку подобного рода:

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

Вероятно, срок действия ID-токена истек, и требуется повторная установка значения ID_TOKEN .

  1. Введите /quit и нажмите Enter , чтобы выйти из Gemini CLI.
  2. Настройте свой проект в терминале.
    gcloud config set project [PROJECT_ID]
    
  3. Повторно выполните команду получения учетных данных Google Cloud, чтобы получить новый ID_TOKEN поскольку срок действия вашего токена мог истечь.
    export PROJECT_NUMBER=$(gcloud projects describe $GOOGLE_CLOUD_PROJECT --format="value(projectNumber)")
    export ID_TOKEN=$(gcloud auth print-identity-token)
    

9. (Необязательно) Проверьте вызовы инструментов в журналах сервера.

Чтобы убедиться, что ваш сервер Cloud Run MCP был вызван, проверьте журналы службы.

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

Вы должны увидеть сообщение в журнале, подтверждающее, что был выполнен вызов инструмента. 🛠️

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. (Необязательно) Добавить приглашение MCP на сервер.

Использование командной строки MCP может ускорить рабочий процесс для часто используемых вами запросов, создавая сокращенную запись для более длинных запросов.

Gemini CLI автоматически преобразует приглашения командной строки MCP в пользовательские команды со слэшем , так что вы можете вызвать приглашение командной строки MCP, набрав /prompt_name где prompt_name — это имя вашего приглашения командной строки MCP.

Создайте командную строку MCP, чтобы быстро находить животных в зоопарке, вводя команду /find animal в Gemini CLI.

  1. Добавьте этот код в файл index.js выше строки // 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. Переразверните приложение в 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. Обновите значение ID_TOKEN для вашего удаленного сервера MCP.
    export ID_TOKEN=$(gcloud auth print-identity-token)
    
  4. После развертывания новой версии вашего приложения запустите Gemini CLI.
    gemini
    
  5. В командной строке используйте созданную вами новую пользовательскую команду:
    /find --animal="lions"
    

Вы должны увидеть, что Gemini CLI вызывает инструмент get_animals_by_species и форматирует ответ в соответствии с указаниями командной строки 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. (Необязательно) Используйте Gemini Flash Lite для более быстрой реакции.

Gemini CLI позволяет выбрать используемую модель.

  • Gemini 2.5 Pro — это передовая модель мышления от Google, способная рассуждать над сложными задачами в области программирования, математики и STEM-дисциплин, а также анализировать большие наборы данных, кодовые базы и документы, используя подробный контекст.
  • Gemini 2.5 Flash — лучшая модель Google по соотношению цены и производительности, предлагающая широкий спектр возможностей. 2.5 Flash лучше всего подходит для крупномасштабной обработки, задач с низкой задержкой и большим объемом данных, требующих интеллектуального анализа, а также для агентских сценариев использования.
  • Gemini 2.5 Flash Lite — это самая быстрая модель Flash от Google, оптимизированная для экономичности и высокой пропускной способности.

Поскольку запросы, связанные с поиском животных в зоопарке, не требуют размышлений или логического мышления, попробуйте ускорить процесс, используя более быструю модель.

Создайте командную строку MCP, чтобы быстро находить животных в зоопарке, вводя команду /find animal в Gemini CLI.

  1. После развертывания новой версии вашего приложения запустите Gemini CLI.
    gemini --model=gemini-2.5-flash-lite
    
  2. В командной строке используйте созданную вами новую пользовательскую команду:
    /find --animal="lions"
    

Вы по-прежнему должны видеть, что Gemini CLI вызывает инструмент get_animals_by_species и форматирует ответ в соответствии с указаниями командной строки 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.

Цели, которые могут стать для вас экстремальными, чтобы проверить свои силы.

В качестве дополнительного задания попробуйте выполнить те же шаги, чтобы создать подсказку для воспроизведения интересных фактов о конкретных видах животных в зоопарке.

Или, чтобы проверить полученные знания, придумайте инструмент, который вы будете часто использовать, и разверните второй удаленный сервер MCP. Затем добавьте его в настройки Gemini CLI, чтобы проверить, работает ли он.

Отладка

Если вы видите ошибку подобного рода:

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

Попробуйте запустить команду /mcp , и если она выдаст сообщение zoo-remote - Disconnected , возможно, потребуется повторно развернуть систему или снова выполнить следующие команды:

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. Заключение

Поздравляем! Вы успешно развернули и подключились к защищенному удаленному серверу MCP.

Переходите к следующей лабораторной работе.

Эта лабораторная работа — первая в серии из трех частей. Во второй лабораторной работе вы будете использовать сервер MCP, который вы создали с помощью агента ADK.

Используйте сервер MCP в Cloud Run с агентом ADK.

(Необязательно) Уборка

Если вы не собираетесь переходить к следующей лабораторной работе и хотите удалить созданный вами проект, вы можете удалить его из облачного хранилища, чтобы избежать дополнительных расходов.

Хотя Cloud Run не взимает плату, когда услуга не используется, с вас все равно может взиматься плата за хранение образа контейнера в реестре артефактов. Удаление вашего проекта Cloud прекращает выставление счетов за все ресурсы, используемые в этом проекте.

При желании вы можете удалить проект:

gcloud projects delete $GOOGLE_CLOUD_PROJECT

Также вы можете удалить ненужные ресурсы с диска Cloudshell. Для этого выполните следующие действия:

  1. Удалите каталог проекта codelab:
    rm -rf ~/mcp-on-cloudrun
    
  2. Внимание! Следующее действие необратимо! Если вы хотите удалить все данные в Cloud Shell, чтобы освободить место, вы можете удалить всю свою домашнюю директорию . Будьте внимательны и убедитесь, что все, что вы хотите сохранить, сохранено в другом месте.
    sudo rm -rf $HOME