@@ -102,6 +102,12 @@ func (t *transportAdapterTranslator) translateTransportAdapterDeployment(
102102 return nil , fmt .Errorf ("image must be specified for MCPServer %s or the command must be 'uvx' or 'npx'" , server .Name )
103103 }
104104
105+ // Convert EnvVarCfg to corev1.EnvVar for deployment
106+ envVars , err := convertEnvVars (server .Spec .Deployment .Env )
107+ if err != nil {
108+ return nil , err
109+ }
110+
105111 // Create environment variables from secrets for envFrom
106112 secretEnvFrom := t .createSecretEnvFrom (server .Spec .Deployment .SecretRefs )
107113
@@ -163,7 +169,7 @@ func (t *transportAdapterTranslator) translateTransportAdapterDeployment(
163169 "-f" ,
164170 "/config/local.yaml" ,
165171 },
166- Env : convertEnvVars ( server . Spec . Deployment . Env ) ,
172+ Env : envVars ,
167173 EnvFrom : secretEnvFrom ,
168174 VolumeMounts : append ([]corev1.VolumeMount {
169175 {
@@ -209,7 +215,7 @@ func (t *transportAdapterTranslator) translateTransportAdapterDeployment(
209215 ImagePullPolicy : mainContainerPullPolicy ,
210216 Command : cmd ,
211217 Args : server .Spec .Deployment .Args ,
212- Env : convertEnvVars ( server . Spec . Deployment . Env ) ,
218+ Env : envVars ,
213219 EnvFrom : secretEnvFrom ,
214220 VolumeMounts : append ([]corev1.VolumeMount {
215221 {
@@ -398,21 +404,50 @@ func (t *transportAdapterTranslator) createVolumeMounts(
398404 return volumeMounts
399405}
400406
401- func convertEnvVars (env map [string ]string ) []corev1.EnvVar {
407+ func convertEnvVars (env map [string ]v1alpha1. EnvVarCfg ) ( []corev1.EnvVar , error ) {
402408 if env == nil {
403- return nil
409+ return nil , nil
404410 }
405411 envVars := make ([]corev1.EnvVar , 0 , len (env ))
406- for key , value := range env {
407- envVars = append (envVars , corev1.EnvVar {
408- Name : key ,
409- Value : value ,
410- })
412+ for key , cfg := range env {
413+ if cfg .Value != "" && cfg .ValueFrom != nil {
414+ return nil , fmt .Errorf ("environment variable %s cannot specify both value and valueFrom" , key )
415+ }
416+ if cfg .Value != "" {
417+ envVars = append (envVars , corev1.EnvVar {
418+ Name : key ,
419+ Value : cfg .Value ,
420+ })
421+ } else if cfg .ValueFrom != nil {
422+ envVars = append (envVars , corev1.EnvVar {
423+ Name : key ,
424+ ValueFrom : cfg .ValueFrom ,
425+ })
426+ }
411427 }
412428 sort .Slice (envVars , func (i , j int ) bool {
413429 return envVars [i ].Name < envVars [j ].Name
414430 })
415- return envVars
431+ return envVars , nil
432+ }
433+
434+ // createStdioEnvConfig creates the environment variable configuration for the StdioTargetSpec.
435+ // It includes all EnvVarCfg entries, including those with ValueFrom.
436+ // Note: The underlying transport adapter (agentgateway) may not support ValueFrom in its config.
437+ func createStdioEnvConfig (env map [string ]v1alpha1.EnvVarCfg ) map [string ]v1alpha1.EnvVarCfg {
438+ if env == nil {
439+ return nil
440+ }
441+ stdioEnvConfig := make (map [string ]v1alpha1.EnvVarCfg )
442+ for key , cfg := range env {
443+ // Basic validation - this should ideally be handled by CRD validation
444+ if cfg .Value != "" && cfg .ValueFrom != nil {
445+ klog .Warningf ("Environment variable %s in MCPServer.Spec.Deployment.Env specifies both value and valueFrom. Prioritizing valueFrom for Kubernetes Deployment, and including both for internal config. This may lead to unexpected behavior." , key )
446+ }
447+ // Pass through the EnvVarCfg as is, the generated struct expects this type
448+ stdioEnvConfig [key ] = cfg
449+ }
450+ return stdioEnvConfig
416451}
417452
418453func (t * transportAdapterTranslator ) translateTransportAdapterService (
@@ -506,7 +541,7 @@ func (t *transportAdapterTranslator) translateTransportAdapterConfig(server *v1a
506541 mcpTarget .Stdio = & StdioTargetSpec {
507542 Cmd : server .Spec .Deployment .Cmd ,
508543 Args : server .Spec .Deployment .Args ,
509- Env : server .Spec .Deployment .Env ,
544+ Env : createStdioEnvConfig ( server .Spec .Deployment .Env ) ,
510545 }
511546 case v1alpha1 .TransportTypeHTTP :
512547 httpTransportConfig := server .Spec .HTTPTransport
0 commit comments