Skip to content

Commit be4ddd3

Browse files
committed
change issuer semantics
1 parent a024ca8 commit be4ddd3

File tree

2 files changed

+25
-17
lines changed

2 files changed

+25
-17
lines changed

src/mcp/server/auth/settings.py

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,9 @@ class RevocationOptions(BaseModel):
1515
class AuthSettings(BaseModel):
1616
issuer_url: AnyHttpUrl = Field(
1717
...,
18-
description="Base URL where this server is reachable. For AS: OAuth issuer URL. For RS: Resource server URL.",
18+
description="OAuth authorization server URL that issues tokens for this resource server.",
1919
)
2020
service_documentation_url: AnyHttpUrl | None = None
2121
client_registration_options: ClientRegistrationOptions | None = None
2222
revocation_options: RevocationOptions | None = None
2323
required_scopes: list[str] | None = None
24-
25-
# Resource Server settings (when operating as RS only)
26-
authorization_servers: list[AnyHttpUrl] | None = Field(
27-
None,
28-
description="Authorization servers that can issue tokens for this resource (RS mode)",
29-
)

src/mcp/server/fastmcp/server.py

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,14 @@ class Settings(BaseSettings, Generic[LifespanResultT]):
120120
# Transport security settings (DNS rebinding protection)
121121
transport_security: TransportSecuritySettings | None = None
122122

123+
def get_resource_server_url(self) -> str:
124+
"""Construct the resource server URL from host and port settings."""
125+
scheme = "https" if self.port == 443 else "http"
126+
if self.port in (80, 443):
127+
return f"{scheme}://{self.host}"
128+
else:
129+
return f"{scheme}://{self.host}:{self.port}"
130+
123131

124132
def lifespan_wrapper(
125133
app: FastMCP,
@@ -743,11 +751,12 @@ async def handle_sse(scope: Scope, receive: Receive, send: Send):
743751
if self._token_verifier:
744752
# Determine resource metadata URL
745753
resource_metadata_url = None
746-
if self.settings.auth and self.settings.auth.authorization_servers:
754+
if self.settings.auth:
747755
from pydantic import AnyHttpUrl
748756

757+
resource_server_url = self.settings.get_resource_server_url()
749758
resource_metadata_url = AnyHttpUrl(
750-
str(self.settings.auth.issuer_url).rstrip("/") + "/.well-known/oauth-protected-resource"
759+
resource_server_url.rstrip("/") + "/.well-known/oauth-protected-resource"
751760
)
752761

753762
# Auth is enabled, wrap the endpoints with RequireAuthMiddleware
@@ -785,13 +794,15 @@ async def sse_endpoint(request: Request) -> Response:
785794
)
786795
)
787796
# Add protected resource metadata endpoint if configured as RS
788-
if self.settings.auth and self.settings.auth.authorization_servers:
797+
if self.settings.auth:
789798
from mcp.server.auth.routes import create_protected_resource_routes
799+
from pydantic import AnyHttpUrl
790800

801+
resource_server_url = AnyHttpUrl(self.settings.get_resource_server_url())
791802
routes.extend(
792803
create_protected_resource_routes(
793-
resource_url=self.settings.auth.issuer_url,
794-
authorization_servers=self.settings.auth.authorization_servers,
804+
resource_url=resource_server_url,
805+
authorization_servers=[self.settings.auth.issuer_url],
795806
scopes_supported=self.settings.auth.required_scopes,
796807
)
797808
)
@@ -858,11 +869,12 @@ async def handle_streamable_http(scope: Scope, receive: Receive, send: Send) ->
858869
if self._token_verifier:
859870
# Determine resource metadata URL
860871
resource_metadata_url = None
861-
if self.settings.auth and self.settings.auth.authorization_servers:
872+
if self.settings.auth:
862873
from pydantic import AnyHttpUrl
863874

875+
resource_server_url = self.settings.get_resource_server_url()
864876
resource_metadata_url = AnyHttpUrl(
865-
str(self.settings.auth.issuer_url).rstrip("/") + "/.well-known/oauth-protected-resource"
877+
resource_server_url.rstrip("/") + "/.well-known/oauth-protected-resource"
866878
)
867879

868880
routes.append(
@@ -881,14 +893,16 @@ async def handle_streamable_http(scope: Scope, receive: Receive, send: Send) ->
881893
)
882894

883895
# Add protected resource metadata endpoint if configured as RS
884-
if self.settings.auth and self.settings.auth.authorization_servers:
896+
if self.settings.auth:
885897
from mcp.server.auth.handlers.metadata import ProtectedResourceMetadataHandler
886898
from mcp.server.auth.routes import cors_middleware
887899
from mcp.shared.auth import ProtectedResourceMetadata
900+
from pydantic import AnyHttpUrl
888901

902+
resource_server_url = AnyHttpUrl(self.settings.get_resource_server_url())
889903
protected_resource_metadata = ProtectedResourceMetadata(
890-
resource=self.settings.auth.issuer_url,
891-
authorization_servers=self.settings.auth.authorization_servers,
904+
resource=resource_server_url,
905+
authorization_servers=[self.settings.auth.issuer_url],
892906
scopes_supported=self.settings.auth.required_scopes,
893907
)
894908
routes.append(

0 commit comments

Comments
 (0)