نحوه استقرار یک سرور MCP ایمن در Cloud Run، نحوه استقرار یک سرور MCP امن در Cloud Run

۱. مقدمه

نمای کلی

در این آزمایش، شما یک سرور پروتکل زمینه مدل (MCP) را ساخته و مستقر خواهید کرد. سرورهای MCP برای دسترسی LLMها به ابزارها و سرویس‌های خارجی مفید هستند. شما آن را به عنوان یک سرویس امن و آماده برای تولید در Cloud Run پیکربندی خواهید کرد که از طریق چندین کلاینت قابل دسترسی باشد. سپس از طریق Gemini CLI به سرور MCP از راه دور متصل خواهید شد.

کاری که انجام خواهید داد

ما از FastMCP برای ایجاد یک سرور MCP مربوط به باغ وحش استفاده خواهیم کرد که دو ابزار دارد: get_animals_by_species و get_animal_details . FastMCP روشی سریع و پایتونیک برای ساخت سرورها و کلاینت‌های MCP ارائه می‌دهد.

گرافیک سرور Zoo MCP

آنچه یاد خواهید گرفت

  • سرور MCP را روی Cloud Run مستقر کنید.
  • با الزام احراز هویت برای همه درخواست‌ها، نقطه پایانی سرور خود را ایمن کنید و مطمئن شوید که فقط کلاینت‌ها و نمایندگان مجاز می‌توانند با آن ارتباط برقرار کنند.
  • از طریق رابط خط فرمان Gemini به سرور امن MCP خود متصل شوید.

۲. راه‌اندازی پروژه

  1. اگر از قبل حساب گوگل ندارید، باید یک حساب گوگل ایجاد کنید .
    • به جای حساب کاری یا تحصیلی از یک حساب شخصی استفاده کنید. حساب‌های کاری و تحصیلی ممکن است محدودیت‌هایی داشته باشند که مانع از فعال کردن APIهای مورد نیاز برای این آزمایشگاه توسط شما شود.
  2. وارد کنسول ابری گوگل شوید.
  3. فعال کردن پرداخت در کنسول ابری
    • تکمیل این آزمایشگاه باید کمتر از ۱ دلار آمریکا از طریق منابع ابری هزینه داشته باشد.
    • شما می‌توانید مراحل انتهای این آزمایش را برای حذف منابع دنبال کنید تا از هزینه‌های بیشتر جلوگیری شود.
    • کاربران جدید واجد شرایط استفاده از دوره آزمایشی رایگان ۳۰۰ دلاری هستند.
  4. یک پروژه جدید ایجاد کنید یا از یک پروژه موجود دوباره استفاده کنید.

۳. ویرایشگر 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 را اجرا کنید.

۴. فعال کردن 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.

۵. پروژه پایتون خود را آماده کنید

  1. یک پوشه با نام mcp-on-cloudrun ایجاد کنید تا کد منبع برای استقرار در آن ذخیره شود:
    mkdir mcp-on-cloudrun && cd mcp-on-cloudrun
    
  2. یک پروژه پایتون با ابزار uv ایجاد کنید تا یک فایل pyproject.toml تولید شود:
    uv init --description "Example of deploying an MCP server on Cloud Run" --bare --python 3.13
    
    دستور uv init یک فایل pyproject.toml برای پروژه شما ایجاد می‌کند. برای مشاهده محتوای فایل، دستور زیر را اجرا کنید:
    cat pyproject.toml
    
    خروجی باید شبیه زیر باشد:
    [project]
    name = "mcp-on-cloudrun"
    version = "0.1.0"
    description = "Example of deploying an MCP server on Cloud Run"
    requires-python = ">=3.13"
    dependencies = []
    

۶. سرور zoo MCP را ایجاد کنید

برای فراهم کردن زمینه‌ای ارزشمند برای بهبود استفاده از LLMها با MCP، یک سرور MCP باغ‌وحش با FastMCP راه‌اندازی کنید - یک چارچوب استاندارد برای کار با پروتکل Model Context. FastMCP روشی سریع برای ساخت سرورها و کلاینت‌های MCP با پایتون ارائه می‌دهد. این سرور MCP داده‌هایی درباره حیوانات در یک باغ‌وحش خیالی ارائه می‌دهد. برای سادگی، داده‌ها را در حافظه ذخیره می‌کنیم. برای یک سرور MCP تولیدی، احتمالاً می‌خواهید داده‌ها را از منابعی مانند پایگاه‌های داده یا APIها ارائه دهید.

  1. دستور زیر را برای اضافه کردن FastMCP به عنوان یک وابستگی در فایل pyproject.toml اجرا کنید:
    uv add fastmcp==2.12.4 --no-sync
    
    این یک فایل uv.lock به پروژه شما اضافه می‌کند.
  2. یک فایل server.py جدید برای کد منبع سرور MCP ایجاد و باز کنید:
    cloudshell edit ~/mcp-on-cloudrun/server.py
    
    دستور cloudshell edit فایل server.py را در ویرایشگر بالای ترمینال باز می‌کند.
  3. کد منبع سرور zoo MCP زیر را به فایل 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,
            )
        )
    

کد شما کامل شد! وقت آن است که سرور MCP را روی Cloud Run مستقر کنید.

۷. استقرار در Cloud Run

اکنون یک سرور MCP را مستقیماً از کد منبع در Cloud Run مستقر کنید.

  1. یک Dockerfile جدید برای استقرار در Cloud Run ایجاد و باز کنید:
    cloudshell edit ~/mcp-on-cloudrun/Dockerfile
    
  2. کد زیر را در Dockerfile قرار دهید تا از ابزار uv برای اجرای فایل 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. دستور gcloud را اجرا کنید تا برنامه در Cloud Run مستقر شود.
    cd ~/mcp-on-cloudrun
    gcloud run deploy zoo-mcp-server \
        --no-allow-unauthenticated \
        --region=europe-west1 \
        --source=. \
        --labels=dev-tutorial=codelab-mcp
    
    برای درخواست احراز هویت از پرچم --no-allow-unauthenticated استفاده کنید. این به دلایل امنیتی مهم است. اگر نیازی به احراز هویت نداشته باشید، هر کسی می‌تواند با سرور MCP شما تماس بگیرد و به طور بالقوه به سیستم شما آسیب برساند.
  4. ایجاد یک مخزن جدید 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 لازم است.
  5. بعد از چند دقیقه، پیامی مانند زیر خواهید دید:
    Service [zoo-mcp-server] revision [zoo-mcp-server-12345-abc] has been deployed and is serving 100 percent of traffic.
    

شما سرور MCP خود را مستقر کرده‌اید. اکنون می‌توانید از آن استفاده کنید.

۸. سرور Remote MCP را به Gemini CLI اضافه کنید.

اکنون که با موفقیت یک سرور MCP از راه دور را مستقر کرده‌اید، می‌توانید با استفاده از برنامه‌های مختلفی مانند Google Code Assist یا Gemini CLI به آن متصل شوید. در این بخش، ما با استفاده از Gemini CLI به سرور MCP از راه دور جدید شما متصل خواهیم شد.

  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 ایجاد نشده است، آن را بسازید.
    mkdir -p ~/.gemini
    
  4. فایل تنظیمات Gemini CLI خود را باز کنید
    cloudshell edit ~/.gemini/settings.json
    
  5. فایل تنظیمات 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"
            }
        }
    }
    
  6. اجرای Gemini CLI در Cloud Shell
    gemini
    
    ممکن است لازم باشد برای پذیرش برخی از تنظیمات پیش‌فرض، Enter فشار دهید. نمای اولیه رابط خط فرمان Gemini
  7. از Gemini بخواهید ابزارهای MCP موجود در متن خود را فهرست کند.
    /mcp
    
  8. از جوزا بخواهید چیزی را در باغ وحش پیدا کند
    Where can I find penguins?
    
    رابط خط فرمان Gemini باید بداند که از سرور MCP zoo-remote استفاده کند و از شما می‌پرسد که آیا مایلید اجازه اجرای MCP را بدهید یا خیر.
  9. برای انتخاب از فلش رو به پایین استفاده کنید، سپس Enter فشار دهید
    Yes, always allow all tools from server "zoo-remote"
    
    رابط خط فرمان Gemini امکان استفاده از ابزارهای کنترل از راه دور Zoo را فراهم می‌کند.

خروجی باید پاسخ صحیح و یک کادر نمایش را نشان دهد که نشان می‌دهد از سرور MCP استفاده شده است.

نمایش نتیجه سرور zoo mcp در Gemini CLI

شما موفق شدید! شما با موفقیت یک سرور 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_TOKEN است.

  1. برای خروج از محیط خط فرمان Gemini، عبارت /quit را تایپ کرده و سپس Enter فشار دهید.
  2. پروژه خود را در ترمینال خود تنظیم کنید
    gcloud config set project [PROJECT_ID]
    
  3. مرحله ۲ بالا را دوباره راه اندازی کنید

۹. (اختیاری) تأیید فراخوانی‌های ابزار در گزارش‌های سرور

برای تأیید اینکه سرور 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'

۱۰. (اختیاری) اضافه کردن MCP prompt به سرور

یک دستورالعمل MCP می‌تواند با ایجاد یک خلاصه‌نویسی برای یک دستورالعمل طولانی‌تر، گردش کار شما را برای دستورالعمل‌هایی که اغلب اجرا می‌کنید، سرعت بخشد.

رابط خط فرمان Gemini به طور خودکار اعلان‌های MCP را به دستورات اسلش سفارشی تبدیل می‌کند تا بتوانید با تایپ کردن /prompt_name که در آن prompt_name نام اعلان MCP شماست، یک اعلان MCP را فراخوانی کنید.

یک اعلان MCP ایجاد کنید تا بتوانید با تایپ کردن /find animal در Gemini CLI، به سرعت یک حیوان را در باغ وحش پیدا کنید.

  1. این کد را به فایل server.py خود، بالای گارد اصلی اضافه کنید ( 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. برنامه خود را دوباره در Cloud Run مستقر کنید
    gcloud run deploy zoo-mcp-server \
        --no-allow-unauthenticated \
        --region=europe-west1 \
        --source=. \
        --labels=dev-tutorial=codelab-mcp
    
  3. شناسه_TOKEN خود را برای سرور MCP از راه دور خود به‌روزرسانی کنید.
    export ID_TOKEN=$(gcloud auth print-identity-token)
    
  4. پس از استقرار نسخه جدید برنامه، Gemini CLI را اجرا کنید.
    gemini
    
  5. در اعلان، از دستور سفارشی جدیدی که ایجاد کرده‌اید استفاده کنید:
    /find --animal="lions"
    
    یا
    /find lions
    

باید ببینید که رابط خط فرمان Gemini ابزار 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.

۱۱. (اختیاری) برای پاسخ‌های سریع‌تر از Gemini Flash Lite استفاده کنید

رابط خط فرمان Gemini به شما امکان می‌دهد مدلی را که استفاده می‌کنید انتخاب کنید.

  • جمینی ۲.۵ پرو ، مدل تفکر پیشرفته گوگل است که قادر به استدلال در مورد مسائل پیچیده در کد، ریاضی و STEM و همچنین تجزیه و تحلیل مجموعه داده‌های بزرگ، پایگاه‌های کد و اسناد با استفاده از متن طولانی است.
  • Gemini 2.5 Flash از نظر نسبت قیمت به عملکرد، بهترین مدل گوگل است و قابلیت‌های کاملی را ارائه می‌دهد. 2.5 Flash برای پردازش در مقیاس بزرگ، وظایف با تأخیر کم و حجم بالا که نیاز به تفکر دارند و موارد استفاده‌ی عاملی (agentic) بهترین گزینه است.
  • Gemini 2.5 Flash Lite سریع‌ترین مدل فلش گوگل است که برای صرفه‌جویی در هزینه و توان عملیاتی بالا بهینه شده است.

از آنجایی که درخواست‌های مربوط به پیدا کردن حیوانات باغ وحش نیازی به تفکر یا استدلال ندارند، سعی کنید با استفاده از یک مدل سریع‌تر، سرعت انجام کارها را افزایش دهید.

یک اعلان MCP ایجاد کنید تا بتوانید با تایپ کردن /find animal در Gemini CLI، به سرعت یک حیوان را در باغ وحش پیدا کنید.

  1. پس از استقرار نسخه جدید برنامه، Gemini CLI را اجرا کنید.
    gemini --model=gemini-2.5-flash-lite
    
  2. در اعلان، از دستور سفارشی جدیدی که ایجاد کرده‌اید استفاده کنید:
    /find 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.

اشکال‌زدایی

اگر خطایی مانند این مشاهده کردید:

✕ 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)

۱۲. نتیجه‌گیری

تبریک! شما با موفقیت مستقر شدید و به یک سرور امن و از راه دور MCP متصل شدید.

ادامه به آزمایشگاه بعدی

این آزمایش، اولین آزمایش از یک مجموعه سه قسمتی است. در آزمایش دوم، از سرور MCP که با ADK Agent ایجاد کرده‌اید، استفاده خواهید کرد.

از یک سرور MCP در Cloud Run با یک ADK Agent استفاده کنید

(اختیاری) تمیز کردن

اگر قصد ادامه دادن به آزمایشگاه بعدی را ندارید و می‌خواهید آنچه را که ایجاد کرده‌اید پاک کنید، می‌توانید پروژه ابری خود را حذف کنید تا از هزینه‌های اضافی جلوگیری کنید.

اگرچه Cloud Run در صورت عدم استفاده از سرویس، هزینه‌ای دریافت نمی‌کند، اما ممکن است همچنان برای ذخیره تصویر کانتینر در Artifact Registry هزینه دریافت شود. حذف پروژه Cloud شما، پرداخت هزینه برای تمام منابع استفاده شده در آن پروژه را متوقف می‌کند.

اگر مایلید، پروژه را حذف کنید:

gcloud projects delete $GOOGLE_CLOUD_PROJECT

همچنین ممکن است بخواهید منابع غیرضروری را از دیسک cloudshell خود حذف کنید. می‌توانید:

  1. پوشه پروژه codelab را حذف کنید:
    rm -rf ~/mcp-on-cloudrun
    
  2. هشدار! اقدام بعدی قابل بازگشت نیست! اگر می‌خواهید همه چیز را در Cloud Shell خود حذف کنید تا فضا آزاد شود، می‌توانید کل دایرکتوری خانگی خود را حذف کنید . مراقب باشید که هر چیزی که می‌خواهید نگه دارید در جای دیگری ذخیره شده باشد.
    sudo rm -rf $HOME