গুগল ক্লাউডে একটি এমসিপি সার্ভার তৈরি, সুরক্ষিত এবং স্থাপন করুন

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

মডেল কনটেক্সট প্রোটোকল (MCP) একটি উন্মুক্ত স্ট্যান্ডার্ড যা এআই মডেল এবং এজেন্টদের টুলস, ডেটাবেস এবং এন্টারপ্রাইজ কনটেক্সট নিরাপদে অ্যাক্সেস করতে সক্ষম করে। ২০২৪ সালে এর প্রবর্তনের পর থেকে, ক্লাউড এবং এলএলএম প্রোভাইডারদের দ্বারা প্রোটোকলটি ব্যাপকভাবে গৃহীত হয়েছে। এর সর্বশেষ স্পেসিফিকেশন MCP Spec 2026-07-28 (MCP 2.0) একটি স্টেটলেস আর্কিটেকচার, সরলীকৃত ট্রান্সপোর্ট এবং কঠোর রেজাল্ট টাইপিং সংজ্ঞায়িত করে, এবং একই সাথে পূর্ববর্তী সংস্করণগুলোর সাথে ব্যাকওয়ার্ড কম্প্যাটিবল থাকে।

অফিসিয়াল এমসিপি পাইথন এসডিকে ( mcp>=2.0.0 ) MCPServer ( mcp.server.mcpserver.MCPServer ) প্রদান করে, যা এমসিপি ২.০-তে FastMCP )-কে প্রতিস্থাপন করেছে। এটি একটি উচ্চ-পারফরম্যান্স সম্পন্ন ও ডেভেলপার-বান্ধব ফ্রেমওয়ার্ক, যা এসএসএল/টিএলএস (SSL/TLS)-এর মাধ্যমে স্ট্রিমেবল এইচটিটিপি (Streamable HTTP) এবং সার্ভার-সেন্ট ইভেন্টস (SSE) ট্রান্সপোর্টসহ আধুনিক এমসিপি স্পেক (২০২৬-০৭-২৮) অনুযায়ী প্রোডাকশন-রেডি এমসিপি সার্ভার তৈরির জন্য ব্যবহৃত হয়।

এই কোডল্যাবে, আপনি MCP 2.0 পাইথন SDK-এর MCPServer এবং uv ডিপেন্ডেন্সি ম্যানেজমেন্ট ব্যবহার করে একটি প্রোডাকশন-গ্রেড MCP সার্ভার তৈরি করবেন। আপনি আপনার MCP সার্ভারটিকে চারটি গুগল ক্লাউড টুল (Vertex AI Gemini ইনভোকেশন, Google Cloud Storage ইন্সপেকশন, Cloud Logging অডিট রাইটিং এবং Google Cloud রিসোর্স হেলথ চেকিং) দিয়ে সজ্জিত করবেন। এরপর, আপনি সার্ভারটিকে কন্টেইনারাইজ করে দুটি গুগল ক্লাউড রানটাইম টার্গেটে— Cloud Run এবং Google Kubernetes Engine (GKE) Autopilot—ডিপ্লয় করবেন এবং Gemini Enterprise Agent Platform- এ MCP সার্ভারটি রেজিস্টার ও ব্যবহার করবেন।

আপনি যা করবেন

  • পাইথন ৩.১২+ এবং uv ব্যবহার করে এমসিপি স্পেক ২০২৬-০৭-২৮ অনুযায়ী ৪টি গুগল ক্লাউড টুলসহ একটি MCPServer তৈরি করুন।
  • একটি বহু-পর্যায়ের ডকার বিল্ড ব্যবহার করে এমসিপি সার্ভারটিকে কন্টেইনারাইজ করুন।
  • বাধ্যতামূলক IAM প্রমাণীকরণ এবং SSL/TLS ব্যবহার করে MCP সার্ভারটিকে সুরক্ষিত করুন এবং Cloud Run- এ স্থাপন করুন।
  • Workload Identity এবং Kubernetes Gateway API-এর সাথে TLS ব্যবহার করে MCP সার্ভারটিকে সুরক্ষিত করুন এবং GKE Autopilot- এ স্থাপন করুন।
  • OIDC বেয়ারার টোকেন হেডার ব্যবহার করে জেমিনি এন্টারপ্রাইজ এজেন্ট প্ল্যাটফর্মে সুরক্ষিত MCP সার্ভার এন্ডপয়েন্টটি রেজিস্টার করুন।

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

  • বিলিং সক্ষম একটি গুগল ক্লাউড প্রজেক্ট।
  • গুগল ক্লাউড এসডিকে ( gcloud CLI) ইনস্টল ও কনফিগার করা হয়েছে।
  • পাইথন ৩.১২+ এবং uv প্যাকেজ ম্যানেজার ইনস্টল করা আছে।
  • docker ইনস্টল করা হয়েছে।
  • kubectl কমান্ড-লাইন টুল ইনস্টল করা হয়েছে।

২. গুগল ক্লাউড পরিবেশ সেট আপ করুন

রিসোর্স তৈরি করার আগে, আপনার পরিবেশ প্রমাণীকরণ করুন এবং প্রয়োজনীয় গুগল ক্লাউড এপিআইগুলো সক্রিয় করুন।

gcloud CLI প্রমাণীকরণ করুন

আপনার গুগল ক্লাউড অ্যাকাউন্টে লগ ইন করুন:

gcloud auth login

আপনার সক্রিয় গুগল ক্লাউড প্রজেক্ট আইডি সেট করুন:

export PROJECT_ID=$(gcloud config get-value project)
gcloud config set project ${PROJECT_ID}

গুগল ক্লাউড পরিষেবাগুলি সক্রিয় করুন

Cloud Run, GKE, Vertex AI, Artifact Registry, Cloud Build, Cloud Logging, Storage, এবং Compute Engine-এর জন্য প্রয়োজনীয় সকল API সক্রিয় করুন:

gcloud services enable \
    agentregistry.googleapis.com \
    run.googleapis.com \
    container.googleapis.com \
    artifactregistry.googleapis.com \
    aiplatform.googleapis.com \
    logging.googleapis.com \
    storage.googleapis.com \
    compute.googleapis.com \
    iam.googleapis.com \
    cloudbuild.googleapis.com \
    --project="${PROJECT_ID}"

এপিআইগুলো সফলভাবে সক্রিয় করা হয়েছে কিনা তা যাচাই করুন:

Operation "operations/..." finished successfully.

অ্যাপ্লিকেশনটির ডিফল্ট পরিচয়পত্র প্রমাণীকরণ করুন

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

gcloud auth application-default login

৩. MCPServer এবং uv ব্যবহার করে MCP সার্ভারটি তৈরি করুন।

এই ধাপে, আপনি uv ব্যবহার করে একটি পাইথন প্রজেক্ট শুরু করবেন এবং চারটি গুগল ক্লাউড সক্ষমতা সমর্থনকারী একটি MCPServer তৈরি করবেন।

ইউভি দিয়ে প্রজেক্ট শুরু করুন

সার্ভার ডিরেক্টরি তৈরি করুন এবং uv চালু করুন:

mkdir -p mcp-server/src/mcp_server
cd mcp-server
uv init --lib

কোডটি pyproject.toml ফাইলে কপি করুন:

[project]
name = "secure-mcp-gcp-server"
version = "0.1.0"
description = "MCP server with Google Cloud tools supporting MCP Spec 2026-07-28 over Streamable HTTP"
readme = "README.md"
requires-python = ">=3.12"
dependencies = [
    "mcp>=2.0.0",
    "google-genai>=1.0.0",
    "google-cloud-storage>=2.14.0",
    "google-cloud-logging>=3.11.0",
    "google-cloud-resource-manager>=1.12.0",
    "uvicorn>=0.30.0",
    "httpx2>=0.1.0",
    "pydantic>=2.7.0",
]

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

[tool.hatch.build.targets.wheel]
packages = ["src/mcp_server"]

uv ব্যবহার করে নির্ভরতা সিঙ্ক করুন:

uv sync

MCPServer কোড লিখুন

src/mcp_server/server.py তে সার্ভার ইমপ্লিমেন্টেশন ফাইলটি তৈরি করুন:

import logging
import os
from typing import Any

from google import genai
from google.cloud import logging as cloud_logging
from google.cloud import storage
from mcp.server.mcpserver import MCPServer
from starlette.requests import Request
from starlette.responses import PlainTextResponse

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger("mcp-gcp-server")

# Initialize MCPServer conforming to MCP Spec 2026-07-28
mcp = MCPServer(
    "Google Cloud Production Tools",
    instructions="MCP Server conforming to MCP Spec 2026-07-28 for Vertex AI, Cloud Storage, Audit Logging, and Health Inspection.",
)


@mcp.custom_route("/healthz", methods=["GET"])
async def health_check(request: Request) -> PlainTextResponse:
    """Kubernetes readiness and liveness probe health check endpoint."""
    return PlainTextResponse("OK")


@mcp.tool(description="Generate content or answer questions using Vertex AI Gemini model.")
def vertex_ai_generate_content(
    prompt: str,
    model_name: str = "gemini-2.5-flash",
    project_id: str | None = None,
    location: str = "us-central1",
) -> str:
    """Invokes Vertex AI Gemini API using official google-genai SDK."""
    target_project = project_id or os.getenv("GCP_PROJECT") or os.getenv("GOOGLE_CLOUD_PROJECT")
    if not target_project:
        return "Error: GCP project ID not configured."

    try:
        client = genai.Client(vertexai=True, project=target_project, location=location)
        response = client.models.generate_content(
            model=model_name,
            contents=prompt,
        )
        return response.text or "No text returned from Gemini."
    except Exception as e:
        logger.error("Vertex AI Tool Error: %s", e)
        return f"Error executing Vertex AI tool: {e!s}"


@mcp.tool(description="List objects and inspect metadata for a specified Google Cloud Storage bucket.")
def gcs_bucket_inspector(
    bucket_name: str,
    max_results: int = 10,
    prefix: str | None = None,
) -> dict[str, Any]:
    """Inspects GCS bucket content and metadata conforming to MCP Spec 2026-07-28 resultType schema."""
    try:
        client = storage.Client()
        bucket = client.bucket(bucket_name)
        blobs = list(client.list_blobs(bucket, max_results=max_results, prefix=prefix))
        items = [{"name": b.name, "size_bytes": b.size, "updated": str(b.updated)} for b in blobs]
        return {
            "resultType": "complete",
            "bucket_name": bucket_name,
            "object_count_sample": len(items),
            "objects": items,
        }
    except Exception as e:
        logger.error("GCS Inspector Error: %s", e)
        return {"resultType": "complete", "error": f"Failed to inspect GCS bucket: {e!s}"}


@mcp.tool(description="Write structured operational or security audit log records to Google Cloud Logging.")
def cloud_logging_audit_writer(
    log_name: str,
    message: str,
    severity: str = "INFO",
    metadata: dict[str, Any] | None = None,
) -> dict[str, Any]:
    """Sends structured audit entry to Cloud Logging."""
    try:
        client = cloud_logging.Client()
        logger_instance = client.logger(log_name)
        payload = {"message": message, "metadata": metadata or {}, "source": "mcp-server-gcp"}
        logger_instance.log_struct(payload, severity=severity.upper())
        return {
            "resultType": "complete",
            "status": "success",
            "log_name": log_name,
            "recorded_message": message,
        }
    except Exception as e:
        logger.error("Cloud Logging Error: %s", e)
        return {"resultType": "complete", "error": f"Failed to record audit log: {e!s}"}


@mcp.tool(description="Check health and operational state of Google Cloud project resources.")
def gcp_resource_health_checker(project_id: str | None = None) -> dict[str, Any]:
    """Returns project resource summary and status."""
    target_project = project_id or os.getenv("GOOGLE_CLOUD_PROJECT") or "unknown-project"
    return {
        "resultType": "complete",
        "status": "HEALTHY",
        "project_id": target_project,
        "mcp_spec_version": "2026-07-28",
        "_meta": {
            "io.modelcontextprotocol/protocolVersion": "2026-07-28",
            "io.modelcontextprotocol/serverInfo": {"name": "mcp-gcp-server", "version": "0.1.0"},
        },
        "transports_enabled": ["Streamable HTTP"],
        "ssl_tls_enabled": True,
    }


if __name__ == "__main__":
    port = int(os.getenv("PORT", "8080"))
    logger.info("Starting MCPServer on port %d (Streamable HTTP Transport, Spec 2026-07-28)...", port)
    mcp.run(
        transport="streamable-http",
        host="0.0.0.0",
        port=port,
        stateless_http=True,
        json_response=True,
    )

স্থানীয়ভাবে এমসিপি সার্ভার পরীক্ষা করুন

ধাপ ১: এমসিপি সার্ভার চালু করুন

আপনার প্রধান টার্মিনালে, uv ব্যবহার করে সার্ভারটি চালু করুন:

uv run python -m src.mcp_server.server

স্টার্টআপ লগ দেখলে আপনি নিশ্চিত হবেন যে Streamable HTTP সার্ভারটি ৮০৮০ পোর্টে লিসেন করছে:

INFO:mcp-gcp-server:Starting MCPServer on port 8080 (Streamable HTTP Transport, Spec 2026-07-28)...
INFO:     Started server process [12345]
INFO:     Waiting for application startup.
INFO:mcp.server.streamable_http_manager:StreamableHTTP session manager started
INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit)

এই টার্মিনালটি খোলা ও চালু রাখুন।

ধাপ ২: curl ব্যবহার করে Streamable HTTP Endpoint যাচাই করুন

MCP 2.0 ( MCP Spec 2026-07-28 )-এ, স্টেটফুল initialize হ্যান্ডশেক এবং Mcp-Session-Id হেডারকে স্টেটলেস রিকোয়েস্ট দ্বারা প্রতিস্থাপন করা হয়েছে। আপনি params._meta তে ক্লায়েন্ট মেটাডেটার সাথে MCP-Protocol-Version এবং Mcp-Method হেডারগুলো পাস করে সরাসরি tools/list কল করতে পারেন।

দ্বিতীয় একটি টার্মিনাল উইন্ডো খুলুন এবং একটি Streamable HTTP POST অনুরোধ পাঠান:

cd mcp-server
curl -i -X POST http://localhost:8080/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -H "MCP-Protocol-Version: 2026-07-28" \
  -H "Mcp-Method: tools/list" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/list",
    "params": {
      "_meta": {
        "io.modelcontextprotocol/protocolVersion": "2026-07-28",
        "io.modelcontextprotocol/clientInfo": {
          "name": "curl-test",
          "version": "1.0.0"
        },
        "io.modelcontextprotocol/clientCapabilities": {}
      }
    }
  }'

MCPServer HTTP/1.1 200 OK দিয়ে সাড়া দেবে এবং সরাসরি JSON-RPC tools/list ফলাফল ফেরত দেবে:

HTTP/1.1 200 OK
date: Wed, 12 Aug 2026 14:55:00 GMT
server: uvicorn

content-type: application/json

{"jsonrpc":"2.0","id":1,"result":{"tools":[{"name":"vertex_ai_generate_content",...},{"name":"gcs_bucket_inspector",...},{"name":"cloud_logging_audit_writer",...},{"name":"gcp_resource_health_checker",...}]}}

ধাপ ৩: এমসিপি টেস্ট ক্লায়েন্টটি চালান।

Streamable HTTP-এর মাধ্যমে আপনার লোকাল সার্ভারে টুলগুলি আবিষ্কার এবং কার্যকর করা পরীক্ষা করতে, src/mcp_server/test_client.py একটি টেস্ট ক্লায়েন্ট স্ক্রিপ্ট তৈরি করুন:

import asyncio
from mcp import Client
from mcp.types import TextContent


async def test_mcp_server() -> None:
    """Connects to the local MCP v2.0 server, lists tools, and invokes health check."""
    server_url = "http://localhost:8080/mcp"
    print(f"[*] Connecting to local MCPServer at {server_url} (Streamable HTTP)...")

    async with Client(server_url) as client:
        print(
            f"[+] Connected (protocol: {client.protocol_version}, "
            f"server: {client.server_info.name if client.server_info else 'unknown'})."
        )

        # List available tools
        tools_response = await client.list_tools()
        print("\n[*] Discovered MCP Tools:")
        for tool in tools_response.tools:
            print(f"  - {tool.name}: {tool.description}")

        # Invoke gcp_resource_health_checker tool
        print("\n[*] Invoking tool: gcp_resource_health_checker...")
        health_result = await client.call_tool("gcp_resource_health_checker", {})
        print("[+] Result:")
        for content in health_result.content:
            if isinstance(content, TextContent):
                print(content.text)


if __name__ == "__main__":
    asyncio.run(test_mcp_server())

uv ব্যবহার করে টেস্ট ক্লায়েন্ট স্ক্রিপ্টটি চালান:

uv run python src/mcp_server/test_client.py

আপনার আউটপুটে সফল সংযোগ, টুল শনাক্তকরণ এবং টুল সম্পাদন প্রদর্শিত হওয়া উচিত:

[*] Connecting to local MCPServer at http://localhost:8080/mcp (Streamable HTTP)...
[+] Connected (protocol: 2026-07-28, server: Google Cloud Production Tools).

[*] Discovered MCP Tools:
  - vertex_ai_generate_content: Generate content or answer questions using Vertex AI Gemini model.
  - gcs_bucket_inspector: List objects and inspect metadata for a specified Google Cloud Storage bucket.
  - cloud_logging_audit_writer: Write structured operational or security audit log records to Google Cloud Logging.
  - gcp_resource_health_checker: Check health and operational state of Google Cloud project resources.

[*] Invoking tool: gcp_resource_health_checker...
[+] Result:
{"resultType": "complete", "status": "HEALTHY", "project_id": "my-gcp-project", "mcp_spec_version": "2026-07-28", "_meta": {"io.modelcontextprotocol/protocolVersion": "2026-07-28", "io.modelcontextprotocol/serverInfo": {"name": "mcp-gcp-server", "version": "0.1.0"}}, "transports_enabled": ["Streamable HTTP"], "ssl_tls_enabled": true}

যাচাই হয়ে গেলে, স্থানীয় সার্ভারটি বন্ধ করতে আপনার প্রধান টার্মিনালে CTRL+C চাপুন।

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

Cloud Run এবং GKE Autopilot-এ MCP সার্ভারটি ডেপ্লয় করতে, uv দ্বারা চালিত একটি মাল্টি-স্টেজের Dockerfile ব্যবহার করে সার্ভারটিকে একটি মিনিমাল কন্টেইনার ইমেজে প্যাকেজ করুন।

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

mcp-server/Dockerfile এ:

FROM ghcr.io/astral-sh/uv:python3.12-bookworm-slim AS builder

WORKDIR /app
ENV UV_COMPILE_BYTECODE=1 UV_LINK_MODE=copy

COPY pyproject.toml uv.lock* /app/
RUN uv sync --no-install-project --no-dev

COPY README.md /app/
COPY src /app/src
RUN uv sync --no-dev

FROM python:3.12-slim-bookworm

WORKDIR /app
COPY --from=builder /app /app

ENV PATH="/app/.venv/bin:$PATH"
ENV PORT=8080
ENV PYTHONUNBUFFERED=1

EXPOSE 8080
CMD ["python", "-m", "src.mcp_server.server"]

আর্টিফ্যাক্ট রেজিস্ট্রিতে ইমেজ তৈরি করুন এবং পুশ করুন

একটি আর্টিফ্যাক্ট রেজিস্ট্রি রিপোজিটরি তৈরি করুন:

gcloud artifacts repositories create mcp-servers \
    --repository-format=docker \
    --location=us-central1 \
    --description="Docker repository for MCP Servers" \
    --project="${PROJECT_ID}"

আপনার ব্যবহারকারী অ্যাকাউন্ট এবং ডিফল্ট Compute Engine পরিষেবা অ্যাকাউন্টকে প্রয়োজনীয় IAM অনুমতি প্রদান করুন, যাতে Cloud Build সোর্স স্টেজ করতে, লগ লিখতে এবং Artifact Registry-তে ইমেজ পুশ করতে পারে:

export USER_EMAIL=$(gcloud config get-value account)

gcloud projects add-iam-policy-binding "${PROJECT_ID}" \
    --member="user:${USER_EMAIL}" \
    --role="roles/cloudbuild.builds.editor"

gcloud projects add-iam-policy-binding "${PROJECT_ID}" \
    --member="user:${USER_EMAIL}" \
    --role="roles/storage.admin"

export DEFAULT_SA=$(gcloud iam service-accounts list \
    --filter="email:compute@developer.gserviceaccount.com" \
    --format="value(email)" \
    --project="${PROJECT_ID}")

gcloud projects add-iam-policy-binding "${PROJECT_ID}" \
    --member="serviceAccount:${DEFAULT_SA}" \
    --role="roles/storage.objectViewer"

gcloud projects add-iam-policy-binding "${PROJECT_ID}" \
    --member="serviceAccount:${DEFAULT_SA}" \
    --role="roles/artifactregistry.writer"

gcloud projects add-iam-policy-binding "${PROJECT_ID}" \
    --member="serviceAccount:${DEFAULT_SA}" \
    --role="roles/logging.logWriter"

ক্লাউড বিল্ড ব্যবহার করে ইমেজ বিল্ড জমা দিন:

export IMAGE_URI="us-central1-docker.pkg.dev/${PROJECT_ID}/mcp-servers/secure-mcp-server:latest"

gcloud builds submit . --tag="${IMAGE_URI}" --project="${PROJECT_ID}"

সম্পন্ন হলে, আপনার কন্টেইনার ইমেজটি আর্টিফ্যাক্ট রেজিস্ট্রি-তে নিরাপদে সংরক্ষণ করা হয়:

SUCCESS: Image published to us-central1-docker.pkg.dev/.../secure-mcp-server:latest

৫. IAM ও HTTPS সহ ক্লাউড রানে ডেপ্লয় করুন

ক্লাউড রান স্বয়ংক্রিয় HTTPS / SSL সার্টিফিকেট টার্মিনেশন এবং সূক্ষ্ম ক্লাউড IAM অ্যাক্সেস কন্ট্রোল সহ একটি সম্পূর্ণভাবে পরিচালিত সার্ভারলেস পরিবেশ প্রদান করে।

ডেডিকেটেড সার্ভিস অ্যাকাউন্ট তৈরি করুন

ক্লাউড রানের জন্য একটি ন্যূনতম সুবিধাযুক্ত গুগল পরিষেবা অ্যাকাউন্ট তৈরি করুন:

gcloud iam service-accounts create mcp-server-cr-sa \
    --display-name="MCP Server Cloud Run SA" \
    --project="${PROJECT_ID}"

export SA_EMAIL="mcp-server-cr-sa@${PROJECT_ID}.iam.gserviceaccount.com"

# Grant Vertex AI, Logging, and GCS permissions
gcloud projects add-iam-policy-binding "${PROJECT_ID}" \
    --member="serviceAccount:${SA_EMAIL}" \
    --role="roles/aiplatform.user"

gcloud projects add-iam-policy-binding "${PROJECT_ID}" \
    --member="serviceAccount:${SA_EMAIL}" \
    --role="roles/logging.logWriter"

gcloud projects add-iam-policy-binding "${PROJECT_ID}" \
    --member="serviceAccount:${SA_EMAIL}" \
    --role="roles/storage.objectViewer"

ক্লাউড রানে সার্ভিস ডিপ্লয় করুন

বাধ্যতামূলক IAM প্রমাণীকরণ ( --no-allow-unauthenticated ) এবং ডিফল্ট পরিচালিত SSL সহ কন্টেইনারটি ক্লাউড রানে স্থাপন করুন:

gcloud run deploy secure-mcp-server \
    --image="${IMAGE_URI}" \
    --platform=managed \
    --region=us-central1 \
    --service-account="${SA_EMAIL}" \
    --set-env-vars="GOOGLE_CLOUD_PROJECT=${PROJECT_ID}" \
    --no-allow-unauthenticated \
    --ingress=all \
    --project="${PROJECT_ID}"

HTTPS URL-টি পুনরুদ্ধার করুন:

export CLOUD_RUN_URL=$(gcloud run services describe secure-mcp-server --platform=managed --region=us-central1 --format='value(status.url)' --project="${PROJECT_ID}")
echo "Cloud Run HTTPS Endpoint: ${CLOUD_RUN_URL}"

এন্ডপয়েন্ট নিরাপত্তা যাচাই করুন

Streamable HTTP এন্ডপয়েন্টে অননুমোদিত অনুরোধ করার চেষ্টা করলে 403 Forbidden ফেরত আসবে:

curl -i -X POST "${CLOUD_RUN_URL}/mcp" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -H "MCP-Protocol-Version: 2026-07-28" \
  -H "Mcp-Method: tools/list" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/list",
    "params": {
      "_meta": {
        "io.modelcontextprotocol/protocolVersion": "2026-07-28",
        "io.modelcontextprotocol/clientInfo": {
          "name": "curl-test",
          "version": "1.0.0"
        },
        "io.modelcontextprotocol/clientCapabilities": {}
      }
    }
  }'
HTTP/2 403
content-type: text/html; charset=UTF-8
date: Mon, 11 Aug 2026 14:00:00 GMT

অনুমোদিত যোগাযোগ যাচাই করার জন্য gcloud ব্যবহার করে একটি OIDC ID টোকেন তৈরি করুন:

export ID_TOKEN=$(gcloud auth print-identity-token --audiences="${CLOUD_RUN_URL}")

curl -i -X POST "${CLOUD_RUN_URL}/mcp" \
  -H "Authorization: Bearer ${ID_TOKEN}" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -H "MCP-Protocol-Version: 2026-07-28" \
  -H "Mcp-Method: tools/list" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/list",
    "params": {
      "_meta": {
        "io.modelcontextprotocol/protocolVersion": "2026-07-28",
        "io.modelcontextprotocol/clientInfo": {
          "name": "curl-test",
          "version": "1.0.0"
        },
        "io.modelcontextprotocol/clientCapabilities": {}
      }
    }
  }'
HTTP/2 200
content-type: application/json

{"jsonrpc":"2.0","id":1,"result":{"tools":[{"name":"vertex_ai_generate_content",...},{"name":"gcs_bucket_inspector",...},{"name":"cloud_logging_audit_writer",...},{"name":"gcp_resource_health_checker",...}]}}

লাইভ টুল এক্সিকিউশন পরীক্ষা করুন: ক্লাউড স্টোরেজ ইন্সপেক্টর

এখন যেহেতু রিমোট এমসিপি সার্ভারটি প্রমাণীকৃত এবং সাড়া দিচ্ছে, গুগল ক্লাউড ইনফ্রাস্ট্রাকচারের বিপরীতে gcs_bucket_inspector টুলটি চালিয়ে পরীক্ষা করুন।

ধাপ ১: একটি টেস্ট ক্লাউড স্টোরেজ বাকেট তৈরি করুন

একটি টেস্ট বাকেট তৈরি করুন এবং একটি নমুনা ফাইল আপলোড করুন:

export BUCKET_NAME="${PROJECT_ID}-mcp-demo"

# Create Cloud Storage bucket
gcloud storage buckets create "gs://${BUCKET_NAME}" \
    --location=us-central1 \
    --project="${PROJECT_ID}"

# Upload sample file
echo "Hello from Secure MCP on Google Cloud!" > sample.txt
gcloud storage cp sample.txt "gs://${BUCKET_NAME}/sample.txt"

ধাপ ২: রিমোট জিসিএস টুল টেস্ট ক্লায়েন্ট তৈরি করুন

Cloud Run-এর সাথে প্রমাণীকরণের জন্য এবং gcs_bucket_inspector টুলটি চালু করার জন্য src/mcp_server/test_gcs_tool.py নামে একটি টেস্ট ক্লায়েন্ট স্ক্রিপ্ট তৈরি করুন:

import asyncio
import os
import subprocess
import httpx2
from mcp import Client
from mcp.client.streamable_http import streamable_http_client
from mcp.types import TextContent


async def test_gcs_tool() -> None:
    """Authenticates to Cloud Run via OIDC and invokes the gcs_bucket_inspector tool."""
    cloud_run_url = os.getenv("CLOUD_RUN_URL")
    bucket_name = os.getenv("BUCKET_NAME")

    if not cloud_run_url or not bucket_name:
        print("[!] Please set both CLOUD_RUN_URL and BUCKET_NAME environment variables.")
        return

    # Generate Google OIDC ID token for Cloud Run authentication
    id_token = subprocess.check_output(
        ["gcloud", "auth", "print-identity-token", f"--audiences={cloud_run_url.rstrip('/')}"],
        text=True,
    ).strip()

    headers = {"Authorization": f"Bearer {id_token}"}
    server_url = f"{cloud_run_url.rstrip('/')}/mcp"

    print(f"[*] Connecting to remote Cloud Run MCP server at {server_url} (Streamable HTTP)...")
    async with httpx2.AsyncClient(
        headers=headers,
        timeout=httpx2.Timeout(30.0, read=300.0),
    ) as http_client:
        transport = streamable_http_client(server_url, http_client=http_client)
        async with Client(transport) as client:
            print(
                f"[+] Authenticated and connected (protocol: {client.protocol_version})."
            )

            # List tools
            tools_response = await client.list_tools()
            print(f"[*] Verified {len(tools_response.tools)} available tools on Cloud Run.")

            # Invoke gcs_bucket_inspector tool
            print(f"\n[*] Invoking tool: gcs_bucket_inspector on '{bucket_name}'...")
            result = await client.call_tool(
                "gcs_bucket_inspector", {"bucket_name": bucket_name}
            )

            print("[+] Response from Cloud Run MCP Server:")
            for content in result.content:
                if isinstance(content, TextContent):
                    print(content.text)


if __name__ == "__main__":
    asyncio.run(test_gcs_tool())

ধাপ ৩: রিমোট জিসিএস টেস্ট ক্লায়েন্টটি চালান

uv ব্যবহার করে টেস্ট স্ক্রিপ্টটি চালান:

uv run python src/mcp_server/test_gcs_tool.py

আপনি ক্লাউড রান এমসিপি সার্ভার থেকে ফেরত আসা লাইভ অবজেক্ট মেটাডেটা দেখতে পাবেন:

[*] Connecting to remote Cloud Run MCP server at https://secure-mcp-server-...-uc.a.run.app/mcp (Streamable HTTP)...
[+] Authenticated and connected (protocol: 2026-07-28).
[*] Verified 4 available tools on Cloud Run.

[*] Invoking tool: gcs_bucket_inspector on 'my-project-mcp-demo'...
[+] Response from Cloud Run MCP Server:
{"resultType":"complete","bucket_name":"my-project-mcp-demo","object_count_sample":1,"objects":[{"name":"sample.txt","size_bytes":39,"updated":"..."}]}

৬. ওয়ার্কলোড আইডেন্টিটি ও টিএলএস সহ জিকেই অটোপাইলটে ডেপ্লয় করুন

Kubernetes ওয়ার্কলোডের ক্ষেত্রে, GKE Autopilot নোড প্রভিশনিং পরিচালনা করে এবং Workload Identity স্ট্যাটিক সার্ভিস অ্যাকাউন্ট কী-এর প্রয়োজনীয়তা দূর করে।

GKE অটোপাইলট ক্লাস্টার সরবরাহ করুন

একটি GKE অটোপাইলট ক্লাস্টার প্রস্তুত করুন:

gcloud container clusters create-auto mcp-gke-cluster \
    --location=us-central1 \
    --project="${PROJECT_ID}"

gcloud container clusters get-credentials mcp-gke-cluster \
    --location=us-central1 \
    --project="${PROJECT_ID}"

ওয়ার্কলোড আইডেন্টিটি সেট আপ করুন

একটি Google Service Account (GSA) এবং একটি Kubernetes Service Account (KSA) তৈরি করুন, তারপর Workload Identity ব্যবহার করে সেগুলোকে লিঙ্ক করুন:

# 1. Create GSA
gcloud iam service-accounts create mcp-gke-sa \
    --display-name="GKE MCP Service Account" \
    --project="${PROJECT_ID}"

export GSA_EMAIL="mcp-gke-sa@${PROJECT_ID}.iam.gserviceaccount.com"

# 2. Grant IAM Roles to GSA
gcloud projects add-iam-policy-binding "${PROJECT_ID}" --member="serviceAccount:${GSA_EMAIL}" --role="roles/aiplatform.user"
gcloud projects add-iam-policy-binding "${PROJECT_ID}" --member="serviceAccount:${GSA_EMAIL}" --role="roles/logging.logWriter"
gcloud projects add-iam-policy-binding "${PROJECT_ID}" --member="serviceAccount:${GSA_EMAIL}" --role="roles/storage.objectViewer"

# 3. Create KSA
kubectl create serviceaccount mcp-server-ksa --namespace default

# 4. Annotate KSA
kubectl annotate serviceaccount mcp-server-ksa \
    --namespace default \
    iam.gke.io/gcp-service-account="${GSA_EMAIL}"

# 5. Bind KSA to GSA
gcloud iam service-accounts add-iam-policy-binding "${GSA_EMAIL}" \
    --role="roles/iam.workloadIdentityUser" \
    --member="serviceAccount:${PROJECT_ID}.svc.id.goog[default/mcp-server-ksa]" \
    --project="${PROJECT_ID}"

TLS সহ Kubernetes Deployment এবং Gateway API প্রয়োগ করুন

ধাপ ১: nip.io-এর মাধ্যমে স্ট্যাটিক আইপি রিজার্ভ করুন এবং গুগল-পরিচালিত এসএসএল সার্টিফিকেট প্রোভিশন করুন।

একটি গ্লোবাল এক্সটার্নাল আইপি অ্যাড্রেস রিজার্ভ করুন এবং nip.io ওয়াইল্ডকার্ড ডিএনএস পরিষেবা ব্যবহার করুন। . .nip.io Kubernetes ম্যানিফেস্ট প্রয়োগ করার আগে একটি বৈধ পাবলিক ডোমেইন নাম ( MCP_DOMAIN ) প্রতিষ্ঠা করতে . .nip.io ) ব্যবহার করুন:

# Reserve global static IP address for GKE Gateway Load Balancer
gcloud compute addresses create mcp-server-ip \
    --global \
    --project="${PROJECT_ID}"

export MCP_IP=$(gcloud compute addresses describe mcp-server-ip --global --format="value(address)" --project="${PROJECT_ID}")
export MCP_DOMAIN="mcp.${MCP_IP}.nip.io"

echo "Reserved Static IP: ${MCP_IP}"
echo "Configured nip.io Domain: ${MCP_DOMAIN}"

# Provision Google-managed SSL certificate
gcloud compute ssl-certificates create mcp-server-cert \
    --domains="${MCP_DOMAIN}" \
    --global \
    --project="${PROJECT_ID}"

এগিয়ে যাওয়ার জন্য আপনাকে SSL সার্টিফিকেটের প্রোভিশনিং শেষ হওয়ার অপেক্ষা করতে হবে না—প্রকৃতপক্ষে, গুগল-পরিচালিত সার্টিফিকেটগুলো ধাপ ৩-এ গেটওয়ে লোড ব্যালান্সারের সাথে সংযুক্ত না হওয়া পর্যন্ত PROVISIONING অবস্থাতেই থাকে। অবিলম্বে পরবর্তী ধাপগুলোতে এগিয়ে যান।

ধাপ ২: ডিপ্লয়মেন্ট এবং সার্ভিস ম্যানিফেস্ট তৈরি করুন

Deployment এবং অভ্যন্তরীণ Service-এর সংজ্ঞা সম্বলিত deployment.yaml তৈরি করুন। যেহেতু MCP 2.0 ( MCP Spec 2026-07-28 ) স্টেটলেস, তাই Kubernetes Service জন্য ক্লায়েন্ট IP সেশন অ্যাফিনিটির প্রয়োজন হয় না:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mcp-server-deployment
  namespace: default
  labels:
    app: mcp-server
    # GKE takes this label and registers the deployment as an MCP server to Agent Registry
    registry.gke.io/functional-type: "MCP_SERVER"
  annotations:
    # Endpoint URL where the GKE controller can access this MCP server
    modelcontextprotocol.info/urls: |
      - https://MCP_DOMAIN/mcp
    # Defines structural capabilities for the MCP server card
    modelcontextprotocol.info/capabilities: |
      card:
        endpoint: "/mcp"
        protocol: "HTTP"
spec:
  replicas: 2
  selector:
    matchLabels:
      app: mcp-server
  template:
    metadata:
      labels:
        app: mcp-server
      annotations:
        # Workload Identity annotation for identity and access management
        iam.gke.io/spiffe-identity-type: agent-identity
    spec:
      serviceAccountName: mcp-server-ksa
      containers:
      - name: mcp-server
        image: us-central1-docker.pkg.dev/PROJECT_ID/mcp-servers/secure-mcp-server:latest
        ports:
        - containerPort: 8080
          name: http
        env:
        - name: PORT
          value: "8080"
        - name: GOOGLE_CLOUD_PROJECT
          value: "PROJECT_ID"
        resources:
          requests:
            cpu: "250m"
            memory: "512Mi"
          limits:
            cpu: "1000m"
            memory: "1Gi"
        readinessProbe:
          httpGet:
            path: /healthz
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 10
        livenessProbe:
          httpGet:
            path: /healthz
            port: 8080
          initialDelaySeconds: 10
          periodSeconds: 15
---
apiVersion: v1
kind: Service
metadata:
  name: mcp-server-service
  namespace: default
  labels:
    app: mcp-server
spec:
  type: ClusterIP
  ports:
  - port: 80
    targetPort: 8080
    name: http
  selector:
    app: mcp-server

MCP_DOMAIN এবং PROJECT_ID প্রতিস্থাপন করুন এবং ডেপ্লয়মেন্টটি প্রয়োগ করুন:

sed -e "s|MCP_DOMAIN|${MCP_DOMAIN}|g" \
    -e "s|PROJECT_ID|${PROJECT_ID}|g" \
    deployment.yaml | kubectl apply -f -

ধাপ ৩: Gateway API, HealthCheckPolicy, এবং GCPBackendPolicy Manifest তৈরি করুন।

Gateway, HTTPRoute, HealthCheckPolicy এবং GCPBackendPolicy সম্বলিত gateway.yaml তৈরি করুন:

  • HealthCheckPolicy : গুগল ক্লাউড লোড ব্যালেন্সারকে পোর্ট ৮০৮০-তে /healthz প্রোব করার জন্য কনফিগার করে।
  • GCPBackendPolicy (ব্যাকএন্ড টাইমআউট) : Streamable HTTP / SSE স্ট্রিমগুলির জন্য MCP SDK v2-এর ৩০০-সেকেন্ডের রিড টাইমআউটের সাথে সামঞ্জস্য রেখে timeoutSec: 300 সেট করে (এটি বাদ দিলে GKE গেটওয়ে ডিফল্টভাবে ৩০ সেকেন্ড সেট করে)।
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: mcp-gateway
  namespace: default
spec:
  gatewayClassName: gke-l7-global-external-managed
  listeners:
  - name: https
    protocol: HTTPS
    port: 443
    tls:
      mode: Terminate
      options:
        networking.gke.io/pre-shared-certs: mcp-server-cert
  addresses:
  - type: NamedAddress
    value: mcp-server-ip
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: mcp-http-route
  namespace: default
spec:
  parentRefs:
  - name: mcp-gateway
  hostnames:
  - "MCP_DOMAIN"
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /
    backendRefs:
    - name: mcp-server-service
      port: 80
---
apiVersion: networking.gke.io/v1
kind: HealthCheckPolicy
metadata:
  name: mcp-health-check-policy
  namespace: default
spec:
  default:
    checkIntervalSec: 15
    timeoutSec: 5
    healthyThreshold: 1
    unhealthyThreshold: 2
    config:
      type: HTTP
      httpHealthCheck:
        port: 8080
        requestPath: /healthz
  targetRef:
    group: ""
    kind: Service
    name: mcp-server-service
---
apiVersion: networking.gke.io/v1
kind: GCPBackendPolicy
metadata:
  name: mcp-backend-policy
  namespace: default
spec:
  default:
    # Aligns with MCP SDK v2's 300s read timeout for Streamable HTTP / SSE streams
    # (GKE Gateway defaults to 30s if omitted)
    timeoutSec: 300
  targetRef:
    group: ""
    kind: Service
    name: mcp-server-service

Gateway, HTTPRoute, HealthCheckPolicy, এবং GCPBackendPolicy প্রয়োগ করুন:

sed "s/MCP_DOMAIN/${MCP_DOMAIN}/g" gateway.yaml | kubectl apply -f -

ধাপ ৪: পোর্ট-ফরোয়ার্ড ব্যবহার করে ডেপ্লয়মেন্ট যাচাই করুন এবং এমসিপি সার্ভার পরীক্ষা করুন।

যেহেতু গুগল-পরিচালিত SSL সার্টিফিকেট এবং বাহ্যিক গুগল ক্লাউড অ্যাপ্লিকেশন লোড ব্যালেন্সারগুলোর প্রোভিশনিং ও DNS রাউটিং স্থাপন করতে ৫ থেকে ১৫ মিনিট সময় লাগে, তাই আপনি kubectl port-forward ব্যবহার করে চলমান GKE পডগুলো তাৎক্ষণিকভাবে পরীক্ষা করতে পারেন।

প্রথমে, আপনার পড এবং গেটওয়ে চালু আছে কিনা তা যাচাই করুন:

kubectl get pods -l app=mcp-server
kubectl get gateway mcp-gateway
NAME                                     READY   STATUS    RESTARTS   AGE
mcp-server-deployment-7b8f9495c5-x2n8q   1/1     Running   0          45s
mcp-server-deployment-7b8f9495c5-z4k9p   1/1     Running   0          45s

NAME          CLASS                             ADDRESS          PROGRAMMED   AGE
mcp-gateway   gke-l7-global-external-managed   34.120.x.x       True         2m

এরপরে, পোর্ট ফরওয়ার্ডিং ব্যবহার করে স্থানীয়ভাবে লাইভ GKE পরিষেবাটি পরীক্ষা করুন:

  1. আপনার টার্মিনালে, লোকাল পোর্ট 8080 GKE ClusterIP সার্ভিসে ফরওয়ার্ড করুন:
kubectl port-forward svc/mcp-server-service 8080:80
  1. দ্বিতীয় একটি টার্মিনালে, ওয়ার্কলোড আইডেন্টিটি ব্যবহার করে GKE-তে vertex_ai_generate_content টুলটি চালু করার জন্য src/mcp_server/test_vertex_tool.py নামের একটি টেস্ট ক্লায়েন্ট স্ক্রিপ্ট তৈরি করুন:
import argparse
import asyncio
import os
from mcp import Client
from mcp.types import TextContent


async def test_vertex_tool(server_url: str) -> None:
    """Connects to the MCP v2.0 server and invokes the vertex_ai_generate_content tool."""
    print(f"[*] Connecting to MCPServer at {server_url} (Streamable HTTP)...")

    async with Client(server_url) as client:
        print(
            f"[+] Connected (protocol: {client.protocol_version}, "
            f"server: {client.server_info.name if client.server_info else 'unknown'})."
        )

        # List available tools
        tools_response = await client.list_tools()
        print(f"[*] Discovered {len(tools_response.tools)} MCP Tools:")
        for tool in tools_response.tools:
            print(f"  - {tool.name}")

        # Invoke vertex_ai_generate_content tool
        prompt = "Explain in 2 sentences why Model Context Protocol (MCP) Streamable HTTP is great for cloud deployments."
        print(f"\n[*] Invoking tool: vertex_ai_generate_content with prompt: '{prompt}'...")

        result = await client.call_tool(
            "vertex_ai_generate_content",
            {
                "prompt": prompt,
                "model_name": "gemini-2.5-flash",
            },
        )

        print("\n[+] Response from Vertex AI Gemini:")
        for content in result.content:
            if isinstance(content, TextContent):
                print(content.text)


if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="Test Vertex AI MCP Tool on MCPServer.")
    parser.add_argument(
        "--host",
        default=os.getenv("MCP_URL", "http://localhost:8080/mcp"),
        help="MCP Server host or URL (default: http://localhost:8080/mcp or $MCP_URL)",
    )
    args = parser.parse_args()

    # Normalize URL format
    url = args.host
    if not url.startswith("http://") and not url.startswith("https://"):
        url = f"https://{url}"
    if not url.endswith("/mcp"):
        url = f"{url.rstrip('/')}/mcp"

    asyncio.run(test_vertex_tool(url))
  1. স্থানীয় পোর্ট-ফরোয়ার্ড করা ইনস্ট্যান্সের বিরুদ্ধে টেস্ট স্ক্রিপ্টটি চালান:
uv run python src/mcp_server/test_vertex_tool.py --host="http://localhost:8080/mcp"
[*] Connecting to MCPServer at http://localhost:8080/mcp (Streamable HTTP)...
[+] Connected (protocol: 2026-07-28, server: Google Cloud Production Tools).
[*] Discovered 4 MCP Tools:
  - vertex_ai_generate_content
  - gcs_bucket_inspector
  - cloud_logging_audit_writer
  - gcp_resource_health_checker

[*] Invoking tool: vertex_ai_generate_content with prompt: 'Explain in 2 sentences why Model Context Protocol (MCP) Streamable HTTP is great for cloud deployments.'...

[+] Response from Vertex AI Gemini:
MCP Streamable HTTP enables lightweight, stateless HTTP interactions that scale effortlessly across cloud-native platforms like GKE and Cloud Run. It simplifies infrastructure management by using standard HTTP/HTTPS protocols while preserving rich bidirectional streaming for AI agents.

এটি নিশ্চিত করে যে GKE পডগুলি সুস্থ আছে, ওয়ার্কলোড আইডেন্টিটি স্ট্যাটিক ক্রেডেনশিয়াল ছাড়াই ভার্টেক্স এআই-এর বিরুদ্ধে সফলভাবে প্রমাণীকরণ করছে, এবং স্ট্রিমেবল HTTP ট্রান্সপোর্ট প্রত্যাশিতভাবে কাজ করছে!

ধাপ ৫: পাবলিক HTTPS গেটওয়ে এন্ডপয়েন্ট যাচাই করুন

সার্টিফিকেট প্রোভিশনিং স্ট্যাটাস চেক করুন:

gcloud compute ssl-certificates describe mcp-server-cert --global --format="value(managed.status)"

সার্টিফিকেটটি ACTIVE হয়ে গেলে, পাইথন টেস্ট ক্লায়েন্ট ব্যবহার করে --host ফ্ল্যাগ সহ পাবলিক HTTPS এন্ডপয়েন্টটি পরীক্ষা করুন:

uv run python src/mcp_server/test_vertex_tool.py --host="https://${MCP_DOMAIN}/mcp"
[*] Connecting to MCPServer at https://mcp.34.120.x.x.nip.io/mcp (Streamable HTTP)...
[+] Connected (protocol: 2026-07-28, server: Google Cloud Production Tools).
[*] Discovered 4 MCP Tools:
  - vertex_ai_generate_content
  - gcs_bucket_inspector
  - cloud_logging_audit_writer
  - gcp_resource_health_checker

[*] Invoking tool: vertex_ai_generate_content with prompt: 'Explain in 2 sentences why Model Context Protocol (MCP) Streamable HTTP is great for cloud deployments.'...

[+] Response from Vertex AI Gemini:
MCP Streamable HTTP enables lightweight, stateless HTTP interactions that scale effortlessly across cloud-native platforms like GKE and Cloud Run. It simplifies infrastructure management by using standard HTTP/HTTPS protocols while preserving rich bidirectional streaming for AI agents.

৭. গুগল ক্লাউড এজেন্ট প্ল্যাটফর্মের সাথে এমসিপি সার্ভারকে একীভূত করুন

এখন যেহেতু আপনার MCPServer ক্লাউড রান এবং GKE অটোপাইলটের HTTPS এন্ডপয়েন্টগুলিতে নিরাপদে ডেপ্লয় করা হয়েছে, তাই আপনার MCP টুলগুলিকে গুগল ক্লাউড এজেন্ট প্ল্যাটফর্ম (এজেন্ট রেজিস্ট্রি)-এর সাথে রেজিস্টার ও ডিসকভার করুন, যাতে এন্টারপ্রাইজ এজেন্ট এবং AI মডেলগুলি সেগুলিকে ডায়নামিকভাবে খুঁজে পেতে এবং ইনভোক করতে পারে।

১. এজেন্ট প্ল্যাটফর্মে কাস্টম ক্লাউড রান এমসিপি সার্ভার নিবন্ধন করুন এবং সার্ভিস ডিসকভারি ব্যবহার করে পরীক্ষা করুন

ধাপ ১: টুলের স্পেসিফিকেশন ( toolspec.json ) বের করুন।

এজেন্ট রেজিস্ট্রি- তে একটি বাহ্যিক বা কাস্টম এমসিপি সার্ভার রেজিস্টার করতে, আপনার লাইভ স্টেটলেস এমসিপি ২.০ সার্ভারে tools/list কোয়েরি করুন, টুল-লেভেলের _meta ফিল্ডগুলি বাদ দিন, এবং ফলাফলটি একটি একক পাইপলাইনে toolspec.json এ সেভ করুন:

# 1. Generate identity token
export ID_TOKEN=$(gcloud auth print-identity-token --audiences="${CLOUD_RUN_URL}")

# 2. Query, parse, sanitize and save in one single pipeline
curl -s -X POST "${CLOUD_RUN_URL}/mcp" \
  -H "Authorization: Bearer ${ID_TOKEN}" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -H "MCP-Protocol-Version: 2026-07-28" \
  -H "Mcp-Method: tools/list" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/list",
    "params": {
      "_meta": {
        "io.modelcontextprotocol/protocolVersion": "2026-07-28",
        "io.modelcontextprotocol/clientInfo": {
          "name": "cli",
          "version": "1.0.0"
        },
        "io.modelcontextprotocol/clientCapabilities": {}
      }
    }
  }' \
  | sed -n 's/^data: //p; /^{/p' \
  | jq '.result | del(.tools[]._meta)' > toolspec.json

ধাপ ২: এজেন্ট রেজিস্ট্রি-তে সার্ভিসটি রেজিস্টার করুন।

আপনার MCP সার্ভার ক্যাটালগ করতে gcloud agent-registry services create ব্যবহার করুন:

export SERVER_NAME="secure-mcp-server"
export DISPLAY_NAME="Google Cloud MCPServer"
export REGION="global"

gcloud agent-registry services create "${SERVER_NAME}" \
  --project="${PROJECT_ID}" \
  --location="${REGION}" \
  --display-name="${DISPLAY_NAME}" \
  --mcp-server-spec-type="tool-spec" \
  --mcp-server-spec-content=toolspec.json \
  --interfaces="url=${CLOUD_RUN_URL}/mcp,protocolBinding=jsonrpc"

পরিষেবাটি সফলভাবে নিবন্ধিত হয়েছে কিনা তা যাচাই করুন:

gcloud agent-registry services describe "${SERVER_NAME}" --location="${REGION}"
name: projects/PROJECT_ID/locations/global/services/secure-mcp-server
displayName: Google Cloud MCPServer
interfaces:
- protocolBinding: JSONRPC
  url: https://secure-mcp-server-xxxx.a.run.app/mcp
mcpServerSpec:
  type: TOOL_SPEC

ধাপ ৩: সার্ভিস ডিসকভারি টেস্ট ক্লায়েন্ট তৈরি এবং রান করুন

src/mcp_server/test_agent_platform.py নামে একটি পাইথন স্ক্রিপ্ট তৈরি করুন যা এজেন্ট রেজিস্ট্রি mcp-servers ক্যাটালগ থেকে ডায়নামিকভাবে এন্ডপয়েন্টটি রিজলভ করে, গুগল ক্লাউড IAM দিয়ে অথেন্টিকেট করে, এবং httpx2 ও MCP 2.0 Client ব্যবহার করে একটি টুল কল করে।

import asyncio
import os
import subprocess
import httpx2  # MCP SDK 2.x utilizes httpx2 instead of httpx
from mcp import Client
from mcp.client.streamable_http import streamable_http_client


async def main() -> None:
    server_name = os.getenv("SERVER_NAME", "secure-mcp-server")
    location = os.getenv("REGION", "global")

    # 1. Discover endpoint URL from Google Cloud Agent Registry (mcp-servers catalog)
    print(f"[*] Discovering '{server_name}' in '{location}' from Agent Registry...")
    url = subprocess.check_output(
        [
            "gcloud",
            "agent-registry",
            "mcp-servers",
            "list",
            f"--location={location}",
            f"--filter=displayName='{server_name}' OR mcpServerId ~ ':{server_name}$'",
            "--format=value(interfaces[0].url)",
            "--limit=1",
        ],
        text=True,
    ).strip()

    if not url:
        raise RuntimeError(
            f"No endpoint URL found for '{server_name}' in location '{location}'. "
            "Verify the server is registered and has an interface URL configured."
        )
    print(f"[+] Discovered Endpoint: {url}")

    # 2. Generate IAM identity token if connecting to Cloud Run
    headers: dict[str, str] = {}
    if "run.app" in url:
        audience = url.split("/mcp")[0]
        token = subprocess.check_output(
            ["gcloud", "auth", "print-identity-token", f"--audiences={audience}"],
            text=True,
        ).strip()
        headers["Authorization"] = f"Bearer {token}"

    # 3. Configure a custom httpx2 Client with MCP-safe timeouts
    # We set read to 300s to ensure the long-lived SSE/GET stream stays open
    async with httpx2.AsyncClient(
        headers=headers,
        timeout=httpx2.Timeout(30.0, read=300.0),
    ) as http_client:

        # 4. Initialize Streamable HTTP Transport (yielding a 2-tuple in MCP v2.x)
        transport = streamable_http_client(url, http_client=http_client)

        # 5. Connect using the clean high-level Client interface
        async with Client(transport) as client:
            print("[+] Session active. Connected successfully.")

            # Verify tools registered in the catalog (Attributes are snake_case in MCP v2)
            tools_response = await client.list_tools()
            print(f"[+] Discovered {len(tools_response.tools)} tools:")
            for tool in tools_response.tools:
                print(f"    - {tool.name}")

            # Test executing the health check tool
            print("\n[*] Invoking tool: gcp_resource_health_checker...")
            result = await client.call_tool("gcp_resource_health_checker", {})
            print(f"[+] Tool Output from Agent Platform:\n{result.content[0].text}")


if __name__ == "__main__":
    asyncio.run(main())

টেস্ট স্ক্রিপ্টটি চালান:

uv run python src/mcp_server/test_agent_platform.py
[*] Discovering 'secure-mcp-server' in 'global' from Agent Registry...
[+] Discovered Endpoint: https://secure-mcp-server-xxxx.a.run.app/mcp
[+] Session active. Connected successfully.
[+] Discovered 4 tools:
    - vertex_ai_generate_content
    - gcs_bucket_inspector
    - cloud_logging_audit_writer
    - gcp_resource_health_checker

[*] Invoking tool: gcp_resource_health_checker...
[+] Tool Output from Agent Platform:
{"resultType": "complete", "status": "HEALTHY", "mcp_spec_version": "2026-07-28"}

২. GKE ব্যবহার করে স্বয়ংক্রিয়ভাবে MCP সার্ভার শনাক্তকরণ এবং নিবন্ধন

গুগল কুবারনেটিস ইঞ্জিন (GKE) এজেন্ট রেজিস্ট্রি-এর সাথে স্বয়ংক্রিয় ইন্টিগ্রেশন প্রদান করে। আপনার GKE ডিপ্লয়মেন্ট ম্যানিফেস্টকে লেবেল ও অ্যানোটেট করার মাধ্যমে, GKE স্বয়ংক্রিয়ভাবে MCP সার্ভারের বিরুদ্ধে একটি ইন্ট্রোস্পেকশন স্ক্যান সম্পাদন করে, টুলগুলিকে ক্যাটালগে রেজিস্টার করে এবং ম্যানুয়ালি toolspec.json তৈরি বা আপলোড করার প্রয়োজন ছাড়াই সার্ভিসটিকে কনজিউমার সাইডে প্রজেক্ট করে।

ধাপ ১: GKE অটোমেটিক ডিসকভারি কীভাবে কাজ করে

পূর্ববর্তী বিভাগে যখন আপনার deployment.yaml প্রয়োগ করা হয়েছিল, তখন নিম্নলিখিত কনফিগারেশনগুলি স্বয়ংক্রিয় ডিসকভারি সক্ষম করেছিল:

  • registry.gke.io/functional-type: "MCP_SERVER" : GKE ক্লাস্টার কন্ট্রোলারকে গুগল ক্লাউড এজেন্ট রেজিস্ট্রি-তে ডেপ্লয়মেন্টটি রেজিস্টার করার জন্য নির্দেশ দেয়।
  • modelcontextprotocol.info/urls : কন্ট্রোলার ইন্ট্রোস্পেকশন এবং কনজিউমার রাউটিং-এর জন্য এক্সটার্নাল HTTPS গেটওয়ে এন্ডপয়েন্ট ( https://${MCP_DOMAIN}/mcp ) প্রদান করে।
  • modelcontextprotocol.info/capabilities : HTTP ট্রান্সপোর্ট এন্ডপয়েন্ট ( /mcp ) ঘোষণা করে।
  • iam.gke.io/spiffe-identity-type: agent-identity : এজেন্টিক যোগাযোগের জন্য ওয়ার্কলোড আইডেন্টিটি কনফিগার করে।

ধাপ ২: এজেন্ট রেজিস্ট্রিতে GKE অটো-রেজিস্ট্রেশন যাচাই করুন

যাচাই করুন যে GKE স্বয়ংক্রিয়ভাবে আপনার MCP সার্ভারটি আঞ্চলিক mcp-servers ক্যাটালগে খুঁজে পেয়েছে এবং নিবন্ধন করেছে:

# List the automatically registered GKE MCP server in us-central1
gcloud agent-registry mcp-servers list \
  --location=us-central1 \
  --format="table(displayName, tools.len():label=TOOLS)"
DISPLAY_NAME           TOOLS
mcp-server-deployment  4

ধাপ ৩: সার্ভিস ডিসকভারি ব্যবহার করে GKE MCP সার্ভার পরীক্ষা করুন

us-central1 এ স্বয়ংক্রিয়ভাবে নিবন্ধিত সার্ভার নামের বিপরীতে সার্ভিস ডিসকভারি স্ক্রিপ্ট ব্যবহার করে আপনার GKE MCP ডেপ্লয়মেন্ট পরীক্ষা করুন:

SERVER_NAME="mcp-server-deployment" \
REGION=us-central1 \
uv run python src/mcp_server/test_agent_platform.py
[*] Discovering 'mcp-server-deployment' in 'us-central1' from Agent Registry...
[+] Discovered Endpoint: https://mcp.34.120.x.x.nip.io/mcp
[+] Session active. Connected successfully.
[+] Discovered 4 tools:
    - vertex_ai_generate_content
    - gcs_bucket_inspector
    - cloud_logging_audit_writer
    - gcp_resource_health_checker

[*] Invoking tool: gcp_resource_health_checker...
[+] Tool Output from Agent Platform:
{"resultType": "complete", "status": "HEALTHY", "mcp_spec_version": "2026-07-28"}

৮. সম্পদ পরিষ্কার করুন

এই কোডল্যাবে ব্যবহৃত রিসোর্সগুলির জন্য আপনার গুগল ক্লাউড অ্যাকাউন্টে চার্জ হওয়া এড়াতে, ক্লাউড রান সার্ভিস, GKE ক্লাস্টার, সার্ভিস অ্যাকাউন্ট এবং কন্টেইনার রিপোজিটরি ডিলিট করে দিন।

ক্লাউড রান পরিষেবা মুছে ফেলুন

gcloud run services delete secure-mcp-server \
    --platform=managed \
    --region=us-central1 \
    --quiet \
    --project="${PROJECT_ID}"

GKE অটোপাইলট ক্লাস্টার মুছুন

gcloud container clusters delete mcp-gke-cluster \
    --location=us-central1 \
    --quiet \
    --project="${PROJECT_ID}"

সার্ভিস অ্যাকাউন্ট এবং আইএএম বাইন্ডিং মুছে ফেলুন

gcloud iam service-accounts delete "mcp-server-cr-sa@${PROJECT_ID}.iam.gserviceaccount.com" --quiet --project="${PROJECT_ID}"
gcloud iam service-accounts delete "mcp-gke-sa@${PROJECT_ID}.iam.gserviceaccount.com" --quiet --project="${PROJECT_ID}"

আর্টিফ্যাক্ট রেজিস্ট্রি রিপোজিটরি মুছুন

gcloud artifacts repositories delete mcp-servers \
    --location=us-central1 \
    --quiet \
    --project="${PROJECT_ID}"

এজেন্ট রেজিস্ট্রি কাস্টম পরিষেবা মুছুন

gcloud agent-registry services delete secure-mcp-server \
    --location=global \
    --quiet \
    --project="${PROJECT_ID}"

ক্লাউড স্টোরেজ বাকেট মুছুন

gcloud storage rm --recursive "gs://${BUCKET_NAME}" --quiet

স্ট্যাটিক আইপি এবং এসএসএল সার্টিফিকেট মুছে ফেলুন

gcloud compute ssl-certificates delete mcp-server-cert --global --quiet --project="${PROJECT_ID}"
gcloud compute addresses delete mcp-server-ip --global --quiet --project="${PROJECT_ID}"

মুছে ফেলা পরিষ্কারের কাজ সম্পন্ন হয়েছে যাচাই করুন:

Deleted service [secure-mcp-server].
Deleted cluster [mcp-gke-cluster].
Deleted repository [mcp-servers].

৯. অভিনন্দন

অভিনন্দন! আপনি MCP Python SDK-এর MCPServer এবং Google Cloud-এর uv ব্যবহার করে সফলভাবে একটি MCP 2.0 সার্ভার তৈরি, সুরক্ষিত এবং স্থাপন করেছেন!

আপনি যা কভার করেছেন

  • স্টেটলেস স্ট্রিমেবল HTTP-এর মাধ্যমে MCP স্পেক (২০২৬-০৭-২৮) সমর্থনকারী একটি MCPServer নির্মাণ করা হয়েছে।
  • Vertex AI Gemini, Cloud Storage, Cloud Logging, এবং Resource Health-কে সমন্বিত করে ৪টি প্রোডাকশন গুগল ক্লাউড টুল তৈরি করা হয়েছে।
  • বাধ্যতামূলক IAM প্রমাণীকরণ এবং SSL/TLS সহ ক্লাউড রান -এ সুরক্ষিত কন্টেইনার স্থাপন।
  • GKE Autopilot- এ Workload Identity এবং Kubernetes Gateway API-তে TLS ব্যবহার করে সিক্রেটলেস অথেন্টিকেশন কনফিগার করা হয়েছে।
  • OIDC অনুমোদন হেডার ব্যবহার করে জেমিনি এন্টারপ্রাইজ এজেন্ট প্ল্যাটফর্ম (এজেন্ট রেজিস্ট্রি)-এ MCP সার্ভার এন্ডপয়েন্টগুলো নিবন্ধিত ও আবিষ্কৃত করা হয়েছে।

পরবর্তী পদক্ষেপ