ক্লাউড রানে জেমিনি এমসিপি ব্যবহার করে প্রাকৃতিক ভাষাকে বাস্তব গুগল ক্লাউড অ্যাকশনে রূপান্তর করুন

১. ভূমিকা

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

স্থাপত্য প্রবাহ: জেমিনি সিএলআই → ক্লাউড রান → এমসিপি

e149713a547f4157.png

এটা কল্পনা করুন: আপনি আপনার টার্মিনাল খুললেন এবং একটি এআই এজেন্টে একটি সাধারণ প্রম্পট টাইপ করলেন, যেমনটি নিচে দেখানো হয়েছে:

  • List my GCS buckets
  • Create a GCS bucket named <bucket-name>
  • Tell me about the metadata of my GCS object

কয়েক সেকেন্ডের মধ্যেই আপনার ক্লাউড শোনে এবং কাজ করে। কোনো জটিল কমান্ড নেই। অবিরাম ট্যাব বদলানোর ঝামেলা নেই। শুধু সাধারণ ভাষা যা বাস্তব ক্লাউড অ্যাকশনে পরিণত হয়।

আপনি যা করবেন

আপনি একটি কাস্টম এমসিপি সার্ভার তৈরি ও স্থাপন করবেন যা জেমিনি সিএলআই-কে গুগল ক্লাউড স্টোরেজের সাথে সংযুক্ত করবে।

আপনি করবেন:

  • পাইথন-ভিত্তিক একটি এমসিপি সার্ভার তৈরি করুন
  • অ্যাপ্লিকেশনটিকে কন্টেইনারাইজ করুন
  • ক্লাউড রানে এটি স্থাপন করুন
  • IAM এবং আইডেন্টিটি টোকেন ব্যবহার করে এটিকে সুরক্ষিত করুন
  • এটি Gemini CLI এর সাথে সংযুক্ত করুন
  • স্বাভাবিক ভাষা ব্যবহার করে সরাসরি GCS অপারেশন সম্পাদন করুন

আপনি যা শিখবেন

  • এমসিপি (মডেল কনটেক্সট প্রোটোকল) কী এবং এটি কীভাবে কাজ করে
  • পাইথন ব্যবহার করে কীভাবে টুল-কলিং ক্ষমতা তৈরি করা যায়
  • ক্লাউড রানে কন্টেইনারাইজড অ্যাপ্লিকেশন কীভাবে ডেপ্লয় করবেন
  • জেমিনি সিএলআই কীভাবে বাহ্যিক এমসিপি সার্ভারগুলির সাথে সমন্বিত হয়
  • ক্লাউড রান পরিষেবাগুলিকে নিরাপদে প্রমাণীকরণ করার উপায়
  • এআই ব্যবহার করে কীভাবে আসল গুগল ক্লাউড স্টোরেজ অপারেশনগুলো সম্পাদন করা যায়

আপনার যা যা লাগবে

  • ক্রোম ওয়েব ব্রাউজার
  • একটি জিমেইল অ্যাকাউন্ট
  • বিলিং সক্ষম একটি গুগল ক্লাউড প্রজেক্ট
  • জেমিনি সিএলআই (এতে গুগল ক্লাউড শেল আগে থেকেই ইনস্টল করা থাকে)
  • পাইথন এবং গুগল ক্লাউড সম্পর্কে প্রাথমিক ধারণা।

এই কোডল্যাবটি ব্যবহারের জন্য ধরে নেওয়া হচ্ছে যে, ব্যবহারকারীর পাইথন সম্পর্কে প্রাথমিক জ্ঞান রয়েছে।

২. শুরু করার আগে

একটি প্রকল্প তৈরি করুন

  1. গুগল ক্লাউড কনসোলের প্রজেক্ট সিলেক্টর পেজে, একটি গুগল ক্লাউড প্রজেক্ট নির্বাচন করুন বা তৈরি করুন।
  2. আপনার ক্লাউড প্রোজেক্টের জন্য বিলিং চালু আছে কিনা তা নিশ্চিত করুন। কোনো প্রোজেক্টে বিলিং চালু আছে কিনা তা কীভাবে পরীক্ষা করবেন, তা জেনে নিন।
  3. আপনি ক্লাউড শেল ব্যবহার করবেন, যা গুগল ক্লাউডে চলমান একটি কমান্ড-লাইন পরিবেশ এবং এটি bq-এর সাথে আগে থেকেই লোড করা থাকে। গুগল ক্লাউড কনসোলের শীর্ষে থাকা ‘Activate Cloud Shell’-এ ক্লিক করুন।

ক্লাউড শেল সক্রিয় করুন বোতামের ছবি

  1. ক্লাউড শেলে সংযুক্ত হওয়ার পর, আপনি নিম্নলিখিত কমান্ডটি ব্যবহার করে যাচাই করে নিন যে আপনি ইতিমধ্যেই প্রমাণীকৃত এবং প্রজেক্টটি আপনার প্রজেক্ট আইডিতে সেট করা আছে:
gcloud auth list
  1. gcloud কমান্ডটি আপনার প্রজেক্ট সম্পর্কে অবগত আছে কিনা, তা নিশ্চিত করতে ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান।
gcloud config list project
  1. আপনার প্রজেক্টটি সেট করা না থাকলে, এটি সেট করতে নিম্নলিখিত কমান্ডটি ব্যবহার করুন:
gcloud config set project <YOUR_PROJECT_ID>
  1. নিচে দেখানো কমান্ডের মাধ্যমে প্রয়োজনীয় API-গুলো সক্রিয় করুন। এতে কয়েক মিনিট সময় লাগতে পারে, তাই অনুগ্রহ করে ধৈর্য ধরুন।
gcloud services enable \
  run.googleapis.com \
  artifactregistry.googleapis.com \
  cloudbuild.googleapis.com

অনুমোদন করতে বলা হলে, চালিয়ে যাওয়ার জন্য 'Authorize'-এ ক্লিক করুন।

5e681903144bdfbe.png

কমান্ডটি সফলভাবে কার্যকর হলে, আপনি নিচে দেখানো বার্তার মতো একটি বার্তা দেখতে পাবেন:

Operation "operations/..." finished successfully.

যদি কোনো API বাদ পড়ে যায়, তাহলে আপনি বাস্তবায়ন চলাকালীন সময়েই তা সক্রিয় করে নিতে পারেন।

gcloud কমান্ড এবং এর ব্যবহার সম্পর্কে জানতে ডকুমেন্টেশন দেখুন।

আপনার পাইথন প্রজেক্ট প্রস্তুত করুন

এই অংশে, আপনি আপনার এমসিপি সার্ভার হোস্ট করার জন্য পাইথন প্রজেক্টটি তৈরি করবেন এবং ক্লাউড রানে ডেপ্লয়মেন্টের জন্য এর ডিপেন্ডেন্সিগুলো কনফিগার করবেন।

প্রজেক্ট ডিরেক্টরি তৈরি করুন

আপনার সোর্স কোড সংরক্ষণের জন্য প্রথমে mcp-on-cloudrun নামে একটি নতুন ফোল্ডার তৈরি করুন:

mkdir gcs-mcp-server && cd gcs-mcp-server

requirements.txt তৈরি করুন

touch requirements.txt
cloudshell edit ~/gcs-mcp-server/requirements.txt

ফাইলটিতে নিম্নলিখিত বিষয়বস্তু যোগ করুন:

fastmcp
google-cloud-storage
google-api-core
pydantic

ফাইলটি সংরক্ষণ করুন।

৩. এমসিপি সার্ভার তৈরি করুন

এই অংশে, আপনি এমন একটি MCP সার্ভার তৈরি করবেন যা গুগল ক্লাউড স্টোরেজ অপারেশনগুলোকে কলযোগ্য টুল হিসেবে প্রকাশ করে।

এই সার্ভারটি করবে:

  • এমসিপি টুলস নিবন্ধন করুন
  • গুগল ক্লাউড স্টোরেজের সাথে সংযোগ করুন
  • HTTP এর মাধ্যমে চালান
  • ক্লাউড রানে স্থাপনযোগ্য হবে

এখন চলুন main.py ভেতরে আমাদের মূল MCP লজিক তৈরি করি।

নিচে সম্পূর্ণ কোডটি দেওয়া হলো, যা গুগল ক্লাউড স্টোরেজ পরিচালনার জন্য একাধিক টুল সংজ্ঞায়িত করে – যেমন বাকেট তালিকাভুক্ত করা ও তৈরি করা থেকে শুরু করে ব্লব আপলোড, ডাউনলোড এবং পরিচালনা করা পর্যন্ত।

মূল অ্যাপ্লিকেশন ফাইল তৈরি করুন

mcp-on-cloudrun ডিরেক্টরির ভিতরে main.py নামে একটি নতুন ফাইল তৈরি করুন:

touch main.py

ক্লাউড শেল এডিটর ব্যবহার করে ফাইলটি খুলুন:

cloudshell edit ~/gcs-mcp-server/main.py

main.py ফাইলের বিষয়বস্তুতে নিম্নলিখিত সোর্সটি যোগ করুন:

import asyncio
import logging
import os
from datetime import timedelta
from typing import List, Dict, Any
from fastmcp import FastMCP
from google.cloud import storage
from google.api_core import exceptions

# ---------------------------------------------------------
# 🌐 Initialize MCP
# ---------------------------------------------------------
logging.basicConfig(format="[%(levelname)s]: %(message)s", level=logging.INFO)
logger = logging.getLogger(__name__)

mcp = FastMCP(name="MyEnhancedGCSMCPServer")
# ---------------------------------------------------------
# 1️⃣ Simple Greeting
# ---------------------------------------------------------
@mcp.tool
def sayhi(name: str) -> str:
  """Returns a friendly greetings"""
  return f"Hello {name}! It's a pleasure to connect from your enhanced MCP Server."

# ---------------------------------------------------------
# 2️⃣ List all GCS buckets
# ---------------------------------------------------------
@mcp.tool
def list_gcs_buckets() -> List[str]:
  """Lists all GCS buckets in the project."""
  try:
      storage_client = storage.Client()
      buckets = storage_client.list_buckets()
      return [bucket.name for bucket in buckets]
  except exceptions.Forbidden as e:
      return [f"Error: Permission denied to list buckets. Details: {e}"]
  except Exception as e:
      return [f"An unexpected error occurred: {e}"]

# ---------------------------------------------------------
# 3️⃣ Create a new bucket
# ---------------------------------------------------------
@mcp.tool
def create_bucket(bucket_name: str, location: str = "US") -> str:
  """Creates a new GCS bucket. Bucket names must be globally unique."""
  try:
      storage_client = storage.Client()
      bucket = storage_client.bucket(bucket_name)
      bucket.location = location
      storage_client.create_bucket(bucket)
      return f"✅ Bucket '{bucket_name}' created successfully in '{location}'."
  except exceptions.Conflict:
      return f"⚠️ Error: Bucket '{bucket_name}' already exists."
  except exceptions.Forbidden as e:
      return f"❌ Error: Permission denied to create bucket. Details: {e}"
  except Exception as e:
      return f"❌ Unexpected error: {e}"

# ---------------------------------------------------------
# 4️⃣ Delete a bucket
# ---------------------------------------------------------
@mcp.tool
def delete_bucket(bucket_name: str) -> str:
  """Deletes a GCS bucket."""
  try:
      storage_client = storage.Client()
      bucket = storage_client.bucket(bucket_name)
      bucket.delete(force=True)
      return f"🗑️ Bucket '{bucket_name}' deleted successfully."
  except exceptions.NotFound:
      return f"⚠️ Error: Bucket '{bucket_name}' not found."
  except exceptions.Forbidden as e:
      return f"❌ Error: Permission denied to delete bucket. Details: {e}"
  except Exception as e:
      return f"❌ Unexpected error: {e}"

# ---------------------------------------------------------
# 5️⃣ List objects in a bucket
# ---------------------------------------------------------
@mcp.tool
def list_objects(bucket_name: str) -> List[str]:
  """Lists all objects in a specified GCS bucket."""
  try:
      storage_client = storage.Client()
      blobs = storage_client.list_blobs(bucket_name)
      return [blob.name for blob in blobs]
  except exceptions.NotFound:
      return [f"⚠️ Error: Bucket '{bucket_name}' not found."]
  except Exception as e:
      return [f"❌ Unexpected error: {e}"]
# ---------------------------------------------------------
# Delete file from a bucket
# ---------------------------------------------------------
@mcp.tool
def delete_blob(bucket_name: str, blob_name: str) -> str:
  """Deletes a blob from a GCS bucket."""
  try:
      storage_client = storage.Client()
      bucket = storage_client.bucket(bucket_name)
      blob = bucket.blob(blob_name)
      blob.delete()
      return f"🗑️ Blob '{blob_name}' deleted from bucket '{bucket_name}'."
  except exceptions.NotFound:
      return f"⚠️ Error: Bucket '{bucket_name}' or blob '{blob_name}' not found."
  except exceptions.Forbidden as e:
      return f" Permission denied. Details: {e}"
  except Exception as e:
      return f" Unexpected error: {e}"

# ---------------------------------------------------------
# Get bucket metadata
# ---------------------------------------------------------
@mcp.tool
def get_bucket_metadata(bucket_name: str) -> Dict[str, Any]:
  """Retrieves metadata for a GCS bucket."""
  try:
      storage_client = storage.Client()
      bucket = storage_client.get_bucket(bucket_name)
      return {
          "id": bucket.id,
          "name": bucket.name,
          "location": bucket.location,
          "storage_class": bucket.storage_class,
          "created": bucket.time_created.isoformat() if bucket.time_created else None,
          "updated": bucket.updated.isoformat() if bucket.updated else None,
          "versioning_enabled": bucket.versioning_enabled,
      }
  except exceptions.NotFound:
      return {"error": f" Bucket '{bucket_name}' not found."}
  except Exception as e:
      return {"error": f" Unexpected error: {e}"}

# ---------------------------------------------------------
# Get object metadata
# ---------------------------------------------------------
@mcp.tool
def get_blob_metadata(bucket_name: str, blob_name: str) -> Dict[str, Any]:
  """Retrieves metadata for a specific blob."""
  try:
      storage_client = storage.Client()
      bucket = storage_client.bucket(bucket_name)
      blob = bucket.get_blob(blob_name)
      if not blob:
          return {"error": f" Blob '{blob_name}' not found in '{bucket_name}'."}
      return {
          "name": blob.name,
          "bucket": blob.bucket.name,
          "size": blob.size,
          "content_type": blob.content_type,
          "updated": blob.updated.isoformat() if blob.updated else None,
          "storage_class": blob.storage_class,
          "crc32c": blob.crc32c,
          "md5_hash": blob.md5_hash,
      }
  except exceptions.NotFound:
      return {"error": f" Bucket '{bucket_name}' not found."}
  except Exception as e:
      return {"error": f" Unexpected error: {e}"}

# ---------------------------------------------------------
# 🚀 Entry Point
# ---------------------------------------------------------
if __name__ == "__main__":
  port = int(os.getenv("PORT", 8080))
  logger.info(f"🚀 Starting Enhanced GCS MCP Server on port {port}")
  asyncio.run(
      mcp.run_async(
          transport="http",
          host="0.0.0.0",
          port=port,
      )
  )

কোড যোগ করার পর ফাইলটি সংরক্ষণ করুন।

আপনার প্রোজেক্টের কাঠামোটি এখন দেখতে এইরকম হবে:

gcs-mcp-server/
├── requirements.txt
└── main.py

আসুন কোডটি সংক্ষেপে বুঝে নিই:

আমদানি এবং সেটআপ :

কোডটি প্রয়োজনীয় লাইব্রেরিগুলো ইম্পোর্ট করার মাধ্যমে শুরু হয়।

  • স্ট্যান্ডার্ড লাইব্রেরিগুলো হলো : অ্যাসিঙ্ক্রোনাস এক্সিকিউশনের জন্য asyncio , স্ট্যাটাস মেসেজ আউটপুট করার জন্য logging , এবং এনভায়রনমেন্ট ভেরিয়েবলের জন্য os
  • FastMCP : মডেল কনটেক্সট প্রোটোকল সার্ভার তৈরি করতে ব্যবহৃত মূল ফ্রেমওয়ার্ক।
  • গুগল ক্লাউড স্টোরেজ : GCS-এর সাথে কাজ করার জন্য google.cloud.storage লাইব্রেরিটি ইম্পোর্ট করা হয়, সাথে ত্রুটি ব্যবস্থাপনার জন্য exceptions থাকে।

প্রারম্ভিকীকরণ :

সার্ভারের পরিচয় ডিবাগ ও ট্র্যাক করতে সাহায্য করার জন্য আমরা লগিং ফরম্যাটটি কনফিগার করি। এছাড়াও আমরা MyEnhancedGCSMCPServer নামের FastMCP এর একটি ইনস্ট্যান্স কনফিগার করি। এই অবজেক্টটি ( mcp ) সার্ভার কর্তৃক উন্মুক্ত করা সমস্ত টুলস (ফাংশন) রেজিস্টার করতে ব্যবহৃত হবে। আমরা নিম্নলিখিত টুলসগুলো সংজ্ঞায়িত করি:

  • list_gcs_buckets : সংশ্লিষ্ট গুগল ক্লাউড প্রজেক্টের সমস্ত স্টোরেজ বাকেটের একটি তালিকা পুনরুদ্ধার করে।
  • create_bucket : একটি নির্দিষ্ট নাম ও অবস্থান সহ একটি নতুন বাকেট তৈরি করে।
  • delete_bucket : বিদ্যমান কোনো বাকেট মুছে ফেলে।
  • list_objects : একটি নির্দিষ্ট বাকেটের অন্তর্গত সমস্ত ফাইল (ব্লব) তালিকাভুক্ত করে।
  • delete_blob : একটি বাকেট থেকে একটি নির্দিষ্ট ফাইল মুছে ফেলে।
  • get_bucket_metadata : একটি বাকেটের প্রযুক্তিগত বিবরণ (অবস্থান, স্টোরেজ ক্লাস, ভার্সনিং স্ট্যাটাস, তৈরির সময়) ফেরত দেয়।
  • get_blob_metadata : একটি নির্দিষ্ট ফাইল সম্পর্কে প্রযুক্তিগত বিবরণ (আকার, বিষয়বস্তুর ধরণ, MD5 হ্যাশ, সর্বশেষ হালনাগাদ) প্রদান করে।

প্রবেশ বিন্দু:

এটি পোর্ট কনফিগার করে, যা সেট করা না থাকলে ডিফল্টভাবে 8080 হয়ে যায়। এরপর এটি mcp.run_async ব্যবহার করে asyncio.run() এর মাধ্যমে সার্ভারটিকে অ্যাসিঙ্ক্রোনাসভাবে চালু করে। সবশেষে, এটি সার্ভারটিকে HTTP ( host 0.0.0.0 ) এর মাধ্যমে চালানোর জন্য কনফিগার করে, যার ফলে এটি আগত নেটওয়ার্ক অনুরোধগুলোর জন্য অ্যাক্সেসযোগ্য হয়ে ওঠে।

৪. এমসিপি সার্ভারকে কন্টেইনারাইজ করুন

এই অংশে, আপনি একটি ডকারফাইল তৈরি করবেন যাতে আপনার এমসিপি সার্ভারটি ক্লাউড রান-এ ডেপ্লয় করা যায়।

ক্লাউড রানের জন্য একটি কন্টেইনারাইজড অ্যাপ্লিকেশন প্রয়োজন। আপনার অ্যাপ্লিকেশনটি কীভাবে বিল্ড এবং স্টার্ট করা হবে, তা আপনিই নির্ধারণ করবেন।

ডকারফাইল তৈরি করুন

Dockerfile নামে একটি নতুন ফাইল তৈরি করুন:

touch Dockerfile

ক্লাউড শেল এডিটর-এ এটি খুলুন:

cloudshell edit ~/gcs-mcp-server/Dockerfile

ডকার কনফিগারেশন যোগ করুন

নিম্নলিখিত বিষয়বস্তু Dockerfile এ পেস্ট করুন:

FROM python:3.11-slim
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
WORKDIR /app
RUN apt-get update && apt-get install -y \
   build-essential \
   gcc \
   && rm -rf /var/lib/apt/lists/*
RUN pip install --upgrade pip
COPY . .
RUN pip install -r requirements.txt
ENV PORT=8080
EXPOSE 8080
CMD ["python", "main.py"]

বিষয়বস্তু যোগ করার পর ফাইলটি সংরক্ষণ করুন। আপনার প্রোজেক্টের কাঠামোটি এখন দেখতে এইরকম হবে:

gcs-mcp-server/
├── requirements.txt
├── main.py
└── Dockerfile

৫. ক্লাউড রান-এ ডেপ্লয় করা

এখন আপনার এমসিপি সার্ভারটি সরাসরি সোর্স থেকে ডেপ্লয় করুন।

ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান:

gcloud run deploy gcs-mcp-server \
   --no-allow-unauthenticated \
   --region=us-central1 \
   --source=. \
   --labels=session=buildersdayblr

যখন অনুরোধ করা হয়

  • প্রমাণীকরণবিহীন আহ্বানের অনুমতি দেবেন? → না

ক্লাউড বিল্ড যা করবে:

  • কন্টেইনার ইমেজ তৈরি করুন
  • আর্টিফ্যাক্ট রেজিস্ট্রি-তে এটি পুশ করুন
  • ক্লাউড রানে এটি স্থাপন করুন

আর্টিফ্যাক্ট রেজিস্ট্রি রিপোজিটরি তৈরি করা যাবে তা নিশ্চিত করতে Y চাপুন।

Deploying from source requires an Artifact Registry Docker repository to store built containers. A repository named [cloud-run-source-deploy] in region [us-central1] will be created.

Do you want to continue (Y/n)?  Y

সফলভাবে ডেপ্লয়মেন্ট সম্পন্ন হলে, আপনি ক্লাউড রান সার্ভিস ইউআরএল সহ একটি সফলতার বার্তা দেখতে পাবেন।

এছাড়াও আপনি আপনার গুগল ক্লাউড কনসোলের Cloud Run → Services বিভাগ থেকে ডেপ্লয়মেন্টটি যাচাই করতে পারেন

53f95a2aa7a169d6.png

৬. জেমিনি সিএলআই কনফিগারেশন

এখন পর্যন্ত, আমরা ক্লাউড রান-এ আমাদের এমসিপি সার্ভারটি তৈরি ও স্থাপন করেছি।

এবার আসল মজার পালা — এটিকে জেমিনি সিএলআই (Gemini CLI)-এর সাথে সংযুক্ত করা এবং আপনার স্বাভাবিক ভাষার নির্দেশাবলীকে বাস্তব ক্লাউড অ্যাকশনে পরিণত করা।

ক্লাউড রান ইনভোকারকে অনুমতি দিন

যেহেতু আমাদের ক্লাউড রান পরিষেবাটি ব্যক্তিগত, তাই আমরা একটি আইডেন্টিটি টোকেন ব্যবহার করে প্রমাণীকরণ করব এবং সঠিক IAM অনুমতিগুলো বরাদ্দ করব।

আমরা সার্ভিসটি --no-allow-unauthenticated ডেপ্লয় করেছি, তাই এটি চালু করার জন্য আপনাকে অবশ্যই অনুমতি দিতে হবে।

আপনার প্রজেক্ট আইডি সেট করুন:

export GOOGLE_CLOUD_PROJECT=$(gcloud config get-value project)

নিজেকে ক্লাউড রান ইনভোকার রোলটি প্রদান করুন:

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)

এটি যাচাই করুন:

echo $PROJECT_NUMBER
echo $ID_TOKEN

আপনি এই টোকেনটি জেমিনি সিএলআই কনফিগারেশনের ভিতরে ব্যবহার করবেন।

Gemini CLI-তে MCP সার্ভার কনফিগার করুন

Gemini CLI সেটিংস ফাইলটি খুলুন:

cloudshell edit ~/.gemini/settings.json

নিম্নলিখিত কনফিগারেশনটি যোগ করুন:

{
 "ide": {
   "enabled": true,
   "hasSeenNudge": true
 },
 "mcpServers": {
   "my-cloudrun-server": {
     "httpUrl": "https://gcs-mcp-server-$PROJECT_NUMBER.asia-south1.run.app/mcp",
     "headers": {
       "Authorization": "Bearer $ID_TOKEN"
     }
   }
 },
 "security": {
   "auth": {
     "selectedType": "cloud-shell"
   }
 }
}

Gemini CLI-তে কনফিগার করা MCP সার্ভারগুলি যাচাই করুন।

নিম্নলিখিত কমান্ডের মাধ্যমে ক্লাউড শেল টার্মিনালে Gemini CLI চালু করুন:

gemini

আপনি নিচের আউটপুটটি দেখতে পাবেন।

193224319056d340.png

জেমিনি সিএলআই-এর ভিতরে, চালান:

/mcp refresh
/mcp list

এখন আপনি আপনার gcs-cloudrun-serve নিবন্ধিত দেখতে পাবেন। নিচে একটি নমুনা স্ক্রিনশট দেখানো হলো:

726738c48290fc30.png

৭. স্বাভাবিক ভাষার মাধ্যমে গুগল স্টোরেজ অপারেশন চালু করুন

বালতি তৈরি করুন

Create a bucket named my-ai-bucket in asia-south1 region

এটি এমসিপি সার্ভার থেকে create_bucket টুলটি চালু করার জন্য আপনার অনুমতি চাইবে।

5ab2225295285077.png

একবার Allow-এ ক্লিক করুন, তাহলে আপনার অনুরোধ করা নির্দিষ্ট অঞ্চলে আপনার বাকেটটি সফলভাবে তৈরি হয়ে যাবে।

বালতি তালিকা

বাকেটগুলির তালিকা করতে, নিচের প্রম্পটটি প্রবেশ করান:

List all my GCS buckets

বালতি মুছুন

একটি বাকেট ডিলিট করতে, নিচের প্রম্পটটি লিখুন (এখানে <your_bucket_name> এর জায়গায় আপনার বাকেটের নাম লিখুন):

Delete the bucket <your_bucket_name>

বাকেটের মেটাডেটা পান

একটি বাকেটের মেটাডেটা পেতে, নিচের প্রম্পটটি প্রবেশ করান (এখানে <your_bucket_name> এর জায়গায় আপনার বাকেটের নাম বসান):

Give me metadata of the <your_bucket_name>

৮. পরিষ্কার করুন

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

এই কোডল্যাবে ব্যবহৃত রিসোর্সগুলির জন্য আপনার গুগল ক্লাউড অ্যাকাউন্টে চার্জ হওয়া এড়াতে, এই ধাপগুলি অনুসরণ করুন:

  • গুগল ক্লাউড কনসোলে, রিসোর্স পরিচালনা (Manage resources) পৃষ্ঠায় যান।
  • প্রজেক্ট তালিকা থেকে, যে প্রজেক্টটি আপনি মুছতে চান সেটি নির্বাচন করুন।
  • ডিলিট-এ ক্লিক করুন।

ডায়ালগ বক্সে প্রজেক্ট আইডি টাইপ করুন এবং তারপর প্রজেক্টটি স্থায়ীভাবে মুছে ফেলার জন্য 'শাট ডাউন'-এ ক্লিক করুন।

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

বিকল্পভাবে, যদি আপনি প্রজেক্টটি রাখতে চান কিন্তু ডেপ্লয় করা সার্ভিসটি সরিয়ে ফেলতে চান:

  1. গুগল ক্লাউড কনসোলে ক্লাউড রান -এ যান।
  2. gcs-mcp-server পরিষেবাটি নির্বাচন করুন।
  3. পরিষেবাটি অপসারণ করতে ডিলিট-এ ক্লিক করুন।

অথবা ক্লাউড শেল টার্মিনালে নিম্নলিখিত gcloud কমান্ডটি দিন।

gcloud run services delete gcs-mcp-server --region=us-central1

৯. উপসংহার

🎉 অভিনন্দন! আপনি এইমাত্র আপনার প্রথম এআই-চালিত ক্লাউড ওয়ার্কফ্লো তৈরি করেছেন!

আপনি বাস্তবায়ন করেছেন:

  • একটি কাস্টম পাইথন-ভিত্তিক এমসিপি সার্ভার
  • গুগল ক্লাউড স্টোরেজের জন্য টুল-কলিং ক্ষমতা
  • ডকার ব্যবহার করে কন্টেইনারাইজেশন
  • ক্লাউড রানে সুরক্ষিত ডেপ্লয়মেন্ট
  • পরিচয়-ভিত্তিক প্রমাণীকরণ
  • জেমিনি সিএলআই-এর সাথে ইন্টিগ্রেশন

এখন আপনি এই আর্কিটেকচারটিকে BigQuery, Pub/Sub, বা Compute Engine-এর মতো অতিরিক্ত Google Cloud পরিষেবাগুলিকে সমর্থন করার জন্য প্রসারিত করতে পারেন।

এই প্যাটার্নটি দেখায় যে কীভাবে এআই সিস্টেমগুলি কাঠামোগত টুল আহ্বানের মাধ্যমে ক্লাউড অবকাঠামোর সাথে নিরাপদে যোগাযোগ করতে পারে।