On-Prem Installation
Deploy Permit MCP Gateway within your own Kubernetes cluster, fully integrated with your existing Permit Platform.
On-premises deployment is available on Enterprise plans. See Enterprise Deployment for an overview of deployment models.
Prerequisites
Before you begin, ensure you have:
| Requirement | Details |
|---|---|
| Permit Platform deployed | Must be running before installing the MCP Gateway. Provides Keycloak (authentication) and the Permit backend (authorization). |
| Kubernetes cluster (1.25+) | With an nginx-ingress controller installed. |
| Helm 3.x and kubectl | Configured for your cluster. |
| Docker | Installed on your local machine (for loading and pushing images to your registry). |
| Private container registry | To host the MCP Gateway images (e.g., Google Artifact Registry, AWS ECR, Harbor). |
| TLS certificate | For your MCP Gateway domain. Required for the authentication flow (HTTPS). |
| DNS | Ability to create DNS records for your MCP Gateway domain (wildcard + platform UI). |
Information you'll need
All configuration derives from just three inputs:
| Item | Example | Used for |
|---|---|---|
| Permit Platform URL | https://permit.yourcompany.com | API URL + OIDC discovery URL |
| MCP Gateway domain | mcp.yourcompany.com | Base domain + platform ingress host |
| Keycloak admin password | (retrieved from secret) | Automatic OIDC client creation |
Retrieve the Keycloak admin password from your Permit Platform cluster:
kubectl get secret global-infrastructure-secret \
-n <permit-platform-namespace> \
-o jsonpath='{.data.KEYCLOAK_ADMIN_PASSWORD}' | base64 -d
Egress Requirements
The MCP Gateway is designed to run fully on-premises. The following table lists every outbound connection the system may make:
| Destination | Required? | Purpose |
|---|---|---|
| Your Permit Platform URL | Required | Permit API for authorization, Keycloak for OIDC |
| Your PDP URL (per-host, configured in Platform UI) | Required | Policy decision point for tool-level authorization |
| Your container registry | Install-time only | Image pulls during deployment |
| Your IdP / OIDC discovery URL | Required | Platform login (server-side token exchange) |
| Upstream MCP servers (customer-configured) | Required | Gateway proxies tool calls to upstream MCP servers |
Not required: No connection to api.permit.io, app.permit.io, or any other external cloud service is required for normal operation. The on-prem configuration explicitly disables external analytics and telemetry integrations.
Installation
Step 1 — Extract the installer package
You'll receive a .tar.gz installer bundle from your Permit team.
tar -xzf agent-security-on-prem-installer-*.tar.gz
cd agent-security-on-prem-installer-*
The package contains:
agent-security-on-prem-installer-*/
├── charts/agent-security/ # Helm chart
├── images/all-images.tar.gz # Docker images (bundled for air-gapped use)
├── scripts/
│ ├── load-images.sh # Push images to your registry
│ └── setup-keycloak.sh # Manual Keycloak setup (for debugging)
├── values.yaml # On-prem values template
└── README.md # Quick reference
Step 2 — Push images to your registry
Authenticate to your container registry, then run the image loader:
# Authenticate (example for GCP)
gcloud auth configure-docker us-central1-docker.pkg.dev
# Push all images and update values.yaml with your registry paths
./scripts/load-images.sh --registry <your-registry>
# See all options
./scripts/load-images.sh --help
Registry-specific examples:
# Google Artifact Registry
./scripts/load-images.sh --registry us-central1-docker.pkg.dev/my-project/mcp-gateway
# AWS ECR
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 123456789.dkr.ecr.us-east-1.amazonaws.com
./scripts/load-images.sh --registry 123456789.dkr.ecr.us-east-1.amazonaws.com/mcp-gateway
# Harbor
./scripts/load-images.sh --registry harbor.company.com/mcp-gateway
This script:
- Loads images from the bundled tarball into your local Docker
- Retags all images with your registry prefix
- Pushes them to your registry
- Updates
values.yaml— replaces theREGISTRYplaceholder with your actual registry
Step 3 — Configure Keycloak OIDC integration
The Helm chart automatically creates the Keycloak OIDC client during installation via a post-install Job. No manual Keycloak setup is needed.
You need the Keycloak admin password from your Permit Platform deployment (see Prerequisites).
You can provide it in one of two ways:
Option A — Reference existing secret (recommended):
permitPlatform:
namespace: "<permit-platform-namespace>"
keycloakAdminPasswordSecret: "global-infrastructure-secret"
keycloakAdminPasswordSecretKey: "KEYCLOAK_ADMIN_PASSWORD"
Option B — Plaintext value:
Avoid storing passwords in plaintext in your values file. If you must use this option, ensure my-values.yaml is not committed to version control.
permitPlatform:
namespace: "<permit-platform-namespace>"
keycloakAdminPassword: "<password>"
The setup Job is idempotent — safe to run on every helm upgrade. It never recreates an existing client.
The platform pod may briefly show CreateContainerConfigError until the Keycloak setup Job completes (~30-60 seconds). This is expected — the pod recovers automatically once the Job creates the OIDC secret.