{"record":{"id":"9307bc41bbadade0","repo":"aaif-goose/goose","slug":"failed-to-list-prompts","errorCode":null,"errorMessage":"Failed to list prompts: {}","messagePattern":"Failed to list prompts: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/goose/src/agents/agent.rs","lineNumber":3693,"sourceCode":"    pub async fn list_extension_prompts(&self, session_id: &str) -> HashMap<String, Vec<Prompt>> {\n        self.extension_manager\n            .list_prompts(session_id, CancellationToken::default())\n            .await\n            .expect(\"Failed to list prompts\")\n    }\n\n    pub async fn get_prompt(\n        &self,\n        session_id: &str,\n        name: &str,\n        arguments: Value,\n    ) -> Result<GetPromptResult> {\n        // First find which extension has this prompt\n        let prompts = self\n            .extension_manager\n            .list_prompts(session_id, CancellationToken::default())\n            .await\n            .map_err(|e| anyhow!(\"Failed to list prompts: {}\", e))?;\n\n        if let Some(extension) = prompts\n            .iter()\n            .find(|(_, prompt_list)| prompt_list.iter().any(|p| p.name == name))\n            .map(|(extension, _)| extension)\n        {\n            return self\n                .extension_manager\n                .get_prompt(\n                    session_id,\n                    extension,\n                    name,\n                    arguments,\n                    CancellationToken::default(),\n                )\n                .await\n                .map_err(|e| anyhow!(\"Failed to get prompt: {}\", e));\n        }","sourceCodeStart":3675,"sourceCodeEnd":3711,"githubUrl":"https://github.com/aaif-goose/goose/blob/3810898a7447ec3299be72e223d3570a7aabf0ab/crates/goose/src/agents/agent.rs#L3675-L3711","documentation":"Thrown by Agent::get_prompt when ExtensionManager::list_prompts fails while enumerating prompts across the session's enabled extensions. The '{}' is the underlying extension error: a started MCP extension failed to answer prompts/list, timed out, or its process died. The lookup cannot proceed because goose discovers which extension owns a prompt by listing them all.","triggerScenarios":"Calling agent.get_prompt (e.g. the /prompt slash command) while an enabled MCP extension is broken: stdio command not found, extension process crashed, JSON-RPC transport error, or prompts/list timing out.","commonSituations":"Extension command path wrong after an npx/pipx upgrade; extension binary missing on a new machine; networked MCP server unreachable; one misconfigured extension poisoning every prompt lookup for the session.","solutions":["Run 'goose doctor' to identify the failing extension","Check the embedded '{}' error and goose logs for which extension failed","Fix or disable the broken extension in 'goose configure' (Extensions) and retry","Verify the extension binary actually starts: run its command manually from a shell"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"// Rust — surface which extension broke without losing the whole operation\nmatch agent.get_prompt(session_id, name, args).await {\n    Ok(result) => Ok(result),\n    Err(e) if e.to_string().contains(\"Failed to list prompts\") => {\n        tracing::warn!(\"prompt lookup degraded: {e}\");\n        Err(e) // or fall back to a builtin prompt\n    }\n    Err(e) => Err(e),\n}","preventionTips":["Keep only extensions you use enabled — one broken extension blocks all prompt lookups","Verify extension commands start manually after tool upgrades (npx/pipx)","Run 'goose doctor' before relying on prompts in automation"],"tags":["extensions","mcp","prompts","transient"],"backgroundTag":null,"analyzedSha":"3810898a7447ec3299be72e223d3570a7aabf0ab","analyzedAt":"2026-08-16T10:14:26.282Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}