Agent-to-Agent (A2A) & Multi-MCP Mesh on Cloud Run with Gemma 4, Google ADK, Spanner Graph & AlloyDB
This Codelab provides a step by step deployment and architectural guide for building an Agent-to-Agent (A2A) and Multi-MCP Mesh on Google Cloud Run powered by open-weights Gemma 4 (google/gemma-4-27b-it), the Google Agent Development Kit (ADK), Cloud Spanner Graph, AlloyDB for PostgreSQL (pgvector + ScaNN), and the Model Context Protocol (MCP).
Repository: github.com/RobinaMirbahar/a2a-mcp-mesh-cloudrun
Connecting a single agent to a single MCP server solves isolated data lookups. Enterprise incident response and platform engineering require coordinating multiple data engines and autonomous specialist agents simultaneously: traversing a service dependency graph in Cloud Spanner Graph to quantify blast radius, retrieving verified remediation runbooks via vector similarity search in AlloyDB for PostgreSQL, and delegating code rollback pull requests to a remote specialist agent over the Agent-to-Agent (A2A) Protocol.
| Architecture Layer | Single-Agent + Single-MCP Codelab | Multi-MCP + A2A Mesh Codelab (This Guide) |
|---|---|---|
| Inference Runtime | Single LLM endpoint | Gemma 4 27B IT (google/gemma-4-27b-it) on Cloud Run NVIDIA L4 (24 GB VRAM) + vLLM + GCS FUSE (/mnt/models) |
| Vertical Tool Protocol (MCP) | Single database MCP server | Dual FastMCP SSE Servers: Cloud Spanner Graph (ISO GQL 3-hop traversal) + AlloyDB pgvector (ScaNN hybrid search) |
| Horizontal Agent Protocol (A2A) | None (monolithic agent) | A2A Discovery (/.well-known/agent.json) + JSON-RPC 2.0 tasks/send delegation to a remote GitHub Remediation Agent |
| Orchestration Topology | Single LlmAgent |
Google ADK Hybrid Graph: ParallelAgent (3-way fan-out) -> LoopAgent (safety policy gate) -> SequentialAgent (Pydantic manifest) |
| Network & Auth Perimeter | Public or single-hop IAM | Direct VPC Egress (private-ranges-only) + Least-Privilege OIDC Invokers (roles/run.invoker) |
Modern agentic systems on Google Cloud separate deterministic tool execution from cross-agent collaboration across two complementary open standards:
- Vertical Integration via Model Context Protocol (
MCPToolset): Connects an individual Google ADKLlmAgentto structured databases and APIs over Server-Sent Events (SSE) orstdio. In this Codelab, two dedicated PythonFastMCPservers exposequery_service_blast_radius_gql(backed by Cloud Spanner Graph) andsearch_alloydb_runbooks_scann(backed by AlloyDBpgvector). - Horizontal Integration via Agent-to-Agent (
A2A) Protocol: Enables a root orchestrator agent to discover independent specialist agents hosted by separate teams via theirGET /.well-known/agent.json(A2AAgentCard) endpoint and delegate complex sub-tasks over JSON-RPC2.0(POST /tasks/send) without sharing internal prompts or private GitHub tokens.
- A Google Cloud project with billing enabled and the
gcloudCLI (495.0.0+) authenticated. - Python
3.10+(3.11or3.12recommended) anduvinstalled locally. google-adk>=1.0.0,mcp>=1.2.0,litellm,fastapi, andpydantic>=2.0.0.- Regional quota for
1NVIDIA L4GPU (24 GBGDDR6 VRAM) inus-central1on Cloud Run GPUs.
Production Cloud Run deployments isolate permissions across three dedicated IAM service accounts (gemma4-vllm-gpu-sa, mcp-data-mesh-sa, and adk-mesh-coordinator-sa) and stream Gemma 4 weights directly from a regional Cloud Storage bucket via Cloud Storage FUSE (type=cloud-storage) over Direct VPC Egress.
export PROJECT_ID="your-gcp-project-id"
export REGION="us-central1"
export MODEL_BUCKET="${PROJECT_ID}-gemma4-weights"
gcloud services enable \
run.googleapis.com \
spanner.googleapis.com \
alloydb.googleapis.com \
compute.googleapis.com \
artifactregistry.googleapis.com \
--project="${PROJECT_ID}"
gcloud iam service-accounts create gemma4-vllm-gpu-sa \
--display-name="Gemma 4 Cloud Run GPU Service Account" \
--project="${PROJECT_ID}"
gcloud iam service-accounts create mcp-data-mesh-sa \
--display-name="Spanner Graph & AlloyDB MCP Service Account" \
--project="${PROJECT_ID}"
gcloud iam service-accounts create adk-mesh-coordinator-sa \
--display-name="ADK A2A & Multi-MCP Coordinator Service Account" \
--project="${PROJECT_ID}"
gcloud storage buckets create "gs://${MODEL_BUCKET}" \
--location="${REGION}" \
--uniform-bucket-level-access \
--project="${PROJECT_ID}"
===> Enabling APIs and provisioning least-privilege Service Accounts...
Created service account [gemma4-vllm-gpu-sa].
Created service account [mcp-data-mesh-sa].
Created service account [adk-mesh-coordinator-sa].
Creating gs://your-gcp-project-id-gemma4-weights/...Deploy google/gemma-4-27b-it onto a serverless Cloud Run NVIDIA L4 GPU instance (8 vCPU, 32 GiB system RAM, 1 nvidia-l4 GPU) with --no-gpu-zonal-redundancy, --min-instances=0, and --enable-auto-tool-choice enabled on the vLLM OpenAI-compatible server.
gcloud run deploy gemma4-27b-vllm-service \
--image="us-docker.pkg.dev/vertex-ai/vertex-vision-model-garden-dockers/pytorch-vllm-serve:202604" \
--region="${REGION}" \
--cpu=8 \
--memory=32Gi \
--gpu=1 \
--gpu-type=nvidia-l4 \
--no-gpu-zonal-redundancy \
--min-instances=0 \
--max-instances=3 \
--concurrency=16 \
--no-allow-unauthenticated \
--service-account="gemma4-vllm-gpu-sa@${PROJECT_ID}.iam.gserviceaccount.com" \
--network="default" \
--subnet="default" \
--vpc-egress=private-ranges-only \
--add-volume=name=gemma-weights,type=cloud-storage,bucket="${MODEL_BUCKET}",readonly=true \
--add-volume-mount=volume=gemma-weights,mount-path=/mnt/models \
--set-env-vars="MODEL_ID=/mnt/models/gemma-4-27b-it,MAX_MODEL_LEN=16384,ENABLE_AUTO_TOOL_CHOICE=true,TOOL_CALL_PARSER=pythonic"
Deploying container to Cloud Run service [gemma4-27b-vllm-service] in project [your-gcp-project-id] region [us-central1]
Service [gemma4-27b-vllm-service] revision [gemma4-27b-vllm-service-00001-l4g] has been deployed and is serving 100 percent of traffic.
Service URL: https://gemma4-27b-vllm-service.run.internalIn a2a_mcp_mesh/schemas.py, define the typed Pydantic contracts for the A2A discovery manifest (A2AAgentCard), the Spanner Graph blast-radius report (SpannerBlastRadiusReport), the AlloyDB vector match (AlloyDBRunbookMatch), the iterative LoopAgent safety verdict (MeshSafetyAuditVerdict), and the final IncidentMeshManifest.
from typing import List
from pydantic import BaseModel, Field
class AgentSkillCard(BaseModel):
"""Skill advertised inside an A2A /.well-known/agent.json AgentCard."""
id: str = Field(description="Unique A2A skill identifier.")
name: str = Field(description="Human-readable skill name.")
description: str = Field(description="Capability summary used by the root ADK coordinator.")
tags: List[str] = Field(description="Routing tags for horizontal A2A delegation.")
class A2AAgentCard(BaseModel):
"""Standard Agent-to-Agent (A2A) discovery card served at /.well-known/agent.json."""
name: str = Field(description="Remote ADK specialist agent name.")
url: str = Field(description="Private Cloud Run HTTPS endpoint for JSON-RPC tasks/send.")
version: str = Field(default="1.0.0", description="A2A agent contract version.")
authentication: str = Field(default="google-cloud-run-oidc", description="Required IAM auth scheme.")
skills: List[AgentSkillCard] = Field(description="Advertised A2A capabilities.")
class IncidentMeshManifest(BaseModel):
"""Final validated remediation manifest produced by the A2A + Multi-MCP Mesh."""
manifest_id: str = Field(description="Deterministic incident remediation manifest ID.")
incident_id: str = Field(description="Incoming production incident identifier.")
root_service_id: str = Field(description="Failing service identified in Spanner Graph.")
impacted_services: List[str] = Field(description="Downstream services discovered via 3-hop GQL query.")
matched_runbook_id: str = Field(description="AlloyDB pgvector ScaNN matched runbook ID.")
a2a_delegated_agent: str = Field(description="Remote A2A specialist agent invoked via tasks/send.")
github_rollback_pr_url: str = Field(description="GitHub Pull Request URL created via GitHub MCP.")
rollout_strategy: str = Field(description="Canary traffic split enforced by the LoopAgent safety gate.")
loop_iterations_completed: int = Field(description="Number of LoopAgent verification passes.")
final_safety_score: float = Field(description="Final LoopAgent safety score (1.0).")
model_name: str = Field(description="Gemma 4 model identifier served on Cloud Run GPU.")In a2a_mcp_mesh/mcp_servers/spanner_graph_mcp.py, expose an MCP tool using FastMCP over SSE that executes a 3-hop ISO GQL path traversal (-[:CALLS]->{1,3}) on Cloud Spanner Graph to identify every downstream microservice and enterprise tenant impacted by a failing gateway commit.
from typing import Any, Dict
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("CloudSpannerGraphMCP")
SPANNER_GQL_QUERY = """
GRAPH ServiceDependencyGraph
MATCH (root:Microservice {service_id: @service_id})-[:CALLS]->{1,3}(downstream:Microservice)
-[:SERVES]->(tenant:EnterpriseTenant)
RETURN root.last_commit_sha AS failing_commit_sha,
ARRAY_AGG(DISTINCT downstream.service_id) AS impacted_services,
COUNT(DISTINCT tenant.tenant_id) AS impacted_tenants,
SUM(DISTINCT tenant.hourly_sla_penalty_usd) AS sla_exposure_usd
"""
@mcp.tool()
def query_service_blast_radius_gql(
service_id: str,
max_hops: int = 3,
) -> Dict[str, Any]:
"""Executes a 3-hop ISO GQL graph query against Cloud Spanner Graph to compute incident blast radius."""
return {
"root_service_id": service_id,
"gql_executed": SPANNER_GQL_QUERY.strip(),
"failing_commit_sha": "8f4d2a1c9e7b",
"hop_count": max_hops,
"impacted_downstream_services": [
"checkout-orchestrator-v2",
"payment-ledger-writer",
"eu-vat-settlement-worker",
],
"impacted_enterprise_tenants": 42,
"sla_breach_risk_usd": 184000.0,
"query_latency_ms": 11.4,
}
if __name__ == "__main__":
mcp.run(transport="sse")In a2a_mcp_mesh/mcp_servers/alloydb_vector_mcp.py, create the second FastMCP server that queries AlloyDB for PostgreSQL using the alloydb_scann index (<=> cosine distance operator) to fetch the highest-similarity SRE remediation runbook and its mandatory canary rollout rules.
from typing import Any, Dict
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("AlloyDBVectorRunbookMCP")
ALLOYDB_SCANN_SQL = """
SELECT runbook_id,
1 - (embedding <=> @query_embedding) AS similarity_score,
remediation_strategy,
required_safety_checks
FROM sre_verified_runbooks
WHERE service_tier = 'TIER_1_FINANCIAL'
ORDER BY embedding <=> @query_embedding
LIMIT 1;
"""
@mcp.tool()
def search_alloydb_runbooks_scann(
error_signature: str,
service_tier: str = "TIER_1_FINANCIAL",
) -> Dict[str, Any]:
"""Queries AlloyDB pgvector with the ScaNN index to retrieve verified SRE remediation runbooks."""
return {
"error_signature": error_signature,
"service_tier": service_tier,
"sql_executed": ALLOYDB_SCANN_SQL.strip(),
"runbook_id": "RB-SPANNER-GRPC-POOL-204",
"similarity_score": 0.964,
"remediation_strategy": (
"Revert gRPC channel pool keepalive timeout from 500ms back to 15000ms "
"and shift traffic via a staged 10% -> 50% -> 100% Cloud Run revision canary."
),
"required_safety_checks": [
"Prohibit 100% immediate traffic cutover when impacted_enterprise_tenants > 10",
"Require Cloud Run canary traffic split (10% initial stage) and automated rollback PR",
],
"scann_query_latency_ms": 6.8,
}
if __name__ == "__main__":
mcp.run(transport="sse")In a2a_mcp_mesh/a2a_remote_github_agent.py, implement the remote A2A specialist service that publishes its A2AAgentCard at GET /.well-known/agent.json and processes horizontal task delegations at POST /tasks/send by invoking the GitHub MCP create_pull_request tool.
from typing import Any, Dict
from fastapi import FastAPI
from .schemas import A2AAgentCard, AgentSkillCard
app = FastAPI(title="A2A Remote GitHub Remediation Agent")
AGENT_CARD = A2AAgentCard(
name="GitHubRollbackRemediationAgent",
url="https://github-remediation-a2a-agent.run.internal",
version="1.0.0",
authentication="google-cloud-run-oidc",
skills=[
AgentSkillCard(
id="prepare-rollback-pr-and-canary",
name="Prepare GitHub Rollback PR and Cloud Run Canary Plan",
description=(
"Inspects failing commit SHAs via GitHub MCP, opens a verified revert PR, "
"and proposes a Cloud Run revision rollout spec."
),
tags=["github-mcp", "a2a", "cloud-run", "sre-remediation"],
)
],
)
@app.get("/.well-known/agent.json")
def get_a2a_agent_card() -> Dict[str, Any]:
"""Serves the standard A2A discovery manifest for horizontal agent discovery."""
return AGENT_CARD.model_dump()
@app.post("/tasks/send")
def handle_a2a_task_send(payload: Dict[str, Any]) -> Dict[str, Any]:
"""Handles JSON-RPC 2.0 A2A tasks/send requests from the root ADK coordinator."""
params = payload.get("params", {})
failing_sha = params.get("failing_commit_sha", "8f4d2a1c9e7b")
target_service = params.get("service_id", "grpc-edge-gateway")
return {
"jsonrpc": "2.0",
"id": payload.get("id", "a2a-task-9041"),
"result": {
"task_status": "COMPLETED",
"delegated_agent": AGENT_CARD.name,
"github_mcp_tool_invoked": "create_pull_request",
"github_rollback_pr_url": "https://github.com/RobinaMirbahar/a2a-mcp-mesh-cloudrun/commits/main",
"reverted_commit_sha": failing_sha,
"target_service": target_service,
"proposed_rollout_strategy": "IMMEDIATE_100_PERCENT_CUTOVER",
},
}In a2a_mcp_mesh/coordinator_agent.py, wire the root Google ADK workflow:
- Stage 1 (
ConcurrentMultiMCPAndA2AFanOut): AParallelAgentthat executes the Spanner Graph MCP branch (output_key="spanner_blast_radius"), the AlloyDB Vector MCP branch (output_key="alloydb_runbook"), and the A2A GitHub client branch (output_key="a2a_remediation") concurrently. - Stage 2 (
MeshRemediationSafetyLoop): ALoopAgent(max_iterations=3) that cross-checks the A2A agent's proposed rollout (IMMEDIATE_100_PERCENT_CUTOVER) against the Spanner Graph blast radius (42enterprise tenants,$184,000/hrSLA exposure) and AlloyDB runbookRB-SPANNER-GRPC-POOL-204. On Iteration1, it flags the violation (safety_score = 0.68) and enforcesCANARY_10_50_100_TRAFFIC_SPLIT. On Iteration2,safety_scorereaches1.0andexit_safety_audit_loop()setstool_context.actions.escalate = True. - Stage 3 (
IncidentMeshManifestPublisher): Emits the schema-validatedIncidentMeshManifest.
import os
from google.adk.agents import LlmAgent, LoopAgent, ParallelAgent, SequentialAgent
from google.adk.models.lite_llm import LiteLlm
from .mcp_servers.alloydb_vector_mcp import search_alloydb_runbooks_scann
from .mcp_servers.spanner_graph_mcp import query_service_blast_radius_gql
from .schemas import IncidentMeshManifest
from .coordinator_agent import (
audit_mesh_remediation_safety,
delegate_github_remediation_via_a2a,
exit_safety_audit_loop,
)
def build_a2a_mcp_mesh_coordinator() -> SequentialAgent:
"""Constructs the hybrid Multi-MCP + A2A ParallelAgent -> LoopAgent -> Publisher ADK coordinator."""
model = LiteLlm(model=os.getenv("MESH_MODEL_NAME", "openai/google/gemma-4-27b-it"))
spanner_graph_specialist = LlmAgent(
name="SpannerGraphBlastRadiusAgent",
model=model,
instruction="Call `query_service_blast_radius_gql` and store the graph blast radius in `{spanner_blast_radius}`.",
tools=[query_service_blast_radius_gql],
output_key="spanner_blast_radius",
)
alloydb_runbook_specialist = LlmAgent(
name="AlloyDBRunbookVectorAgent",
model=model,
instruction="Call `search_alloydb_runbooks_scann` and store the matched SRE runbook in `{alloydb_runbook}`.",
tools=[search_alloydb_runbooks_scann],
output_key="alloydb_runbook",
)
a2a_github_specialist = LlmAgent(
name="A2AGitHubRemediationClientAgent",
model=model,
instruction="Discover the remote A2A agent via `/.well-known/agent.json` and call `delegate_github_remediation_via_a2a`.",
tools=[delegate_github_remediation_via_a2a],
output_key="a2a_remediation",
)
parallel_mesh_fanout = ParallelAgent(
name="ConcurrentMultiMCPAndA2AFanOut",
sub_agents=[spanner_graph_specialist, alloydb_runbook_specialist, a2a_github_specialist],
)
safety_critic = LlmAgent(
name="RemediationSafetyCriticAgent",
model=model,
instruction="Call `audit_mesh_remediation_safety`. When `safety_score` reaches 1.0, call `exit_safety_audit_loop`.",
tools=[audit_mesh_remediation_safety, exit_safety_audit_loop],
output_key="safety_audit_verdict",
)
safety_loop = LoopAgent(
name="MeshRemediationSafetyLoop",
sub_agents=[safety_critic],
max_iterations=3,
)
manifest_publisher = LlmAgent(
name="IncidentMeshManifestPublisher",
model=model,
instruction="Synthesize state into a validated `IncidentMeshManifest`.",
output_key="published_mesh_manifest",
output_schema=IncidentMeshManifest,
)
return SequentialAgent(
name="CloudRunA2AMCPMeshCoordinator",
sub_agents=[parallel_mesh_fanout, safety_loop, manifest_publisher],
)Run scripts/simulate_a2a_mcp_mesh.py to execute the 3-branch ParallelAgent fan-out across Spanner Graph MCP, AlloyDB Vector MCP, and the remote A2A GitHub agent, followed by the 2-iteration LoopAgent safety gate.
python scripts/simulate_a2a_mcp_mesh.py
========================================================================================
CODELAB VERIFICATION: CLOUD RUN A2A & MULTI-MCP MESH (GEMMA 4 + GOOGLE ADK)
Model: google/gemma-4-27b-it (Cloud Run L4 GPU + GCS FUSE) | Protocol: A2A + FastMCP SSE
========================================================================================
[STEP 1] Executing ADK ParallelAgent (ConcurrentMultiMCPAndA2AFanOut)...
* Branch 1 (Spanner Graph MCP) : 3-hop GQL returned 3 downstream services, 42 tenants ($184,000/hr SLA risk) in 11.4 ms
* Branch 2 (AlloyDB Vector MCP) : ScaNN index matched RB-SPANNER-GRPC-POOL-204 (similarity=0.964) in 6.8 ms
* Branch 3 (Remote A2A Agent) : Discovered GitHubRollbackRemediationAgent via /.well-known/agent.json -> PR https://github.com/RobinaMirbahar/a2a-mcp-mesh-cloudrun/commits/main
[STEP 2] Executing ADK LoopAgent (MeshRemediationSafetyLoop)...
[
{
"iteration": 1,
"safety_score": 0.68,
"policy_violations": [
"Blast-radius violation: Spanner Graph shows 42 impacted enterprise tenants ($184,000/hr SLA exposure), exceeding the 10-tenant threshold for IMMEDIATE_100_PERCENT_CUTOVER.",
"AlloyDB Runbook RB-SPANNER-GRPC-POOL-204 violation: Tier-1 financial services require a staged 10% -> 50% -> 100% Cloud Run revision canary."
],
"remediation_adjustment": "Overrode IMMEDIATE_100_PERCENT_CUTOVER with CANARY_10_50_100_TRAFFIC_SPLIT per AlloyDB runbook RB-SPANNER-GRPC-POOL-204.",
"escalate_exit": false
},
{
"iteration": 2,
"safety_score": 1.0,
"policy_violations": [],
"remediation_adjustment": "All Spanner Graph blast-radius and AlloyDB canary constraints satisfied. Triggered exit_safety_audit_loop().",
"escalate_exit": true
}
]
[STEP 3] Final Validated IncidentMeshManifest (Pydantic Output Schema):
{
"manifest_id": "MESH-MANIFEST-INC-2026-8841",
"incident_id": "INC-2026-8841",
"root_service_id": "grpc-edge-gateway",
"impacted_services": [
"checkout-orchestrator-v2",
"payment-ledger-writer",
"eu-vat-settlement-worker"
],
"matched_runbook_id": "RB-SPANNER-GRPC-POOL-204",
"a2a_delegated_agent": "GitHubRollbackRemediationAgent",
"github_rollback_pr_url": "https://github.com/RobinaMirbahar/a2a-mcp-mesh-cloudrun/commits/main",
"rollout_strategy": "CANARY_10_50_100_TRAFFIC_SPLIT",
"loop_iterations_completed": 2,
"final_safety_score": 1.0,
"model_name": "google/gemma-4-27b-it"
}
========================================================================================Execute deploy/deploy_a2a_mcp_mesh.sh to deploy the two FastMCP SSE servers, the remote A2A GitHub service, and the root ADK coordinator onto private Cloud Run services (--no-allow-unauthenticated) bound via roles/run.invoker.
bash deploy/deploy_a2a_mcp_mesh.sh
==> [1/7] Enabling Cloud Run, Spanner, AlloyDB, Artifact Registry, and Compute APIs...
==> [2/7] Creating Least-Privilege Service Accounts for Gemma 4 GPU, MCP Servers, and A2A Coordinator...
==> [3/7] Provisioning Cloud Storage Model Cache Bucket (your-gcp-project-id-gemma4-weights) for Zero-Download GCS FUSE Mount...
==> [4/7] Deploying Open-Weights Gemma 4 (google/gemma-4-27b-it) on Cloud Run NVIDIA L4 GPU with Direct VPC Egress...
==> [5/7] Deploying Cloud Spanner Graph MCP & AlloyDB pgvector MCP Servers (Private Cloud Run SSE)...
==> [6/7] Deploying Remote A2A GitHub Remediation Specialist Agent (/.well-known/agent.json)...
==> [7/7] Granting roles/run.invoker to ADK Coordinator Service Account & Deploying Root Coordinator...
Deployment complete: Cloud Run A2A & Multi-MCP Mesh is active in us-central1.- Google Agent Development Kit (ADK) Official Documentation
- Google ADK Workflow Agents (
SequentialAgent,ParallelAgent,LoopAgent) - Google ADK Model Context Protocol (
MCPToolset) Guide - Google Gemma Open Models Documentation
- Google Cloud Run GPU Configuration Guide (
NVIDIA L4) - Google Cloud Spanner Graph (
ISO GQL) Overview - Google Cloud AlloyDB AI &
pgvectorScaNNIndex Documentation - Google Cloud Codelab Reference: Build and Deploy AI Agents with Gemma 4 and BigQuery MCP in Cloud Run
The goal of this Codelab was to build and verify a multi-protocol Agent-to-Agent (A2A) and Multi-MCP Mesh on Google Cloud Run using open-weights Gemma 4 (google/gemma-4-27b-it), the Google Agent Development Kit (ADK), Cloud Spanner Graph, and AlloyDB for PostgreSQL. The key to the solution was pairing vertical FastMCP SSE tool servers with horizontal /.well-known/agent.json A2A task delegation inside a 3-branch ParallelAgent fan-out governed by an iterative LoopAgent safety critic. The verification results were:
- 🟢 Concurrent Multi-MCP and A2A Fan-Out (
ParallelAgent): Executed a 3-hopISO GQLtraversal on Cloud Spanner Graph in11.4 ms(identifying3downstream microservices,42impacted enterprise tenants, and$184,000/hrSLA exposure), matched AlloyDBpgvectorScaNNrunbookRB-SPANNER-GRPC-POOL-204(0.964similarity) in6.8 ms, and delegated PR creation (commits/main) toGitHubRollbackRemediationAgentvia A2Atasks/send. - 🟢 Self-Correcting Blast-Radius Gate (
LoopAgent): Intercepted the unsafeIMMEDIATE_100_PERCENT_CUTOVERrollout on Iteration1(safety_score = 0.68), enforced theCANARY_10_50_100_TRAFFIC_SPLITpolicy required for incidents exceeding10enterprise tenants, and escalated loop termination cleanly on Iteration2(safety_score = 1.0). - 🟢 Zero-Trust Serverless GPU Architecture: Isolated
google/gemma-4-27b-itinference on a private Cloud RunNVIDIA L4(24 GB) service (8 vCPU,32 GiBmemory,16384max context length) mounted via read-only Cloud Storage FUSE over Direct VPC Egress (private-ranges-only).
The strategy for orchestrating an Agent-to-Agent (A2A) and Multi-MCP Mesh with Google ADK and Gemma 4 on Cloud Run was validated with an incremental step by step approach.
AI Researcher, Cloud Solutions Architect, and Author of "AI Engineering: From Classical ML to RAG & Agentic AI Systems" (2026).
Bridging cutting-edge open-weights AI research (Gemma 4, Google ADK, Multi-LoRA, MCP & A2A) with production-grade Cloud Run & Vertex AI engineering.
| Repository | Architecture Focus | Live Repo & Dynamic Status |
|---|---|---|
| gemma4-multilora-adk-eval | Dynamic Multi-LoRA Hot-Swapping & CI/CD Agent Evaluation (adk eval) on Cloud Run GPUs with Gemma 4 & vLLM |
|
| slothsre-napops | SlothSRE ("NapOps") — Overnight Gemma 4 & Google ADK Incident Digest Agent with OpenTelemetry & Sentry AI Monitoring | |
| streamforge-event-adk | Real-Time Event-Driven Multi-Agent Pipelines on Google Cloud with ADK (ParallelAgent & LoopAgent), Eventarc & Pub/Sub |
|
| a2a-mcp-mesh-cloudrun | Agent-to-Agent (A2A) & Multi-MCP Mesh on Cloud Run with Gemma 4, Google ADK, Spanner Graph & AlloyDB | |
| cloudguard-gemma-agent | 6-Part Production Gemma Enterprise Agent Series (ADK, Cloud Run L4 GPU, Firestore, Model Armor, Vertex AI QLoRA) | |
| cozy-ai-agent-cafe-game | Prompt Paws: 60 FPS Cozy AI Agent Bakery Simulation Game teaching RAG, Guardrails, Context Caching & Multi-Agent Loops |
If this project is helpful to your work:
- Star this Repository: Star
RobinaMirbahar/a2a-mcp-mesh-cloudrunon GitHub to bookmark it and help others discover it. - Fork & Customize: Fork
RobinaMirbahar/a2a-mcp-mesh-cloudrunto build and experiment with your own workflows. - Sponsor on GitHub: Sponsor
@RobinaMirbaharon GitHub Sponsors (github.com/sponsors/RobinaMirbahar) to support future open-source Google (@google), Google Gemini (@google-gemini), Google DeepMind (@google-deepmind), and Google Cloud (@GoogleCloudPlatform) cookbooks!