MCP server on ARO#932
Conversation
Document Helm-based install, read-only RBAC, route exposure, and testing on ARO, with references to the Red Hat technology preview announcement. Signed-off-by: dharmesh-b <dharmesh.b@gmail.com> Co-authored-by: Cursor <cursoragent@cursor.com>
Updated author's name for clarity.
✅ Deploy Preview for rh-cloud-experts ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
paulczar
left a comment
There was a problem hiding this comment.
Thanks for contributing this guide — the content is well-structured and the RBAC options are a nice touch. However, there are a few issues to address before merge, including one security blocker.
Security blocker: unauthenticated public endpoint
The guide exposes the MCP server via oc expose svc, creating a publicly accessible HTTP route on *.aroapp.io. The test in Step 16 sends a raw JSON-RPC request with no Authorization header. The MCP protocol has no built-in transport-layer auth, so anyone who can reach that URL can query your cluster — pod logs, configmaps, service account names, cluster topology, monitoring rules, etc.
The server authenticates to the cluster using its service account token, but nothing authenticates the clients hitting the MCP endpoint. At minimum, the guide needs to address this — options include:
- OAuth proxy sidecar (standard OpenShift pattern)
- Restrict to cluster-internal access only (no external route)
- NetworkPolicy restricting which pods can reach the service
- A note that this config is for local/isolated testing only and must not be used in any shared or production environment
Please pick one of these approaches and document it before merging.
Other issues (see inline comments)
- Missing Technology Preview warning banner
oc expose svccreates HTTP (not HTTPS) — should useoc create route edgesecurityContextin values-openshift.yaml is missing fields required by ARO's restricted-v2 SCC- Steps 4 and 10 are trivial no-op verifications that can be removed
| - Dharmeshkumar Bhamre | ||
| --- | ||
|
|
||
| This guide walks through deploying the [OpenShift Kubernetes MCP Server](https://github.com/openshift/openshift-mcp-server) on an **Azure Red Hat OpenShift (ARO)** cluster. You install the server with Helm, bind a read-only ClusterRole to a dedicated service account, and expose the MCP endpoint on an OpenShift route for client testing. |
There was a problem hiding this comment.
The Red Hat blog post linked in the References section confirms this is a Technology Preview feature. Please add a TP warning banner here:
| This guide walks through deploying the [OpenShift Kubernetes MCP Server](https://github.com/openshift/openshift-mcp-server) on an **Azure Red Hat OpenShift (ARO)** cluster. You install the server with Helm, bind a read-only ClusterRole to a dedicated service account, and expose the MCP endpoint on an OpenShift route for client testing. | |
| {{% alert state="warning" %}}The OpenShift MCP Server is a Technology Preview feature. Technology Preview features are not supported with Red Hat production service level agreements (SLAs) and might not be functionally complete. Red Hat does not recommend using them in production.{{% /alert %}} | |
| This guide walks through deploying the [OpenShift Kubernetes MCP Server](https://github.com/openshift/openshift-mcp-server) on an **Azure Red Hat OpenShift (ARO)** cluster. You install the server with Helm, bind a read-only ClusterRole to a dedicated service account, and expose the MCP endpoint on an OpenShift route for client testing. |
| Confirm the service account was created successfully. | ||
|
|
||
| ```bash | ||
| oc get sa -n mcp-server |
There was a problem hiding this comment.
This step runs oc get sa immediately after creating the service account — it will always succeed unless the prior step failed, so it adds no diagnostic value. Consider removing Step 4 to keep the guide tight.
| Review the default Helm chart values before customization. | ||
|
|
||
| ```bash | ||
| cat values.yaml |
There was a problem hiding this comment.
Running cat values.yaml has no actionable purpose in the guide — the reader is about to override it with a custom file anyway. Consider removing Step 10.
| cpu: 500m | ||
| memory: 512Mi | ||
|
|
||
| securityContext: |
There was a problem hiding this comment.
ARO's default restricted-v2 SCC (OpenShift 4.11+) requires seccompProfile and capabilities.drop: [ALL] in addition to runAsNonRoot and allowPrivilegeEscalation: false. Without these, the pod will likely be rejected at admission. Please expand the security context:
| securityContext: | |
| securityContext: | |
| runAsNonRoot: true | |
| allowPrivilegeEscalation: false | |
| seccompProfile: | |
| type: RuntimeDefault | |
| capabilities: | |
| drop: | |
| - ALL |
| Create an OpenShift route to expose the MCP server externally. | ||
|
|
||
| ```bash | ||
| oc expose svc kubernetes-mcp-server -n mcp-server |
There was a problem hiding this comment.
oc expose svc creates a plaintext HTTP route. Combined with the lack of client authentication on the MCP endpoint (see main review comment), this means cluster data is served over unencrypted HTTP to anyone on the internet. Please use an edge-terminated TLS route instead:
| oc expose svc kubernetes-mcp-server -n mcp-server | |
| oc create route edge kubernetes-mcp-server \ | |
| --service=kubernetes-mcp-server \ | |
| -n mcp-server |
|
|
||
| ```bash | ||
| curl -i -X POST \ | ||
| http://kubernetes-mcp-server-mcp-server.apps.<xxx>.<xxx>.aroapp.io/mcp \ |
There was a problem hiding this comment.
If the route is changed to edge-terminated TLS (see Step 14 comment), update this to https://:
| http://kubernetes-mcp-server-mcp-server.apps.<xxx>.<xxx>.aroapp.io/mcp \ | |
| https://kubernetes-mcp-server-mcp-server.apps.<xxx>.<xxx>.aroapp.io/mcp \ |
Document OIDC on the MCP endpoint, group-based RBAC with token passthrough, corrected chart config, and HTTPS route testing. Co-authored-by: Cursor <cursoragent@cursor.com>
Follow-up: additional issues in
|
Scope: nothing here is ARO-specificLooking at the guide end-to-end, there's no step that requires ARO specifically — it would work identically on ROSA, OSD, or any self-managed OpenShift cluster. The only ARO-flavoured detail is the example hostname ( It might be worth generalising this into an |
Live deployment test on ROSA HCP 4.19.30Tested the OAuth passthrough auth config on a live ROSA HCP cluster. Results: What works ✅
Bug found in the values example ❌The guide sets Even in passthrough mode, the server needs the SA token mounted to discover the cluster's API URL and CA cert via in-cluster config. The SA token is used for cluster discovery only — the actual API calls use the forwarded user Bearer token. Without it, the server can't find the cluster and dies. Fix: set serviceAccount:
create: true
automountToken: true # ← required even in passthrough modeAlso:
|
No description provided.