Spaces:
Sleeping
Sleeping
File size: 1,364 Bytes
c91c7db 3493993 c91c7db 3493993 c91c7db | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | from __future__ import annotations
import contextvars
from dataclasses import dataclass
from datetime import datetime
@dataclass(frozen=True, slots=True)
class AuthContext:
api_key_id: str
key_name: str
key_prefix: str
environment: str
role: str | None
scopes: frozenset[str]
requests_per_minute: int
concurrent_jobs: int
uploads_per_hour: int
processing_bytes_per_day: int
expires_at: datetime | None
# Resolved exclusively by the server from APIKeyPrincipal. These are not
# accepted from REST, MCP, SDK, or n8n request payloads.
workspace_id: str | None = None
user_id: str | None = None
membership_id: str | None = None
membership_role: str | None = None
def allows(self, required_scope: str) -> bool:
if required_scope in self.scopes or "admin" in self.scopes:
return True
return False
auth_context: contextvars.ContextVar[AuthContext | None] = contextvars.ContextVar(
"auth_context", default=None
)
# HTTP authentication already applies request and concurrency limits before the
# MCP ASGI application runs. Standalone stdio MCP calls use this marker to apply
# the same limiter exactly once inside the transport-neutral registry.
http_auth_applied: contextvars.ContextVar[bool] = contextvars.ContextVar(
"http_auth_applied", default=False
)
|