Adds mcp._context.current_user_id() backed by a ContextVar. The ASGI auth middleware sets it before dispatching to FastMCP and resets it on the way out, so tool handlers can read the acting user without re-parsing the request scope. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
21 lines
732 B
Python
21 lines
732 B
Python
"""Per-request MCP context.
|
|
|
|
The ASGI middleware (mcp/server.py) populates `_user_id_ctx` from
|
|
scope['fable_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("fable_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
|