Skip to content

Commit 190f101

Browse files
committed
chore(auth): type-safe auth context push
1 parent caf980b commit 190f101

2 files changed

Lines changed: 7 additions & 10 deletions

File tree

src/mcp/server/auth/middleware/auth_context.py

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import contextvars
2-
32
from contextvars import Token
3+
from typing import Any
44

55
from starlette.requests import Request
66
from starlette.types import ASGIApp, Receive, Scope, Send
@@ -23,7 +23,7 @@ def get_access_token() -> AccessToken | None:
2323
return auth_user.access_token if auth_user else None
2424

2525

26-
def _push_auth_context_from_request(request: Request | None) -> Token[AuthenticatedUser | None] | None:
26+
def push_auth_context_from_request(request: Request | None) -> Token[AuthenticatedUser | None] | None:
2727
"""Set auth context for the current task from an incoming request.
2828
2929
This is primarily used by server transports where request handlers may run
@@ -32,10 +32,7 @@ def _push_auth_context_from_request(request: Request | None) -> Token[Authentica
3232
if request is None:
3333
return None
3434
# Avoid Request.user, which asserts AuthenticationMiddleware is installed.
35-
user = None
36-
scope = getattr(request, "scope", None)
37-
if isinstance(scope, dict):
38-
user = scope.get("user")
35+
user: Any | None = request.scope.get("user")
3936
if user is None:
4037
try:
4138
user = getattr(request, "user", None)
@@ -46,7 +43,7 @@ def _push_auth_context_from_request(request: Request | None) -> Token[Authentica
4643
return None
4744

4845

49-
def _pop_auth_context(token: Token[AuthenticatedUser | None] | None) -> None:
46+
def pop_auth_context(token: Token[AuthenticatedUser | None] | None) -> None:
5047
if token is None:
5148
return
5249
auth_context_var.reset(token)

src/mcp/server/runner.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
from pydantic import BaseModel, ValidationError
2727
from typing_extensions import TypeVar
2828

29-
from mcp.server.auth.middleware.auth_context import _pop_auth_context, _push_auth_context_from_request
29+
from mcp.server.auth.middleware.auth_context import pop_auth_context, push_auth_context_from_request
3030
from mcp.server.connection import Connection
3131
from mcp.server.context import CallNext, HandlerResult, ServerMiddleware, ServerRequestContext
3232
from mcp.server.models import InitializationOptions
@@ -260,11 +260,11 @@ async def _inner() -> HandlerResult:
260260
return result
261261

262262
call = self._compose_server_middleware(ctx, method, params, _inner)
263-
auth_token = _push_auth_context_from_request(ctx.request)
263+
auth_token = push_auth_context_from_request(ctx.request)
264264
try:
265265
result = _dump_result(await call())
266266
finally:
267-
_pop_auth_context(auth_token)
267+
pop_auth_context(auth_token)
268268
if method == "initialize":
269269
# Commit only on chain success, so a middleware veto leaves no state.
270270
# Race-free: the read loop is parked until this call returns.

0 commit comments

Comments
 (0)