feat: implement SEP-991 URL-based client ID (CIMD) support (#1652)
Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Felix Weinberger <3823880+felixweinberger@users.noreply.github.com>
This commit is contained in:
parent
f2517fe14b
commit
f22501315e
1 changed files with 476 additions and 14 deletions
|
|
@ -150,9 +150,15 @@ class CallbackServer:
|
|||
class SimpleAuthClient:
|
||||
"""Simple MCP client with auth support."""
|
||||
|
||||
def __init__(self, server_url: str, transport_type: str = "streamable-http"):
|
||||
def __init__(
|
||||
self,
|
||||
server_url: str,
|
||||
transport_type: str = "streamable-http",
|
||||
client_metadata_url: str | None = None,
|
||||
):
|
||||
self.server_url = server_url
|
||||
self.transport_type = transport_type
|
||||
self.client_metadata_url = client_metadata_url
|
||||
self.session: ClientSession | None = None
|
||||
|
||||
async def connect(self):
|
||||
|
|
@ -185,12 +191,14 @@ class SimpleAuthClient:
|
|||
webbrowser.open(authorization_url)
|
||||
|
||||
# Create OAuth authentication handler using the new interface
|
||||
# Use client_metadata_url to enable CIMD when the server supports it
|
||||
oauth_auth = OAuthClientProvider(
|
||||
server_url=self.server_url,
|
||||
client_metadata=OAuthClientMetadata.model_validate(client_metadata_dict),
|
||||
storage=InMemoryTokenStorage(),
|
||||
redirect_handler=_default_redirect_handler,
|
||||
callback_handler=callback_handler,
|
||||
client_metadata_url=self.client_metadata_url,
|
||||
)
|
||||
|
||||
# Create transport with auth handler based on transport type
|
||||
|
|
@ -334,6 +342,7 @@ async def main():
|
|||
# Most MCP streamable HTTP servers use /mcp as the endpoint
|
||||
server_url = os.getenv("MCP_SERVER_PORT", 8000)
|
||||
transport_type = os.getenv("MCP_TRANSPORT_TYPE", "streamable-http")
|
||||
client_metadata_url = os.getenv("MCP_CLIENT_METADATA_URL")
|
||||
server_url = (
|
||||
f"http://localhost:{server_url}/mcp"
|
||||
if transport_type == "streamable-http"
|
||||
|
|
@ -343,9 +352,11 @@ async def main():
|
|||
print("🚀 Simple MCP Auth Client")
|
||||
print(f"Connecting to: {server_url}")
|
||||
print(f"Transport type: {transport_type}")
|
||||
if client_metadata_url:
|
||||
print(f"Client metadata URL: {client_metadata_url}")
|
||||
|
||||
# Start connection flow - OAuth will be handled automatically
|
||||
client = SimpleAuthClient(server_url, transport_type)
|
||||
client = SimpleAuthClient(server_url, transport_type, client_metadata_url)
|
||||
await client.connect()
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue