Use case
We run MCP servers via the operator on EKS + Karpenter. To cut provisioning cold-start latency we keep a dedicated pre-warmed node pool, tainted workload-class=mcp-warm:NoSchedule, and steer the MCP server pod onto it using spec.podTemplateSpec (a matching toleration + nodeAffinity). That works well for the server.
But each MCPServer also spawns the proxy (proxyrunner) Deployment, and there's no way to give the proxy pod the same scheduling. resourceOverrides.proxyDeployment currently supports only annotations/labels/env/imagePullSecrets — no nodeSelector/tolerations/affinity. So the proxy is repelled by the warm-pool taint, always lands on a cold general node, and forces a fresh node boot (~40s) that dominates provisioning latency and trips our readiness watch. Net: the server is warm but the proxy is cold, so we hit the cold-start anyway.
What we need
A way to set nodeSelector, tolerations, and affinity on the proxy Deployment via the MCPServer CR — matching the capability spec.podTemplateSpec already gives the server pod. Most naturally, extend resourceOverrides.proxyDeployment with those fields (or a podTemplateSpec).
Why it looks tractable
The runtime already supports it — pkg/container/kubernetes/client.go applies a full pod-template patch to the proxy Deployment (applyPodTemplatePatch(..., options.K8sPodTemplatePatch)). The gap is only the operator surface: ProxyDeploymentOverrides in cmd/thv-operator/api/v1beta1/mcpserver_types.go doesn't expose scheduling, and the operator doesn't feed it into that patch. So the change would be: add the fields → wire them into the proxy pod-template patch → make manifests → extend mcpserver_resource_overrides_test.go.
Happy to contribute the PR if this direction works for you.
Use case
We run MCP servers via the operator on EKS + Karpenter. To cut provisioning cold-start latency we keep a dedicated pre-warmed node pool, tainted
workload-class=mcp-warm:NoSchedule, and steer the MCP server pod onto it usingspec.podTemplateSpec(a matching toleration + nodeAffinity). That works well for the server.But each
MCPServeralso spawns the proxy (proxyrunner) Deployment, and there's no way to give the proxy pod the same scheduling.resourceOverrides.proxyDeploymentcurrently supports onlyannotations/labels/env/imagePullSecrets— nonodeSelector/tolerations/affinity. So the proxy is repelled by the warm-pool taint, always lands on a cold general node, and forces a fresh node boot (~40s) that dominates provisioning latency and trips our readiness watch. Net: the server is warm but the proxy is cold, so we hit the cold-start anyway.What we need
A way to set
nodeSelector,tolerations, andaffinityon the proxy Deployment via theMCPServerCR — matching the capabilityspec.podTemplateSpecalready gives the server pod. Most naturally, extendresourceOverrides.proxyDeploymentwith those fields (or apodTemplateSpec).Why it looks tractable
The runtime already supports it —
pkg/container/kubernetes/client.goapplies a full pod-template patch to the proxy Deployment (applyPodTemplatePatch(..., options.K8sPodTemplatePatch)). The gap is only the operator surface:ProxyDeploymentOverridesincmd/thv-operator/api/v1beta1/mcpserver_types.godoesn't expose scheduling, and the operator doesn't feed it into that patch. So the change would be: add the fields → wire them into the proxy pod-template patch →make manifests→ extendmcpserver_resource_overrides_test.go.Happy to contribute the PR if this direction works for you.