@@ -750,17 +750,7 @@ async def handle_sse(scope: Scope, receive: Receive, send: Send):
750
750
751
751
# Add auth endpoints if auth server provider is configured
752
752
if self ._auth_server_provider :
753
- from mcp .server .auth .routes import create_auth_routes
754
-
755
- routes .extend (
756
- create_auth_routes (
757
- provider = self ._auth_server_provider ,
758
- issuer_url = self .settings .auth .issuer_url ,
759
- service_documentation_url = self .settings .auth .service_documentation_url ,
760
- client_registration_options = self .settings .auth .client_registration_options ,
761
- revocation_options = self .settings .auth .revocation_options ,
762
- )
763
- )
753
+ routes .extend (_build_provider_auth_routes (self ._auth_server_provider , self .settings .auth ))
764
754
765
755
# When auth is configured, require authentication
766
756
if self ._token_verifier :
@@ -865,17 +855,7 @@ async def handle_streamable_http(scope: Scope, receive: Receive, send: Send) ->
865
855
866
856
# Add auth endpoints if auth server provider is configured
867
857
if self ._auth_server_provider :
868
- from mcp .server .auth .routes import create_auth_routes
869
-
870
- routes .extend (
871
- create_auth_routes (
872
- provider = self ._auth_server_provider ,
873
- issuer_url = self .settings .auth .issuer_url ,
874
- service_documentation_url = self .settings .auth .service_documentation_url ,
875
- client_registration_options = self .settings .auth .client_registration_options ,
876
- revocation_options = self .settings .auth .revocation_options ,
877
- )
878
- )
858
+ routes .extend (_build_provider_auth_routes (self ._auth_server_provider , self .settings .auth ))
879
859
880
860
# Set up routes with or without auth
881
861
if self ._token_verifier :
@@ -1145,3 +1125,39 @@ async def warning(self, message: str, **extra: Any) -> None:
1145
1125
async def error (self , message : str , ** extra : Any ) -> None :
1146
1126
"""Send an error log message."""
1147
1127
await self .log ("error" , message , ** extra )
1128
+
1129
+
1130
+ # ---------------------------------------------------------------------------
1131
+ # Internal helpers
1132
+ # ---------------------------------------------------------------------------
1133
+
1134
+
1135
+ # pyright: reportUnknownArgumentType=false, reportUnknownParameterType=false
1136
+ def _build_provider_auth_routes (provider : OAuthAuthorizationServerProvider [Any , Any , Any ], auth_settings : AuthSettings ):
1137
+ """Return the list of Starlette routes for the given provider.
1138
+
1139
+ This consolidates the custom-route fallback logic that previously appeared
1140
+ twice in ``sse_app`` and ``streamable_http_app``.
1141
+ """
1142
+
1143
+ from mcp .server .auth .routes import create_auth_routes # local import to avoid cycles
1144
+
1145
+ # Allow provider to supply its own custom route list (e.g. proxy mode)
1146
+ get_auth_routes = getattr (provider , "get_auth_routes" , None )
1147
+ if callable (get_auth_routes ):
1148
+ try :
1149
+ custom = get_auth_routes ()
1150
+ if custom and hasattr (custom , "__iter__" ):
1151
+ return list (custom ) # type: ignore[return-value]
1152
+ except Exception :
1153
+ # Fall back to default factory on any error
1154
+ pass
1155
+
1156
+ # Default behaviour – use shared route factory
1157
+ return create_auth_routes (
1158
+ provider = provider ,
1159
+ issuer_url = auth_settings .issuer_url ,
1160
+ service_documentation_url = auth_settings .service_documentation_url ,
1161
+ client_registration_options = auth_settings .client_registration_options ,
1162
+ revocation_options = auth_settings .revocation_options ,
1163
+ )
0 commit comments