Cloud Run पर सुरक्षित MCP सर्वर को डिप्लॉय करने का तरीका

1. परिचय

खास जानकारी

इस लैब में, मॉडल कॉन्टेक्स्ट प्रोटोकॉल (एमसीपी) सर्वर बनाया और डिप्लॉय किया जाएगा. एमसीपी सर्वर, एलएलएम को बाहरी टूल और सेवाओं का ऐक्सेस देने में मददगार होते हैं. इन्हें Cloud Run पर सुरक्षित और प्रोडक्शन के लिए तैयार सेवा के तौर पर कॉन्फ़िगर किया जाएगा. इन्हें कई क्लाइंट से ऐक्सेस किया जा सकता है. इसके बाद, Antigravity CLI से रिमोट एमसीपी सर्वर से कनेक्ट किया जाएगा.

आप क्या करेंगे

हम FastMCP का इस्तेमाल करके, चिड़ियाघर का एमसीपी सर्वर बनाएंगे. इसमें दो टूल होंगे: get_animals_by_species और get_animal_details. FastMCP, एमसीपी सर्वर और क्लाइंट को Python की मदद से तेज़ी से बनाने का तरीका उपलब्ध कराता है.

ज़ू एमसीपी सर्वर का ग्राफ़िक

आपको क्या सीखने को मिलेगा

  • एमसीपी सर्वर को Cloud Run पर डिप्लॉय करना.
  • सभी अनुरोधों के लिए पुष्टि की ज़रूरत वाली सेटिंग लागू करके, अपने सर्वर के एंडपॉइंट को सुरक्षित करना. इससे यह पक्का किया जा सकेगा कि सिर्फ़ अनुमति वाले क्लाइंट और एजेंट ही उससे कम्यूनिकेट कर सकें.
  • Antigravity CLI से, सुरक्षित एमसीपी सर्वर के एंडपॉइंट से कनेक्ट करना

2. प्रोजेक्ट सेटअप करना

  1. अगर आपके पास पहले से कोई Google खाता नहीं है, तो आपको Google खाता बनाना होगा.
    • ऑफ़िस या स्कूल वाले खाते के बजाय, निजी खाते का इस्तेमाल करें. ऑफ़िस और स्कूल वाले खातों पर पाबंदियां हो सकती हैं. इनकी वजह से, इस लैब के लिए ज़रूरी एपीआई चालू नहीं किए जा सकते.
  2. Google Cloud Console में साइन इन करें.
  3. नया प्रोजेक्ट बनाएं या किसी मौजूदा प्रोजेक्ट का फिर से इस्तेमाल करें.
    • अगर आपको प्रोजेक्ट के कोटा से जुड़ी कोई गड़बड़ी दिखती है, तो नया प्रोजेक्ट बनाने के लिए किसी मौजूदा प्रोजेक्ट का फिर से इस्तेमाल करें या किसी मौजूदा प्रोजेक्ट को मिटाएं.

3. Cloud Shell एडिटर खोलना

  1. Cloud Shell एडिटर पर सीधे जाने के लिए, इस लिंक पर क्लिक करें
  2. अगर आज किसी भी समय अनुमति देने के लिए कहा जाता है, तो जारी रखने के लिए अनुमति दें पर क्लिक करें. Cloud Shell को अनुमति देने के लिए क्लिक करें
  3. अगर टर्मिनल, स्क्रीन के सबसे नीचे नहीं दिखता है, तो इसे खोलें:
    • देखें पर क्लिक करें
    • टर्मिनल पर क्लिक करेंCloud Shell Editor में नया टर्मिनल खोलें
  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 Editor के टर्मिनल में प्रोजेक्ट आईडी सेट करना
  5. आपको यह मैसेज दिखेगा:
    Updated property [core/project].
    
    अगर आपको WARNING दिखता है और आपसे Do you want to continue (Y/n)? पूछा जाता है, तो हो सकता है कि आपने प्रोजेक्ट आईडी गलत डाला हो. n दबाएं, Enter दबाएं, और gcloud config set project कमांड को फिर से चलाएं.

4. एपीआई चालू करें

टर्मिनल में, एपीआई चालू करें:

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. अपना Python प्रोजेक्ट तैयार करना

  1. डिप्लॉयमेंट के लिए सोर्स कोड सेव करने के लिए, mcp-on-cloudrun नाम का फ़ोल्डर बनाएं:
    mkdir mcp-on-cloudrun && cd mcp-on-cloudrun
    
  2. pyproject.toml फ़ाइल जनरेट करने के लिए, uv टूल की मदद से Python प्रोजेक्ट बनाएं:
    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 = []
    

6. चिड़ियाघर का एमसीपी सर्वर बनाना

एलएलएम के इस्तेमाल को बेहतर बनाने के लिए, एमसीपी के साथ काम करने के लिए, चिड़ियाघर का एमसीपी सर्वर सेट अप करें. इसके लिए, FastMCP का इस्तेमाल करें. यह मॉडल कॉन्टेक्स्ट प्रोटोकॉल के साथ काम करने के लिए, स्टैंडर्ड फ़्रेमवर्क है. FastMCP, Python की मदद से एमसीपी सर्वर और क्लाइंट को तेज़ी से बनाने का तरीका उपलब्ध कराता है. यह एमसीपी सर्वर, काल्पनिक चिड़ियाघर में मौजूद जानवरों के बारे में डेटा उपलब्ध कराता है. आसान बनाने के लिए, हम डेटा को मेमोरी में सेव करते हैं. प्रोडक्शन के लिए एमसीपी सर्वर के लिए, आपको डेटाबेस या एपीआई जैसे सोर्स से डेटा उपलब्ध कराना पड़ सकता है.

  1. pyproject.toml फ़ाइल में, FastMCP को डिपेंडेंसी के तौर पर जोड़ने के लिए, यह कमांड चलाएं:
    uv add fastmcp==2.12.4 --no-sync
    
    इससे आपके प्रोजेक्ट में uv.lock फ़ाइल जुड़ जाएगी.
  2. एमसीपी सर्वर के सोर्स कोड के लिए, नई server.py फ़ाइल बनाएं और उसे खोलें:
    cloudshell edit ~/mcp-on-cloudrun/server.py
    
    cloudshell edit कमांड से, server.py फ़ाइल, टर्मिनल के ऊपर मौजूद एडिटर में खुल जाएगी.
  3. 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,
            )
        )
    

आपका कोड पूरा हो गया है! अब एमसीपी सर्वर को Cloud Run पर डिप्लॉय करने का समय आ गया है.

7. Cloud Run पर डिप्लॉय किया जा रहा है

अब सोर्स कोड से सीधे Cloud Run पर एमसीपी सर्वर डिप्लॉय करें.

  1. Cloud Run पर डिप्लॉय करने के लिए, नया Dockerfile बनाएं और उसे खोलें:
    cloudshell edit ~/mcp-on-cloudrun/Dockerfile
    
  2. server.py फ़ाइल चलाने के लिए, uv टूल का इस्तेमाल करने के लिए, Dockerfile में यह कोड शामिल करें:
    # 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. mcp-server-sa नाम का सेवा खाता बनाएं:
    gcloud iam service-accounts create mcp-server-sa --display-name="MCP Server Service Account"
    
  4. ऐप्लिकेशन को Cloud Run पर डिप्लॉय करने के लिए, gcloud कमांड चलाएं
    cd ~/mcp-on-cloudrun
    gcloud run deploy zoo-mcp-server \
        --service-account=mcp-server-sa@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com \
        --no-allow-unauthenticated \
        --region=us-west1 \
        --source=. \
        --labels=dev-tutorial=codelab-mcp
    
    पुष्टि की ज़रूरत वाली सेटिंग लागू करने के लिए, --no-allow-unauthenticated फ़्लैग का इस्तेमाल करें. सुरक्षा की वजह से, यह ज़रूरी है. अगर पुष्टि की ज़रूरत वाली सेटिंग लागू नहीं की जाती है, तो कोई भी आपके एमसीपी सर्वर को कॉल कर सकता है और इससे आपके सिस्टम को नुकसान पहुंच सकता है.
  5. 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 [us-west1] will be created.
    
    Do you want to continue (Y/n)?
    
    Y टाइप करें और Enter दबाएं. इससे आपके डिप्लॉयमेंट के लिए, Artifact Registry की रिपॉज़िटरी बन जाएगी. Cloud Run सेवा के लिए, एमसीपी सर्वर के Docker कंटेनर को सेव करने के लिए, यह ज़रूरी है.
  6. कुछ मिनट बाद, आपको इस तरह का मैसेज दिखेगा:
    Service [zoo-mcp-server] revision [zoo-mcp-server-12345-abc] has been deployed and is serving 100 percent of traffic.
    

आपने अपना एमसीपी सर्वर डिप्लॉय कर लिया है. अब इसका इस्तेमाल किया जा सकता है.

8. रिमोट एमसीपी सर्वर को Antigravity CLI में जोड़ना

अब आपने रिमोट एमसीपी सर्वर को सही तरीके से डिप्लॉय कर लिया है. अब इसे Google Code Assist या Antigravity CLI जैसे अलग-अलग ऐप्लिकेशन का इस्तेमाल करके कनेक्ट किया जा सकता है. इस सेक्शन में, हम Antigravity CLI का इस्तेमाल करके, आपके नए रिमोट एमसीपी सर्वर से कनेक्शन बनाएंगे.

  1. अपने उपयोगकर्ता खाते को रिमोट एमसीपी सर्वर को कॉल करने की अनुमति दें
    gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
        --member=user:$(gcloud config get-value account) \
        --role='roles/run.invoker'
    
  2. Antigravity की सेटिंग वाली फ़ाइल में इस्तेमाल करने के लिए, अपने Google Cloud क्रेडेंशियल और प्रोजेक्ट नंबर को एनवायरमेंट वैरिएबल में सेव करें:
    export PROJECT_NUMBER=$(gcloud projects describe $GOOGLE_CLOUD_PROJECT --format="value(projectNumber)")
    export ID_TOKEN=$(gcloud auth print-identity-token)
    
  3. अगर .gemini/antigravity-cli फ़ोल्डर पहले से नहीं बना है, तो इसे बनाएं
    mkdir -p ~/.gemini/antigravity-cli
    
  4. रिमोट एमसीपी सर्वर को Antigravity CLI की एमसीपी कॉन्फ़िगरेशन फ़ाइल में लिखें:
    cat > ~/.gemini/antigravity-cli/mcp_config.json << EOF
    {
        "mcpServers": {
            "zoo-remote": {
                "serverUrl": "https://zoo-mcp-server-${PROJECT_NUMBER}.us-west1.run.app/mcp",
                "headers": {
                    "Authorization": "Bearer ${ID_TOKEN}"
                }
            }
        }
    }
    EOF
    
  5. Antigravity CLI शुरू करें:
    agy
    
  1. Antigravity CLI से पुष्टि करें: पहली बार शुरू करने पर, पुष्टि करना ज़रूरी है. OAuth को चुनें (इसके लिए Enter दबाएं).Antigravity की पुष्टि करने वाली स्क्रीन
  2. लिंक पर क्लिक करें. अगर लिंक पर क्लिक नहीं किया जा सकता, तो इसे कॉपी करने के लिए Cloud Shell में यूआरएल को हाइलाइट करें. इसके बाद, इसे अपने ब्राउज़र में चिपकाएं
  3. अपने Google खाते में साइन इन करें
  4. कोड को कॉपी करें
  5. कोड को Cloud Shell एडिटर के टर्मिनल में चिपकाएं
  6. Enter दबाएं.Antigravity सुरक्षा कोड प्रॉम्प्ट
  7. कुछ डिफ़ॉल्ट सेटिंग स्वीकार करने के लिए, Enter दबाएं.
  8. Antigravity CLI से, उसके कॉन्टेक्स्ट में उपलब्ध एमसीपी टूल की सूची देखें
    /mcp
    
    प्रॉम्प्ट बॉक्स पर वापस जाने के लिए, ESC दबाएं.
  9. Antigravity CLI से, चिड़ियाघर में कुछ ढूंढने के लिए कहें
    Where can I find penguins?
    
    Antigravity CLI को zoo-remote एमसीपी सर्वर का इस्तेमाल करना चाहिए. साथ ही, यह आपसे पूछेगा कि क्या आपको एमसीपी को चलाने की अनुमति देनी है.
  10. चुनने के लिए, डाउन ऐरो का इस्तेमाल करें. इसके बाद, Enter दबाएं
    Yes, always allow all tools from server "zoo-remote"
    
    Antigravity CLI allow zoo remote tools

आउटपुट में सही जवाब दिखना चाहिए. साथ ही, एक डिसप्ले बॉक्स दिखना चाहिए, जिससे पता चले कि एमसीपी सर्वर का इस्तेमाल किया गया है.

Antigravity CLI show zoo mcp server result

आपने यह कर लिया! आपने Cloud Run पर रिमोट एमसीपी सर्वर को सही तरीके से डिप्लॉय कर लिया है. साथ ही, Antigravity CLI का इस्तेमाल करके, इसकी जांच कर ली है.

सेशन खत्म करने के लिए, /exit टाइप करें. इसके बाद, Antigravity CLI से बाहर निकलने के लिए, Enter दबाएं.

डीबग करना

अगर आपको इस तरह की कोई गड़बड़ी दिखती है, तो:

🔍 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. Antigravity CLI से बाहर निकलने के लिए, /exit टाइप करें. इसके बाद, Enter दबाएं.
  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)
    
    cat > ~/.gemini/antigravity-cli/mcp_config.json << EOF
    

{ "mcpServers": { "zoo-remote": { "serverUrl": "https://zoo-mcp-server-${PROJECT_NUMBER}.us-west1.run.app/mcp", "headers": { "Authorization": "Bearer ${ID_TOKEN}" } } } } EOF ```

9. (ज़रूरी नहीं) सर्वर लॉग में टूल कॉल की पुष्टि करना

यह पुष्टि करने के लिए कि आपके Cloud Run एमसीपी सर्वर को कॉल किया गया था, सेवा के लॉग देखें.

gcloud run services logs read zoo-mcp-server --region us-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. (ज़रूरी नहीं) सर्वर में एमसीपी प्रॉम्प्ट जोड़ना

एमसीपी प्रॉम्प्ट, अक्सर इस्तेमाल किए जाने वाले प्रॉम्प्ट के लिए शॉर्टहैंड बनाकर, आपके वर्कफ़्लो को तेज़ कर सकता है.

Antigravity CLI, एमसीपी प्रॉम्प्ट को कस्टम स्लैश कमांड में अपने-आप बदल देता है. इससे, एमसीपी प्रॉम्प्ट को /prompt_name टाइप करके शुरू किया जा सकता है. यहां prompt_name आपके एमसीपी प्रॉम्प्ट का नाम है.

एमसीपी प्रॉम्प्ट बनाएं, ताकि Antigravity CLI में /find animal टाइप करके, चिड़ियाघर में किसी जानवर को तेज़ी से ढूंढा जा सके.

  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 \
        --region=us-west1 \
        --source=. \
        --labels=dev-tutorial=codelab-mcp
    
  3. अपना ID_TOKEN रीफ़्रेश करें और कॉन्फ़िगरेशन फ़ाइल को फिर से बनाएं:
    export ID_TOKEN=$(gcloud auth print-identity-token)
    export PROJECT_NUMBER=$(gcloud projects describe $GOOGLE_CLOUD_PROJECT --format="value(projectNumber)")
    
    cat > ~/.gemini/antigravity-cli/mcp_config.json << EOF
    

{ "mcpServers": { "zoo-remote": { "serverUrl": "https://zoo-mcp-server-${PROJECT_NUMBER}.us-west1.run.app/mcp", "headers": { "Authorization": "Bearer ${ID_TOKEN}" } } } } EOF ```

  1. अपने ऐप्लिकेशन का नया वर्शन डिप्लॉय होने के बाद, Antigravity CLI शुरू करें.
    agy
    
  2. प्रॉम्प्ट में, बनाया गया नया कस्टम कमांड इस्तेमाल करें:
    /find lions
    

आपको दिखेगा कि Antigravity CLI, get_animals_by_species टूल को कॉल करता है और एमसीपी प्रॉम्प्ट के निर्देश के मुताबिक, रिस्पॉन्स को फ़ॉर्मैट करता है!

╭───────────────────────────╮
│  > /find lions            │
╰───────────────────────────╯

 ╭───────────────────────────────────────────────────────────────────────────────────────────────────╮
 │ ✔  get_animals_by_species (zoo-remote MCP Server) get_animals_by_species (zoo-remote MCP Server)  │
 │                                                                                                   │
 │    [{"species":"lion","name":"Leo","age":7,"enclosure":"The Big Cat                               │
 │    Plains","trail":"Savannah                                                                      │
 │    Heights"},{"species":"lion","name":"Nala","age":6,"enclosure":"The Big Cat                     │
 │    Plains","trail":"Savannah                                                                      │
 │    Heights"},{"species":"lion","name":"Simba","age":3,"enclosure":"The Big Cat                    │
 │    Plains","trail":"Savannah                                                                      │
 │    Heights"},{"species":"lion","name":"King","age":8,"enclosure":"The Big Cat                     │
 │    Plains","trail":"Savannah Heights"}]                                                           │
 ╰───────────────────────────────────────────────────────────────────────────────────────────────────╯
✦ Lions can be found in The Big Cat Plains on the Savannah Heights.

11. (ज़रूरी नहीं) तेज़ी से जवाब पाने के लिए, Gemini Flash Lite का इस्तेमाल करना

Antigravity CLI की मदद से, इस्तेमाल किया जा रहा मॉडल और उसके लिए की जा रही कोशिश चुनी जा सकती है.

चिड़ियाघर के जानवरों को ढूंढने से जुड़े अनुरोधों के लिए, सोचने या तर्क करने की ज़रूरत नहीं होती. इसलिए, तेज़ मॉडल का इस्तेमाल करके, प्रोसेस को तेज़ करने की कोशिश करें.

पिछले सेक्शन में, आपने एमसीपी प्रॉम्प्ट बनाया था, ताकि Antigravity CLI में /find animal टाइप करके, चिड़ियाघर में किसी जानवर को तेज़ी से ढूंढा जा सके.

  1. अपने ऐप्लिकेशन का नया वर्शन डिप्लॉय होने के बाद, Antigravity CLI शुरू करें.
    agy --model=gemini-3.6-flash --effort=low
    
  2. प्रॉम्प्ट में, बनाया गया नया कस्टम कमांड इस्तेमाल करें:
    /find lions
    

आपको अब भी दिखेगा कि Antigravity CLI, get_animals_by_species टूल को कॉल करता है और एमसीपी प्रॉम्प्ट के निर्देश के मुताबिक, रिस्पॉन्स को फ़ॉर्मैट करता है. हालांकि, जवाब बहुत तेज़ी से दिखेगा!

╭───────────────────────────╮
│  > /find lions            │
╰───────────────────────────╯

 ╭───────────────────────────────────────────────────────────────────────────────────────────────────╮
 │ ✔  get_animals_by_species (zoo-remote MCP Server) get_animals_by_species (zoo-remote MCP Server)  │
 │                                                                                                   │
 │    [{"species":"lion","name":"Leo","age":7,"enclosure":"The Big Cat                               │
 │    Plains","trail":"Savannah                                                                      │
 │    Heights"},{"species":"lion","name":"Nala","age":6,"enclosure":"The Big Cat                     │
 │    Plains","trail":"Savannah                                                                      │
 │    Heights"},{"species":"lion","name":"Simba","age":3,"enclosure":"The Big Cat                    │
 │    Plains","trail":"Savannah                                                                      │
 │    Heights"},{"species":"lion","name":"King","age":8,"enclosure":"The Big Cat                     │
 │    Plains","trail":"Savannah Heights"}]                                                           │
 ╰───────────────────────────────────────────────────────────────────────────────────────────────────╯
✦ Lions can be found in The Big Cat Plains on the Savannah Heights.

डीबग करना

अगर आपको इस तरह की कोई गड़बड़ी दिखती है, तो:

✕ Unknown command: /find 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)

cat > ~/.gemini/antigravity-cli/mcp_config.json << EOF
{
   "mcpServers": {
       "zoo-remote": {
           "serverUrl": "https://zoo-mcp-server-${PROJECT_NUMBER}.us-west1.run.app/mcp",
           "headers": {
               "Authorization": "Bearer ${ID_TOKEN}"
           }
       }
   }
}
EOF

12. नतीजा

बधाई हो! आपने सुरक्षित रिमोट एमसीपी सर्वर को सही तरीके से डिप्लॉय कर लिया है और उससे कनेक्ट कर लिया है.

अगली लैब पर जाएं

यह लैब, तीन हिस्सों वाली सीरीज़ की पहली लैब है. दूसरी लैब में, एडीके एजेंट के साथ, बनाए गए एमसीपी सर्वर का इस्तेमाल किया जाएगा.

एडीके एजेंट के साथ, Cloud Run पर एमसीपी सर्वर का इस्तेमाल करना

(ज़रूरी नहीं) स्टोरेज में जगह बनाएं

अगर आपको अगली लैब पर नहीं जाना है और आपने जो कुछ भी बनाया है उसे मिटाना है, तो अतिरिक्त शुल्क से बचने के लिए, अपना Cloud प्रोजेक्ट मिटाया जा सकता है.

Cloud Run, सेवा का इस्तेमाल न होने पर शुल्क नहीं लेता. हालांकि, Artifact Registry में कंटेनर इमेज सेव करने के लिए, आपसे शुल्क लिया जा सकता है. Cloud प्रोजेक्ट मिटाने पर, उस प्रोजेक्ट में इस्तेमाल किए गए सभी संसाधनों के लिए बिलिंग बंद हो जाती है.

अगर आपको प्रोजेक्ट मिटाना है, तो:

gcloud projects delete $GOOGLE_CLOUD_PROJECT

आपके पास Cloud Shell डिस्क से, गैर-ज़रूरी संसाधन मिटाने का विकल्प भी होता है. ये काम किए जा सकते हैं:

  1. कोडलैब प्रोजेक्ट की डायरेक्ट्री मिटाना:
    rm -rf ~/mcp-on-cloudrun
    
  2. चेतावनी! अगली कार्रवाई को वापस नहीं किया जा सकता! अगर आपको जगह खाली करने के लिए, Cloud Shell पर मौजूद सब कुछ मिटाना है, तो पूरी होम डायरेक्ट्रीमिटाई जा सकती है. ध्यान रखें कि आपको जो भी सेव रखना है उसे कहीं और सेव कर लिया गया हो.
    sudo rm -rf $HOME