{"record":{"id":"b2a128b96361952e","repo":"PrefectHQ/fastmcp","slug":"prompt-name-r-not-found","errorCode":null,"errorMessage":"Prompt {name!r} not found","messagePattern":"Prompt (.+?) not found","errorType":"exception","errorClass":"KeyError","httpStatus":null,"severity":"error","filePath":"fastmcp_slim/fastmcp/server/providers/local_provider/local_provider.py","lineNumber":333,"sourceCode":"    def remove_prompt(self, name: str, version: str | None = None) -> None:\n        \"\"\"Remove prompt(s) from this provider's storage.\n\n        Args:\n            name: The prompt name.\n            version: If None, removes ALL versions. If specified, removes only that version.\n\n        Raises:\n            KeyError: If no matching prompt is found.\n        \"\"\"\n        if version is None:\n            # Remove all versions\n            keys_to_remove = [\n                k\n                for k, c in self._components.items()\n                if isinstance(c, Prompt) and c.name == name\n            ]\n            if not keys_to_remove:\n                raise KeyError(f\"Prompt {name!r} not found\")\n            for key in keys_to_remove:\n                self._remove_component(key)\n        else:\n            # Remove specific version\n            key = f\"{Prompt.make_key(name)}@{version}\"\n            if key not in self._components:\n                raise KeyError(f\"Prompt {name!r} version {version!r} not found\")\n            self._remove_component(key)\n\n    # =========================================================================\n    # Provider interface implementation\n    # =========================================================================\n\n    async def _list_tools(self) -> Sequence[Tool]:\n        \"\"\"Return all tools.\"\"\"\n        return [v for v in self._components.values() if isinstance(v, Tool)]\n\n    async def _get_tool(","sourceCodeStart":315,"sourceCodeEnd":351,"githubUrl":"https://github.com/PrefectHQ/fastmcp/blob/1f021142978e0861cd910c8df4e8074bc7cf3978/fastmcp_slim/fastmcp/server/providers/local_provider/local_provider.py#L315-L351","documentation":"remove_prompt(name, version=None) scans LocalProvider storage for Prompt components matching the name; with none found it raises KeyError(f\"Prompt {name!r} not found\"), indicating nothing was removed.","triggerScenarios":"provider.remove_prompt(\"summarize\") when the prompt was never registered, was already removed, is registered under a different name, or lives on a mounted provider rather than local storage.","commonSituations":"Cleanup code in tests removing prompts that failed to register; name typo/case mismatch; prompts added via decorators under a derived name differing from the assumed name.","solutions":["Confirm the exact registered prompt name before removal","Catch KeyError to make removal idempotent","Ensure the prompt is registered on this LocalProvider, not a mounted one"],"exampleFix":"// before\nprovider.remove_prompt(\"Summarize\")  # registered as \"summarize\"\n// after\nprovider.remove_prompt(\"summarize\")","handlingStrategy":"try-catch","validationCode":"names = {c.name for c in provider._components.values() if isinstance(c, Prompt)}\nif \"summarize\" not in names:\n    return","typeGuard":"def prompt_exists(provider, name: str) -> bool:\n    return any(isinstance(c, Prompt) and c.name == name\n               for c in provider._components.values())","tryCatchPattern":"try:\n    provider.remove_prompt(\"summarize\")\nexcept KeyError:\n    pass  # nothing to remove","preventionTips":["Check the registered name (decorator may derive it from the function)","Keep prompt names centralized as constants","Confirm the prompt lives on this provider, not a mounted one"],"tags":["keyerror","prompt","removal"],"backgroundTag":"component-key-not-found","analyzedSha":"1f021142978e0861cd910c8df4e8074bc7cf3978","analyzedAt":"2026-08-29T14:31:16.082Z","schemaVersion":2},"datasetVersion":"2026-08-29T17:17:51.833Z"}