{"record":{"id":"f48c7b11245c529f","repo":"PrefectHQ/fastmcp","slug":"subclasses-must-implement-read-or-override-creat","errorCode":null,"errorMessage":"Subclasses must implement read() or override create_resource()","messagePattern":"Subclasses must implement read\\(\\) or override create_resource\\(\\)","errorType":"exception","errorClass":"NotImplementedError","httpStatus":null,"severity":"error","filePath":"fastmcp_slim/fastmcp/resources/template.py","lineNumber":265,"sourceCode":"            auth=auth,\n            security=security,\n        )\n\n    @field_validator(\"mime_type\", mode=\"before\")\n    @classmethod\n    def set_default_mime_type(cls, mime_type: str | None) -> str:\n        \"\"\"Set default MIME type if not provided.\"\"\"\n        if mime_type:\n            return mime_type\n        return \"text/plain\"\n\n    def matches(self, uri: str) -> dict[str, Any] | None:\n        \"\"\"Check if URI matches template and extract parameters.\"\"\"\n        return match_uri_template(uri, self.uri_template)\n\n    async def read(self, arguments: dict[str, Any]) -> str | bytes | ResourceResult:\n        \"\"\"Read the resource content.\"\"\"\n        raise NotImplementedError(\n            \"Subclasses must implement read() or override create_resource()\"\n        )\n\n    def convert_result(self, raw_value: Any) -> ResourceResult:\n        \"\"\"Convert a raw result to ResourceResult.\n\n        This is used in two contexts:\n        1. In _read() to convert user function return values to ResourceResult\n        2. In tasks_result_handler() to convert Docket task results to ResourceResult\n\n        Handles ResourceResult passthrough and converts raw values using\n        ResourceResult's normalization. The template's own ``mime_type`` is\n        forwarded so that reads match the MIME type the template advertises\n        in ``resources/templates/list``.\n        \"\"\"\n        return convert_raw_to_resource_result(\n            raw_value, mime_type=self.mime_type, meta=self.meta\n        )","sourceCodeStart":247,"sourceCodeEnd":283,"githubUrl":"https://github.com/PrefectHQ/fastmcp/blob/1f021142978e0861cd910c8df4e8074bc7cf3978/fastmcp_slim/fastmcp/resources/template.py#L247-L283","documentation":"ResourceTemplate.read() is the base-class placeholder: a template must know how to render content for a matched URI. Subclasses that don't override read() (or supply content via create_resource()) hit this NotImplementedError when a client reads a URI matching the template.","triggerScenarios":"Subclassing ResourceTemplate with a custom matches()/uri_template but no read(arguments) override, then calling read on a matching URI via _read.","commonSituations":"Custom template types (database-backed, API-backed) where the author implemented matching but not rendering; copying the base class skeleton verbatim.","solutions":["Implement async def read(self, arguments) in the subclass returning str, bytes, or ResourceResult","Or override create_resource(uri, params) to build a concrete Resource whose read() supplies content","Prefer FunctionResourceTemplate(fn) for function-backed templates"],"exampleFix":"// before\nclass ApiTemplate(ResourceTemplate):\n    def __init__(self, uri_template): super().__init__(uri_template=uri_template)\n// after\nclass ApiTemplate(ResourceTemplate):\n    async def read(self, arguments):\n        return fetch_api(arguments)","handlingStrategy":"type-guard","validationCode":"import inspect\nassert inspect.iscoroutinefunction(MyTemplate.read), \"template must implement async read()\"","typeGuard":"def implements_template_read(cls) -> bool:\n    return getattr(cls.read, \"__qualname__\", \"\") != \"ResourceTemplate.read\"","tryCatchPattern":"try:\n    content = await template.read(params)\nexcept NotImplementedError:\n    raise ConfigurationError(f\"{type(template).__name__} lacks read()\")","preventionTips":["Override read() or create_resource() in every ResourceTemplate subclass","Prefer FunctionResourceTemplate for function-backed templates","Add an import-time or startup check that custom templates implement read"],"tags":["python","resource-templates","not-implemented"],"backgroundTag":"subclass-must-implement-method","analyzedSha":"1f021142978e0861cd910c8df4e8074bc7cf3978","analyzedAt":"2026-08-29T14:31:16.082Z","schemaVersion":2},"datasetVersion":"2026-08-29T17:17:51.833Z"}