BoltMCP Installation Docs

Configuration Reference

Complete reference for all configurable values of the BoltMCP Helm chart.

database

ParameterTypeDefaultDescription
database.affinityobject{}Affinity rules. Pass-through, not strictly validated.
database.coreSchemastring"boltmcp_core"Schema holding the shared application tables. The ltree extension is namespaced here and the schema is owned by the migrate-core user; application roles have no dependency on public.
database.hoststring""External database host (when internal.enabled=false)
database.image.pullPolicystring"IfNotPresent"Image pull policy
database.image.repositorystring"postgres"PostgreSQL image repository
database.image.tagstring"15-alpine"PostgreSQL image tag
database.internal.enabledbooltrueDeploy internal PostgreSQL. Set false for external DB
database.namestring"boltmcp"Database name
database.nodeSelectorobject{}Node selector
database.persistence.accessModesarray["ReadWriteOnce"]PVC access modes
database.persistence.enabledbooltrueEnable persistent storage
database.persistence.sizestring"10Gi"PVC size
database.persistence.storageClassstring""Storage class (falls back to global.storageClass)
database.portint5432Database port
database.resourcesobject{}CPU/memory resource limits and requests. Pass-through, not strictly validated.
database.superuser.usernamestring"postgres"Superuser username (password lives in the database Secret as superuser-password)
database.tolerationsarray[]Tolerations
database.users.keycloak.schemastring"boltmcp_keycloak"Keycloak schema name
database.users.keycloak.usernamestring"boltmcp_keycloak"Keycloak DB user (password: keycloak-password)
database.users.mcpServer.usernamestring"boltmcp_mcp_server"MCP Server DB user, read-only on the core schema plus read/write on specific tables (password: mcp-server-password)
database.users.migrateCore.usernamestring"boltmcp_migrate_core"Migration DB user — owns the core schema and is the only role that runs DDL/migrations (password: migrate-core-password)
database.users.restApi.usernamestring"boltmcp_rest_api"REST API DB user, read/write on the core schema (password: rest-api-password)
database.users.vault.schemastring"boltmcp_vault"Vault storage schema name
database.users.vault.usernamestring"boltmcp_vault"Vault storage DB user; owns the pre-created vault_kv_store table (password: vault-password)
database.users.web.usernamestring"boltmcp_web"Web app DB user, read/write on the core schema (password lives in the database Secret as web-password)

global

ParameterTypeDefaultDescription
global.domainstring""Apex domain that hosts BoltMCP. Used to derive per-service hostnames as web.<domain>, auth.<domain>, server.<domain>, inspector.<domain>. Required unless every per-service URL/hostname override is set explicitly.
global.hostAliasesarray[]hostAliases injected into every BoltMCP pod. Use when the public BoltMCP hostnames don't resolve from inside the cluster (split-horizon DNS, local installs) so in-cluster OIDC discovery can reach Keycloak.
global.imagePullSecretsarray[{"name":"boltmcp-pull-secret"}]Image pull secrets for private registries. Matches the Secret name created in cluster prep. Set to [] if your images come from a registry that doesn't require auth.
global.imageRegistrystring"europe-west2-docker.pkg.dev/boltmcp-platform/boltmcp-alpha/images"Default image registry for BoltMCP images
global.storageClassstring""Storage class for all BoltMCP persistent volumes. Empty uses the cluster default (fine on GKE/AKS). On EKS set it to a class you created. Overridable per-volume by database.persistence.storageClass.
global.tls.enabledbooltrueWhether the public BoltMCP URLs are served over HTTPS. Declares the scheme the workloads advertise and expect — it does not provision TLS itself; certificates and termination remain the job of your ingress / load balancer (with the chart-managed Ingress, of cert-manager via ingress.annotations). Single source of the scheme for every derived URL (web/server/inspector/Keycloak base URLs, the OIDC issuer) and for whether the chart-managed Ingress carries a tls section. Set false only for evaluation installs served over plain HTTP. Explicit overrides such as web.baseUrl and keycloak.baseUrl always win, scheme included.

ingress

Optional chart-managed Ingress. Disabled by default: bring your own ingress / gateway / load balancer instead (see examples/ingress in the chart for a reference manifest).

ParameterTypeDefaultDescription
ingress.annotationsobject{}Annotations for the Ingress. Controller- and cert-manager-specific settings go here: on ingress-nginx you almost always want cert-manager.io/cluster-issuer for TLS certificates, and on plain-HTTP installs nginx.ingress.kubernetes.io/ssl-redirect: "false". The chart applies two ingress-nginx defaults you do not need to repeat: proxy-body-size: "10m", without which ingress-nginx's own 1m default rejects API spec uploads with 413 (10m matches the 10 MB request-body limit the BoltMCP REST API enforces itself, so raising it further has no effect), and proxy-buffer-size: "128k", required for Keycloak's large auth headers (the 4k default breaks login with "upstream sent too big header"). Setting either key here overrides the chart default; all other annotations you supply are merged alongside them.
ingress.classNamestring""IngressClass name (spec.ingressClassName). Empty omits the field so the cluster default class applies.
ingress.enabledboolfalseCreate a single Ingress routing the public BoltMCP hostnames (derived from global.domain / the per-service baseUrl overrides, so they can never drift from the URLs the services advertise) to the in-cluster services.
ingress.tls.secretNamestring"boltmcp-tls"Name of the TLS Secret covering all BoltMCP hostnames (created by cert-manager when the cluster-issuer annotation is set). The Ingress carries a tls section only when global.tls.enabled is true.

keycloak

ParameterTypeDefaultDescription
keycloak.affinityobject{}Affinity rules. Pass-through, not strictly validated.
keycloak.baseUrlstring""Base URL. If empty, defaults to https://auth.<global.domain> (http when global.tls.enabled is false). The OIDC issuer is <baseUrl>/realms/boltmcp
keycloak.enabledbooltrueEnable Keycloak deployment
keycloak.image.pullPolicystring"IfNotPresent"Image pull policy
keycloak.image.repositorystring"quay.io/keycloak/keycloak"Keycloak image
keycloak.image.tagstring"26.7.0-1"Keycloak image tag
keycloak.nodeSelectorobject{}Node selector
keycloak.production.enabledbooltrueRun in production mode (start vs start-dev). Production mode works over plain HTTP behind a proxy (the chart sets the proxy-headers env); set false only for evaluation installs with no ingress / reverse proxy in front of Keycloak at all
keycloak.reconcile.authstring"master"Which principal the reconcile Job authenticates as. master: the master-realm operator (master_admin, password from the auth Secret). client: the realm's own boltmcp-keycloak-reconcile service account (client credentials; secret under keycloak-reconcile-client-secret in the OIDC Secret; realm-scoped manage-clients, manage-realm and manage-users only), with the master password not mounted into the Job at all. client requires the realm to already hold that client, which is true for any realm installed or upgraded with this chart version or later. If the Job is refused in client mode (client missing, or its secret in Keycloak no longer matches the OIDC Secret after a rotation), set master for one upgrade so the Job creates the client or patches its secret, then switch back
keycloak.reconcile.enabledbooltrueReconcile the platform-owned realm resources (OIDC clients, the boltmcp:rest-api:access scope, the mcp:manage role) on every install and upgrade via a pre-upgrade/post-install hook Job driven by files/boltmcp-realm-reconcile.json. Declared fields are patched to match; scope attachments, mappers and scope mappings are only added to. Disable only if you manage these resources yourself and will apply upgrade changes by hand
keycloak.resourcesobject{}CPU/memory resource limits and requests. Pass-through, not strictly validated.
keycloak.service.healthPortint9000Health check port
keycloak.service.portint8080Service port
keycloak.service.typestring"ClusterIP"Service type
keycloak.tolerationsarray[]Tolerations

mcpInspector

ParameterTypeDefaultDescription
mcpInspector.affinityobject{}Affinity rules. Pass-through, not strictly validated.
mcpInspector.baseUrlstring""Base URL. If empty, defaults to https://inspector.<global.domain> (http when global.tls.enabled is false)
mcpInspector.enabledbooltrueEnable MCP Inspector
mcpInspector.image.pullPolicystring"IfNotPresent"Image pull policy
mcpInspector.image.repositorystring"ghcr.io/modelcontextprotocol/inspector"Image repository
mcpInspector.image.tagstring"2.2.0"Image tag
mcpInspector.nodeSelectorobject{}Node selector
mcpInspector.resourcesobject{}CPU/memory resource limits and requests. Pass-through, not strictly validated.
mcpInspector.service.typestring"ClusterIP"Service type
mcpInspector.service.webPortint6274Web UI port
mcpInspector.tolerationsarray[]Tolerations

mcpServer

ParameterTypeDefaultDescription
mcpServer.affinityobject{}Affinity rules. Pass-through, not strictly validated.
mcpServer.baseUrlstring""Base URL. If empty, defaults to https://server.<global.domain> (http when global.tls.enabled is false)
mcpServer.extraEnvarray[]Additional environment variables
mcpServer.image.pullPolicystring"IfNotPresent"Image pull policy
mcpServer.image.repositorystring""Image repository (defaults to global.imageRegistry/boltmcp-mcp-server)
mcpServer.image.tagstring""Image tag (defaults to .Chart.AppVersion if empty)
mcpServer.nodeSelectorobject{}Node selector
mcpServer.replicaCountint1Number of replicas
mcpServer.resourcesobject{}CPU/memory resource limits and requests. Pass-through, not strictly validated.
mcpServer.service.portint3001Service port
mcpServer.service.typestring"ClusterIP"Service type
mcpServer.tolerationsarray[]Tolerations

migrations

Helm hook Job settings. coreMigrateImage is the image for the migrate-core Job only; backoffLimit and ttlSecondsAfterFinished apply to both hook Jobs (migrate-core and keycloak-reconcile).

ParameterTypeDefaultDescription
migrations.backoffLimitint3Retry limit for every hook Job (migrate-core and keycloak-reconcile)
migrations.coreMigrateImage.repositorystring""Core schema migration image (defaults to global.imageRegistry/boltmcp-migrate-core)
migrations.coreMigrateImage.tagstring""Tag (inherits from web.image.tag)
migrations.ttlSecondsAfterFinishedint300Seconds a finished hook Job (migrate-core and keycloak-reconcile) is kept before Kubernetes deletes it

oidc

ParameterTypeDefaultDescription
oidc.adminUser.emailstring""Required. Email for the first user in the boltmcp Keycloak realm. Provisioned on first install via --import-realm (username boltmcp_admin, firstName Admin, emailVerified true, granted realm-management/realm-admin). Password lives in the auth Secret as boltmcp-admin-password.
oidc.mcpServer.clientIdstring"boltmcp-mcp-server"MCP Server client ID (secret: mcp-server-client-secret)
oidc.providerstring"keycloak"OIDC provider type
oidc.web.clientIdstring"boltmcp-web"Platform client ID (secret lives in the OIDC Secret as web-client-secret)

restApi

ParameterTypeDefaultDescription
restApi.affinityobject{}Affinity rules. Pass-through, not strictly validated.
restApi.extraEnvarray[]Additional environment variables
restApi.image.pullPolicystring"IfNotPresent"Image pull policy
restApi.image.repositorystring""Image repository (defaults to global.imageRegistry/boltmcp-rest-api)
restApi.image.tagstring""Image tag (defaults to .Chart.AppVersion if empty)
restApi.nodeSelectorobject{}Node selector
restApi.replicaCountint1Number of replicas
restApi.resourcesobject{}CPU/memory resource limits and requests. Pass-through, not strictly validated.
restApi.service.portint3003Service port
restApi.service.typestring"ClusterIP"Service type
restApi.tolerationsarray[]Tolerations

secrets

Names of user-managed Kubernetes Secrets the chart reads. The chart never creates these.

ParameterTypeDefaultDescription
secrets.auth.namestring""Name of the user-managed Secret holding auth tokens, the master-realm Keycloak admin password (keycloak-admin-password), the BoltMCP-realm first-user password (boltmcp-admin-password), the MCP Inspector token, and the MCP server's upstream-OAuth root secret (mcp-server-upstream-oauth-secret). If empty, defaults to <release>-auth.
secrets.database.namestring""Name of the user-managed Secret holding database passwords. If empty, defaults to <release>-database.
secrets.oidc.namestring""Name of the user-managed Secret holding OIDC client secrets. If empty, defaults to <release>-oidc.

vault

ParameterTypeDefaultDescription
vault.affinityobject{}Affinity rules. Pass-through, not strictly validated.
vault.enabledbooltrueDeploy the bundled Vault
vault.image.pullPolicystring"IfNotPresent"Image pull policy
vault.image.repositorystring"hashicorp/vault"Image repository
vault.image.tagstring"1.21.4"Image tag
vault.kubernetesAuth.audiencestring"vault"Projected-token audience (must match the Vault role)
vault.kubernetesAuth.authMountPathstring"kubernetes"Mount path of Vault's Kubernetes auth method
vault.kubernetesAuth.enabledbooltrueWire boltmcp-rest-api to Vault via Kubernetes auth (ServiceAccount + projected token + env)
vault.kubernetesAuth.kvMountstring"secret"KV v2 secrets engine mount
vault.kubernetesAuth.kvPathPrefixstring"boltmcp/server-env-api-cred"Logical prefix the REST API stores secrets under
vault.kubernetesAuth.mcpServer.policystring"boltmcp-mcp-server"Vault policy for the MCP Server's read-only access to the secret prefix
vault.kubernetesAuth.mcpServer.rolestring"boltmcp-mcp-server"Vault role bound to the MCP Server ServiceAccount (the reader; shares the auth mount, KV mount/prefix, and audience)
vault.kubernetesAuth.policystring"boltmcp-rest-api"Vault policy for the secret prefix
vault.kubernetesAuth.rolestring"boltmcp-rest-api"Vault role bound to the REST API ServiceAccount
vault.nodeSelectorobject{}Node selector
vault.resourcesobject{}CPU/memory resource limits and requests. Pass-through, not strictly validated.
vault.seal.configobject{}Key/value pairs rendered into the seal stanza (e.g. region, kms_key_id)
vault.seal.extraEnvarray[]Extra Vault container env for the seal (e.g. KMS credentials)
vault.seal.typestring""Seal type — "" is Shamir/manual unseal; awskms/gcpckms/azurekeyvault/transit enable auto-unseal
vault.service.portint8200Service port
vault.service.typestring"ClusterIP"Service type
vault.tolerationsarray[]Tolerations

web

ParameterTypeDefaultDescription
web.affinityobject{}Affinity rules. Pass-through, not strictly validated.
web.baseUrlstring""Base URL. If empty, defaults to https://web.<global.domain> (http when global.tls.enabled is false)
web.extraEnvarray[]Additional environment variables
web.image.pullPolicystring"IfNotPresent"Image pull policy
web.image.repositorystring""Image repository (defaults to global.imageRegistry/boltmcp-web)
web.image.tagstring""Image tag (defaults to .Chart.AppVersion if empty)
web.nodeSelectorobject{}Node selector
web.replicaCountint1Number of replicas
web.resourcesobject{}CPU/memory resource limits and requests. Pass-through, not strictly validated.
web.service.portint3000Service port
web.service.typestring"ClusterIP"Service type
web.tolerationsarray[]Tolerations

Other values

ParameterTypeDefaultDescription
fullnameOverridestring""Override the full release name
nameOverridestring""Override the release name
podAnnotationsobject{}Pod annotations
podSecurityContextobject{}Pod security context

On this page