1+ # pyright: reportUnknownMemberType=false, reportUnknownVariableType=false, reportAttributeAccessIssue=false, reportUnknownArgumentType=false, reportCallIssue=false, reportUnnecessaryIsInstance=false
12from __future__ import annotations
23
4+ import logging
5+ import os
6+ import time
7+ import uuid
8+ from collections .abc import Mapping
9+ from typing import Any , cast
10+ from urllib .parse import urlencode
11+
12+ import httpx # type: ignore
13+ from pydantic import AnyHttpUrl , AnyUrl , Field
14+ from pydantic_settings import BaseSettings , SettingsConfigDict
15+ from starlette .responses import Response
16+ from starlette .routing import Route
17+
18+ from mcp .server .auth .handlers .token import TokenHandler
19+ from mcp .server .auth .middleware .client_auth import ClientAuthenticator
20+ from mcp .server .auth .provider import (
21+ AccessToken ,
22+ AuthorizationCode ,
23+ AuthorizationParams ,
24+ OAuthAuthorizationServerProvider ,
25+ )
26+ from mcp .server .auth .proxy .routes import create_proxy_routes
27+ from mcp .server .auth .routes import create_auth_routes
28+ from mcp .server .auth .settings import ClientRegistrationOptions
29+ from mcp .server .fastmcp .utilities .logging import redact_sensitive_data
30+ from mcp .shared .auth import OAuthClientInformationFull , OAuthToken
31+
332"""Transparent OAuth proxy provider for FastMCP (Anthropic SDK).
433
534This provider mimics the behaviour of fastapi_mcp's `setup_proxies=True` and the
2352A simple helper ``TransparentOAuthProxyProvider.from_env()`` reads these vars.
2453"""
2554
26- import os
27- import time
28- import uuid
29- import json
30- import urllib .parse
31- from typing import Any , cast
32- from collections .abc import Mapping
33- from urllib .parse import urlencode
34-
35- import httpx # type: ignore
36- import logging
37- from pydantic import AnyHttpUrl , Field , AnyUrl
38- from pydantic_settings import BaseSettings , SettingsConfigDict
39- from starlette .routing import Route
40- from starlette .requests import Request
41- from starlette .responses import Response
42-
43- from mcp .server .auth .provider import (
44- AccessToken ,
45- AuthorizationCode ,
46- AuthorizationParams ,
47- OAuthAuthorizationServerProvider ,
48- )
49- from mcp .server .auth .settings import ClientRegistrationOptions
50- from mcp .shared .auth import OAuthClientInformationFull , OAuthToken
51- from mcp .server .auth .routes import create_auth_routes
52- from mcp .server .auth .middleware .client_auth import ClientAuthenticator
53- from mcp .server .auth .handlers .token import TokenHandler
54- from starlette .requests import Request
55- from starlette .responses import Response
56-
57- # New: route factory for proxy endpoints
58- from mcp .server .auth .proxy .routes import create_proxy_routes # noqa: E402
59-
60- from mcp .server .fastmcp .utilities .logging import configure_logging , redact_sensitive_data
61-
6255__all__ = ["TransparentOAuthProxyProvider" ]
6356
6457logger = logging .getLogger ("transparent_oauth_proxy" )
@@ -74,15 +67,13 @@ class ProxyTokenHandler(TokenHandler):
7467 back to the caller.
7568 """
7669
77- def __init__ (self , provider : " TransparentOAuthProxyProvider" ):
70+ def __init__ (self , provider : TransparentOAuthProxyProvider ):
7871 # We provide a dummy ClientAuthenticator that will accept any client –
7972 # we are not going to invoke the base-class logic anyway.
8073 super ().__init__ (provider = provider , client_authenticator = ClientAuthenticator (provider ))
8174 self .provider = provider # keep for easy access
8275
83- async def handle (self , request ): # type: ignore[override]
84- from starlette .responses import Response
85-
76+ async def handle (self , request ) -> Response : # type: ignore[override]
8677 correlation_id = str (uuid .uuid4 ())[:8 ]
8778 start_time = time .time ()
8879
@@ -157,7 +148,7 @@ class ProxySettings(BaseSettings):
157148 default_scope : str = Field ("openid" , alias = "PROXY_DEFAULT_SCOPE" )
158149
159150 @classmethod
160- def load (cls ) -> " ProxySettings" :
151+ def load (cls ) -> ProxySettings :
161152 """Instantiate settings from environment variables (for backwards compatibility)."""
162153 return cls ()
163154
@@ -342,7 +333,7 @@ async def revoke_token(self, token: object) -> None: # noqa: D401
342333 # ------------------------------------------------------------------
343334
344335 @classmethod
345- def from_env (cls ) -> " TransparentOAuthProxyProvider" :
336+ def from_env (cls ) -> TransparentOAuthProxyProvider :
346337 """Construct provider using :class:`ProxySettings` populated from the environment."""
347338 return cls (settings = ProxySettings .load ())
348339
0 commit comments