Il pulsante Connect ora connette davvero

Approvare un assistente non faceva nulla. La pagina diceva che il modulo non veniva da qui, e aveva ragione in un modo che era sbagliato: la pagina di approvazione chiedeva ai browser di non inviare un referrer, e Chrome deriva l'origine di una pagina dalla stessa impostazione — così il modulo della pagina stessa arrivava dichiarando di venire da nessun posto, e il controllo che impedisce a un altro sito di approvare cose per te bloccava la pagina stessa.

Nulla era mai stato connesso tramite di essa. I test non potevano vederlo, perché un test non è un browser e invia qualunque intestazione gli venga detto di inviare; il database sì, e lo diceva chiaramente: ogni richiesta mostrata, nessuna mai approvata.

Dietro a questo ce n'era un secondo. La pagina dice al browser che può inviarti solo verso l'assistente che ha fatto la richiesta — e diceva invece che poteva inviarti solo di nuovo verso di noi, così l'approvazione funzionava e il ritorno verso l'assistente veniva rifiutato dalla pagina stessa. Ora nomina quell'unico indirizzo, e nulla altro.

Approvare un assistente è una pagina e un pulsante: questo sta dietro.

Cosa fa davvero l'approvazione

Accedi qui con l'account che usi già, leggi una pagina che nomina il client e l'indirizzo per cui sta per agire, e premi Connect. Ciò che il client riceve è un token emesso da questo sito — non la tua sessione, non una chiave API. Raggiunge i documenti dell'account e nulla altro: non l'account, non l'accesso, non le tue chiavi API. Una connessione di sola lettura non può salvare, condividere o eliminare, e questo è imposto sulla credenziale, non sugli strumenti.

TransformPipe deve essere il proprio server di autorizzazione per questo: la specifica MCP proibisce a una risorsa di accettare un token emesso da qualcun altro, quindi la sessione di accesso non può semplicemente essere consegnata.

L'ordine degli eventi

  1. L'assistente invia un POST a /api/mcp senza token e riceve un 401 che indica dove guardare.
  2. Legge /.well-known/oauth-protected-resource, poi /.well-known/oauth-authorization-server, per trovare gli endpoint.
  3. Si identifica — con un documento di metadati che pubblica, oppure registrandosi qui. Nessun segreto in entrambi i casi: un client in esecuzione sulla macchina di qualcun altro non può custodirne uno, ed è esattamente per questo che esiste PKCE.
  4. Ti invia a /authorize con una challenge. code_challenge_method=S256 è obbligatorio; una challenge semplice viene rifiutata senz'altro.
  5. Tu approvi con un POST dalla pagina che ti è stata mostrata, così un link da solo non autorizza nulla.
  6. Scambia il codice e il suo verifier su /token.

Cosa fanno i token in seguito

Un codice vive cinque minuti e viene bruciato all'inizio del suo scambio, prima di qualunque verifica, così una copia riproposta durante la prima chiamata non ottiene nulla. I refresh token ruotano: consegnarne uno lo revoca ed emette una nuova coppia. Consegnarne uno già ruotato termina l'intera concessione — token di accesso, refresh token e ogni rotazione precedente — perché un refresh token presentato due volte è l'unico segnale che sia stato copiato.

Lo revochi dal menu dell'account, sotto Connettore MCP; smette di funzionare alla chiamata successiva.

Perché il pulsante non aveva fatto nulla

Due intestazioni sulla nostra pagina. Chiedeva ai browser di non inviare un referrer, e Chrome deriva l'Origin di un POST da quella stessa impostazione, così il modulo della pagina arrivava dichiarando di venire da nessun posto — e il controllo che blocca un altro sito dall'approvare cose per te bloccava la pagina stessa. Dietro a questo, la form-action nominava solo questo sito, quindi il ritorno verso l'assistente era rifiutato dopo che il codice era già stato coniato. Ora nomina l'unico indirizzo a cui la richiesta verrà inviata, e nulla altro.

Da leggere: convertire documenti da un assistente, e se un convertitore online è sicuro.