{"record":{"id":"b14ad98d0a43a8c9","repo":"xai-org/grok-build","slug":"env-can-only-be-used-with-stdio-servers","errorCode":null,"errorMessage":"--env can only be used with stdio servers.","messagePattern":"--env can only be used with stdio servers\\.","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/codegen/xai-grok-pager/src/mcp_cmd.rs","lineNumber":394,"sourceCode":"            } else {\n                \"http\"\n            };\n            let Some(url) = source else {\n                bail!(\n                    \"A URL is required for {label} servers. Usage: grok mcp add --transport {label} <name> <url>\"\n                );\n            };\n            if !url.starts_with(\"http://\") && !url.starts_with(\"https://\") {\n                bail!(\"Invalid URL '{url}'. Server URLs must start with http:// or https://.\");\n            }\n            if !server_args.is_empty() {\n                bail!(\n                    \"Unexpected arguments after the URL: '{}'. HTTP and SSE servers take a single URL.\",\n                    server_args.join(\" \")\n                );\n            }\n            if !args.env.is_empty() {\n                bail!(\"--env can only be used with stdio servers.\");\n            }\n            let headers = parse_headers(&args.header)?;\n\n            let mut warnings = Vec::new();\n            if inferred_http {\n                warnings.push(format!(\n                    \"No --transport given; '{url}' starts with http(s)://, adding as an HTTP server. Use --transport sse for an SSE server, or --transport stdio to force a stdio command.\"\n                ));\n            }\n\n            Ok(ResolvedAdd {\n                kind: transport,\n                transport: McpServerTransportConfig::StreamableHttp {\n                    url: url.to_string(),\n                    transport_type: (transport == McpTransport::Sse).then(|| \"sse\".to_string()),\n                    bearer_token_env_var: None,\n                    headers: (!headers.is_empty()).then_some(headers),\n                    oauth_client_id: None,","sourceCodeStart":376,"sourceCodeEnd":412,"githubUrl":"https://github.com/xai-org/grok-build/blob/bc7f02eddd3d84085849dc19ed216f11c23b0571/crates/codegen/xai-grok-pager/src/mcp_cmd.rs#L376-L412","documentation":"The `--env` flag configures environment variables for locally spawned stdio MCP server processes. When the transport is HTTP or SSE there is no child process to receive them, so the CLI rejects `--env` with this message.","triggerScenarios":"`grok mcp add <name> --transport http <url> -e KEY=value` (or --transport sse) — any non-empty env list combined with a remote transport.","commonSituations":"Reusing a shared add-command template that always appends -e flags; attempting to send credentials to a remote server that should instead use headers; migrating a stdio entry to http without cleaning flags.","solutions":["Remove the -e/--env flags for HTTP/SSE servers.","Pass authentication or configuration via --header 'Name: value' instead (HTTP headers).","Keep --env only with stdio servers where the process is launched locally."],"exampleFix":"// before\ngrok mcp add acme --transport http https://acme.example.com/mcp -e API_KEY=abc\n// after\ngrok mcp add acme --transport http https://acme.example.com/mcp --header 'Authorization: Bearer abc'","handlingStrategy":"validation","validationCode":"if transport_is_http_or_sse {\n    assert!(env_flags.is_empty(), \"--env is only valid for stdio servers; use --header for HTTP config\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Use --header for remote-server configuration, -e only for stdio.","Don't reuse a single add-command template across transports."],"tags":["cli","mcp","environment-variables","transport"],"backgroundTag":"flag-not-valid-for-transport","analyzedSha":"bc7f02eddd3d84085849dc19ed216f11c23b0571","analyzedAt":"2026-08-31T04:59:42.031Z","schemaVersion":2},"datasetVersion":"2026-08-31T09:17:48.483Z"}