55import inspect
66import re
77from collections .abc import AsyncIterator , Awaitable , Callable , Iterable , Sequence
8- from contextlib import (
9- AbstractAsyncContextManager ,
10- asynccontextmanager ,
11- )
8+ from contextlib import AbstractAsyncContextManager , asynccontextmanager
129from itertools import chain
1310from typing import Any , Generic , Literal
1411
1815from pydantic .networks import AnyUrl
1916from pydantic_settings import BaseSettings , SettingsConfigDict
2017from starlette .applications import Starlette
18+ from starlette .exceptions import HTTPException
2119from starlette .middleware import Middleware
2220from starlette .middleware .authentication import AuthenticationMiddleware
23- from starlette .exceptions import HTTPException
2421from starlette .requests import Request
2522from starlette .responses import Response
2623from starlette .routing import Mount , Route
3229 JWTBearerTokenAuthBackend ,
3330 RequireAuthMiddleware ,
3431)
35- from mcp .server .auth .provider import AccessToken , TokenValidator
36- from mcp .server .auth .provider import OAuthAuthorizationServerProvider
37- from mcp .shared .auth import ProtectedResourceMetadata
38- from mcp .server .auth .settings import (
39- AuthSettings ,
32+ from mcp .server .auth .provider import (
33+ AccessToken ,
34+ OAuthAuthorizationServerProvider ,
35+ TokenValidator ,
4036)
37+ from mcp .server .auth .settings import AuthSettings
4138from mcp .server .fastmcp .exceptions import ResourceError
4239from mcp .server .fastmcp .prompts import Prompt , PromptManager
4340from mcp .server .fastmcp .resources import FunctionResource , Resource , ResourceManager
5350from mcp .server .stdio import stdio_server
5451from mcp .server .streamable_http import EventStore
5552from mcp .server .streamable_http_manager import StreamableHTTPSessionManager
53+ from mcp .shared .auth import ProtectedResourceMetadata
5654from mcp .shared .context import LifespanContextT , RequestContext
5755from mcp .types import (
5856 AnyFunction ,
@@ -143,8 +141,9 @@ def __init__(
143141 name : str | None = None ,
144142 instructions : str | None = None ,
145143 auth_server_details : dict [str , Any ] | None = None ,
146- auth_server_provider : OAuthAuthorizationServerProvider [Any , Any , Any ]
147- | None = None ,
144+ auth_server_provider : (
145+ OAuthAuthorizationServerProvider [Any , Any , Any ] | None
146+ ) = None ,
148147 protected_resource_metadata : dict [str , Any ] | None = None ,
149148 event_store : EventStore | None = None ,
150149 token_validator : TokenValidator [AccessToken ] | None = None ,
@@ -154,9 +153,11 @@ def __init__(
154153 self ._auth_server_details = auth_server_details
155154 self ._protected_resource_metadata = None
156155 if protected_resource_metadata :
157- self ._protected_resource_metadata = ProtectedResourceMetadata (** protected_resource_metadata )
156+ self ._protected_resource_metadata = ProtectedResourceMetadata (
157+ ** protected_resource_metadata
158+ )
158159 self ._token_validator = token_validator
159-
160+
160161 self ._mcp_server = MCPServer (
161162 name = name or "FastMCP" ,
162163 instructions = instructions ,
@@ -176,7 +177,9 @@ def __init__(
176177 warn_on_duplicate_prompts = self .settings .warn_on_duplicate_prompts
177178 )
178179 # don't do this check if protected_resource_metadata is not None
179- if (self .settings .auth is not None ) != (auth_server_provider is not None ) and self ._protected_resource_metadata is None :
180+ if (self .settings .auth is not None ) != (
181+ auth_server_provider is not None
182+ ) and self ._protected_resource_metadata is None :
180183 # TODO: after we support separate authorization servers (see
181184 # https://github.com/modelcontextprotocol/modelcontextprotocol/pull/284)
182185 # we should validate that if auth is enabled, we have either an
@@ -228,8 +231,13 @@ def session_manager(self) -> StreamableHTTPSessionManager:
228231 async def _serve_protected_resource_metadata (self , request : Request ) -> Response :
229232 """Serve the OAuth protected resource metadata."""
230233 if not self ._protected_resource_metadata :
231- raise HTTPException (status_code = 404 , detail = "Protected resource metadata not configured" )
232- return Response (self ._protected_resource_metadata .model_dump_json (), media_type = "application/json" )
234+ raise HTTPException (
235+ status_code = 404 , detail = "Protected resource metadata not configured"
236+ )
237+ return Response (
238+ self ._protected_resource_metadata .model_dump_json (),
239+ media_type = "application/json" ,
240+ )
233241
234242 def run (
235243 self ,
@@ -706,11 +714,10 @@ async def handle_sse(scope: Scope, receive: Receive, send: Send):
706714
707715 # Create routes
708716 routes : list [Route | Mount ] = []
709-
717+
710718 middleware : list [Middleware ] = []
711719 required_scopes = []
712720
713-
714721 # Add auth endpoints if auth provider is configured
715722 if self ._auth_server_provider :
716723 assert self .settings .auth
@@ -808,21 +815,20 @@ async def handle_streamable_http(
808815 routes : list [Route | Mount ] = []
809816 middleware : list [Middleware ] = []
810817 required_scopes = []
811- print ("Protected resource metadata: " , self ._protected_resource_metadata )
812818 if self ._protected_resource_metadata and self ._token_validator :
813- print ( "Adding protected resource metadata route" )
814- # only add the well-known route if the protected resource metadata is configured
819+ # only add the well-known route if the protected resource metadata is
820+ # configured
815821 routes .append (
816822 Route (
817823 "/.well-known/oauth-protected-resource" ,
818824 self ._serve_protected_resource_metadata ,
819- methods = ["GET" ]
825+ methods = ["GET" ],
820826 )
821827 )
822- # by default assuming that this would be a JWT Bearer Token;
823- # Make this also optional somehow; may be as part of the protected resource metadata,
824- # take a class for validting the token
825- middleware = [
828+ # by default assuming that this would be a JWT Bearer Token;
829+ # Make this also optional somehow; may be as part of the protected resource
830+ # metadata, take a class for validating the token
831+ middleware = [
826832 Middleware (
827833 AuthenticationMiddleware ,
828834 backend = JWTBearerTokenAuthBackend (
0 commit comments