{"record":{"id":"0cce34c6762b10bd","repo":"Hmbown/CodeWhale","slug":"server-server-name-is-not-registered","errorCode":null,"errorMessage":"server '{server_name}' is not registered","messagePattern":"server '(.+?)' is not registered","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/mcp/src/lib.rs","lineNumber":381,"sourceCode":"            failed,\n            cancelled,\n        }\n    }\n\n    /// Stop a running server by removing its client.\n    pub fn stop_server(&mut self, server_name: &str) -> Result<()> {\n        self.clients\n            .remove(server_name)\n            .with_context(|| format!(\"server '{server_name}' is not running\"))?;\n        Ok(())\n    }\n\n    /// Remove a server entirely (config and client).\n    pub fn unregister_server(&mut self, server_name: &str) -> Result<()> {\n        let had_config = self.configs.remove(server_name).is_some();\n        self.clients.remove(server_name);\n        if !had_config {\n            bail!(\"server '{server_name}' is not registered\");\n        }\n        Ok(())\n    }\n\n    /// List all tools from all running servers, applying tool filters.\n    pub fn list_tools(&self) -> Result<Vec<McpToolDescriptor>> {\n        Ok(self\n            .list_tools_with_input_schemas()?\n            .into_iter()\n            .map(|(tool, _)| tool)\n            .collect())\n    }\n\n    fn list_tools_with_input_schemas(&self) -> Result<Vec<(McpToolDescriptor, Value)>> {\n        let mut out = Vec::new();\n        let mut qualified_origins: HashMap<String, (String, String)> = HashMap::new();\n        for (server_name, (_, filter)) in &self.configs {\n            let Some(client) = self.clients.get(server_name) else {","sourceCodeStart":363,"sourceCodeEnd":399,"githubUrl":"https://github.com/Hmbown/CodeWhale/blob/73e0f67d83c59909b571efdfc88c4bc28c309cb1/crates/mcp/src/lib.rs#L363-L399","documentation":"Raised by `McpManager::unregister_server` (crates/mcp/src/lib.rs): the given server name has no entry in the manager's config map, so there is nothing to remove. The client entry (if any) is still dropped, but the call returns an error because the named server was never registered.","triggerScenarios":"Calling `unregister_server(name)` for a name never passed to `register_server`, after a previous unregister already removed it, or with a name that differs in spelling/case from the registered one.","commonSituations":"Double teardown in cleanup code or drop paths; idempotent-shutdown scripts that unregister twice; typos or renamed servers in config after an upgrade; test fixtures tearing down servers that failed to start.","solutions":["Check the server is registered first (`list_tools`, configs, or a `contains` check) before unregistering.","Make teardown idempotent by ignoring this error when it occurs during shutdown.","Fix the server name to match the registered config key exactly."],"exampleFix":"// before\nmanager.unregister_server(\"github\")?; // may error if absent\n// after\nif manager.configs().contains_key(\"github\") {\n    manager.unregister_server(\"github\").ok();\n}","handlingStrategy":"try-catch","validationCode":"// Rust: only unregister what exists\nif manager.has_server(\"github\") {\n    manager.unregister_server(\"github\")?;\n}","typeGuard":"fn registered(manager: &McpManager, name: &str) -> bool { manager.has_server(name) }","tryCatchPattern":"if let Err(e) = manager.unregister_server(\"github\") {\n    if !e.to_string().contains(\"is not registered\") {\n        return Err(e); // ignore only the benign not-registered case\n    }\n}","preventionTips":["Track registration state alongside your own teardown list.","Make shutdown paths tolerate 'not registered' errors for idempotency.","Use exact server-name constants shared between register and unregister call sites."],"tags":["mcp","unregister","not-found"],"backgroundTag":"entity-not-found","analyzedSha":"73e0f67d83c59909b571efdfc88c4bc28c309cb1","analyzedAt":"2026-09-22T01:30:00.501Z","contentChangedAt":"2026-09-22T01:30:00.501Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}