The main container exposes **ACP** only (no HTTP server).
Optional **MCP sidecars** listen on **0.0.0.0** (so kubelet readiness can reach the pod IP); the chart sets **`GEMINI_MCP_HTTP_URLS`** to **127.0.0.1** URLs (JSON map of server keys → URLs, e.g. `memory` → `http://127.0.0.1:9330/mcp`). Override via **`gemini.mcpHttpUrls`** or derive from enabled **`mcpSidecars`** (see `values.yaml`).
{{- if .Values.postgres.enabled }}

When **postgres.enabled**, build and push the CNPG operand from **`postgres-cnpg/Dockerfile`** (see CI) so **`postgres.imageName`** resolves; the cluster runs TimescaleDB + pgvector + pgvectorscale in **`postgres.postInitApplicationSQL`**.
{{- end }}

1. Port-forward the ACP service (default port {{ .Values.acp.port }}):
{{- if contains "ClusterIP" .Values.service.type }}
  kubectl --namespace {{ .Release.Namespace }} port-forward svc/{{ include "gemini-chart.fullname" . }} {{ .Values.acp.port }}:{{ .Values.acp.port }}
  Then connect your ACP client to 127.0.0.1:{{ .Values.acp.port }}.
{{- else if contains "NodePort" .Values.service.type }}
  export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "gemini-chart.fullname" . }})
  export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
  echo "ACP (NodePort): $NODE_IP:$NODE_PORT"
{{- else if contains "LoadBalancer" .Values.service.type }}
  NOTE: It may take a few minutes for the LoadBalancer IP to be available.
        You can watch the status by running 'kubectl get svc -w {{ include "gemini-chart.fullname" . }}'
  export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "gemini-chart.fullname" . }} --template "{{"{{"}} range (index .status.loadBalancer.ingress 0) {{"}}"}} {{"{{"}} . {{"}}"}} {{"{{"}} end {{"}}"}}")
  echo "ACP: $SERVICE_IP:{{ .Values.acp.port }}"
{{- end }}
