{"record":{"id":"e59aa28756cc62f4","repo":"PrefectHQ/fastmcp","slug":"session-is-not-available-because-the-mcp-session-h","errorCode":null,"errorMessage":"session is not available because the MCP session has not been established yet. Check `context.request_context` for None before accessing this attribute.","messagePattern":"session is not available because the MCP session has not been established yet\\. Check `context\\.request_context` for None before accessing this attribute\\.","errorType":"exception","errorClass":"RuntimeError","httpStatus":null,"severity":"error","filePath":"fastmcp_slim/fastmcp/server/context.py","lineNumber":814,"sourceCode":"\n        In request mode: Returns the session from the active request context.\n        In background task mode: Returns the session stored at Context creation.\n\n        Raises RuntimeError if no session is available.\n        \"\"\"\n        # Background task mode: use the stored session\n        if self.is_background_task and self._session is not None:\n            return self._session\n\n        # Request mode: use request context\n        if self.request_context is not None:\n            return self.request_context.session\n\n        # Fallback to stored session (e.g., during on_initialize)\n        if self._session is not None:\n            return self._session\n\n        raise RuntimeError(\n            \"session is not available because the MCP session has not been established yet. \"\n            \"Check `context.request_context` for None before accessing this attribute.\"\n        )\n\n    # Convenience methods for common log levels\n    async def debug(\n        self,\n        message: str,\n        logger_name: str | None = None,\n        extra: Mapping[str, Any] | None = None,\n    ) -> None:\n        \"\"\"Send a `DEBUG`-level message to the connected MCP Client.\n\n        Messages sent to Clients are also logged to the `fastmcp.server.context.to_client` logger with a level of `DEBUG`.\"\"\"\n        await self.log(\n            level=\"debug\",\n            message=message,\n            logger_name=logger_name,","sourceCodeStart":796,"sourceCodeEnd":832,"githubUrl":"https://github.com/PrefectHQ/fastmcp/blob/1f021142978e0861cd910c8df4e8074bc7cf3978/fastmcp_slim/fastmcp/server/context.py#L796-L832","documentation":"Context.session returns the low-level MCP ServerSession. It prefers the per-request session from request_context, falls back to a stored session (e.g. during on_initialize), and raises RuntimeError when neither exists — i.e. no MCP session has been established for this Context.","triggerScenarios":"Accessing ctx.session in code that runs before a session exists: outside any request, after the request finished (stale Context), or during early lifecycle phases where neither request_context nor the stored _session is set.","commonSituations":"Direct low-level session.send_* calls from helpers invoked at import time; tests instantiating Context manually; middleware that runs before initialization completes and assumes a session is present.","solutions":["Call session-dependent code only from within a request handler or after on_initialize has stored a session.","Check ctx.request_context is not None (or wrap in try-except RuntimeError) before accessing ctx.session.","Pass the session explicitly into helpers instead of reading it from Context at arbitrary times.","For on_initialize-era code, rely on the stored-session fallback rather than caching ctx.session yourself."],"exampleFix":"// before\nasync def helper(ctx: Context):\n    await ctx.session.send_log_message(level=\"info\", data=\"hi\")  # may raise\n// after\nasync def helper(ctx: Context):\n    if ctx.request_context is not None:\n        await ctx.session.send_log_message(level=\"info\", data=\"hi\")","handlingStrategy":"type-guard","validationCode":"session = ctx.request_context.session if ctx.request_context is not None else None","typeGuard":"def session_available(ctx) -> bool:\n    return ctx.request_context is not None or getattr(ctx, \"_session\", None) is not None","tryCatchPattern":"try:\n    session = ctx.session\nexcept RuntimeError:\n    session = None  # no MCP session established yet","preventionTips":["Gate low-level session calls on ctx.request_context being present.","In on_initialize handlers, rely on the stored-session fallback rather than caching the session yourself.","Keep helper functions session-free; pass the session in as a parameter."],"tags":["python","context","session","runtimeerror","session-lifecycle"],"backgroundTag":"no-active-request-context","analyzedSha":"1f021142978e0861cd910c8df4e8074bc7cf3978","analyzedAt":"2026-08-29T14:31:16.082Z","schemaVersion":2},"datasetVersion":"2026-08-29T17:17:51.833Z"}