{"record":{"id":"cd8622339454e641","repo":"PrefectHQ/fastmcp","slug":"subclasses-must-implement-create-resource-use-f","errorCode":null,"errorMessage":"Subclasses must implement create_resource(). Use FunctionResourceTemplate for task support.","messagePattern":"Subclasses must implement create_resource\\(\\)\\. Use FunctionResourceTemplate for task support\\.","errorType":"exception","errorClass":"NotImplementedError","httpStatus":null,"severity":"error","filePath":"fastmcp_slim/fastmcp/resources/template.py","lineNumber":302,"sourceCode":"\n    async def _read(self, uri: str, params: dict[str, Any]) -> ResourceResult:\n        \"\"\"Server entry point for template reads.\n\n        The server calls this instead of create_resource()/read() directly so\n        subclasses can customize dispatch (e.g. FastMCPProviderResourceTemplate\n        delegates to child-server middleware).\n        \"\"\"\n        resource = await self.create_resource(uri, params)\n        result = await resource.read()\n        return self.convert_result(result)\n\n    async def create_resource(self, uri: str, params: dict[str, Any]) -> Resource:\n        \"\"\"Create a resource from the template with the given parameters.\n\n        The base implementation does not support background tasks.\n        Use FunctionResourceTemplate for task support.\n        \"\"\"\n        raise NotImplementedError(\n            \"Subclasses must implement create_resource(). \"\n            \"Use FunctionResourceTemplate for task support.\"\n        )\n\n    def to_mcp_template(\n        self,\n        **overrides: Any,\n    ) -> SDKResourceTemplate:\n        \"\"\"Convert the resource template to an SDKResourceTemplate.\"\"\"\n\n        return SDKResourceTemplate(\n            name=overrides.get(\"name\", self.name),\n            uri_template=overrides.get(\"uriTemplate\", self.uri_template),\n            description=overrides.get(\"description\", self.description),\n            mime_type=overrides.get(\"mimeType\", self.mime_type),\n            title=overrides.get(\"title\", self.title),\n            icons=overrides.get(\"icons\", self.icons),\n            annotations=overrides.get(\"annotations\", self.annotations),","sourceCodeStart":284,"sourceCodeEnd":320,"githubUrl":"https://github.com/PrefectHQ/fastmcp/blob/1f021142978e0861cd910c8df4e8074bc7cf3978/fastmcp_slim/fastmcp/resources/template.py#L284-L320","documentation":"ResourceTemplate.create_resource() materializes a concrete Resource from a matched URI and parameters; the base implementation deliberately does not support it (background-task-capable reads require create_resource, which only FunctionResourceTemplate provides). Subclasses must either implement it or not rely on the code path that calls it.","triggerScenarios":"Custom ResourceTemplate subclass where _read reaches create_resource() without an override; using a bare ResourceTemplate subclass in a context requiring task-capable resource creation.","commonSituations":"Authors of custom templates who only implemented read() but the caller path (task-enabled reads) invokes create_resource; forgetting the docstring's guidance to use FunctionResourceTemplate.","solutions":["Implement async def create_resource(self, uri, params) returning a configured Resource instance","Or subclass FunctionResourceTemplate, which provides a working create_resource for functions","If you only need simple reads and no tasks, ensure your code path calls read() directly, not create_resource()"],"exampleFix":"// before\nclass T(ResourceTemplate):\n    async def read(self, args): return \"data\"\n// after\nclass T(ResourceTemplate):\n    async def read(self, args): return \"data\"\n    async def create_resource(self, uri, params):\n        return FunctionResource(fn=lambda: self.read(params), uri=uri)","handlingStrategy":"type-guard","validationCode":"import inspect\nassert inspect.iscoroutinefunction(MyTemplate.create_resource), \"must implement create_resource()\"","typeGuard":"def implements_create_resource(cls) -> bool:\n    return getattr(cls.create_resource, \"__qualname__\", \"\") != \"ResourceTemplate.create_resource\"","tryCatchPattern":"try:\n    resource = await template.create_resource(uri, params)\nexcept NotImplementedError:\n    resource = FunctionResourceTemplate(fn, uri_template=template.uri_template)","preventionTips":["Subclass FunctionResourceTemplate when task-capable resource creation is needed","Implement create_resource() returning a concrete Resource for custom templates","Keep custom templates out of code paths that require create_resource unless implemented"],"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"}