@@ -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 :
@@ -863,17 +853,7 @@ def streamable_http_app(self) -> Starlette:
863
853
864
854
# Add auth endpoints if auth server provider is configured
865
855
if self ._auth_server_provider :
866
- from mcp .server .auth .routes import create_auth_routes
867
-
868
- routes .extend (
869
- create_auth_routes (
870
- provider = self ._auth_server_provider ,
871
- issuer_url = self .settings .auth .issuer_url ,
872
- service_documentation_url = self .settings .auth .service_documentation_url ,
873
- client_registration_options = self .settings .auth .client_registration_options ,
874
- revocation_options = self .settings .auth .revocation_options ,
875
- )
876
- )
856
+ routes .extend (_build_provider_auth_routes (self ._auth_server_provider , self .settings .auth ))
877
857
878
858
# Set up routes with or without auth
879
859
if self ._token_verifier :
@@ -1162,3 +1142,39 @@ async def warning(self, message: str, **extra: Any) -> None:
1162
1142
async def error (self , message : str , ** extra : Any ) -> None :
1163
1143
"""Send an error log message."""
1164
1144
await self .log ("error" , message , ** extra )
1145
+
1146
+
1147
+ # ---------------------------------------------------------------------------
1148
+ # Internal helpers
1149
+ # ---------------------------------------------------------------------------
1150
+
1151
+
1152
+ # pyright: reportUnknownArgumentType=false, reportUnknownParameterType=false
1153
+ def _build_provider_auth_routes (provider : OAuthAuthorizationServerProvider [Any , Any , Any ], auth_settings : AuthSettings ):
1154
+ """Return the list of Starlette routes for the given provider.
1155
+
1156
+ This consolidates the custom-route fallback logic that previously appeared
1157
+ twice in ``sse_app`` and ``streamable_http_app``.
1158
+ """
1159
+
1160
+ from mcp .server .auth .routes import create_auth_routes # local import to avoid cycles
1161
+
1162
+ # Allow provider to supply its own custom route list (e.g. proxy mode)
1163
+ get_auth_routes = getattr (provider , "get_auth_routes" , None )
1164
+ if callable (get_auth_routes ):
1165
+ try :
1166
+ custom = get_auth_routes ()
1167
+ if custom and hasattr (custom , "__iter__" ):
1168
+ return list (custom ) # type: ignore[return-value]
1169
+ except Exception :
1170
+ # Fall back to default factory on any error
1171
+ pass
1172
+
1173
+ # Default behaviour – use shared route factory
1174
+ return create_auth_routes (
1175
+ provider = provider ,
1176
+ issuer_url = auth_settings .issuer_url ,
1177
+ service_documentation_url = auth_settings .service_documentation_url ,
1178
+ client_registration_options = auth_settings .client_registration_options ,
1179
+ revocation_options = auth_settings .revocation_options ,
1180
+ )
0 commit comments