{"record":{"id":"1fb04cb5899c263c","repo":"PrefectHQ/fastmcp","slug":"remote-server-returned-empty-content-for-backend","errorCode":null,"errorMessage":"Remote server returned empty content for {backend_uri}","messagePattern":"Remote server returned empty content for (.+?)","errorType":"exception","errorClass":"ResourceError","httpStatus":null,"severity":"error","filePath":"fastmcp_slim/fastmcp/server/providers/proxy.py","lineNumber":555,"sourceCode":"            return self._cached_content\n\n        backend_uri = self._backend_uri or str(self.uri)\n        with client_span(\n            \"resources/read\",\n            \"resources/read\",\n            backend_uri,\n            resource_uri=backend_uri,\n        ) as span:\n            span.set_attribute(\"fastmcp.provider.type\", \"ProxyProvider\")\n            client = await self._get_client()\n            ctx = get_context()\n            async with client:\n                _stash_proxy_request_context(client, ctx)\n                result = await _relay_read_resource(client, backend_uri, ctx)\n            if isinstance(result, mcp_types.InputRequiredResult):\n                return InputRequiredResourceResult(result)\n            if not result:\n                raise ResourceError(\n                    f\"Remote server returned empty content for {backend_uri}\"\n                )\n\n            # Process all items in the result list, not just the first one\n            contents: list[ResourceContent] = []\n            for item in result:\n                if isinstance(item, TextResourceContents):\n                    contents.append(\n                        ResourceContent(\n                            content=item.text,\n                            mime_type=item.mime_type,\n                            meta=item.meta,\n                        )\n                    )\n                elif isinstance(item, BlobResourceContents):\n                    contents.append(\n                        ResourceContent(\n                            content=base64.b64decode(item.blob),","sourceCodeStart":537,"sourceCodeEnd":573,"githubUrl":"https://github.com/PrefectHQ/fastmcp/blob/1f021142978e0861cd910c8df4e8074bc7cf3978/fastmcp_slim/fastmcp/server/providers/proxy.py#L537-L573","documentation":"When the FastMCP proxy reads a resource from the remote backend, if _relay_read_resource returns an empty result list, a ResourceError('Remote server returned empty content for <uri>') is raised because a resource must yield at least one content item.","triggerScenarios":"client.read_resource('uri') on a proxy where the backend server responds successfully but with no resource contents (empty list of contents).","commonSituations":"Backend resource handler returns an empty/None result, backend and proxy version mismatch in resource result shape, backend bug for a particular URI.","solutions":["Verify the backend server returns content for that URI by querying it directly","Check the backend's resource implementation for early returns of empty lists/None","Upgrade backend and proxy to matching FastMCP versions","Catch ResourceError and return a placeholder/empty-content fallback"],"exampleFix":"// before\n@server.resource('data://items')\ndef items():\n    return None\n// after\n@server.resource('data://items')\ndef items():\n    return [] if not data else data","handlingStrategy":"try-catch","validationCode":"async def backend_returns_content(backend_client, uri: str) -> bool:\n    result = await backend_client.read_resource(uri)\n    return bool(result)","typeGuard":null,"tryCatchPattern":"try:\n    content = await proxy_client.read_resource(uri)\nexcept ResourceError as e:\n    if 'empty content' in str(e):\n        log.warning('backend returned nothing for %s', uri)\n        content = fallback_content(uri)\n    else:\n        raise","preventionTips":["Ensure backend resource handlers never return None/empty lists","Keep proxy and backend FastMCP versions aligned","Smoke-test every registered resource URI through the proxy"],"tags":["proxy","resources","remote-server"],"backgroundTag":"empty-resource-content","analyzedSha":"1f021142978e0861cd910c8df4e8074bc7cf3978","analyzedAt":"2026-08-29T14:31:16.082Z","schemaVersion":2},"datasetVersion":"2026-08-29T17:17:51.833Z"}