1. शुरू करने से पहले
मॉडल कॉन्टेक्स्ट प्रोटोकॉल (एमसीपी) एक ओपन स्टैंडर्ड है. इससे एआई मॉडल और एजेंट, टूल, डेटाबेस, और एंटरप्राइज़ कॉन्टेक्स्ट को सुरक्षित तरीके से ऐक्सेस कर पाते हैं. इस प्रोटोकॉल को 2024 में लॉन्च किया गया था. इसके बाद से, क्लाउड और एलएलएम की सेवाएं देने वाली कई कंपनियों ने इसे अपनाया है. MCP Spec 2026-07-28 (MCP 2.0) की नई खास बातों में, स्टेटलेस आर्किटेक्चर, आसान ट्रांसपोर्ट, और नतीजों के टाइपिंग के लिए सख्त नियम तय किए गए हैं. हालांकि, यह अब भी पुराने वर्शन के साथ काम करता है.
आधिकारिक MCP Python SDK (mcp>=2.0.0) MCPServer (mcp.server.mcpserver.MCPServer) उपलब्ध कराता है. यह MCP 2.0 में FastMCP की जगह लेता है. यह ज़्यादा परफ़ॉर्मेंस वाला और डेवलपर के लिए आसान फ़्रेमवर्क है. इससे, प्रोडक्शन के लिए तैयार MCP सर्वर बनाए जा सकते हैं. ये सर्वर, MCP स्पेसिफ़िकेशन (28-07-2026) के मौजूदा वर्शन के मुताबिक होते हैं. इनमें एसएसएल/टीएलएस पर स्ट्रीम किए जा सकने वाले एचटीटीपी और सर्वर-सेंट इवेंट (एसएसई) ट्रांसपोर्ट होते हैं.
इस कोडलैब में, एमसीपी 2.0 Python SDK से MCPServer और uv डिपेंडेंसी मैनेजमेंट का इस्तेमाल करके, प्रोडक्शन-ग्रेड एमसीपी सर्वर बनाने का तरीका बताया गया है. आपको अपने एमसीपी सर्वर में, Google Cloud के चार टूल (Vertex AI Gemini invocation, Google Cloud Storage inspection, Cloud Logging audit writing, और Google Cloud resource health checking) जोड़ने होंगे. इसके बाद, सर्वर को कंटेनर में बदला जाएगा और इसे Google Cloud के दो रनटाइम टारगेट पर डिप्लॉय किया जाएगा: Cloud Run और Google Kubernetes Engine (GKE) Autopilot. साथ ही, Gemini Enterprise Agent Platform में एमसीपी सर्वर को रजिस्टर किया जाएगा और इसका इस्तेमाल किया जाएगा.
आपको क्या करना होगा
- Python 3.12+ और MCP Spec 2026-07-28 के मुताबिक
uvका इस्तेमाल करके, Google Cloud के चार टूल की मदद सेMCPServerबनाएं. - मल्टी-स्टेज Docker बिल्ड का इस्तेमाल करके, एमसीपी सर्वर को कंटेनर में बदलें.
- एमसीपी सर्वर को Cloud Run पर सुरक्षित तरीके से डिप्लॉय करें. इसके लिए, IAM की पुष्टि करने की सुविधा और एसएसएल/टीएलएस को लागू करें.
- Workload Identity और टीएलएस के साथ Kubernetes Gateway API का इस्तेमाल करके, MCP सर्वर को सुरक्षित करें और उसे GKE Autopilot पर डिप्लॉय करें.
- ओआईडीसी बेयरर टोकन हेडर का इस्तेमाल करके, सुरक्षित एमसीपी सर्वर एंडपॉइंट को Gemini Enterprise Agent Platform के साथ रजिस्टर करें.
आपको किन चीज़ों की ज़रूरत होगी
- बिलिंग की सुविधा वाला Google क्लाउड प्रोजेक्ट.
- Google Cloud SDK (
gcloudसीएलआई) इंस्टॉल और कॉन्फ़िगर किया गया हो. - Python 3.12+ और
uvपैकेज मैनेजर इंस्टॉल किया गया हो. dockerइंस्टॉल किया गया.kubectlकमांड-लाइन टूल इंस्टॉल किया गया हो.
2. Google Cloud एनवायरमेंट सेट अप करना
संसाधन बनाने से पहले, अपने एनवायरमेंट की पुष्टि करें और ज़रूरी Google Cloud API चालू करें.
gcloud सीएलआई की पुष्टि करना
अपने Google Cloud खाते में लॉग इन करें:
gcloud auth login
अपना ऐक्टिव Google क्लाउड प्रोजेक्ट आईडी सेट करें:
export PROJECT_ID=$(gcloud config get-value project)
gcloud config set project ${PROJECT_ID}
Google Cloud की सेवाएं चालू करना
Cloud Run, GKE, Vertex AI, Artifact Registry, Cloud Build, Cloud Logging, Storage, और Compute Engine के लिए ज़रूरी सभी एपीआई चालू करें:
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.
ऐप्लिकेशन के डिफ़ॉल्ट क्रेडेंशियल की पुष्टि करना
अपने एनवायरमेंट की पुष्टि करें, ताकि Python क्लाइंट लाइब्रेरी, डेवलपमेंट के दौरान Vertex AI और Cloud Storage को स्थानीय तौर पर ऐक्सेस कर सकें:
gcloud auth application-default login
3. MCPServer और uv की मदद से एमसीपी सर्वर बनाना
इस चरण में, uv का इस्तेमाल करके Python प्रोजेक्ट को शुरू किया जाएगा. साथ ही, Google Cloud की चार सुविधाओं के साथ काम करने वाला MCPServer बनाया जाएगा.
uv की मदद से प्रोजेक्ट शुरू करना
सर्वर डायरेक्ट्री बनाएं और 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 एचटीटीपी सर्वर, पोर्ट 8080 पर सुन रहा है:
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 का इस्तेमाल करके, स्ट्रीम किए जा सकने वाले एचटीटीपी एंडपॉइंट की पुष्टि करना
एमसीपी 2.0 (एमसीपी स्पेसिफ़िकेशन 2026-07-28) में, स्टेटफ़ुल initialize हैंडशेक और Mcp-Session-Id हेडर को स्टेटलेस अनुरोधों से बदल दिया गया है. params._meta में क्लाइंट मेटाडेटा के साथ MCP-Protocol-Version और Mcp-Method हेडर पास करके, सीधे तौर पर tools/list को चालू किया जा सकता है.
दूसरी टर्मिनल विंडो खोलें और स्ट्रीम किए जा सकने वाले एचटीटीपी पोस्ट का अनुरोध भेजें:
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",...}]}}
तीसरा चरण: एमसीपी टेस्ट क्लाइंट को चलाएं
स्ट्रीमेबल एचटीटीपी पर, अपने लोकल सर्वर पर टूल ढूंढने और उन्हें चलाने की सुविधा की जांच करने के लिए, एक टेस्ट क्लाइंट स्क्रिप्ट 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 दबाएं.
4. एमसीपी सर्वर को कंटेनर में बदलना
एमसीपी सर्वर को Cloud Run और GKE Autopilot पर डिप्लॉय करने के लिए, सर्वर को uv की मदद से अलग-अलग लेवल वाले Dockerfile का इस्तेमाल करके, कम से कम कंटेनर इमेज में पैकेज करें.
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"]
Artifact Registry में इमेज बनाना और उसे पुश करना
Artifact Registry में कोई डेटाबेस बनाएं:
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"
Cloud Build का इस्तेमाल करके, इमेज बिल्ड सबमिट करें:
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}"
प्रोसेस पूरी होने के बाद, आपकी कंटेनर इमेज को Artifact Registry में सुरक्षित तरीके से सेव कर दिया जाता है:
SUCCESS: Image published to us-central1-docker.pkg.dev/.../secure-mcp-server:latest
5. IAM और एचटीटीपीएस के साथ Cloud Run पर डिप्लॉय करना
Cloud Run, पूरी तरह से मैनेज किया गया सर्वरलेस एनवायरमेंट उपलब्ध कराता है. इसमें एचटीटीपीएस / एसएसएल सर्टिफ़िकेट अपने-आप बंद हो जाता है. साथ ही, इसमें Cloud IAM की मदद से ऐक्सेस कंट्रोल को बेहतर तरीके से मैनेज किया जा सकता है.
डेडीकेटेड सेवा खाता बनाना
Cloud Run के लिए, कम से कम अनुमतियों वाला Google सेवा खाता बनाएं:
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"
Cloud Run पर सेवा डिप्लॉय करना
आईएम की पुष्टि करने की सुविधा (--no-allow-unauthenticated) और डिफ़ॉल्ट रूप से मैनेज किए गए एसएसएल के साथ, कंटेनर को Cloud Run पर डिप्लॉय करें:
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}"
एचटीटीपीएस यूआरएल वापस पाएं:
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 आईडी टोकन जनरेट करें:
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",...}]}}
लाइव टूल के एक्ज़ीक्यूशन की जांच करना: Cloud Storage Inspector
अब रिमोट एमसीपी सर्वर की पुष्टि हो गई है और वह जवाब दे रहा है. इसलिए, Google Cloud इन्फ़्रास्ट्रक्चर के ख़िलाफ़ 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"
दूसरा चरण: रिमोट GCS टूल टेस्ट क्लाइंट बनाएं
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())
तीसरा चरण: रिमोट GCS टेस्ट क्लाइंट को चलाएं
uv का इस्तेमाल करके, टेस्ट स्क्रिप्ट चलाएं:
uv run python src/mcp_server/test_gcs_tool.py
आपको Cloud Run एमसीपी सर्वर से लाइव ऑब्जेक्ट मेटाडेटा दिखना चाहिए:
[*] 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":"..."}]}
6. Workload Identity और टीएलएस की मदद से, GKE Autopilot पर डिप्लॉय करना
Kubernetes वर्कलोड के लिए, GKE Autopilot नोड प्रोविज़निंग को मैनेज करता है. वहीं, Workload Identity स्टैटिक सेवा खाते की कुंजियों को हटा देता है.
GKE Autopilot क्लस्टर उपलब्ध कराना
GKE Autopilot क्लस्टर प्रोविज़न करें:
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}"
Workload Identity सेट अप करना
Google सेवा खाता (जीएसए) और Kubernetes सेवा खाता (केएसए) बनाएं. इसके बाद, 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 डिप्लॉयमेंट और Gateway API लागू करना
पहला चरण: nip.io की मदद से स्टैटिक आईपी रिज़र्व करें और Google की ओर से मैनेज किया जाने वाला एसएसएल सर्टिफ़िकेट उपलब्ध कराएं
Kubernetes मेनिफ़ेस्ट लागू करने से पहले, ग्लोबल एक्सटर्नल आईपी पता रिज़र्व करें और वाइल्डकार्ड डीएनएस सेवा nip.io () का इस्तेमाल करके, मान्य सार्वजनिक डोमेन नेम (MCP_DOMAIN) बनाएं:
# 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}"
एसएसएल सर्टिफ़िकेट के प्रोविज़निंग की प्रोसेस पूरी होने का इंतज़ार करने की ज़रूरत नहीं है. Google के मैनेज किए गए सर्टिफ़िकेट, तीसरे चरण में Gateway Load Balancer से अटैच होने तक PROVISIONING स्थिति में रहते हैं. अगले चरणों पर तुरंत जाएं.
दूसरा चरण: डिप्लॉयमेंट और सेवा मेनिफ़ेस्ट बनाना
डिपार्टमेंट और इंटरनल सर्विस की परिभाषाओं वाला deployment.yaml बनाएं. एमसीपी 2.0 (एमसीपी स्पेसिफ़िकेशन 28-07-2026) स्टेटलेस है. इसलिए, Kubernetes Service को क्लाइंट आईपी सेशन अफ़िनिटी की ज़रूरत नहीं होती:
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 मेनिफ़ेस्ट बनाना
गेटवे, एचटीटीपी रूट, HealthCheckPolicy, और GCPBackendPolicy वाला gateway.yaml बनाएं:
HealthCheckPolicy: यह Google Cloud Load Balancer को पोर्ट 8080 पर/healthzकी जांच करने के लिए कॉन्फ़िगर करता है.GCPBackendPolicy(बैकएंड टाइमआउट):timeoutSec: 300को सेट करता है, ताकि यह MCP SDK v2 के 300 सेकंड के रीड टाइमआउट के साथ अलाइन हो सके. यह टाइमआउट, स्ट्रीम किए जा सकने वाले एचटीटीपी / एसएसई स्ट्रीम के लिए होता है. अगर इसे शामिल नहीं किया जाता है, तो GKE गेटवे डिफ़ॉल्ट रूप से 30 सेकंड पर सेट हो जाता है.
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 -
चौथा चरण: पोर्ट-फ़ॉरवर्डिंग का इस्तेमाल करके, एमसीपी सर्वर के डिप्लॉयमेंट की पुष्टि करना और उसकी जांच करना
Google मैनेज किए गए एसएसएल सर्टिफ़िकेट और Google Cloud के बाहरी ऐप्लिकेशन लोड बैलेंसर को डीएनएस राउटिंग की सुविधा देने में 5 से 15 मिनट लगते हैं. इसलिए, 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 सेवा की जांच करें:
- अपने टर्मिनल में, लोकल पोर्ट
8080को GKE ClusterIP सेवा पर फ़ॉरवर्ड करें:
kubectl port-forward svc/mcp-server-service 8080:80
- दूसरे टर्मिनल में,
src/mcp_server/test_vertex_tool.pyनाम की एक टेस्ट क्लाइंट स्क्रिप्ट बनाएं. इसका इस्तेमाल करके, Workload Identity का इस्तेमाल करके GKE परvertex_ai_generate_contentटूल को चालू किया जा सकता है:
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))
- लोकल पोर्ट-फ़ॉरवर्ड किए गए इंस्टेंस के ख़िलाफ़ टेस्ट स्क्रिप्ट चलाएं:
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 पॉड सही तरीके से काम कर रहे हैं, Workload Identity, स्टैटिक क्रेडेंशियल के बिना Vertex AI के ख़िलाफ़ पुष्टि कर रहा है, और स्ट्रीम किए जा सकने वाले एचटीटीपी ट्रांसपोर्ट, उम्मीद के मुताबिक काम कर रहा है!
पांचवां चरण: सार्वजनिक एचटीटीपीएस गेटवे एंडपॉइंट की पुष्टि करना
सर्टिफ़िकेट के प्रावधान की स्थिति देखने के लिए, यह कमांड इस्तेमाल करें:
gcloud compute ssl-certificates describe mcp-server-cert --global --format="value(managed.status)"
सर्टिफ़िकेट की पुष्टि हो जाने के बाद, ACTIVE--host फ़्लैग के साथ Python टेस्ट क्लाइंट का इस्तेमाल करके, सार्वजनिक एचटीटीपीएस एंडपॉइंट की जांच करें:
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.
7. एमसीपी सर्वर को Google Cloud Agent Platform के साथ इंटिग्रेट करना
अब आपका MCPServer, Cloud Run और GKE Autopilot पर एचटीटीपीएस एंडपॉइंट पर सुरक्षित तरीके से डिप्लॉय हो गया है. इसलिए, Google Cloud Agent Platform (एजेंट रजिस्ट्री) के साथ अपने एमसीपी टूल रजिस्टर करें और उन्हें खोजें, ताकि एंटरप्राइज़ एजेंट और एआई मॉडल उन्हें डाइनैमिक तरीके से खोज सकें और उनका इस्तेमाल कर सकें.
1. कस्टम Cloud Run एमसीपी सर्वर को एजेंट प्लैटफ़ॉर्म पर रजिस्टर करना और सर्विस डिस्कवरी का इस्तेमाल करके उसकी जांच करना
पहला चरण: टूल की खास जानकारी निकालना (toolspec.json)
एजेंट रजिस्ट्री में किसी बाहरी या कस्टम एमसीपी सर्वर को रजिस्टर करने के लिए, अपने लाइव स्टेटलेस एमसीपी 2.0 सर्वर पर 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
दूसरा चरण: एजेंट रजिस्ट्री में सेवा को रजिस्टर करना
अपने एमसीपी सर्वर को कैटलॉग करने के लिए, 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 नाम की एक Python स्क्रिप्ट बनाएं. यह स्क्रिप्ट, Agent Registry mcp-servers कैटलॉग से एंडपॉइंट को डाइनैमिक तरीके से हल करती है. साथ ही, Google Cloud 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"}
2. GKE की मदद से, एमसीपी सर्वर का अपने-आप पता लगना और रजिस्टर होना
Google Kubernetes Engine (GKE), Agent Registry के साथ अपने-आप इंटिग्रेट हो जाता है. अपने GKE डिप्लॉयमेंट मेनिफ़ेस्ट को लेबल और एनोटेट करने पर, GKE अपने-आप MCP सर्वर के ख़िलाफ़ इंट्रॉस्पेक्शन स्कैन करता है. साथ ही, टूल को कैटलॉग में रजिस्टर करता है और सेवा को उपभोक्ता की तरफ़ प्रोजेक्ट करता है. इसके लिए, आपको मैन्युअल तरीके से toolspec.json जनरेट या अपलोड करने की ज़रूरत नहीं होती.
पहला चरण: GKE में अपने-आप डिस्कवर होने की सुविधा कैसे काम करती है
पिछले सेक्शन में deployment.yaml लागू होने पर, इन कॉन्फ़िगरेशन की वजह से अपने-आप डिस्कवर होने की सुविधा चालू हो गई थी:
registry.gke.io/functional-type: "MCP_SERVER": यह GKE क्लस्टर कंट्रोलर को, Google Cloud Agent Registry में डिप्लॉयमेंट रजिस्टर करने के लिए सूचना देता है.modelcontextprotocol.info/urls: यह कंट्रोलर इंट्रॉस्पेक्शन और उपभोक्ता राउटिंग के लिए, बाहरी एचटीटीपीएस गेटवे एंडपॉइंट (https://${MCP_DOMAIN}/mcp) उपलब्ध कराता है.modelcontextprotocol.info/capabilities: यह एचटीटीपी ट्रांसपोर्ट एंडपॉइंट (/mcp) के बारे में बताता है.iam.gke.io/spiffe-identity-type: agent-identity: यह एजेंटिक कम्यूनिकेशन के लिए Workload Identity को कॉन्फ़िगर करता है.
दूसरा चरण: एजेंट रजिस्ट्री में GKE के अपने-आप रजिस्टर होने की सुविधा की पुष्टि करना
पुष्टि करें कि GKE ने आपके एमसीपी सर्वर का पता अपने-आप लगा लिया है और उसे रीजनल 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 एमसीपी सर्वर की जांच करना
us-central1 में अपने-आप रजिस्टर हुए सर्वर के नाम के हिसाब से, GKE एमसीपी डिप्लॉयमेंट की जांच करने के लिए, डिवाइस और सेवाओं की अपने-आप पहचान करने वाली स्क्रिप्ट का इस्तेमाल करें:
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"}
8. संसाधन हटाना
इस कोडलैब में इस्तेमाल किए गए संसाधनों के लिए, अपने Google Cloud खाते से शुल्क न लिए जाने के लिए, Cloud Run सेवा, GKE क्लस्टर, सेवा खाते, और कंटेनर रिपॉज़िटरी मिटाएं.
Cloud Run सर्विस मिटाना
gcloud run services delete secure-mcp-server \
--platform=managed \
--region=us-central1 \
--quiet \
--project="${PROJECT_ID}"
GKE Autopilot क्लस्टर मिटाना
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}"
Artifact Registry रिपॉज़िटरी मिटाना
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}"
Cloud Storage बकेट मिटाना
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].
9. बधाई हो
बधाई हो! आपने Google Cloud पर, MCP Python SDK से MCPServer और uv का इस्तेमाल करके, MCP 2.0 सर्वर को बना लिया है, उसे सुरक्षित कर लिया है, और डिप्लॉय कर लिया है!
आपने क्या कवर किया
- बिना स्टेटस वाली स्ट्रीम की जा सकने वाली एचटीटीपी सेवा पर, एमसीपी स्पेसिफ़िकेशन (28-07-2026) के साथ काम करने वाली
MCPServerबनाई गई है. - Google Cloud के चार प्रोडक्शन टूल बनाए गए हैं. इनमें Vertex AI Gemini, Cloud Storage, Cloud Logging, और Resource Health को इंटिग्रेट किया गया है.
- Cloud Run पर सुरक्षित कंटेनर डिप्लॉयमेंट. इसमें आईएएम की पुष्टि करने और एसएसएल/टीएलएस को लागू करने की सुविधा होती है.
- GKE Autopilot पर, Workload Identity और TLS के साथ Kubernetes Gateway API की मदद से, बिना सीक्रेट के पुष्टि करने की सुविधा कॉन्फ़िगर की गई हो.
- ओआईडीसी ऑथराइज़ेशन हेडर का इस्तेमाल करके, Gemini Enterprise Agent Platform (एजेंट रजिस्ट्री) के साथ रजिस्टर किए गए और खोजे गए एमसीपी सर्वर एंडपॉइंट.
अगले चरण
- ऐडवांस संसाधनों और प्रॉम्प्ट की परिभाषाओं के लिए, मॉडल कॉन्टेक्स्ट प्रोटोकॉल की खास जानकारी देखें.
- MCP Python SDK के बारे में ज़्यादा जानें.
- Google Cloud Run की सुरक्षा और GKE Workload Identity के बारे में ज़्यादा जानें.