{"record":{"id":"ccb809fb05453279","repo":"openai/codex","slug":"invalid-mcp-server-name-server-name-must-matc","errorCode":null,"errorMessage":"Invalid MCP server name '{server_name}': must match pattern {pattern}","messagePattern":"Invalid MCP server name '(.+?)': must match pattern (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"codex-rs/codex-mcp/src/rmcp_client.rs","lineNumber":861,"sourceCode":"                    \"Environment variable {env_var} for MCP server '{server_name}' is empty\"\n                ))\n            } else {\n                Ok(Some(value))\n            }\n        }\n        Err(env::VarError::NotPresent) => Err(anyhow!(\n            \"Environment variable {env_var} for MCP server '{server_name}' is not set\"\n        )),\n        Err(env::VarError::NotUnicode(_)) => Err(anyhow!(\n            \"Environment variable {env_var} for MCP server '{server_name}' contains invalid Unicode\"\n        )),\n    }\n}\n\nfn validate_mcp_server_name(server_name: &str) -> Result<()> {\n    let re = regex_lite::Regex::new(r\"^[a-zA-Z0-9_-]+$\")?;\n    if !re.is_match(server_name) {\n        return Err(anyhow!(\n            \"Invalid MCP server name '{server_name}': must match pattern {pattern}\",\n            pattern = re.as_str()\n        ));\n    }\n    Ok(())\n}\n\n#[instrument(level = \"trace\", skip_all, fields(server_name = %server_name))]\nasync fn start_server_task(\n    server_name: String,\n    client: Arc<RmcpClient>,\n    params: StartServerTaskParams,\n) -> Result<ManagedClient, StartupOutcomeError> {\n    let StartServerTaskParams {\n        is_codex_apps_mcp_server,\n        startup_timeout,\n        tx_event,\n        elicitation_requests,","sourceCodeStart":843,"sourceCodeEnd":879,"githubUrl":"https://github.com/openai/codex/blob/339751715c64496cb86246bfb3935f40e309dd3d/codex-rs/codex-mcp/src/rmcp_client.rs#L843-L879","documentation":"Before connecting, validate_mcp_server_name (called from start) checks the MCP server key against ^[a-zA-Z0-9_-]+$. Server names become tool namespaces, config keys and cache identifiers, so anything outside ASCII letters, digits, underscore and hyphen (spaces, dots, slashes, colons, unicode) is rejected at startup with the offending name and the exact pattern.","triggerScenarios":"config.toml keys like [mcp_servers.\"my server\"], [mcp_servers.github/api], [mcp_servers.\"db.prod\"] or unicode names; keys with leading/trailing whitespace from copy-paste; programmatically registered servers (app-server MCP APIs) whose ids were never slugified.","commonSituations":"Display names pasted as TOML keys; generated names containing '/', ':' or non-ASCII; renaming a server to a human-friendly label in config.","solutions":["Rename the key to only [A-Za-z0-9_-], e.g. [mcp_servers.github_proxy] instead of [mcp_servers.\"github proxy\"]","Check the key for invisible leading/trailing whitespace or a BOM","If the name is generated, slugify it before registering: replace separators with '-' and strip non-ASCII"],"exampleFix":"# before\n[mcp_servers.\"github proxy\"]\nurl = \"https://mcp.github.com/api\"\n\n# after\n[mcp_servers.github_proxy]\nurl = \"https://mcp.github.com/api\"","handlingStrategy":"validation","validationCode":"// Validate before registering or writing config\nfn is_valid_mcp_server_name(name: &str) -> bool {\n    !name.is_empty()\n        && name.bytes().all(|b| b.is_ascii_alphanumeric() || b == b'_' || b == b'-')\n}","typeGuard":"pub fn is_valid_mcp_server_name(name: &str) -> bool {\n    regex_lite::Regex::new(r\"^[a-zA-Z0-9_-]+$\").unwrap().is_match(name)\n}","tryCatchPattern":null,"preventionTips":["Use slug-style ids everywhere a server is named: config keys, registrations, generated entries","Add a config lint that rejects keys outside [A-Za-z0-9_-]","Never paste human display names into [mcp_servers.*] keys"],"tags":["mcp","codex","server-name","validation","config","regex"],"backgroundTag":"invalid-identifier","analyzedSha":"339751715c64496cb86246bfb3935f40e309dd3d","analyzedAt":"2026-08-25T05:35:09.876Z","schemaVersion":2},"datasetVersion":"2026-08-25T06:17:31.827Z"}