CloakBrowser MCP — a Model Context Protocol browser-automation server that runs upstream @playwright/mcp with the CloakBrowser Chromium binary. This Helm chart packages the bridge in its streamable-http transport so it can be reached over the network, driven entirely from values.yaml via the bjw-s common library.
helm repo add obeone https://charts.obeone.cloud
helm repo update
helm install cloakbrowser-mcp obeone/cloakbrowser-mcp
CloakBrowser MCP is a Model Context Protocol
browser-automation server: it runs the upstream @playwright/mcp bridge on top
of the CloakBrowser stealth Chromium build, so AI agents can drive a real
browser that keeps a low fingerprint. This chart packages the bridge with its
streamable-http transport, making the MCP endpoint reachable over the network
from inside (or outside) the cluster.
swimmwatch/cloakbrowser-mcpcharts/cloakbrowser-mcpkubeVersion constraint (see Chart.yaml)This chart is built on the bjw-s-labs common library.
Most configuration keys (controllers, service, ingress, persistence,
…) follow its schema; see the common library documentation
for everything it supports beyond what is spelled out in values.yaml.
Defaults are meant to work out of the box on any cluster. The full list of
options lives in values.yaml, is validated by
values.schema.json at install time, and is documented
in the Values section below. Override it with your own values file:
helm install cloakbrowser-mcp obeone/cloakbrowser-mcp -f my-values.yaml
helm repo update
helm upgrade cloakbrowser-mcp obeone/cloakbrowser-mcp
Each release lists its changes in the Artifact Hub changelog; give it a look before jumping across several chart versions.
helm uninstall cloakbrowser-mcp
PersistentVolumeClaims created by the chart are kept around: delete them manually if you also want the data gone.
Kubernetes: >=1.31.0-0
| Repository | Name | Version |
|---|---|---|
| https://bjw-s-labs.github.io/helm-charts | common | 5.0.1 |
| Key | Type | Default | Description |
|---|---|---|---|
| controllers.main.containers.main.env | object | {"CLOAK_PLAYWRIGHT_MCP_HTTP_HOST":"0.0.0.0","CLOAK_PLAYWRIGHT_MCP_HTTP_PORT":"3000","CLOAK_PLAYWRIGHT_MCP_LOG_LEVEL":"info","CLOAK_PLAYWRIGHT_MCP_TRANSPORT":"streamable-http","PLAYWRIGHT_MCP_HEADLESS":"true","PLAYWRIGHT_MCP_OUTPUT_DIR":"/data"} |
Environment driving the bridge. The image entrypoint takes no args, so the whole configuration is expressed through these CLOAK_/PLAYWRIGHT_ variables. |
| controllers.main.containers.main.image.pullPolicy | string | "IfNotPresent" |
|
| controllers.main.containers.main.image.repository | string | "swimmwatch/cloakbrowser-mcp" |
Container image. The same tag is published on Docker Hub and ghcr.io. |
| controllers.main.containers.main.image.tag | string | "" |
|
| controllers.main.containers.main.probes.liveness.custom | bool | true |
|
| controllers.main.containers.main.probes.liveness.enabled | bool | true |
|
| controllers.main.containers.main.probes.liveness.spec.failureThreshold | int | 5 |
|
| controllers.main.containers.main.probes.liveness.spec.httpGet.path | string | "/healthz" |
|
| controllers.main.containers.main.probes.liveness.spec.httpGet.port | int | 3000 |
|
| controllers.main.containers.main.probes.liveness.spec.initialDelaySeconds | int | 10 |
|
| controllers.main.containers.main.probes.liveness.spec.periodSeconds | int | 30 |
|
| controllers.main.containers.main.probes.liveness.spec.timeoutSeconds | int | 5 |
|
| controllers.main.containers.main.probes.readiness.custom | bool | true |
|
| controllers.main.containers.main.probes.readiness.enabled | bool | true |
|
| controllers.main.containers.main.probes.readiness.spec.failureThreshold | int | 3 |
|
| controllers.main.containers.main.probes.readiness.spec.httpGet.path | string | "/readyz" |
|
| controllers.main.containers.main.probes.readiness.spec.httpGet.port | int | 3000 |
|
| controllers.main.containers.main.probes.readiness.spec.initialDelaySeconds | int | 5 |
|
| controllers.main.containers.main.probes.readiness.spec.periodSeconds | int | 10 |
|
| controllers.main.containers.main.probes.readiness.spec.timeoutSeconds | int | 5 |
|
| controllers.main.containers.main.probes.startup.custom | bool | true |
|
| controllers.main.containers.main.probes.startup.enabled | bool | true |
|
| controllers.main.containers.main.probes.startup.spec.failureThreshold | int | 30 |
|
| controllers.main.containers.main.probes.startup.spec.httpGet.path | string | "/healthz" |
|
| controllers.main.containers.main.probes.startup.spec.httpGet.port | int | 3000 |
|
| controllers.main.containers.main.probes.startup.spec.periodSeconds | int | 5 |
|
| controllers.main.containers.main.resources.limits.memory | string | "2Gi" |
|
| controllers.main.containers.main.resources.requests.cpu | string | "250m" |
|
| controllers.main.containers.main.resources.requests.memory | string | "512Mi" |
|
| controllers.main.containers.main.securityContext.allowPrivilegeEscalation | bool | false |
|
| controllers.main.containers.main.securityContext.capabilities.drop[0] | string | "ALL" |
|
| defaultPodOptions | object | {"automountServiceAccountToken":false,"securityContext":{"fsGroup":1000,"runAsGroup":1000,"runAsNonRoot":true,"runAsUser":1000,"seccompProfile":{"type":"RuntimeDefault"}}} |
Pod-wide options applied to every controller in this chart. |
| ingress | object | {"main":{"className":"","enabled":false,"hosts":[{"host":"chart-example.local","paths":[{"path":"/","pathType":"Prefix","service":{"identifier":"main","port":"http"}}]}],"tls":[{"hosts":["chart-example.local"],"secretName":"tls-chart-example-local"}]}} |
Ingress. Disabled by default; flip enabled and set a real host to expose the MCP endpoint. The bridge speaks plain HTTP, so terminate TLS at the ingress. |
| persistence | object | {"data":{"globalMounts":[{"path":"/data"}],"type":"emptyDir"},"dshm":{"globalMounts":[{"path":"/dev/shm"}],"medium":"Memory","sizeLimit":"1Gi","type":"emptyDir"}} |
Storage. Artifacts under /data are transient by default (emptyDir). Switch the “data” volume to a persistentVolumeClaim if you need to keep them across restarts. |
| route | object | {"main":{"enabled":false,"hostnames":["chart-example.local"],"kind":"HTTPRoute","parentRefs":[{"name":"gateway","namespace":"gateway-system"}],"rules":[{"backendRefs":[{"identifier":"main"}],"matches":[{"path":{"type":"PathPrefix","value":"/"}}]}]}} |
Gateway API HTTPRoute, mirroring the Ingress above. Disabled by default: pick either Ingress or HTTPRoute, not both. Requires the Gateway API CRDs and an existing Gateway in the cluster. |
| route.main.enabled | bool | false |
Enable the HTTPRoute. Mutually exclusive with ingress.main.enabled. |
| route.main.hostnames | list | ["chart-example.local"] |
Hostnames served by this route. |
| route.main.kind | string | "HTTPRoute" |
Route kind. HTTPRoute, GRPCRoute, TCPRoute, TLSRoute or UDPRoute. |
| route.main.parentRefs | list | [{"name":"gateway","namespace":"gateway-system"}] |
Gateways this route attaches to. |
| route.main.rules | list | [{"backendRefs":[{"identifier":"main"}],"matches":[{"path":{"type":"PathPrefix","value":"/"}}]}] |
Routing rules. identifier refers to a Service defined above. |
| service | object | {"main":{"controller":"main","ports":{"http":{"port":3000,"protocol":"TCP","targetPort":3000}},"type":"ClusterIP"}} |
Service exposing the streamable-http MCP endpoint inside the cluster. |
Charts in this repository are signed with GPG and every release ships a
provenance file. The public key is available at
charts.obeone.cloud/public_key.gpg,
fingerprint B9FE852F28888D27F8C9A11CD33E04CD22E335CE.
# Import the signing key into a legacy keyring (helm verifies with GnuPG v1 keyrings)
curl -fsSL https://charts.obeone.cloud/public_key.gpg | gpg --import
gpg --export > ~/.gnupg/pubring.gpg
# Pull the chart and check it against its provenance file
helm pull --verify obeone/cloakbrowser-mcp
This is a personal chart repository, maintained on a best-effort basis. Bug reports and contributions are welcome on GitHub.
Autogenerated from chart metadata using helm-docs v1.14.2