ক্লাউড রানে কীভাবে একটি নিরাপদ এমসিপি সার্ভার স্থাপন করবেন, ক্লাউড রানে কীভাবে একটি নিরাপদ এমসিপি সার্ভার স্থাপন করবেন

1. ভূমিকা

সংক্ষিপ্ত বিবরণ

এই ল্যাবে, আপনি একটি মডেল কনটেক্সট প্রোটোকল (MCP) সার্ভার তৈরি এবং স্থাপন করবেন। MCP সার্ভারগুলি LLM-গুলিকে বহিরাগত সরঞ্জাম এবং পরিষেবাগুলিতে অ্যাক্সেস প্রদানের জন্য কার্যকর। আপনি এটিকে ক্লাউড রানে একটি নিরাপদ, উৎপাদন-প্রস্তুত পরিষেবা হিসাবে কনফিগার করবেন যা একাধিক ক্লায়েন্ট থেকে অ্যাক্সেস করা যেতে পারে। তারপর আপনি Gemini CLI থেকে দূরবর্তী MCP সার্ভারের সাথে সংযুক্ত হবেন।

তুমি কি করবে

আমরা FastMCP ব্যবহার করে একটি zoo MCP সার্ভার তৈরি করব যার দুটি টুল রয়েছে: get_animals_by_species এবং get_animal_details । FastMCP MCP সার্ভার এবং ক্লায়েন্ট তৈরি করার জন্য একটি দ্রুত, পাইথোনিক উপায় প্রদান করে।

চিড়িয়াখানার এমসিপি সার্ভার গ্রাফিক

তুমি কি শিখবে

  • ক্লাউড রানে MCP সার্ভার স্থাপন করুন।
  • সমস্ত অনুরোধের জন্য প্রমাণীকরণ বাধ্যতামূলক করে আপনার সার্ভারের এন্ডপয়েন্ট সুরক্ষিত করুন, নিশ্চিত করুন যে শুধুমাত্র অনুমোদিত ক্লায়েন্ট এবং এজেন্টরা এর সাথে যোগাযোগ করতে পারে।
  • জেমিনি সিএলআই থেকে আপনার সুরক্ষিত এমসিপি সার্ভার এন্ডপয়েন্টের সাথে সংযোগ করুন

2. প্রকল্প সেটআপ

  1. যদি আপনার ইতিমধ্যেই একটি Google অ্যাকাউন্ট না থাকে, তাহলে আপনাকে অবশ্যই একটি Google অ্যাকাউন্ট তৈরি করতে হবে।
    • কর্মক্ষেত্র বা স্কুল অ্যাকাউন্টের পরিবর্তে ব্যক্তিগত অ্যাকাউন্ট ব্যবহার করুন। কর্মক্ষেত্র এবং স্কুল অ্যাকাউন্টগুলিতে এমন বিধিনিষেধ থাকতে পারে যা আপনাকে এই ল্যাবের জন্য প্রয়োজনীয় API গুলি সক্ষম করতে বাধা দেয়।
  2. গুগল ক্লাউড কনসোলে সাইন-ইন করুন।
  3. ক্লাউড কনসোলে বিলিং সক্ষম করুন
    • এই ল্যাবটি সম্পূর্ণ করতে ক্লাউড রিসোর্সে $1 USD এর কম খরচ হবে।
    • আরও চার্জ এড়াতে আপনি এই ল্যাবের শেষে রিসোর্স মুছে ফেলার ধাপগুলি অনুসরণ করতে পারেন।
    • নতুন ব্যবহারকারীরা $300 USD বিনামূল্যে ট্রায়ালের জন্য যোগ্য।
  4. একটি নতুন প্রকল্প তৈরি করুন অথবা বিদ্যমান প্রকল্পটি পুনরায় ব্যবহার করতে বেছে নিন।

৩. ক্লাউড শেল এডিটর খুলুন

  1. সরাসরি ক্লাউড শেল এডিটরে যেতে এই লিঙ্কে ক্লিক করুন।
  2. আজই যদি যেকোনো সময় অনুমোদনের অনুরোধ করা হয়, তাহলে চালিয়ে যেতে অনুমোদন করুন -এ ক্লিক করুন। ক্লাউড শেল অনুমোদন করতে ক্লিক করুন
  3. যদি স্ক্রিনের নীচে টার্মিনালটি না দেখা যায়, তাহলে এটি খুলুন:
    • ভিউ ক্লিক করুন
    • টার্মিনাল ক্লিক করুন ক্লাউড শেল এডিটরে নতুন টার্মিনাল খুলুন
  4. টার্মিনালে, এই কমান্ড দিয়ে আপনার প্রকল্পটি সেট করুন:
    • বিন্যাস:
      gcloud config set project [PROJECT_ID]
      
    • উদাহরণ:
      gcloud config set project lab-project-id-example
      
    • যদি আপনি আপনার প্রকল্প আইডি মনে করতে না পারেন:
      • আপনি আপনার সমস্ত প্রকল্প আইডি তালিকাভুক্ত করতে পারেন:
        gcloud projects list | awk '/PROJECT_ID/{print $2}'
        
      ক্লাউড শেল এডিটর টার্মিনালে প্রোজেক্ট আইডি সেট করুন
  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

অনুমোদনের জন্য অনুরোধ করা হলে, চালিয়ে যেতে অনুমোদনে ক্লিক করুন। ক্লাউড শেল অনুমোদন করতে ক্লিক করুন

এই কমান্ডটি সম্পন্ন হতে কয়েক মিনিট সময় লাগতে পারে, কিন্তু অবশেষে এটির মতো একটি সফল বার্তা আসবে:

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

৫. আপনার পাইথন প্রকল্প প্রস্তুত করুন

  1. স্থাপনার জন্য সোর্স কোড সংরক্ষণের জন্য mcp-on-cloudrun নামে একটি ফোল্ডার তৈরি করুন:
    mkdir mcp-on-cloudrun && cd mcp-on-cloudrun
    
  2. pyproject.toml ফাইল তৈরি করতে uv টুল ব্যবহার করে একটি পাইথন প্রকল্প তৈরি করুন:
    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 = []
    

৬. চিড়িয়াখানার MCP সার্ভার তৈরি করুন

MCP-এর সাথে LLM-এর ব্যবহার উন্নত করার জন্য মূল্যবান প্রেক্ষাপট প্রদান করতে, FastMCP-এর সাথে একটি zoo MCP সার্ভার স্থাপন করুন — মডেল কনটেক্সট প্রোটোকলের সাথে কাজ করার জন্য একটি আদর্শ কাঠামো। FastMCP Python-এর সাহায্যে MCP সার্ভার এবং ক্লায়েন্ট তৈরি করার একটি দ্রুত উপায় প্রদান করে। এই MCP সার্ভারটি একটি কাল্পনিক চিড়িয়াখানার প্রাণীদের সম্পর্কে তথ্য সরবরাহ করে। সহজ করার জন্য, আমরা ডেটা মেমোরিতে সংরক্ষণ করি। একটি প্রোডাকশন MCP সার্ভারের জন্য, আপনি সম্ভবত ডাটাবেস বা API-এর মতো উৎস থেকে ডেটা সরবরাহ করতে চাইবেন।

  1. pyproject.toml ফাইলে নির্ভরতা হিসেবে FastMCP যোগ করতে নিম্নলিখিত কমান্ডটি চালান:
    uv add fastmcp==2.12.4 --no-sync
    
    এটি আপনার প্রকল্পে একটি uv.lock ফাইল যুক্ত করবে।
  2. MCP সার্ভার সোর্স কোডের জন্য একটি নতুন server.py ফাইল তৈরি করুন এবং খুলুন:
    cloudshell edit ~/mcp-on-cloudrun/server.py
    
    cloudshell edit কমান্ড টার্মিনালের উপরে এডিটরে server.py ফাইলটি খুলবে।
  3. server.py ফাইলে নিম্নলিখিত zoo MCP সার্ভার সোর্স কোডটি যোগ করুন:
    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 সার্ভার স্থাপনের সময় এসেছে।

৭. ক্লাউড রানে মোতায়েন করা

এখন সোর্স কোড থেকে সরাসরি ক্লাউড রানে একটি MCP সার্ভার স্থাপন করুন।

  1. ক্লাউড রানে স্থাপনের জন্য একটি নতুন 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. ক্লাউড রানে অ্যাপ্লিকেশনটি স্থাপন করতে gcloud কমান্ডটি চালান।
    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. একটি নতুন আর্টিফ্যাক্ট রেজিস্ট্রি রিপোজিটরি তৈরি নিশ্চিত করুন। যেহেতু আপনি প্রথমবার সোর্স কোড থেকে ক্লাউড রানে স্থাপন করছেন, তাই আপনি দেখতে পাবেন:
    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 টিপুন, এটি আপনার স্থাপনার জন্য একটি আর্টিফ্যাক্ট রেজিস্ট্রি সংগ্রহস্থল তৈরি করবে। ক্লাউড রান পরিষেবার জন্য MCP সার্ভার ডকার কন্টেইনার সংরক্ষণের জন্য এটি প্রয়োজন।
  5. কয়েক মিনিট পরে, আপনি একটি বার্তা দেখতে পাবেন যেমন:
    Service [zoo-mcp-server] revision [zoo-mcp-server-12345-abc] has been deployed and is serving 100 percent of traffic.
    

তুমি তোমার MCP সার্ভার স্থাপন করেছো। এখন তুমি এটি ব্যবহার করতে পারো।

৮. জেমিনি সিএলআই-তে রিমোট এমসিপি সার্ভার যুক্ত করুন

এখন যেহেতু আপনি একটি রিমোট 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. জেমিনি সেটিংস ফাইলে ব্যবহারের জন্য আপনার গুগল ক্লাউড শংসাপত্র এবং প্রকল্প নম্বর পরিবেশ ভেরিয়েবলে সংরক্ষণ করুন:
    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. আপনার জেমিনি সিএলআই সেটিংস ফাইলটি খুলুন।
    cloudshell edit ~/.gemini/settings.json
    
  5. ক্লাউড রান এমসিপি সার্ভার যোগ করতে আপনার জেমিনি সিএলআই সেটিংস ফাইলটি প্রতিস্থাপন করুন।
    {
        "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
    
    কিছু ডিফল্ট সেটিংস গ্রহণ করার জন্য আপনাকে Enter টিপতে হতে পারে। জেমিনি সিএলআই-এর প্রাথমিক দৃশ্য
  7. জেমিনিকে তার প্রেক্ষাপটে উপলব্ধ MCP সরঞ্জামগুলির তালিকা তৈরি করতে বলুন।
    /mcp
    
  8. মিথুন রাশিকে চিড়িয়াখানায় কিছু খুঁজে পেতে বলুন।
    Where can I find penguins?
    
    জেমিনি সিএলআই-এর zoo-remote এমসিপি সার্ভার ব্যবহার করা জানা উচিত এবং আপনি এমসিপি কার্যকর করার অনুমতি দিতে চান কিনা তা জিজ্ঞাসা করবে।
  9. নিচের তীরচিহ্ন ব্যবহার করুন, তারপর নির্বাচন করতে Enter টিপুন
    Yes, always allow all tools from server "zoo-remote"
    
    জেমিনি সিএলআই চিড়িয়াখানার রিমোট টুলগুলিকে অনুমতি দেয়

আউটপুটে সঠিক উত্তর এবং একটি ডিসপ্লে বক্স দেখানো উচিত যা দেখায় যে MCP সার্ভারটি ব্যবহার করা হয়েছে।

জেমিনি সিএলআই চিড়িয়াখানা এমসিপি সার্ভারের ফলাফল দেখায়

তুমি এটা করে ফেলেছো! তুমি ক্লাউড রানে একটি রিমোট MCP সার্ভার সফলভাবে স্থাপন করেছো এবং জেমিনি CLI ব্যবহার করে এটি পরীক্ষা করেছো।

যখন আপনি আপনার সেশন শেষ করার জন্য প্রস্তুত হবেন, তখন /quit টাইপ করুন এবং তারপর Gemini 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. জেমিনি সিএলআই থেকে বেরিয়ে আসতে /quit টাইপ করুন এবং তারপর Enter টিপুন।
  2. আপনার টার্মিনালে আপনার প্রকল্পটি সেট করুন
    gcloud config set project [PROJECT_ID]
    
  3. উপরের ধাপ ২-এ পুনরায় চালু করুন

৯. (ঐচ্ছিক) সার্ভার লগে টুল কল যাচাই করুন

আপনার ক্লাউড রান এমসিপি সার্ভারে কল করা হয়েছে কিনা তা যাচাই করতে, পরিষেবা লগগুলি পরীক্ষা করুন।

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 প্রম্পট যোগ করুন

একটি MCP প্রম্পট দীর্ঘ প্রম্পটের জন্য একটি শর্টহ্যান্ড তৈরি করে আপনার প্রায়শই চালানো প্রম্পটগুলির জন্য আপনার কর্মপ্রবাহকে দ্রুততর করতে পারে।

জেমিনি সিএলআই স্বয়ংক্রিয়ভাবে এমসিপি প্রম্পটগুলিকে কাস্টম স্ল্যাশ কমান্ডে রূপান্তর করে যাতে আপনি /prompt_name টাইপ করে একটি এমসিপি প্রম্পট আহ্বান করতে পারেন যেখানে prompt_name হল আপনার এমসিপি প্রম্পটের নাম।

একটি MCP প্রম্পট তৈরি করুন যাতে আপনি দ্রুত চিড়িয়াখানায় একটি প্রাণী খুঁজে পেতে পারেন Gemini 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. আপনার অ্যাপ্লিকেশনটি ক্লাউড রানে পুনরায় স্থাপন করুন
    gcloud run deploy zoo-mcp-server \
        --no-allow-unauthenticated \
        --region=europe-west1 \
        --source=. \
        --labels=dev-tutorial=codelab-mcp
    
  3. আপনার দূরবর্তী MCP সার্ভারের জন্য আপনার ID_TOKEN রিফ্রেশ করুন।
    export ID_TOKEN=$(gcloud auth print-identity-token)
    
  4. আপনার অ্যাপ্লিকেশনের নতুন সংস্করণটি স্থাপনের পরে, জেমিনি সিএলআই শুরু করুন।
    gemini
    
  5. প্রম্পটে আপনার তৈরি করা নতুন কাস্টম কমান্ডটি ব্যবহার করুন:
    /find --animal="lions"
    
    অথবা
    /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.

১১. (ঐচ্ছিক) দ্রুত প্রতিক্রিয়ার জন্য জেমিনি ফ্ল্যাশ লাইট ব্যবহার করুন

জেমিনি সিএলআই আপনাকে আপনার ব্যবহৃত মডেলটি বেছে নিতে দেয়।

  • জেমিনি ২.৫ প্রো হল গুগলের অত্যাধুনিক চিন্তাভাবনা মডেল, যা কোড, গণিত এবং STEM-এর জটিল সমস্যাগুলির উপর যুক্তি দিতে সক্ষম, পাশাপাশি দীর্ঘ প্রেক্ষাপট ব্যবহার করে বৃহৎ ডেটাসেট, কোডবেস এবং নথি বিশ্লেষণ করতে সক্ষম।
  • দাম-পারফরম্যান্সের দিক থেকে জেমিনি ২.৫ ফ্ল্যাশ হল গুগলের সেরা মডেল, যা সুবিস্তৃত ক্ষমতা প্রদান করে। বৃহৎ স্কেল প্রক্রিয়াকরণ, কম-বিলম্বিতা, উচ্চ ভলিউম কাজের জন্য যেখানে চিন্তাভাবনা প্রয়োজন এবং এজেন্টিক ব্যবহারের ক্ষেত্রে ২.৫ ফ্ল্যাশ সেরা।
  • জেমিনি ২.৫ ফ্ল্যাশ লাইট হল গুগলের দ্রুততম ফ্ল্যাশ মডেল যা খরচ-দক্ষতা এবং উচ্চ থ্রুপুটের জন্য অপ্টিমাইজ করা হয়েছে।

যেহেতু চিড়িয়াখানার প্রাণীদের খুঁজে বের করার অনুরোধগুলির জন্য চিন্তাভাবনা বা যুক্তির প্রয়োজন হয় না, তাই দ্রুত মডেল ব্যবহার করে কাজ দ্রুত করার চেষ্টা করুন।

একটি MCP প্রম্পট তৈরি করুন যাতে আপনি দ্রুত চিড়িয়াখানায় একটি প্রাণী খুঁজে পেতে পারেন Gemini CLI-তে /find animal টাইপ করে।

  1. আপনার অ্যাপ্লিকেশনের নতুন সংস্করণটি স্থাপনের পরে, জেমিনি সিএলআই শুরু করুন।
    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 সার্ভার স্থাপন এবং সংযুক্ত করেছেন।

পরবর্তী ল্যাবে যান

এই ল্যাবটি তিন পর্বের সিরিজের প্রথম ল্যাব। দ্বিতীয় ল্যাবে, আপনি ADK এজেন্ট দিয়ে তৈরি MCP সার্ভারটি ব্যবহার করবেন।

ADK এজেন্টের সাথে ক্লাউড রানে একটি MCP সার্ভার ব্যবহার করুন

(ঐচ্ছিক) পরিষ্কার করুন

যদি আপনি পরবর্তী ল্যাবে না যান এবং আপনার তৈরি করা জিনিসগুলি পরিষ্কার করতে চান, তাহলে অতিরিক্ত চার্জ এড়াতে আপনি আপনার ক্লাউড প্রকল্পটি মুছে ফেলতে পারেন।

পরিষেবাটি ব্যবহার না করা অবস্থায় ক্লাউড রান চার্জ করে না, তবুও আর্টিফ্যাক্ট রেজিস্ট্রিতে কন্টেইনার চিত্র সংরক্ষণের জন্য আপনাকে চার্জ করা হতে পারে। আপনার ক্লাউড প্রকল্পটি মুছে ফেলার ফলে সেই প্রকল্পের মধ্যে ব্যবহৃত সমস্ত সংস্থানের জন্য বিলিং বন্ধ হয়ে যায়।

আপনি যদি চান, প্রকল্পটি মুছে ফেলুন:

gcloud projects delete $GOOGLE_CLOUD_PROJECT

আপনি আপনার ক্লাউডশেল ডিস্ক থেকে অপ্রয়োজনীয় রিসোর্সগুলিও মুছে ফেলতে চাইতে পারেন। আপনি করতে পারেন:

  1. কোডল্যাব প্রজেক্ট ডিরেক্টরিটি মুছে ফেলুন:
    rm -rf ~/mcp-on-cloudrun
    
  2. সতর্কতা! পরবর্তী পদক্ষেপটি পূর্বাবস্থায় ফেরানো যাবে না! যদি আপনি আপনার ক্লাউড শেলের সবকিছু মুছে ফেলতে চান যাতে জায়গা খালি হয়, তাহলে আপনি আপনার সম্পূর্ণ হোম ডিরেক্টরি মুছে ফেলতে পারেন। আপনি যা রাখতে চান তা যেন অন্য কোথাও সংরক্ষিত থাকে সেদিকে খেয়াল রাখুন।
    sudo rm -rf $HOME