Skip to content

MCP server

Any streamable HTTP MCP server image for one team, with its credential from a Secret, discovered by an MCP gateway

Chart mcp-server
Version 0.2.0
Application version 0.1.0
Kind MCP server
Source charts/mcp-server

The values are listed under Values, the changes per version under Changelog.

Purpose

Runs one MCP server from any container image that serves streamable HTTP, for one team in your project, with its upstream credential taken from an existing Secret. It is meant to sit behind an MCP gateway, not on a public Route. Examples: grafana/mcp-grafana, mcp-atlassian, mcp-server-odoo.

Choices:

  • Nothing renders until image.repository and image.tag are set; pin the tag.
  • The Service port carries appProtocol: agentgateway.dev/mcp and the annotations agentgateway.dev/mcp-path (path) and agentgateway.dev/mcp-target-name (default: the release name), so an agentgateway backend with a label selector discovers it and prefixes its tools with the target name.
  • envFromSecret names a Secret you create (for example from an ExternalSecret); its keys become environment variables. The chart never writes a credential.
  • No ServiceAccount token in the pod; non-root, no capabilities, RuntimeDefault seccomp.
  • A NetworkPolicy admits callers from the own project and networkPolicy.ingressNamespaces only. Egress goes to cluster DNS and the public internet; a private upstream needs an entry in networkPolicy.egress.allow.
  • rbacProxy.enabled puts kube-rbac-proxy in front of the server: every call needs a Kubernetes ServiceAccount token allowed services/proxy on the Service (Role <release>-caller, subjects from rbacProxy.callers). The server then listens on 127.0.0.1; serviceAccountName must name a ServiceAccount bound to system:auth-delegator, which the cluster administrator creates. With route.enabled a Route publishes the endpoint (reencrypt to the proxy) for an MCP gateway on another cluster.
  • secretEnv maps single keys of existing Secrets to variables, for example a ServiceAccount token Secret.
  • The default port 8000 is outside the ports a typical project default opens to everyone (80, 443, 8080, 8443).

Install

helm repo add grncloud https://apps.openshift.eu
oc create secret generic grafana-mcp --from-literal=GRAFANA_URL=https://grafana.example.com \
  --from-literal=GRAFANA_SERVICE_ACCOUNT_TOKEN=<token>
helm install grafana grncloud/mcp-server \
  --set image.repository=docker.io/grafana/mcp-grafana --set image.tag=2.0.2 \
  --set 'args={-t,streamable-http,--address,0.0.0.0:8000,--allowed-hosts,*,--disable-write}' \
  --set envFromSecret=grafana-mcp

Delivery instructions

  • Check the pod is Ready: oc get pods -l app.kubernetes.io/instance=grafana.
  • Through your MCP gateway the tools appear as <release>_<tool>. From inside the project: POST http://<release>:8000/mcp with an MCP initialize request.
  • The server has whatever rights its credential has: give it a read-only one where the upstream allows it.