{"record":{"id":"5c4e0e8dd4c79ec2","repo":"xai-org/grok-build","slug":"invalid-name-name-names-can-only-contain-lett","errorCode":null,"errorMessage":"Invalid name '{name}'. Names can only contain letters, numbers, hyphens, and underscores.","messagePattern":"Invalid name '(.+?)'\\. Names can only contain letters, numbers, hyphens, and underscores\\.","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/codegen/xai-grok-pager/src/mcp_cmd.rs","lineNumber":428,"sourceCode":"                    bearer_token_env_var: None,\n                    headers: (!headers.is_empty()).then_some(headers),\n                    oauth_client_id: None,\n                    oauth_client_secret_env_var: None,\n                    oauth_scopes: None,\n                },\n                warnings,\n            })\n        }\n    }\n}\n\nfn validate_server_name(name: &str) -> Result<()> {\n    if name.is_empty()\n        || !name\n            .chars()\n            .all(|c| c.is_ascii_alphanumeric() || c == '-' || c == '_')\n    {\n        bail!(\n            \"Invalid name '{name}'. Names can only contain letters, numbers, hyphens, and underscores.\"\n        );\n    }\n    Ok(())\n}\n\nfn parse_env_vars(pairs: &[String]) -> Result<HashMap<String, String>> {\n    let mut env = HashMap::new();\n    for pair in pairs {\n        match pair.split_once('=') {\n            Some((key, value)) if !key.is_empty() => {\n                env.insert(key.to_string(), value.to_string());\n            }\n            _ => bail!(\n                \"Invalid environment variable format: '{pair}'. Environment variables should be added as: -e KEY1=value1 -e KEY2=value2\"\n            ),\n        }\n    }","sourceCodeStart":410,"sourceCodeEnd":446,"githubUrl":"https://github.com/xai-org/grok-build/blob/bc7f02eddd3d84085849dc19ed216f11c23b0571/crates/codegen/xai-grok-pager/src/mcp_cmd.rs#L410-L446","documentation":"Server names for `grok mcp add` are validated against a strict charset: ASCII letters, digits, hyphens, and underscores. Empty names or names containing spaces, dots, slashes, or other punctuation are rejected so the name is always safe as a config key/identifier.","triggerScenarios":"`grok mcp add \"My Server!\" ...`, an empty name, or names with dots/colons/slashes (e.g. `acme.dev`, `corp/mcp`).","commonSituations":"Using display labels with spaces, DNS-style dotted names, copy-pasted names with trailing whitespace or unicode characters from docs or other tool configs.","solutions":["Rename using only letters, numbers, hyphens, and underscores (e.g. acme-dev).","Trim whitespace from the name argument in scripts.","Quote and normalize names in automation before passing them to grok mcp add."],"exampleFix":"// before\ngrok mcp add \"Acme MCP\" --transport http https://acme.example.com/mcp\n// after\ngrok mcp add acme-mcp --transport http https://acme.example.com/mcp","handlingStrategy":"validation","validationCode":"fn valid_name(name: &str) -> bool {\n    !name.is_empty() && name.chars().all(|c| c.is_ascii_alphanumeric() || c == '-' || c == '_')\n}\nassert!(valid_name(server_name));","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Use kebab-case or snake_case server names.","Trim and sanitize names in automation before invoking the CLI.","Avoid spaces, dots, and slashes in names."],"tags":["cli","mcp","naming","validation"],"backgroundTag":"invalid-identifier-name","analyzedSha":"bc7f02eddd3d84085849dc19ed216f11c23b0571","analyzedAt":"2026-08-31T04:59:42.031Z","schemaVersion":2},"datasetVersion":"2026-08-31T09:17:48.483Z"}