Erreur de connexion MCP dans Codex : comment corriger Auth Unsupported

Codex affiche Auth Unsupported à côté d’un serveur MCP, et codex mcp login refuse de s’exécuter ou signale qu’aucune prise en charge de l’autorisation n’a été détectée. Cet article montre quand ce libellé est sans gravité, comment distinguer un serveur stdio d’un serveur HTTP, et trois solutions : une variable de jeton bearer, une connexion OAuth propre et un pont mcp-remote. Il traite aussi la régression sur macOS et une erreur de connexion qui lui ressemble.

Erreur de connexion MCP dans Codex : comment corriger Auth Unsupported
Cristian Da Conceicao
Fondateur de Picasso IA

Vous lancez codex mcp list, le nouveau serveur apparaît, et la colonne Auth affiche Unsupported. Ensuite, codex mcp login refuse soit de démarrer, soit s’arrête avec un message indiquant l’absence de prise en charge de l’autorisation. Les outils n’apparaissent jamais dans votre session, et rien dans la sortie ne vous indique lequel de plusieurs problèmes différents vous rencontrez.

Cette page les classe dans l’ordre où vous devez les vérifier. D’abord, savoir si Unsupported pose réellement un problème, car pour certains serveurs c’est le libellé correct. Ensuite, trois solutions (un jeton bearer, une connexion OAuth propre, un pont stdio), une régression sur macOS signalée en juillet 2026, et une erreur qui ressemble à un problème de connexion sans en être un.

💡 Réponse rapide : Unsupported signifie que Codex n’a trouvé aucun élément pour s’authentifier. Pour un serveur stdio, c’est normal. Pour un serveur HTTP qui exige des identifiants, donnez à Codex une variable de jeton bearer, relancez codex mcp login <name> sur une version récente, ou faites passer le serveur par mcp-remote.

Cadenas en laiton à côté d’un ordinateur portable ouvert sur un bureau en noyer

Ce que signifie Auth Unsupported

D’où vient le libellé

Codex calcule lui-même la colonne Auth. D’après un guide de la sous-commande codex mcp, list et get vérifient trois éléments pour chaque serveur :

  1. Une variable d’environnement de jeton bearer est-elle configurée, et est-elle réellement définie ?
  2. Des jetons OAuth enregistrés se trouvent-ils dans le magasin d’identifiants ?
  3. Le point de terminaison HTTP annonce-t-il des métadonnées OAuth ?

Si aucun des trois ne s’applique, la colonne affiche Unsupported. Ce libellé décrit ce que Codex peut voir, et non ce dont le serveur a besoin. Un serveur peut exiger une connexion et afficher quand même Unsupported si ses métadonnées sont absentes, mal formées ou inaccessibles depuis votre machine.

Les valeurs de statut en un coup d’œil

Ce que vous voyezCe que cela signifieÉtape suivante
UnsupportedNi variable de jeton, ni jetons enregistrés, ni métadonnées OAuth (ou serveur stdio)Vérifiez le type de serveur ci-dessous
AuthenticatedUne variable de jeton est définie ou des jetons OAuth sont enregistrésRien à corriger, vérifiez que les outils se chargent
Un libellé de déconnexionLe serveur annonce OAuth, mais aucun jeton n’est enregistréLancez codex mcp login <name>

Les exemples officiels montrent authenticated et unsupported. La formulation de l’état déconnecté change d’une version à l’autre. Considérez donc la colonne comme une indication, et vérifiez avec /mcp dans le TUI de Codex, qui liste vos serveurs MCP actifs. La documentation officielle de Codex sur MCP détaille l’ensemble des paramètres de serveur.

Pour un copier-coller propre dans un ticket ou un script, codex mcp list --json et codex mcp get my-server --json affichent les mêmes données de statut sous une forme lisible par une machine. C’est aussi le moyen le plus rapide de comparer une machine où la connexion fonctionne avec une machine où elle échoue.

Développeur lisant une fenêtre de terminal sur un grand écran

Stdio ou HTTP : vérifier le type de serveur

Avant de modifier quoi que ce soit, identifiez le type de serveur que vous avez enregistré. Ouvrez ~/.codex/config.toml et regardez l’entrée. Une ligne command indique stdio. Une ligne url indique HTTP streamable. La solution dépend entièrement de cette différence.

Vue de dessus d’un carnet avec deux schémas de connexion dessinés à la main

Serveurs stdio : Unsupported est normal

Un serveur stdio est un processus local que Codex démarre et avec lequel il communique via l’entrée et la sortie standard :

[mcp_servers.local-tools]
command = "npx"
args = ["-y", "some-mcp-package"]
env = { LOG_LEVEL = "info" }

OAuth relève du transport HTTP. La référence l’indique clairement : « La connexion OAuth n’est prise en charge que pour les serveurs HTTP streamable. » Donc codex mcp login local-tools est rejeté par conception, et Unsupported est le libellé attendu. Si ce serveur nécessite un identifiant, transmettez-le via env ou env_vars dans le même tableau, au lieu d’essayer de vous connecter.

💡 Un serveur public qui ne demande aucune authentification affichera lui aussi Unsupported. Si les outils apparaissent dans votre session, il n’y a rien à corriger.

Serveurs HTTP : Unsupported est un avertissement

Une entrée HTTP ressemble à ceci :

[mcp_servers.my-server]
url = "https://mcp.example.com/mcp"

Si ce serveur attend des identifiants et que la colonne affiche toujours Unsupported, l’une de trois causes est probable :

  • Le serveur utilise des jetons statiques, et non OAuth, et vous n’en avez pas fourni.
  • Le serveur utilise OAuth, mais Codex ne peut ni joindre ni analyser ses métadonnées.
  • Votre version de Codex est trop ancienne pour la recherche de métadonnées dont le serveur a besoin.

Chaque cause a sa solution ci-dessous.

Solution 1 : envoyer un jeton bearer

Si le fournisseur vous remet un jeton API depuis un tableau de bord, c’est le chemin le plus court. Pas de navigateur, pas de callback, pas de recherche de métadonnées.

Mains tapant sur un clavier dans la lumière chaude de l’après-midi

Exporter la variable

Placez le jeton dans une variable d’environnement, puis enregistrez le serveur avec le nom de la variable :

export MY_SERVER_TOKEN="paste-the-token-value-here"
codex mcp add my-server --url https://mcp.example.com/mcp --bearer-token-env-var MY_SERVER_TOKEN

L’option --bearer-token-env-var enregistre le nom de la variable, et le jeton lui-même n’est jamais écrit sur le disque.

Faire pointer la configuration vers la variable

Le résultat dans config.toml doit afficher :

[mcp_servers.my-server]
url = "https://mcp.example.com/mcp"
bearer_token_env_var = "MY_SERVER_TOKEN"
startup_timeout_sec = 20

Quatre erreurs d’inattention expliquent la plupart des échecs :

  • Coller le jeton dans bearer_token_env_var. Ce champ attend le nom de la variable, pas le secret.
  • Exporter dans le mauvais shell. Une variable définie dans un onglet de terminal est invisible depuis un autre.
  • Lancer Codex depuis une icône d’éditeur ou du dock. Ces processus ne voient souvent pas les variables exportées dans votre profil shell. Démarrez Codex depuis le terminal qui contient la variable, ou définissez-la au niveau du système.
  • Enregistrer toute la ligne d’en-tête. Gardez uniquement la valeur du jeton, puisque Codex l’envoie lui-même dans l’en-tête Authorization.

Relancez codex mcp list. La colonne doit quitter Unsupported dès que la variable est définie.

En CI, stockez le jeton comme secret masqué et exportez-le dans l’étape du job qui lance Codex. Le nom de variable dans config.toml reste le même, donc le fichier peut vivre dans le dépôt sans rien divulguer.

Solution 2 : lancer la connexion OAuth

Quand le serveur attend OAuth, il n’y a pas de jeton à coller. Codex doit passer par une connexion dans le navigateur et enregistrer le résultat.

Ordinateur portable sur une table de café en marbre affichant une page de connexion floue

Se connecter, se déconnecter, réessayer

codex mcp login my-server
codex mcp login my-server --scopes "read,write"
codex mcp logout my-server

La première commande ouvre votre navigateur. Approuvez la demande et revenez au terminal. La deuxième demande des scopes spécifiques lorsque les valeurs par défaut du serveur sont trop restreintes. La troisième efface les identifiants enregistrés et affiche soit Removed OAuth credentials for 'my-server', soit No OAuth credentials stored for 'my-server'.

Travailler en SSH ou sur une machine sans écran est le piège classique. La page de connexion s’ouvre dans un navigateur, puis le fournisseur redirige vers une adresse de callback qui doit atteindre la machine qui exécute Codex. Sur un hôte distant, cette redirection aboutit souvent sur votre ordinateur portable, et la connexion ne se termine jamais. Transférez le port du callback, ou choisissez la solution 1 ou 3 pour cette machine.

Quand une connexion échoue sans cesse, déconnectez-vous d’abord, puis reconnectez-vous, pour ne pas lutter contre une session périmée. Faites de même avant de supprimer une entrée de serveur, car supprimer l’entrée ne révoque ni ne supprime les jetons déjà enregistrés.

Figer la ressource et le callback

Les fournisseurs qui suivent les règles OAuth les plus récentes lient chaque jeton à une seule URL de ressource canonique. Les notes Codex de MintMCP recommandent de définir oauth_resource explicitement dans l’entrée du serveur plutôt que de laisser Codex la déduire, et de garder la même URL pour le point de terminaison MCP, les métadonnées de ressource, la demande d’autorisation et l’audience du jeton :

[mcp_servers.my-server]
url = "https://mcp.example.com/mcp"
oauth_resource = "https://mcp.example.com/mcp"

[mcp_servers.my-server.oauth]
client_id = "your-preregistered-client-id"
callback_url = "http://localhost:8765/callback"

Ajoutez la table oauth seulement lorsque le fournisseur vous a remis un ID client préenregistré. L’URL de callback doit correspondre, caractère pour caractère, à celle que le fournisseur a enregistrée.

La prise en charge d’OAuth est arrivée dans Codex par étapes, donc votre version compte :

VersionDateCe qui a changé
rust-v0.131.02026-05-18ID clients OAuth MCP explicites et liaison du callback
rust-v0.134.02026-05-26codex mcp add accepte les options OAuth pour les serveurs HTTP
rust-v0.142.02026-06-22Recherche des métadonnées de ressource protégée (RFC 9728)
rust-v0.144.02026-07-09Réauthentification interactive après un 401 en cours de session
rust-v0.145.02026-07-21Le démarrage ne bloque plus sur les recherches OAuth ; les rafraîchissements d’identifiants s’exécutent un à la fois

Un serveur qui fonctionne sur la version la plus récente peut échouer sur une version vieille de deux mois, car la recherche a emprunté un autre chemin. Vérifiez avec codex --version, puis mettez à jour via l’installateur que vous avez utilisé, par exemple npm i -g @openai/codex@latest.

Solution 3 : placer mcp-remote au milieu

Parfois le serveur est en ordre, votre jeton aussi, et Codex affiche quand même Unsupported. La solution la plus propre consiste à ne plus demander à Codex de faire OAuth. Le paquet mcp-remote est un petit proxy stdio qui dialogue avec le serveur distant et gère lui-même la connexion dans le navigateur, si bien que Codex ne voit jamais qu’un processus local.

Longue allée de baies de serveurs noires avec des goulottes de câbles bien rangées

Brancher le pont

[mcp_servers.my-server]
command = "npx"
args = ["-y", "mcp-remote", "https://mcp.example.com/mcp"]
startup_timeout_sec = 60

Augmentez startup_timeout_sec au-delà de sa valeur par défaut de 10 secondes. Le premier lancement attend que vous terminiez la connexion dans le navigateur, et un délai trop court tuerait le processus avant que vous puissiez cliquer. Supprimez d’abord toute ancienne entrée portant le même nom, pour que les deux n’entrent pas en conflit.

Compromis à accepter

  • La colonne Auth continuera d’afficher Unsupported. C’est attendu : Codex voit maintenant un serveur stdio, et le pont gère l’authentification.
  • Vous dépendez de la disponibilité de Node et de npx là où Codex s’exécute.
  • Les jetons vivent dans le cache propre du pont (généralement ~/.mcp-auth), et non dans Codex. Si une mauvaise connexion se répète, videz ce dossier.
  • Vous contournez le chemin OAuth de Codex, ce qui signifie pas de réauthentification gérée par Codex après un 401 en cours de session.

Pour un serveur que vous utilisez tous les jours, c’est une configuration permanente raisonnable. Pour un simple test ponctuel, la solution 1 est plus rapide.

Toujours en échec après la correction ?

macOS : aucune prise en charge de l’autorisation détectée

Une panne mérite sa propre section. MintMCP documente un cas où codex mcp login s’arrête avec No authorization support detected sur macOS, à partir des versions du 2026-07-22. Face à un serveur OAuth conforme aux spécifications, la même version de Codex se connecte sous Linux mais échoue à l’étape des métadonnées sous macOS. Le problème est suivi dans openai/codex#34684.

Ordinateurs portables argentés et noirs côte à côte avec des fenêtres de terminal

Avant d’accuser le serveur, testez ses métadonnées depuis la machine qui échoue :

curl -i https://mcp.example.com/.well-known/oauth-protected-resource

Un corps JSON signifie que le serveur publie ce que la spécification demande, et que le problème se situe côté Codex. Certains serveurs ajoutent à la place le chemin du point de terminaison, comme /.well-known/oauth-protected-resource/mcp. Vos options, de la moins coûteuse à la plus lourde :

  1. Mettez à jour Codex et réessayez, car les correctifs arrivent souvent.
  2. Utilisez un jeton bearer (solution 1) si le fournisseur en propose un.
  3. Passez par mcp-remote (solution 3), qui sort le flux OAuth de Codex.

Connexion fermée à l’initialisation

Certaines erreurs ressemblent à des échecs d’authentification sans en être. Un signalement sur le ticket GitHub n° 5619 décrit Codex CLI v0.47.0 se connectant à un serveur HTTP streamable avec un jeton bearer et se terminant par connection closed: initialize response. Le client annonçait la version de protocole 2025-06-18 mais se comportait comme l’ancien transport 2024-11-05 : il fermait la connexion juste après l’événement endpoint sans attendre la réponse d’initialisation. Le même serveur fonctionnait dans Cursor.

Développeur devant un tableau blanc couvert de notes adhésives et de flèches de chronologie

Si votre erreur indique connection closed au lieu de unsupported, aucun changement de jeton ne servira. Mettez Codex à jour vers une version récente, et vérifiez quel transport le serveur parle réellement, car un ancien point de terminaison de style SSE et un point de terminaison HTTP streamable ne sont pas interchangeables.

La liste de contrôle en cinq minutes

Carnet de liste de contrôle avec des coches à côté d’un ordinateur portable

  1. Lancez codex --version et mettez à jour si la version a plus de deux mois.
  2. Lancez codex mcp get my-server et notez si l’entrée utilise command ou url.
  3. Pour les entrées command, acceptez Unsupported et corrigez plutôt le processus du serveur.
  4. Pour les entrées url, définissez bearer_token_env_var ou lancez codex mcp login my-server.
  5. Testez les métadonnées avec curl contre /.well-known/oauth-protected-resource.
  6. Sur macOS, essayez le pont mcp-remote avant de perdre une heure en hypothèses.
  7. Ouvrez /mcp dans le TUI et vérifiez que le serveur apparaît.

Déboguer avec GPT 5.6 Sol sur PicassoIA

Quand la configuration semble correcte et que l’erreur persiste, un second regard aide. GPT 5.6 Sol est conçu pour les tâches de programmation et le raisonnement en plusieurs étapes, et il accepte les captures d’écran, si bien que vous pouvez lui transmettre directement la sortie du terminal. Il ne lancera pas Codex et ne touchera pas à votre machine. Il lit seulement ce que vous collez.

Préparer la requête

  1. Ouvrez GPT 5.6 Sol sur PicassoIA.
  2. Dans System Prompt, définissez le rôle : « Vous êtes un dépanneur de Codex CLI et MCP. Demandez les informations manquantes avant de deviner. »
  3. Dans Prompt, collez votre tableau [mcp_servers.my-server] et la sortie de codex mcp get my-server.
  4. Ajoutez une capture d’écran du terminal en échec sous Image Input.
  5. Réglez Reasoning Effort sur medium pour la plupart des cas, ou sur high pour une configuration OAuth complexe. La valeur par défaut, none, privilégie la vitesse.
  6. Augmentez Max Completion Tokens lorsque vous utilisez high ou xhigh, car un raisonnement poussé peut consommer tout le budget et renvoyer une réponse vide.
  7. Choisissez Verbosity low pour une courte liste de corrections ou high pour un guide complet.

💡 Remplacez chaque jeton réel, secret client et nom d’hôte interne par REDACTED avant de coller quoi que ce soit.

Des prompts qui valent le coup

  • « Voici mon entrée de configuration et la sortie de codex mcp get. Lequel des trois contrôles d’authentification échoue, et pourquoi ? »
  • « Ce serveur est stdio. Réécrivez l’entrée pour que l’identifiant atteigne le processus via env_vars. »
  • « Comparez ma configuration OAuth à cette URL de ressource et dites-moi où l’audience pourrait ne pas correspondre. »

Pour un second avis, Claude Sonnet 5 sur la même plateforme est une autre option solide pour lire des configurations et des sorties d’erreur.

Créer vos propres images sur PicassoIA

Corriger une erreur de connexion est une bonne occasion de créer quelque chose avec les outils qui fonctionnent désormais. Chaque photo de cet article a été générée avec P Image sur PicassoIA, à partir de prompts qui précisent l’optique, la lumière et les textures. Vous pouvez faire de même pour vos propres documentations, notes de version ou bannières de projet.

Trois modèles à essayer ensuite :

  • Seedream 4.5 pour des images 4K nettes à partir d’une description simple
  • GPT Image 2 quand le prompt est long et détaillé
  • Flux 2 Pro pour la génération texte vers image et les retouches à partir de photos

Rédigez un prompt, générez, ajustez l’éclairage ou l’angle, puis générez à nouveau. Une fois qu’une image vous semble juste, les outils vidéo de la plateforme peuvent la transformer en mouvement. Ouvrez PicassoIA, choisissez un modèle et créez votre première image dès aujourd’hui.

Partager cet article

Choisissez votre langue