{"record":{"id":"ebd161afe33287c4","repo":"PrefectHQ/fastmcp","slug":"template-uri-template-r-version-version-r-not","errorCode":null,"errorMessage":"Template {uri_template!r} version {version!r} not found","messagePattern":"Template (.+?) version (.+?) not found","errorType":"exception","errorClass":"KeyError","httpStatus":null,"severity":"error","filePath":"fastmcp_slim/fastmcp/server/providers/local_provider/local_provider.py","lineNumber":310,"sourceCode":"        Raises:\n            KeyError: If no matching template 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, ResourceTemplate) and c.uri_template == uri_template\n            ]\n            if not keys_to_remove:\n                raise KeyError(f\"Template {uri_template!r} not found\")\n            for key in keys_to_remove:\n                self._remove_component(key)\n        else:\n            # Remove specific version\n            key = f\"{ResourceTemplate.make_key(uri_template)}@{version}\"\n            if key not in self._components:\n                raise KeyError(\n                    f\"Template {uri_template!r} version {version!r} not found\"\n                )\n            self._remove_component(key)\n\n    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","sourceCodeStart":292,"sourceCodeEnd":328,"githubUrl":"https://github.com/PrefectHQ/fastmcp/blob/1f021142978e0861cd910c8df4e8074bc7cf3978/fastmcp_slim/fastmcp/server/providers/local_provider/local_provider.py#L292-L328","documentation":"remove_template with an explicit version builds f\"{ResourceTemplate.make_key(uri_template)}@{version}\" and raises KeyError if that key is absent. The pattern exists but not under the given version.","triggerScenarios":"provider.remove_template(\"weather://{city}\", \"1.1\") when the template is unversioned or versioned as \"1.0\".","commonSituations":"Version string mismatch between registration and removal; removing after a prior partial cleanup already deleted that version; template registered without a version.","solutions":["Omit version to remove all versions of the template","Match the exact registered version string","Catch KeyError for idempotent teardown"],"exampleFix":"// before\nprovider.remove_template(\"weather://{city}\", \"1.1\")  # registered \"1.0\"\n// after\nprovider.remove_template(\"weather://{city}\")  # removes all versions","handlingStrategy":"validation","validationCode":"key = f\"{ResourceTemplate.make_key('weather://{city}')}@1.0\"\nif key not in provider._components:\n    provider.remove_template(\"weather://{city}\")","typeGuard":"def template_version_registered(provider, uri_template: str, version: str) -> bool:\n    return f\"{ResourceTemplate.make_key(uri_template)}@{version}\" in provider._components","tryCatchPattern":"try:\n    provider.remove_template(\"weather://{city}\", \"1.0\")\nexcept KeyError:\n    logger.info(\"template version not present\")","preventionTips":["Use a single version constant at registration and removal","Prefer omitting version in teardown to remove all versions","Avoid ad-hoc version formats like \"v1\" vs \"1.0\""],"tags":["keyerror","resource-template","versioning","removal"],"backgroundTag":"component-version-mismatch","analyzedSha":"1f021142978e0861cd910c8df4e8074bc7cf3978","analyzedAt":"2026-08-29T14:31:16.082Z","schemaVersion":2},"datasetVersion":"2026-08-29T17:17:51.833Z"}