{"record":{"id":"5c0b0f47dea6ee3e","repo":"PrefectHQ/fastmcp","slug":"resource-uri-r-version-version-r-not-found","errorCode":null,"errorMessage":"Resource {uri!r} version {version!r} not found","messagePattern":"Resource (.+?) version (.+?) not found","errorType":"exception","errorClass":"KeyError","httpStatus":null,"severity":"error","filePath":"fastmcp_slim/fastmcp/server/providers/local_provider/local_provider.py","lineNumber":282,"sourceCode":"        Raises:\n            KeyError: If no matching resource 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, Resource) and str(c.uri) == uri\n            ]\n            if not keys_to_remove:\n                raise KeyError(f\"Resource {uri!r} not found\")\n            for key in keys_to_remove:\n                self._remove_component(key)\n        else:\n            # Remove specific version\n            key = f\"{Resource.make_key(uri)}@{version}\"\n            if key not in self._components:\n                raise KeyError(f\"Resource {uri!r} version {version!r} not found\")\n            self._remove_component(key)\n\n    def remove_template(self, uri_template: str, version: str | None = None) -> None:\n        \"\"\"Remove resource template(s) from this provider's storage.\n\n        Args:\n            uri_template: The template URI pattern.\n            version: If None, removes ALL versions. If specified, removes only that version.\n\n        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","sourceCodeStart":264,"sourceCodeEnd":300,"githubUrl":"https://github.com/PrefectHQ/fastmcp/blob/1f021142978e0861cd910c8df4e8074bc7cf3978/fastmcp_slim/fastmcp/server/providers/local_provider/local_provider.py#L264-L300","documentation":"remove_resource with an explicit version constructs f\"{Resource.make_key(uri)}@{version}\" and raises KeyError if that exact key is not stored. The URI may exist but not with the supplied version string.","triggerScenarios":"provider.remove_resource(\"config://app\", \"2\") when the resource is registered unversioned, versioned as \"2.0\", or under a different version value.","commonSituations":"Version drift between add and remove calls; assuming a version exists after partial cleanup; mixing versioned and unversioned registration styles.","solutions":["Omit the version argument to remove all versions of the resource","Check the registered version string matches exactly before removal","Catch KeyError for idempotent teardown"],"exampleFix":"// before\nprovider.remove_resource(\"config://app\", \"2.0\")  # registered as \"2\"\n// after\nprovider.remove_resource(\"config://app\")  # removes all versions","handlingStrategy":"validation","validationCode":"key = f\"{Resource.make_key('config://app')}@1.0\"\nif key not in provider._components:\n    provider.remove_resource(\"config://app\")  # all versions","typeGuard":"def resource_version_registered(provider, uri: str, version: str) -> bool:\n    return f\"{Resource.make_key(uri)}@{version}\" in provider._components","tryCatchPattern":"try:\n    provider.remove_resource(\"config://app\", \"1.0\")\nexcept KeyError:\n    logger.info(\"resource version not present; nothing removed\")","preventionTips":["Match version strings exactly between registration and removal","Omit version in cleanup code to remove all versions at once","Don't mix versioned and unversioned resources with the same URI"],"tags":["keyerror","resource","versioning","removal"],"backgroundTag":"component-version-mismatch","analyzedSha":"1f021142978e0861cd910c8df4e8074bc7cf3978","analyzedAt":"2026-08-29T14:31:16.082Z","schemaVersion":2},"datasetVersion":"2026-08-29T17:17:51.833Z"}