# OAuth per server MCP: il flusso, i controlli e cosa resta al client

Un server MCP remoto usa OAuth 2.1: 401, metadata, consenso, token opaco. Ecco i sei endpoint, i controlli obbligatori e il limite del nostro server.

> Pagina: https://ui.eneawork.it/blog/mcp-auth-oauth-guida
> Markdown: https://ui.eneawork.it/blog/mcp-auth-oauth-guida.md

*2026-11-01*

Un server MCP remoto autentica il client con OAuth 2.1, in sei endpoint, e non chiede mai una password al client. Il flusso è quello del resource server: 401, metadata, consenso, token opaco legato a un solo resource.

Il modulo backend/mcp-oauth.js monta 6 route handler: due /.well-known/, /oauth/register, /oauth/authorize in GET e POST e /oauth/token, contati il 1 novembre 2026. Le scadenze nel codice sono 60 s per il code, 1 h per l'access token e 30 giorni per il refresh, verificate lo stesso giorno. L'endpoint /mcp ha risposto a tools/list con 9 strumenti, 3.655 byte e 138 ms, misurati da ui.eneawork.it/mcp il 1 novembre 2026. Il catalogo dietro conta 111.985 componenti, 1.556 blocchi e 12.808 icone da 1.472 librerie, letti da /api/stats. La specifica citata è la revisione 2025-06-18.

## Cosa chiede la specifica

La revisione 2025-06-18 parte da OAuth 2.1 (draft -13) e ne impone un sottoinsieme. Il server MCP deve pubblicare i Protected Resource Metadata di RFC 9728, l'authorization server deve pubblicare i metadata di RFC 8414, e il client deve mandare il parametro resource di RFC 8707 sia nella richiesta di autorizzazione sia in quella del token. PKCE è obbligatorio e il redirect_uri deve combaciare con un valore registrato, non con un prefisso.

## Il flusso in cinque passi

## Registrare il client

curl -s -X POST https://ui.eneawork.it/oauth/register \ -H "Content-Type: application/json" \ -d '{"client_name":"Claude Code","redirect_uris":["http://localhost:3000/callback"]}'

La risposta contiene client_id e token_endpoint_auth_method: none. Non c'è un client secret, ed è una scelta: un client MCP è un editor o un'app desktop, e un segreto dentro un binario si legge con strings. La registrazione dinamica di RFC 7591 resta raccomandata, non obbligatoria: un server senza di essa deve dare un client id per un'altra via.

## I sei endpoint

## Il confine del nostro server

Il token è opaco e salvato come SHA-256, poi risolto a un account. Non porta il claim di audience di RFC 8707: con un solo resource pubblico la differenza è nulla, con due resource servirebbe il controllo di audience. Anche lo scope è uno, mcp: non c'è un modo per concedere la lettura del catalogo e negare il comando di installazione.

## La limitazione

Il flusso protegge il trasporto, non il contenuto. Un tool può restituire testo che contiene istruzioni, e un client che le esegue trasforma il risultato in prompt injection. La specifica lo dice: i risultati restano dati non fidati, e il consenso dell'utente non li rende sicuri.

## Dove continuare

La costruzione del server è in costruire un server MCP, il disegno degli strumenti in progettare un tool MCP. Per il lato client leggi sicurezza di un agente di coding, e per gli schermi di login reali la rassegna blocchi di autenticazione. Il catalogo dietro il token è in 111.985 componenti e 1.556 blocchi; un record con licenza non dichiarata a monte è login form di minhxthanh.

## FAQ

### Serve OAuth per un server MCP locale?

No. La specifica dice che un server stdio non deve usare il flusso OAuth e deve leggere le credenziali dall'ambiente. OAuth serve al trasporto HTTP, dove il client è remoto.

### Perché il code dura solo 60 secondi?

Perché un code intercettato vale un token. Sessanta secondi bastano al browser per tornare al client e rendono inutile un code copiato da un log. Il valore è in backend/mcp-oauth.js, verificato il 1 novembre 2026.

### Cosa succede se un refresh token viene rubato?

Il refresh ruota a ogni uso e la riga vecchia viene cancellata. Il primo dei due che lo usa vince, il secondo riceve invalid_grant. L'utente vede la connessione rotta e revoca il client dalla pagina account.

### Il client deve mandare il token a ogni richiesta?

Sì. OAuth 2.1 lo richiede a ogni richiesta HTTP, anche dentro la stessa sessione MCP. Il token non va mai messo nella query string, perché finirebbe nei log del proxy.

### Quanti scope espone il vostro server?

Uno, mcp. Copre la ricerca, la lettura dei metadata e i comandi di installazione consentiti dal piano. Non c'è uno scope separato per la scrittura perché il server è in sola lettura.
