49b9bb6724
Deploy Docs / deploy-docs (push) Failing after 1s
Conformance Tests / client-conformance (push) Failing after 3s
Conformance Tests / server-conformance (push) Failing after 1s
GitHub Actions Security Analysis / zizmor (push) Failing after 1s
CI / checks (push) Failing after 59m20s
CI / all-green (push) Waiting to run
46 lines
1.3 KiB
Python
46 lines
1.3 KiB
Python
"""Run from the repository root:
|
|
uv run examples/snippets/servers/oauth_server.py
|
|
"""
|
|
|
|
from pydantic import AnyHttpUrl
|
|
|
|
from mcp.server.auth.provider import AccessToken, TokenVerifier
|
|
from mcp.server.auth.settings import AuthSettings
|
|
from mcp.server.mcpserver import MCPServer
|
|
|
|
|
|
class SimpleTokenVerifier(TokenVerifier):
|
|
"""Simple token verifier for demonstration."""
|
|
|
|
async def verify_token(self, token: str) -> AccessToken | None:
|
|
pass # This is where you would implement actual token validation
|
|
|
|
|
|
# Create MCPServer instance as a Resource Server
|
|
mcp = MCPServer(
|
|
"Weather Service",
|
|
# Token verifier for authentication
|
|
token_verifier=SimpleTokenVerifier(),
|
|
# Auth settings for RFC 9728 Protected Resource Metadata
|
|
auth=AuthSettings(
|
|
issuer_url=AnyHttpUrl("https://auth.example.com"), # Authorization Server URL
|
|
resource_server_url=AnyHttpUrl("http://localhost:3001"), # This server's URL
|
|
required_scopes=["user"],
|
|
),
|
|
)
|
|
|
|
|
|
@mcp.tool()
|
|
async def get_weather(city: str = "London") -> dict[str, str]:
|
|
"""Get weather data for a city"""
|
|
return {
|
|
"city": city,
|
|
"temperature": "22",
|
|
"condition": "Partly cloudy",
|
|
"humidity": "65%",
|
|
}
|
|
|
|
|
|
if __name__ == "__main__":
|
|
mcp.run(transport="streamable-http", json_response=True)
|