Passer de Claude Code à Codex : AGENTS.md, skills et MCP
Instructions, skills, serveurs MCP : voici comment transférer votre configuration Claude Code vers Codex, avec un script de synchronisation.

Mise à jour (9 novembre 2026) : Claude Fable 5.2 et Mythos 5.2 sont sortis - prix, accès et benchmarks dans mon guide Claude Fable 5.2.
👁 116 lectures
J’ai acheté l’offre ChatGPT la plus élevée le 3 novembre et je me suis aussitôt heurté à un problème. Depuis plusieurs mois, je faisais tout mon travail sur des blogs, des clips musicaux et des applications avec Claude Code. J’avais accumulé des centaines de notes sur mes projets, six skills personnalisés, des fichiers CLAUDE.md dans une douzaine de dossiers et des serveurs MCP connectés. Au premier lancement, Codex ne savait rien de tout cela. Il utilisait des tirets cadratins, alors que je n’emploie que des traits d’union depuis des années, et me posait des questions auxquelles Claude savait déjà répondre.
Le transfert m’a pris un après-midi. Le plus important n’a pas été de copier les fichiers, mais de comprendre où Codex va chercher ses instructions. Voici le processus complet, avec l’erreur que j’ai rencontrée dans l’importateur officiel et le script que j’utilise désormais.
Le transfert en bref
- Instructions : règles globales dans
~/.codex/AGENTS.md; dans les projets, Codex peut lire les fichiers CLAUDE.md après l’ajout d’une ligne dansconfig.toml - Skills : copiez les dossiers contenant SKILL.md dans
~/.agents/skills; le format est identique - MCP :
codex mcp add nom --url adresse, puis connexion OAuth aveccodex mcp login - À ne pas transférer : les anciennes sessions longues et chargées de captures d’écran
- Script prêt à l’emploi :
synchronizuj-skille.py, à télécharger plus bas
Claude Code et Codex : deux conventions différentes
Claude Code et Codex font la même chose : ils lisent vos fichiers, exécutent des commandes et écrivent du code ou du texte. Mais ils n’emploient pas les mêmes chemins. Claude cherche les règles dans CLAUDE.md, Codex dans AGENTS.md. Claude stocke les skills dans ~/.claude/skills, Codex dans ~/.agents/skills. Claude enregistre les serveurs MCP au format JSON, Codex dans un fichier TOML. Si vous voulez comparer ces outils dans le cadre d’un usage quotidien, consultez notre article Codex ou Claude Code. Ici, je pars du principe que vous utilisez les deux et souhaitez qu’ils se comportent de la même façon.
Codex lit AGENTS.md à deux endroits. Le premier est son dossier personnel, ~/.codex/AGENTS.md, dont les règles s’appliquent à toutes les conversations. Le second est le projet : Codex parcourt les dossiers depuis la racine du dépôt jusqu’au répertoire courant et ne prend qu’un seul fichier dans chacun. Les fichiers les plus proches du répertoire courant sont lus en dernier et peuvent donc remplacer les règles générales. La limite par défaut est de 32 KiB d’instructions ; Codex tronque le reste sans avertissement.
Étape 1 : définir les règles dans AGENTS.md
Je n’avais pas de CLAUDE.md global, car mes règles étaient conservées sous forme de notes séparées dans la mémoire de Claude Code : ne pas inventer de chiffres, fournir les liens à la fin et ne rien publier dans la boutique sans mon accord. J’en ai rassemblé l’essentiel dans un fichier ~/.codex/AGENTS.md de 60 lignes. Mieux vaut résumer l’essentiel que tout copier : plus les instructions sont courtes, moins elles consomment de contexte à chaque message.
J’ai ajouté à la fin du fichier une section qui a fait la plus grande différence. J’ai indiqué à Codex où trouver le dossier de mémoire de Claude Code, en lecture seule. Je ne copie rien : Codex voit donc toujours les notes à jour, que Claude enregistre au fil de l’eau.
## Connaissances sur les projets
Toutes les connaissances sur les projets se trouvent dans la mémoire de Claude Code (lecture seule) :
C:\Users\ty\.claude\projects\<nom-du-projet>\memory\
- Commencez par MEMORY.md (index), puis consultez les fichiers pertinents.
- Pour une tâche liée à un projet, recherchez d’abord dans ce dossier.
Étape 2 : réutiliser CLAUDE.md dans les projets
Si vos projets ont déjà leur propre CLAUDE.md, inutile de créer un deuxième fichier. Deux lignes dans ~/.codex/config.toml suffisent :
project_doc_fallback_filenames = ["CLAUDE.md"]
project_doc_max_bytes = 65536
La première indique à Codex de lire CLAUDE.md lorsqu’aucun AGENTS.md n’est présent. La seconde augmente la limite de 32 KiB à 64 KiB, car certains de mes fichiers de projet sont longs. OpenAI donne la même valeur, 65536, dans un exemple de sa documentation.
Étape 3 : copier les skills dans ~/.agents/skills
Un skill est un dossier contenant un fichier SKILL.md, auquel peuvent s’ajouter des scripts et des ressources. Le format est commun : les skills de Claude fonctionnent dans Codex sans modification. Dans l’en-tête de SKILL.md, Codex exige deux champs : name et description. La description détermine quand le modèle choisira le skill de lui-même ; indiquez donc clairement à quoi il sert.
J’ai d’abord copié les skills dans ~/.codex/skills, comme le conseillaient les anciens guides. Codex les a chargés, mais la documentation actuelle indique ~/.agents/skills comme dossier des skills personnels. Je les ai donc déplacés. Vous pouvez appeler un skill manuellement en saisissant $ suivi de son nom, ou avec /skills. Le modèle peut aussi le sélectionner automatiquement si la tâche correspond à sa description.
Un point peut surprendre lorsque vous avez beaucoup de skills : leur liste et leurs descriptions occupent au maximum 2 % de la fenêtre de contexte. Si les skills sont nombreux, Codex raccourcit les descriptions et peut en omettre certains avec un avertissement. Le fichier SKILL.md complet n’est chargé qu’au moment où le skill est utilisé.
Script prêt à l’emploi : synchronizuj-skille.py
Je continue d’améliorer les skills dans Claude ; une copie ponctuelle ne suffisait donc pas. J’ai écrit un script qui les transfère en une commande sans toucher aux skills créés manuellement dans Codex. Il garde une trace des dossiers qu’il a lui-même copiés et ne remplace que ceux-là. Il vérifie aussi que chaque SKILL.md contient les champs name et description.
Télécharger synchronizuj-skille.py (Python 3.8 ou version ultérieure, sans bibliothèque supplémentaire ; Windows, macOS et Linux)
Avant publication, je l’ai testé dans un dossier vide avec cinq cas : aperçu sans écriture, première copie, nouvelle exécution après modification d’un skill, skill sans en-tête et dossier source inexistant. Un skill portant le même nom et déjà présent dans Codex est resté intact. Un skill sans en-tête a été copié avec un avertissement et un code de sortie 1. Les caractères polonais dans les noms et les descriptions ont été pris en charge sans problème.
Utilisation :
python synchronizuj-skille.py --na-sucho # afficher le plan sans rien enregistrer
python synchronizuj-skille.py # ~/.claude/skills -> ~/.agents/skills
python synchronizuj-skille.py --zrodlo D:/moje-skille --zrodlo ~/.claude/skills
python synchronizuj-skille.py --cel ./projekt/.agents/skills
Code complet :
"""Synchronisation des skills de Claude Code vers Codex (Promptif).
Copie les dossiers de skills (chacun contenant un fichier SKILL.md) depuis Claude Code
vers le dossier où Codex lit les skills utilisateur. Par défaut :
source : ~/.claude/skills
cible : ~/.agents/skills
Le script conserve un registre des skills copiés (.synchronizuj-skille.json dans le dossier
cible). Lors des exécutions suivantes, il ne remplace que ces skills et laisse intacts
ceux créés manuellement dans Codex. Il vérifie aussi que SKILL.md contient les champs
name et description, sans lesquels Codex ne chargera pas le skill.
Utilisation :
python synchronizuj-skille.py # dossiers par défaut
python synchronizuj-skille.py --na-sucho # afficher les actions prévues
python synchronizuj-skille.py --zrodlo D:/skille --zrodlo ~/.claude/skills
python synchronizuj-skille.py --cel ./projekt/.agents/skills
Nécessite Python 3.8 ou version ultérieure, sans bibliothèque supplémentaire. Fonctionne sous Windows, macOS et Linux.
Après la synchronisation, redémarrez Codex pour qu’il charge les skills.
"""
import argparse
import json
import re
import shutil
import sys
from pathlib import Path
REJESTR_PLIK = ".synchronizuj-skille.json"
POMIJAJ = shutil.ignore_patterns("__pycache__", ".git", "node_modules", ".DS_Store")
def sciezka(tekst):
return Path(tekst).expanduser().resolve()
def sprawdz_frontmatter(skill_md):
"""Renvoie la liste des champs manquants dans l’en-tête de SKILL.md (liste vide = tout est en ordre)."""
tekst = skill_md.read_text(encoding="utf-8", errors="replace")
m = re.match(r"^---\s*\n(.*?)\n---", tekst, re.S)
if not m:
return ["en-tête --- absent au début du fichier"]
naglowek = m.group(1)
return [f"champ {pole} manquant" for pole in ("name", "description")
if not re.search(rf"^{pole}\s*:\s*\S", naglowek, re.M)]
def main():
p = argparse.ArgumentParser(description="Copie les skills de Claude Code vers Codex.")
p.add_argument("--zrodlo", action="append", type=sciezka,
help="dossier contenant les skills (peut être indiqué plusieurs fois) ; par défaut : ~/.claude/skills")
p.add_argument("--cel", type=sciezka, default=sciezka("~/.agents/skills"),
help="dossier des skills Codex ; par défaut : ~/.agents/skills")
p.add_argument("--na-sucho", action="store_true", help="ne rien enregistrer, afficher seulement le plan")
a = p.parse_args()
zrodla = a.zrodlo or [sciezka("~/.claude/skills")]
rejestr_plik = a.cel / REJESTR_PLIK
nasze = set()
if rejestr_plik.exists():
nasze = set(json.loads(rejestr_plik.read_text(encoding="utf-8")))
skopiowane, pominiete, ostrzezenia = [], [], []
for zrodlo in zrodla:
if not zrodlo.is_dir():
print(f"ABSENT {zrodlo} - dossier inexistant, ignoré")
continue
for skill in sorted(x for x in zrodlo.iterdir() if (x / "SKILL.md").is_file()):
cel = a.cel / skill.name
if skill.name in skopiowane:
pominiete.append(skill.name)
print(f"DOUBLON {skill.name} - déjà copié depuis une source précédente, ignoré")
continue
if cel.exists() and skill.name not in nasze:
pominiete.append(skill.name)
print(f"IGNORÉ {skill.name} - un skill portant ce nom existe déjà dans la cible, mais le script ne l’a pas copié")
continue
for brak in sprawdz_frontmatter(skill / "SKILL.md"):
ostrzezenia.append(f"{skill.name} : {brak}")
if not a.na_sucho:
a.cel.mkdir(parents=True, exist_ok=True)
if cel.exists():
shutil.rmtree(cel)
shutil.copytree(skill, cel, ignore=POMIJAJ)
skopiowane.append(skill.name)
print(f"{'PLAN' if a.na_sucho else 'OK'}{' ' * (9 - len('PLAN' if a.na_sucho else 'OK'))}{skill.name} <- {zrodlo}")
if not a.na_sucho and skopiowane:
rejestr_plik.write_text(json.dumps(sorted(nasze | set(skopiowane)), ensure_ascii=False, indent=1),
encoding="utf-8")
print(f"\n{'À copier' if a.na_sucho else 'Copiés'} : {len(skopiowane)}, ignorés : {len(pominiete)}, cible : {a.cel}")
for o in ostrzezenia:
print(f"AVERTISSEMENT {o} - Codex exige les champs name et description dans l’en-tête de SKILL.md")
if skopiowane and not a.na_sucho:
print("Redémarrez Codex pour qu’il charge les skills.")
return 1 if ostrzezenia else 0
if __name__ == "__main__":
if hasattr(sys.stdout, "reconfigure"):
sys.stdout.reconfigure(encoding="utf-8")
sys.exit(main())
Étape 4 : configurer les serveurs MCP
Une seule commande suffit pour ajouter un serveur MCP. Pour un serveur accessible à une adresse, comme c’est le cas de la plupart des nouveaux services, la procédure ressemble à ceci :
codex mcp add flashboards --url https://flashboards.yaroflasher.com/api/mcp
codex mcp login flashboards
codex mcp list
Lorsque j’ai ajouté FlashBoards, Codex a ouvert automatiquement la page de connexion OAuth dans le navigateur, car j’étais déjà connecté au service. Pour ajouter des serveurs lancés localement, utilisez codex mcp add nom -- commande. Les variables d’environnement se définissent avec --env avant le séparateur. Tout est enregistré dans des sections [mcp_servers.nom] de config.toml. Je décris la création d’un serveur dans l’article Créer son propre serveur MCP en 15 minutes.
L’importateur a un bug ; mieux vaut laisser les anciennes sessions de côté
Codex possède un importateur intégré. Dans l’application, l’option Importer se trouve dans les paramètres ; en arrière-plan, c’est le skill migrate-to-codex qui fonctionne, avec les modes --scan-only, --plan et --dry-run. Je l’ai lancé sur mon ordinateur. L’analyse a trouvé six skills et rien d’autre : ni commandes, ni sous-agents, ni CLAUDE.md global. L’importateur ne tient pas compte de la mémoire des projets, qui était pourtant l’élément le plus précieux pour moi.
Le mode --plan a échoué sur le premier skill contenant des caractères polonais : UnicodeDecodeError: 'charmap' codec can't decode byte 0x98. Le script lit les fichiers avec l’encodage par défaut du système ; Windows en polonais utilise cp1250. Pour contourner le problème, définissez la variable PYTHONUTF8=1 avant de le lancer. Mon script lit tout en UTF-8 et ne rencontre donc pas cette erreur.
L’importateur peut aussi transférer les conversations des 30 derniers jours sous forme de fils Codex. Je ne l’ai pas fait et je le déconseille pour les longues sessions. Les captures d’écran collées dans une conversation sont intégralement intégrées à la transcription. Un de mes fils dans Codex Desktop a un jour atteint 33 GB, et l’application a tenté de le charger en mémoire. Mieux vaut repartir de zéro dans Codex, avec un AGENTS.md bien préparé et l’accès aux notes.
Vérifier que Codex a bien accès à tout
Pour finir, j’ai posé quatre questions de contrôle à Codex depuis le terminal : quelle règle il applique aux tirets, quels skills il voit, ce qui figure dans les premières lignes de l’index de mes notes et s’il dispose des outils FlashBoards. Il a répondu correctement dès le premier essai au sujet de la règle et des skills. Pour lire le fichier de notes, il n’y est parvenu qu’avec un accès complet (-s danger-full-access) : sous Windows, son environnement isolé signalait une erreur en mode lecture seule. Dans l’application, cela fonctionne sans option supplémentaire quand l’accès complet est activé.
Codex dispose maintenant des mêmes règles et des mêmes connaissances que Claude. J’explique combien coûte chaque message et comment éviter d’épuiser le quota hebdomadaire dans l’article [pwlink slug= »codex-ustawienia-limit »]Utiliser Codex sans épuiser son quota[/pwlink]. J’ai ensuite fait le chemin inverse : Claude Code délègue des tâches à Codex avec le [pwlink slug= »wtyczka-codex-claude-code »]module officiel d’OpenAI[/pwlink].
Google · Vos sourcesPromptif plus haut dans Google - en un clicAjouter aux sources préférées →Sources
- OpenAI, Custom instructions with AGENTS.md : https://learn.chatgpt.com/docs/agent-configuration/agents-md
- OpenAI, Agent Skills : https://learn.chatgpt.com/docs/build-skills
- OpenAI, Model Context Protocol dans Codex CLI : https://learn.chatgpt.com/docs/extend/mcp?surface=cli
- OpenAI, Configuration Reference : https://learn.chatgpt.com/docs/config-file/config-reference
- Daniel Vaughan, The Codex CLI Agent Migration System : https://codex.danielvaughan.com/2026/05/13/codex-cli-agent-migration-system-import-claude-code-sessions-skills-config/
- Test personnel de l’importation et de la configuration, Codex CLI 0.162.1, 3 novembre 2026


