Config MCP OpenCode : ajouter des serveurs, OAuth et corriger les timeouts
Configurez les serveurs MCP dans OpenCode avec les champs exacts d’opencode.json pour les configurations locales et distantes, découvrez comment fonctionne la connexion OAuth et pourquoi elle se bloque, et corrigez les erreurs de délai qui font échouer les outils au démarrage ou après 60 secondes de traitement.
Vous ajoutez un serveur MCP à opencode.json, redémarrez le terminal, et les outils n’apparaissent jamais. Ou bien ils apparaissent, la connexion par navigateur s’ouvre, et le callback n’arrive jamais. Ou tout fonctionne jusqu’à ce que le premier appel lent expire avec un timeout. Ces trois échecs expliquent la plupart des problèmes de config MCP OpenCode, et chacun a une solution courte et banale.
Cet article détaille les champs exacts que lit OpenCode, les commandes qui indiquent ce qui ne va pas, et les réglages qui mettent fin aux tâtonnements. Les extraits suivent la documentation officielle de MCP pour OpenCode telle que vérifiée en octobre 2026. Collez-les donc tels quels et ne changez que les noms, chemins et URL.
Où OpenCode lit sa configuration
OpenCode ne choisit pas un seul fichier de configuration en ignorant les autres. Il fusionne toutes les sources qu’il trouve, et lorsque deux sources définissent le même champ, la dernière dans l’ordre ci-dessous l’emporte. C’est pourquoi un serveur que vous avez « supprimé » du fichier du projet continue de réapparaître : il est toujours défini dans votre fichier global.
Emplacements des configurations et ordre de fusion
Ordre
Source
Utilisation recommandée
1
Configuration distante depuis .well-known/opencode
Valeurs par défaut de l’organisation
2
~/.config/opencode/opencode.json global
Serveurs que vous voulez partout
3
Chemin dans la variable OPENCODE_CONFIG
Un fichier ponctuel ou pour la CI
4
opencode.json à la racine du projet
Serveurs propres au dépôt
5
Répertoires .opencode
Agents, commandes, plugins
6
Variable OPENCODE_CONFIG_CONTENT
Surcharges en ligne
7
Paramètres système gérés
Règles imposées par un administrateur
Le JSON comme le JSONC (JSON avec commentaires) fonctionnent. Ajouter "$schema": "https://opencode.ai/config.json" en haut donne à votre éditeur l’autocomplétion et les soulignements rouges sur les fautes de frappe. Les fautes de frappe sont la raison la plus fréquente pour laquelle un serveur est ignoré sans bruit, donc cette ligne de schéma se rentabilise en quelques minutes.
💡 Astuce : Quand un serveur se comporte étrangement, vérifiez d’abord le fichier global. Une entrée obsolète peut y écraser une entrée de projet parfaitement correcte.
Utiliser des variables, pas des secrets collés
OpenCode remplace deux marqueurs partout dans la configuration. {env:NAME} lit une variable d’environnement, et {file:path} insère le contenu d’un fichier. Utilisez-les pour chaque token, afin que la configuration reste sûre à versionner.
Les chemins de fichiers relatifs se résolvent depuis le répertoire de configuration, tandis que les chemins commençant par / ou ~ sont absolus. Si la variable est absente du shell qui a lancé OpenCode, le serveur ne reçoit jamais un token valide et répond 401, ce qui ressemble exactement à un mauvais token. Exportez la variable dans le même shell, puis lancez OpenCode depuis celui-ci.
Ajouter des serveurs locaux et distants
Tout se trouve sous un champ de premier niveau nommé mcp. Chaque enfant est un serveur avec un nom que vous choisissez, et ce nom devient le préfixe de ses outils. Choisissez donc des noms courts, en minuscules et sans espaces.
Un serveur local minimal
Un serveur local est un processus que OpenCode démarre pour vous et avec lequel il communique via l’entrée et la sortie standard.
Deux champs sont obligatoires : "type": "local" et command. Le point qui piège les gens est que command est un tableau de chaînes, une entrée par argument, et non une seule chaîne de shell. Écrire "command": "npx -y some-server" est le moyen le plus rapide d’obtenir un serveur qui ne démarre jamais.
Variables d’environnement et répertoire de travail
Les serveurs locaux ont souvent besoin d’identifiants ou d’un dossier précis. environment transmet des variables au processus enfant, et cwd définit son répertoire de travail. Les chemins relatifs dans cwd se résolvent depuis l’espace de travail.
Définir "oauth": false est le bon réflexe pour tout serveur qui s’authentifie avec un token statique. Sans cela, OpenCode traite un 401 comme un signal pour lancer une connexion OAuth, ce qui prête à confusion quand le vrai problème est un mauvais token.
Vérifier le résultat avec mcp list
Exécutez opencode mcp list après chaque modification. Elle affiche chaque serveur configuré et son statut, ce qui vous indique en deux secondes si un serveur est connecté, demande une authentification ou a échoué. Faites-le avant d’ouvrir une session et de vous demander pourquoi les outils manquent.
Voici la référence complète des champs en un seul endroit :
Champ
Local
Distant
Rôle
type
obligatoire
obligatoire
local ou remote
command
obligatoire
non applicable
Tableau de chaînes qui lance le processus
cwd
facultatif
non applicable
Répertoire de travail du processus
environment
facultatif
non applicable
Variables transmises au processus
url
non applicable
obligatoire
Point d’accès du serveur
headers
non applicable
facultatif
En-têtes HTTP personnalisés
oauth
non applicable
facultatif
Un objet, ou false pour désactiver OAuth
enabled
facultatif
facultatif
Activer ou désactiver un serveur sans le supprimer
timeout
facultatif
facultatif
En millisecondes, 5000 par défaut
💡 Astuce : Définissez "enabled": false sur les serveurs dont vous n’avez besoin que de temps en temps. L’entrée reste dans le fichier, et rien ne se charge dans votre session tant que vous ne la réactivez pas.
Corriger les problèmes de connexion OAuth
Les serveurs distants qui suivent le flux d’autorisation MCP demandent presque aucune configuration. Lorsque OpenCode reçoit un 401, il lance OAuth tout seul, s’enregistre comme client via Dynamic Client Registration (RFC 7591), ouvre votre navigateur et attend la redirection. Les tokens obtenus sont stockés dans ~/.local/share/opencode/mcp-auth.json.
Fonctionnement de l’OAuth automatique
Pour un serveur qui le prend en charge, toute la configuration tient en deux champs et une commande.
Ajoutez le serveur avec uniquement type et url.
Exécutez opencode mcp auth tracker en remplaçant tracker par le nom de votre serveur.
Approuvez la demande dans l’onglet du navigateur qui s’ouvre.
Exécutez opencode mcp list et vérifiez que le serveur s’affiche comme connecté.
Quatre commandes couvrent tout le cycle de vie :
Commande
Rôle
opencode mcp auth <name>
Lance le flux de connexion
opencode mcp list
Affiche les serveurs et leur statut d’authentification
opencode mcp logout <name>
Supprime les identifiants enregistrés
opencode mcp debug <name>
Diagnostique les problèmes de connexion et d’OAuth
Quand une connexion qui fonctionnait la semaine dernière échoue soudainement, la cause est généralement un token périmé ou révoqué. Exécutez opencode mcp logout <name>, puis opencode mcp auth <name> à nouveau, et vous repartez de zéro.
Clients préenregistrés et scopes
Certains fournisseurs refusent l’enregistrement dynamique et exigent que vous enregistriez une application à la main. Dans ce cas, donnez à OpenCode les détails du client qu’il aurait sinon créés lui-même.
La valeur scope est une chaîne unique dont les scopes sont séparés par des espaces, exactement comme le fournisseur les documente. Demandez le plus petit ensemble qui fonctionne. Un scope trop large que le fournisseur rejette produit une erreur sur la page de connexion qui n’indique rien d’utile sur le scope en cause.
La connexion échoue sur une machine distante
C’est celui qui fait perdre un après-midi. OpenCode écoute sur un port de callback local pendant que vous vous connectez, et les retours d’utilisateurs placent le port par défaut à 19876. Si OpenCode tourne sur un hôte distant via SSH, votre navigateur sur l’ordinateur portable redirige vers 127.0.0.1:19876 sur l’ordinateur portable, où personne n’écoute. L’approbation réussit, le callback n’arrive jamais, et la commande finit par expirer.
La solution est une redirection de port de votre ordinateur portable vers l’hôte distant :
Exécutez opencode mcp auth <name> dans cette session SSH, ouvrez l’URL affichée dans votre navigateur local, et le callback passe désormais par le tunnel.
Les versions récentes acceptent aussi callbackPort et redirectUri dans l’objet oauth, pour les fournisseurs qui exigent un callback fixe et préenregistré. L’URI de redirection doit utiliser http:// avec localhost, 127.0.0.1 ou [::1] et un port explicite. Si vous changez de port, redirigez ce même port. Vérifiez le schéma dans votre éditeur avant de vous fier à l’un de ces champs, car les anciennes versions ne les connaissent pas.
Solutions aux délais d’attente qui fonctionnent
Il existe deux délais différents, et les confondre fait perdre des heures. Le premier détermine combien de temps OpenCode attend qu’un serveur démarre et liste ses outils. L’autre détermine combien de temps un appel d’outil unique peut durer une fois le serveur lancé.
La valeur de démarrage par défaut
Le champ timeout est exprimé en millisecondes et vaut 5000 par défaut, pour les serveurs locaux comme distants. Cinq secondes suffisent pour un petit script. Ce n’est pas assez pour npx -y avec un cache froid, car le paquet doit se télécharger avant même que le serveur démarre. Le serveur apparaît alors en échec et ses outils ne se chargent jamais.
Corrigez dans cet ordre :
Augmentez le champ pour ce serveur uniquement. Définissez "timeout": 15000 ou 30000 sur l’entrée lente et laissez les autres tranquilles.
Supprimez le téléchargement. Installez le paquet globalement avec npm install -g, puis pointez command vers le binaire installé. Le démarrage tombe à une fraction de seconde.
Testez le point d’accès des serveurs distants. Exécutez un simple curl sur l’URL. Si curl est lent aussi, le problème vient du réseau ou du serveur, pas de votre configuration.
Symptôme
Cause probable
Solution
Échec après environ 5 secondes
timeout par défaut
La porter à 15000 ou plus
Échec uniquement sur une machine neuve
npx qui télécharge le paquet
L’installer globalement d’abord
Échec uniquement sur un réseau d’hôtel
Lenteur du DNS ou de la négociation TLS
Augmenter timeout, réessayer
Quand les appels d’outils échouent à 60 secondes
Une autre erreur apparaît plus tard, au milieu d’une session : MCP error -32001: Request timed out. C’est le délai de requête de la bibliothèque cliente MCP, et de nombreux clients construits sur le SDK TypeScript utilisent 60 secondes par défaut. Augmenter le timeout de démarrage ne le change pas pour un appel d’outil en cours.
Cherchez d’abord un réglage par requête dans le schéma de votre version. S’il n’y en a pas, changez l’outil plutôt que le client. Faites en sorte que le premier outil renvoie immédiatement un identifiant de tâche, et ajoutez un second outil qui indique le statut de la tâche. Le modèle soumet, reçoit un identifiant et revient vérifier, ce qui correspond au schéma soumettre-puis-interroger qu’utilisent les API de génération d’images et de vidéos pour la même raison.
💡 Astuce : Envoyez les journaux du serveur vers stderr, jamais vers stdout. Un serveur local partage stdout avec le protocole, donc un seul console.log égaré peut corrompre la poignée de main et ressembler à un délai d’attente.
Déboguer un serveur qui ne se connecte pas
Quand la solution n’est pas évidente, arrêtez de modifier la configuration et testez chaque couche séparément.
Lancer le serveur à la main
Copiez le tableau command dans un terminal et exécutez-le sur une seule ligne. Un serveur stdio en bonne santé démarre et attend silencieusement une entrée. S’il affiche une erreur, un module manquant ou un mauvais chemin, vous avez trouvé le problème sans qu’OpenCode intervienne. Exécutez ensuite opencode mcp debug <name>, qui diagnostique les problèmes de connexion et d’OAuth pour ce seul serveur.
Pour un serveur distant, curl -i l’URL avec les mêmes en-têtes. Un 401 signifie des identifiants, un 404 signifie un mauvais chemin, et un blocage signifie un problème réseau.
Erreurs courantes et solutions
Symptôme
Cause probable
Solution
Serveur absent de la liste
Faute de frappe, ou mauvais fichier modifié
Ajoutez $schema, vérifiez le fichier global
Échec immédiat
command est une chaîne, ou le binaire n’est pas dans PATH
Utilisez un tableau et un chemin absolu
401 constant
Variable de token absente, ou OAuth attendu
Exportez la variable, ou exécutez mcp auth
La page de connexion ne se termine jamais
Le callback ne peut pas atteindre OpenCode
Redirigez le port du callback
L’appel d’outil se termine avec -32001
Limite de requête de 60 secondes
Utilisez le modèle d’identifiant de tâche
Fonctionne dans votre shell, échoue dans OpenCode
PATH ou environnement différent
Définissez environment, utilisez des chemins complets
Limiter le contexte par agent
Chaque serveur connecté ajoute ses descriptions d’outils au contexte envoyé à chaque requête. Quelques serveurs peuvent consommer une large part de la fenêtre avant même que vous ayez tapé un mot, et le modèle choisit moins bien le bon outil quand il doit en choisir parmi cinquante. La documentation d’OpenCode le dit d’ailleurs : utilisez les serveurs MCP avec parcimonie.
Désactiver globalement, activer par agent
Les noms d’outils portent le nom du serveur en préfixe, donc un motif glob permet de basculer un serveur entier d’un coup. * correspond à zéro caractère ou plus, et ? correspond à exactement un caractère.
Avec cette configuration, l’agent builder ne voit que les outils de système de fichiers et l’agent planner ne voit que le suivi. Aucun des deux ne paie le coût en tokens de la liste d’outils de l’autre serveur.
Comment utiliser Claude Sonnet 5
Les bugs de configuration sont un travail de reconnaissance de motifs fastidieux : une chaîne là où il faut un tableau, une variable non exportée, un port que personne n’a redirigé. C’est là qu’un modèle de code gagne son temps. Claude Sonnet 5 sur PicassoIA lit du texte de configuration, des erreurs de terminal et même des captures d’écran, donc vous pouvez coller ce que vous voyez et demander ce qui ne va pas.
Collez votre bloc mcp. Remplacez d’abord chaque token et chaque secret par un marqueur, puis ajoutez la sortie de opencode mcp debug <name>.
Réglez l’effort. Le réglage low par défaut saute la réflexion et répond le plus vite. Utilisez medium ou high quand plusieurs fichiers interagissent, par exemple une configuration globale surchargée par une configuration de projet.
Ajoutez un prompt système une fois. Quelque chose comme : « You review opencode.json MCP configs. Check type, command, timeout and oauth. Reply with corrected JSON only. »
Joignez une capture d’écran si vous en avez une. L’entrée image lit les erreurs du terminal. Augmentez la résolution maximale de l’image quand le texte de la capture est petit.
Gardez max_tokens à 8192. C’est la valeur par défaut, et elle suffit largement pour quelques blocs de configuration.
Vérifiez avant de coller. Contrôlez chaque champ suggéré par rapport au tableau ci-dessus et à la documentation officielle.
💡 Astuce : Ne collez jamais un vrai token dans une zone de chat. Des marqueurs comme TRACKER_TOKEN suffisent au modèle.
Créez vos propres images dès aujourd’hui
La configuration ne représente qu’une partie de ce que MCP permet. Une fois qu’un agent de code peut appeler des outils, il peut aussi appeler des générateurs d’images. PicassoIA expose ses générateurs via MCP, et l’adresse du serveur se trouve sur la page des connexions MCP de votre compte. Tout serveur qui parle HTTP suit le même modèle distant que dans cet article : type, url, un en-tête ou OAuth, et un timeout raisonnable.
Si vous préférez vous passer de la configuration et simplement créer des images, ouvrez PicassoIA et essayez ces modèles de texte vers image :
Seedream 5 Pro pour des scènes détaillées et photographiques
GPT Image 2 pour les prompts aux mises en page précises
FLUX 2 Pro pour des textures nettes et une lumière naturelle
Choisissez-en un, écrivez un prompt sur ce que vous venez de configurer, et comparez la façon dont chaque modèle le lit. Dix minutes d’essais vous apprennent davantage sur la formulation des prompts qu’une heure de lecture, et chaque image générée est une répétition gratuite pour la suivante.