{"record":{"id":"b24b145cdbefd646","repo":"PrefectHQ/fastmcp","slug":"prompt-name-r-version-version-r-not-found","errorCode":null,"errorMessage":"Prompt {name!r} version {version!r} not found","messagePattern":"Prompt (.+?) version (.+?) not found","errorType":"exception","errorClass":"KeyError","httpStatus":null,"severity":"error","filePath":"fastmcp_slim/fastmcp/server/providers/local_provider/local_provider.py","lineNumber":340,"sourceCode":"        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(\n        self, name: str, version: VersionSpec | None = None\n    ) -> Tool | None:\n        \"\"\"Get a tool by name.\n\n        Args:\n            name: The tool name.\n            version: Optional version filter. If None, returns highest version.","sourceCodeStart":322,"sourceCodeEnd":358,"githubUrl":"https://github.com/PrefectHQ/fastmcp/blob/1f021142978e0861cd910c8df4e8074bc7cf3978/fastmcp_slim/fastmcp/server/providers/local_provider/local_provider.py#L322-L358","documentation":"remove_prompt with an explicit version constructs f\"{Prompt.make_key(name)}@{version}\" and raises KeyError when that key is not in storage. The prompt name exists but not under the supplied version string.","triggerScenarios":"provider.remove_prompt(\"summarize\", \"2\") when the prompt is unversioned or versioned \"2.0\"/\"v2\".","commonSituations":"Version formatting mismatches (\"2\" vs \"2.0\" vs \"v2\"); removing a version already deleted; prompts registered without versions but removal code passing one.","solutions":["Omit the version argument to remove all versions","Use the exact version string from registration","Catch KeyError for idempotent teardown"],"exampleFix":"// before\nprovider.remove_prompt(\"summarize\", \"v2\")  # registered as \"2.0\"\n// after\nprovider.remove_prompt(\"summarize\", \"2.0\")","handlingStrategy":"validation","validationCode":"key = f\"{Prompt.make_key('summarize')}@2.0\"\nif key not in provider._components:\n    provider.remove_prompt(\"summarize\")  # all versions","typeGuard":"def prompt_version_registered(provider, name: str, version: str) -> bool:\n    return f\"{Prompt.make_key(name)}@{version}\" in provider._components","tryCatchPattern":"try:\n    provider.remove_prompt(\"summarize\", \"2.0\")\nexcept KeyError:\n    provider.remove_prompt(\"summarize\")  # remove all versions","preventionTips":["Standardize version format across add and remove calls","Omit version in cleanup paths to avoid version-string drift","Register versions explicitly rather than relying on defaults"],"tags":["keyerror","prompt","versioning","removal"],"backgroundTag":"component-version-mismatch","analyzedSha":"1f021142978e0861cd910c8df4e8074bc7cf3978","analyzedAt":"2026-08-29T14:31:16.082Z","schemaVersion":2},"datasetVersion":"2026-08-29T17:17:51.833Z"}