{"record":{"id":"fb9ace4a73e4d5a9","repo":"PrefectHQ/fastmcp","slug":"resource-uri-r-not-found","errorCode":null,"errorMessage":"Resource {uri!r} not found","messagePattern":"Resource (.+?) not found","errorType":"exception","errorClass":"KeyError","httpStatus":null,"severity":"error","filePath":"fastmcp_slim/fastmcp/server/providers/local_provider/local_provider.py","lineNumber":275,"sourceCode":"    def remove_resource(self, uri: str, version: str | None = None) -> None:\n        \"\"\"Remove resource(s) from this provider's storage.\n\n        Args:\n            uri: The resource URI.\n            version: If None, removes ALL versions. If specified, removes only that version.\n\n        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.","sourceCodeStart":257,"sourceCodeEnd":293,"githubUrl":"https://github.com/PrefectHQ/fastmcp/blob/1f021142978e0861cd910c8df4e8074bc7cf3978/fastmcp_slim/fastmcp/server/providers/local_provider/local_provider.py#L257-L293","documentation":"remove_resource(uri, version=None) scans LocalProvider storage for Resource components whose string URI matches; when no match is found it raises KeyError(f\"Resource {uri!r} not found\"). It signals the caller that removal found nothing to delete.","triggerScenarios":"provider.remove_resource(\"config://app\") when the resource URI differs (scheme, trailing slash, normalization), was never added, was already removed, or lives in another provider.","commonSituations":"URI stringification mismatches (AnyUrl vs str, case, trailing slash); removing a resource mounted on a different provider; refactoring URIs without updating removal code.","solutions":["Compare the exact str(resource.uri) as registered — check for scheme/slash/case differences first","List existing resources to confirm the exact URI before removal","Catch KeyError to make removal idempotent"],"exampleFix":"// before\nprovider.remove_resource(\"config://app/\")  # registered as \"config://app\"\n// after\nprovider.remove_resource(\"config://app\")  # exact registered URI","handlingStrategy":"try-catch","validationCode":"uris = {str(c.uri) for c in provider._components.values() if isinstance(c, Resource)}\nif \"config://app\" not in uris:\n    return","typeGuard":"def resource_exists(provider, uri: str) -> bool:\n    return any(isinstance(c, Resource) and str(c.uri) == uri\n               for c in provider._components.values())","tryCatchPattern":"try:\n    provider.remove_resource(\"config://app\")\nexcept KeyError:\n    pass  # idempotent teardown","preventionTips":["Pass the URI exactly as str(resource.uri) was registered","Watch for trailing-slash and scheme normalization differences","Keep resource URIs as constants shared between registration and removal"],"tags":["keyerror","resource","uri","removal"],"backgroundTag":"component-key-not-found","analyzedSha":"1f021142978e0861cd910c8df4e8074bc7cf3978","analyzedAt":"2026-08-29T14:31:16.082Z","schemaVersion":2},"datasetVersion":"2026-08-29T17:17:51.833Z"}