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

1. ভূমিকা

ওভারভিউ

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

আপনি কি করবেন

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

চিড়িয়াখানা MCP সার্ভার গ্রাফিক

আপনি কি শিখবেন

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

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

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

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

  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 কমান্ড চালানোর চেষ্টা করুন।

4. APIs সক্ষম করুন৷

টার্মিনালে, APIs সক্ষম করুন:

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

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

এই কমান্ডটি সম্পূর্ণ হতে কয়েক মিনিট সময় নিতে পারে, তবে এটি শেষ পর্যন্ত এটির মতো একটি সফল বার্তা তৈরি করবে:

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

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

  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 = []
    

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

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

  1. pyproject.toml ফাইলে নির্ভরতা হিসাবে FastMCP যোগ করতে নিম্নলিখিত কমান্ডটি চালান:
    uv add fastmcp==2.11.1 --no-sync
    
    এটি আপনার প্রকল্পে একটি uv.lock ফাইল যোগ করবে।
  2. MCP সার্ভার সোর্স কোডের জন্য একটি নতুন server.py ফাইল তৈরি করুন এবং খুলুন:
    cloudshell edit server.py
    
    cloudshell edit কমান্ড টার্মিনালের উপরের সম্পাদকে server.py ফাইলটি খুলবে।
  3. server.py ফাইলে নিম্নলিখিত চিড়িয়াখানা 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__":
        logger.info(f"🚀 MCP server started on port {os.getenv('PORT', 8080)}")
        asyncio.run(
            mcp.run_async(
                transport="http",
                host="0.0.0.0",
                port=os.getenv("PORT", 8080),
            )
        )
    

আপনার কোড সম্পূর্ণ! ক্লাউড রানে এমসিপি সার্ভার স্থাপন করার সময় এসেছে।

7. ক্লাউড রানে স্থাপন করা হচ্ছে

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

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

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

8. Gemini CLI-তে রিমোট 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. জেমিনি সেটিংস ফাইলে ব্যবহারের জন্য পরিবেশের ভেরিয়েবলে আপনার Google ক্লাউড শংসাপত্র এবং প্রকল্প নম্বর সংরক্ষণ করুন:
    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. Cloud Run MCP সার্ভার যোগ করতে আপনার Gemini CLI সেটিংস ফাইলটি প্রতিস্থাপন করুন
    {
      "mcpServers": {
        "zoo-remote": {
          "httpUrl": "https://zoo-mcp-server-$PROJECT_NUMBER.europe-west1.run.app/mcp/",
          "headers": {
            "Authorization": "Bearer $ID_TOKEN"
          }
        }
      },
      "selectedAuthType": "cloud-shell",
      "hasSeenIdeIntegrationNudge": true
    }
    

  1. ক্লাউড শেলে জেমিনি CLI শুরু করুন
    gemini
    
    কিছু ডিফল্ট সেটিংস গ্রহণ করতে আপনাকে Enter টিপুতে হতে পারে। মিথুন CLI প্রাথমিক দৃশ্য
  2. জেমিনিকে তার প্রেক্ষাপটে পাওয়া MCP টুলগুলির তালিকা করুন
    /mcp
    
  3. মিথুনকে চিড়িয়াখানায় কিছু খুঁজে পেতে বলুন
    Where can I find penguins?
    
    Gemini CLI-এর zoo-remote MCP সার্ভার ব্যবহার করতে জানা উচিত এবং আপনি MCP কার্যকর করার অনুমতি দিতে চান কিনা তা জিজ্ঞাসা করবে।
  4. নিচের তীরটি ব্যবহার করুন, তারপর নির্বাচন করতে Enter টিপুন
    Yes, always allow all tools from server "zoo-remote"
    
    Gemini CLI চিড়িয়াখানার দূরবর্তী সরঞ্জামগুলিকে অনুমতি দেয়

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

মিথুন CLI চিড়িয়াখানা mcp সার্ভারের ফলাফল দেখায়

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

যখন আপনি আপনার অধিবেশন শেষ করতে প্রস্তুত হন, তখন টাইপ করুন /quit এবং তারপর জেমিনি 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 টোকেনের সময় শেষ হয়ে গেছে এবং ID_TOKEN আবার সেট করতে হবে।

  1. টাইপ করুন /quit এবং তারপর জেমিনি সিএলআই থেকে প্রস্থান করতে Enter টিপুন।
  2. আপনার টার্মিনালে আপনার প্রকল্প সেট করুন
    gcloud config set project [PROJECT_ID]
    
  3. উপরের ধাপ 2 এ পুনরায় আরম্ভ করুন

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

আপনার ক্লাউড রান 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 প্রম্পটকে কাস্টম স্ল্যাশ কমান্ডে রূপান্তর করে যাতে আপনি /prompt_name লিখে একটি MCP প্রম্পট চালু করতে পারেন যেখানে prompt_name আপনার MCP প্রম্পটের নাম।

একটি 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 CLI শুরু করুন।
    gemini
    
  5. প্রম্পটে আপনি তৈরি করা নতুন কাস্টম কমান্ডটি ব্যবহার করুন:
    /find --animal="lions"
    

আপনার দেখা উচিত যে জেমিনি 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 সার্ভার স্থাপন করবেন। তারপর এটি কাজ করে কিনা তা দেখতে আপনার জেমিনি CLI সেটিংসে এটি যোগ করুন।

11. উপসংহার

অভিনন্দন! আপনি সফলভাবে স্থাপন করেছেন এবং একটি নিরাপদ দূরবর্তী MCP সার্ভারের সাথে সংযুক্ত করেছেন৷

পরবর্তী ল্যাবে চালিয়ে যান

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

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

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

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

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

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

gcloud projects delete $GOOGLE_CLOUD_PROJECT

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

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