{"record":{"id":"5f35f55dbdcbc788","repo":"PrefectHQ/fastmcp","slug":"unknown-resource-uri-r-version-version-r","errorCode":null,"errorMessage":"Unknown resource: {uri!r} version {version!r}","messagePattern":"Unknown resource: (.+?) version (.+?)","errorType":"exception","errorClass":"NotFoundError","httpStatus":null,"severity":"error","filePath":"fastmcp_slim/fastmcp/server/server.py","lineNumber":1665,"sourceCode":"                        if is_timeout_error(e):\n                            raise ResourceError(\n                                \"Upstream request timed out, please retry\"\n                            ) from e\n                        # Standard masking logic\n                        if self._mask_error_details:\n                            raise ResourceError(\n                                f\"Error reading resource {uri!r}\"\n                            ) from e\n                        raise ResourceError(\n                            f\"Error reading resource {uri!r}: {e}\"\n                        ) from e\n\n                # Try templates (transforms + auth via get_resource_template)\n                template = await self.get_resource_template(uri, version=version)\n                if template is None:\n                    if version is None:\n                        raise NotFoundError(f\"Unknown resource: {uri!r}\")\n                    raise NotFoundError(\n                        f\"Unknown resource: {uri!r} version {version!r}\"\n                    )\n                span.set_attributes(template.get_span_attributes())\n                params = template.matches(uri)\n                assert params is not None\n\n                # Path-security screening: reject traversal / absolute-path /\n                # null-byte payloads in extracted parameter values BEFORE the\n                # handler runs. This is the single chokepoint for every\n                # templated read (local decorator and provider-sourced), so\n                # enforcement lives here rather than in any decorator.\n                security = template.resolve_security(self._resource_security)\n                if security is not None:\n                    failed = security.validate(params)\n                    if failed is not None:\n                        logger.debug(\n                            \"Rejected resource %r: parameter %r failed \"\n                            \"path-security screening\",","sourceCodeStart":1647,"sourceCodeEnd":1683,"githubUrl":"https://github.com/PrefectHQ/fastmcp/blob/1f021142978e0861cd910c8df4e8074bc7cf3978/fastmcp_slim/fastmcp/server/server.py#L1647-L1683","documentation":"FastMCP raises NotFoundError(\"Unknown resource: {uri!r} version {version!r}\") when a URI resolves but the specifically requested version does not exist. Raised by read_resource when get_resource_template(uri, version=...) returns None and a non-None version was supplied.","triggerScenarios":"`read_resource(uri, version=\"2.0\")` (or a versioned client request via _version_request_meta) where the resource/template exists only under another version, or was never versioned at all.","commonSituations":"After a server upgrade that renamed/retired versions; hardcoded version strings in clients; mistyped version specifiers; mixing version-pinned clients with unversioned servers.","solutions":["Enumerate available versions for the resource and use one that exists.","Omit the version parameter to get the highest/default version.","Register the requested version or fix the version string (typos like 'v2' vs '2.0').","If pinning clients to versions, ensure deployments keep those versions registered."],"exampleFix":"// before\nres = await server.read_resource(\"data://report\", version=\"3\")\n// after\nversions = [t.version for t in await server.get_resource_templates()]\nres = await server.read_resource(\"data://report\", version=versions[0])  # or drop version=","handlingStrategy":"validation","validationCode":"# discover versions before pinning\ntemplates = await client.list_resource_templates()\nprint([(t.uri_template, getattr(t, 'versions', None)) for t in templates])","typeGuard":null,"tryCatchPattern":"try:\n    result = await server.read_resource(uri, version=v)\nexcept NotFoundError as e:\n    if 'version' in str(e):\n        result = await server.read_resource(uri)  # fall back to default version","preventionTips":["Avoid hardcoding version strings; discover them at runtime or drop the version param.","Keep client-pinned versions in sync with server deployments.","Use consistent version formatting across server and clients.","Re-register retired versions temporarily during migrations."],"tags":["mcp","resource","not-found","versioning"],"backgroundTag":"resource-version-not-found","analyzedSha":"1f021142978e0861cd910c8df4e8074bc7cf3978","analyzedAt":"2026-08-29T14:31:16.082Z","schemaVersion":2},"datasetVersion":"2026-08-29T17:17:51.833Z"}