"""Per-request MCP context. The ASGI middleware (mcp/server.py) populates `_user_id_ctx` from scope['scribe_user_id'] before dispatching to FastMCP tool handlers. Tool functions then call `current_user_id()` to retrieve it. Tools must never fall back to a default user — `current_user_id()` raises if called outside a properly-authed MCP request. """ from contextvars import ContextVar _user_id_ctx: ContextVar[int | None] = ContextVar("scribe_mcp_user_id", default=None) def current_user_id() -> int: """Return the user_id for the in-flight MCP request. Raises if unset.""" uid = _user_id_ctx.get() if uid is None: raise RuntimeError("no MCP user context — request was not bearer-authed") return uid