Claude.ai (sky) + MCP via OAuth 2.1
Claude Desktop autentiserer med statisk Bearer-token i konfigfilen. Claude.ai web støtter ikke statisk token — «Add custom connector»-dialogen krever full OAuth 2.1-flyt. ketl cloud implementerer OAuth 2.1 + Dynamic Client Registration (DCR) slik at sluttbruker bare limer inn MCP-server-URL, logger inn på data.ketl.no og godkjenner scopes — ingen client_id- eller secret-håndtering.
Status: 1/7 delleveranser er live. 6 pågår — UX-en er klar til å skru på når backend er deployet.
Detaljert leveranse i EPIC #963 (sub-issues #1008–#1014).
Slik kobler du Claude.ai til ketl
Discovery-flyten (7 sub-issuer)
MCP-spec 2025-03-26 krever at klienter kan finne alle OAuth-endepunkter automatisk via well-known URLer. Her er kjeden Claude.ai går gjennom:
Klient prøver MCP-kall uten token
GET https://data.ketl.no/mcp/ → 401 Unauthorized
WWW-Authenticate: Bearer realm="mcp", resource_metadata="https://data.ketl.no/.well-known/oauth-protected-resource"Klient henter Protected Resource Metadata (RFC 9728)
GET https://data.ketl.no/.well-known/oauth-protected-resource → JSON med authorization_servers[]
authorization_servers: ["https://data.ketl.no"]Klient henter Authorization Server Metadata (RFC 8414)
GET https://data.ketl.no/.well-known/oauth-authorization-server → JSON med authorize/token/registration-endpoints
Klient registrerer seg dynamisk (RFC 7591)
POST https://data.ketl.no/oauth/register med redirect_uris[] → 201 med client_id
Klient sender bruker til consent (PKCE S256)
GET https://data.ketl.no/oauth/authorize?client_id=...&code_challenge=...&state=...
Vi viser https://data.ketl.no/oauth/consent hvor bruker logger inn og godkjenner scopes.Klient bytter authorization_code mot tokens
POST https://data.ketl.no/oauth/token med grant_type=authorization_code + code_verifier → JWT access_token + refresh_token
Klient kaller MCP-tools
GET/POST https://data.ketl.no/mcp/... med Authorization: Bearer <jwt>
verifyMcpAuth verifiserer JWT lokalt (HS256), sjekker scopemcp:toolsog audiencehttps://data.ketl.no/mcp.