本文へ移動
話題

ガイド

Claude CodeからCodexへ移行する方法:AGENTS.md、スキル、MCP

Claude Codeの指示、スキル、MCP設定をCodexへ移す手順を解説。公式インポーターで見つかった問題と、同期用スクリプトも紹介します。

執筆: 読了時間:3分

更新(2026年11月9日):Claude Fable 5.2とMythos 5.2がリリースされ、料金・提供範囲・ベンチマークはClaude Fable 5.2まとめで解説しています。

👁 111閲覧数

11月3日、ChatGPTの最上位プランであるPro 500を契約しましたが、すぐに問題に直面しました。ここ数カ月、ブログやミュージックビデオ、アプリの作業はすべてClaude Codeで進めていました。プロジェクトに関するメモが数百件、自作スキルが6つ、複数のフォルダーにCLAUDE.mdがあり、MCPサーバーも接続していました。初回起動時のCodexは、そうした情報を何も知りませんでした。私は長年、通常のハイフンだけを使っていますが、Codexは別のダッシュ記号を使い、Claudeなら覚えていることまで質問してきました。

移行にかかったのは午後のひとときです。単にファイルをコピーするより、Codexが指示をどこから読み込むかを理解することが重要でした。ここでは、公式インポーターで遭遇したエラーと、現在使っているスクリプトを含め、手順を紹介します。

移行の概要

  • 指示: 全体に適用するルールは~/.codex/AGENTS.mdへ。設定ファイルに1行追加すれば、Codexはプロジェクト内のCLAUDE.mdも読み込めます。
  • スキル: SKILL.mdを含むフォルダーを~/.agents/skillsにコピーします。形式は共通です。
  • MCP: codex mcp add 名前 --url アドレスで追加し、codex mcp loginでOAuthログインします。
  • 移行しないもの: スクリーンショットが大量に含まれる長い過去のセッション。
  • スクリプト: 下記からダウンロードできるsynchronizuj-skille.pyを利用します。

Claude CodeとCodexで異なる設定名

Claude CodeとCodexは、ファイルを読み、コマンドを実行し、コードや文章を書くツールです。違いは設定の置き場所や名前にあります。ClaudeはCLAUDE.md、CodexはAGENTS.mdから指示を読み込みます。Claudeのスキルは~/.claude/skills、Codexのスキルは~/.agents/skillsに置きます。ClaudeはMCPサーバーの設定をJSONに、CodexはTOMLに保存します。日常的な使い方の違いを知りたい場合は、CodexとClaude Codeの比較をご覧ください。この記事では、両方を使っていて、同じように動作させたい方を対象にしています。

Codexは2か所からAGENTS.mdを読み込みます。1つ目はCodexのホームフォルダーにある~/.codex/AGENTS.mdで、すべての会話に適用されます。2つ目はプロジェクト内です。リポジトリーのルートから現在のフォルダーまで順に確認し、それぞれのフォルダーから最大1つのファイルを読み込みます。現在のフォルダーに近いファイルが後から適用され、より一般的なルールを上書きします。既定の指示ファイルの上限は32 KiBで、超過分は警告なしに切り捨てられます。

手順1:全体に適用するAGENTS.mdを作る

私は全体に適用するCLAUDE.mdを使っていませんでした。ルールは、Claude Codeの記憶に個別のメモとして保存されていました。たとえば「ポーランド語で書く」「ハイフンだけを使う」「最後にリンクを載せる」「数字を捏造しない」「許可なくストアに公開しない」といった内容です。これらをまとめ、60行の~/.codex/AGENTS.mdを作りました。すべてを貼り付けるより、要点をまとめるほうがよいでしょう。指示が短いほど、メッセージごとに消費するコンテキストを抑えられます。

ファイルの末尾に追加した設定が、最も大きな違いを生みました。Claude Codeの記憶フォルダーを読み取り専用の知識ベースとしてCodexに指定したのです。コピーはしていないため、Claudeが随時保存するメモの最新状態をCodexから参照できます。

## プロジェクトの知識
プロジェクトに関する情報はClaude Codeの記憶にあります(読み取り専用):
C:\Users\ty\.claude\projects\<プロジェクト名>\memory\
- まずMEMORY.md(目次)を読み、その後に関連ファイルを確認します。
- プロジェクトに関する作業では、最初にこのフォルダーを検索します。

手順2:プロジェクトのCLAUDE.mdをそのまま使う

独自のCLAUDE.mdがあるプロジェクトでも、別のファイルを作る必要はありません。~/.codex/config.tomlに次の2行を追加します。

project_doc_fallback_filenames = ["CLAUDE.md"]
project_doc_max_bytes = 65536

1行目は、AGENTS.mdがない場所でCodexにCLAUDE.mdを読み込ませます。2行目は上限を32 KiBから64 KiBへ引き上げます。私のプロジェクトファイルには長いものがあるためです。OpenAIのドキュメントにある例でも、同じ値の65536が使われています。

手順3:スキルを~/.agents/skillsへ移す

スキルはSKILL.mdを含むフォルダーで、スクリプトや資料を一緒に置くこともできます。形式は共通なので、Claudeのスキルは変更せずにCodexで使えます。CodexではSKILL.mdのヘッダーにnameとdescriptionの2項目が必要です。説明はモデルがスキルを自動で選ぶ判断材料になるため、用途を明確に書きましょう。

最初は古いガイドに従い、スキルを~/.codex/skillsにコピーしました。Codexは読み込みましたが、現在のドキュメントでは個人用スキルの保存先として~/.agents/skillsが案内されているため、そちらへ移しました。スキルは$に続けて名前を入力するか、/skillsで手動実行できます。また、作業内容が説明に合致する場合は、モデルが自動で選ぶこともあります。

スキルが多い場合に意外なのは、説明を含む一覧がコンテキストウィンドウの最大2%を占めることです。数が多いとCodexは説明を短くし、一部を警告付きで省略することがあります。完全なSKILL.mdが読み込まれるのは、スキルを使うときです。

同期スクリプト:synchronizuj-skille.py

Claudeのスキルは頻繁に更新するため、一度だけコピーする方法では不十分でした。そこで、Codexで手作業で作ったスキルには触れずに、1つのコマンドで同期するスクリプトを作りました。スクリプト自身がコピーした項目を記録し、そのフォルダーだけを上書きします。各SKILL.mdにnameとdescriptionがあるかも確認します。

synchronizuj-skille.pyをダウンロード(Python 3.8以降、追加ライブラリー不要、Windows・macOS・Linux対応)

公開前に、空のフォルダーで5つのケースをテストしました。書き込みなしのプレビュー、初回コピー、スキル変更後の再実行、ヘッダーのないスキル、存在しないコピー元フォルダーです。Codexにすでに同じ名前のスキルがあった場合は変更されませんでした。ヘッダーのないスキルは警告と終了コード1を出しながらコピーされました。ポーランド語の文字を含む名前や説明も問題なく処理できました。

使い方:

python synchronizuj-skille.py --na-sucho    # 実行内容を表示。ファイルは変更しない
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

スクリプト全文:

"""Claude CodeからCodexへスキルを同期します。

SKILL.mdを含むスキルフォルダーを、Claude CodeからCodexのユーザースキル用フォルダーへコピーします。既定値:
    コピー元: ~/.claude/skills
    コピー先: ~/.agents/skills

コピーしたスキルは、コピー先フォルダーの.synchronizuj-skille.jsonに記録します。
次回実行時は記録されたスキルだけを上書きし、Codexで手動作成したスキルは変更しません。
Codexが読み込むために必要なnameとdescriptionがSKILL.mdにあるかも確認します。

使い方:
    python synchronizuj-skille.py                    # 既定のフォルダーを使用
    python synchronizuj-skille.py --na-sucho         # 変更せず、実行内容だけを表示
    python synchronizuj-skille.py --zrodlo D:/skille --zrodlo ~/.claude/skills
    python synchronizuj-skille.py --cel ./projekt/.agents/skills

Python 3.8以降が必要です。追加ライブラリーは不要です。Windows、macOS、Linuxで動作します。
同期後、スキルを読み込ませるためCodexを再起動してください。
"""
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):
    """SKILL.mdのヘッダーに不足している項目を返します(問題がなければ空のリスト)。"""
    tekst = skill_md.read_text(encoding="utf-8", errors="replace")
    m = re.match(r"^---\s*\n(.*?)\n---", tekst, re.S)
    if not m:
        return ["ファイルの先頭に---ヘッダーがありません"]
    naglowek = m.group(1)
    return [f"{pole}項目がありません" for pole in ("name", "description")
            if not re.search(rf"^{pole}\s*:\s*\S", naglowek, re.M)]


def main():
    p = argparse.ArgumentParser(description="Claude CodeからCodexへスキルをコピーします。")
    p.add_argument("--zrodlo", action="append", type=sciezka,
                   help="スキルのフォルダー(複数指定可)。既定値は~/.claude/skills")
    p.add_argument("--cel", type=sciezka, default=sciezka("~/.agents/skills"),
                   help="Codexのスキルフォルダー。既定値は~/.agents/skills")
    p.add_argument("--na-sucho", action="store_true", help="ファイルを変更せず、実行内容だけを表示")
    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"見つかりません  {zrodlo} - フォルダーがないためスキップします")
            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"重複  {skill.name} - 先に指定したコピー元からすでにコピーしたためスキップします")
                continue
            if cel.exists() and skill.name not in nasze:
                pominiete.append(skill.name)
                print(f"スキップ  {skill.name} - コピー先に同名の手動作成スキルがあります")
                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"{'予定' if a.na_sucho else '完了'}{' ' * (7 if a.na_sucho else 5)}{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{'コピー予定' if a.na_sucho else 'コピー済み'}: {len(skopiowane)}、スキップ: {len(pominiete)}、コピー先: {a.cel}")
    for o in ostrzezenia:
        print(f"警告  {o} - CodexではSKILL.mdのヘッダーにnameとdescriptionが必要です")
    if skopiowane and not a.na_sucho:
        print("スキルを読み込ませるためCodexを再起動してください。")
    return 1 if ostrzezenia else 0


if __name__ == "__main__":
    if hasattr(sys.stdout, "reconfigure"):
        sys.stdout.reconfigure(encoding="utf-8")
    sys.exit(main())

手順4:MCPサーバーを設定する

MCPサーバーは1つのコマンドで追加できます。新しいサービスの多くが採用する、アドレスから接続するサーバーの場合は次のとおりです。

codex mcp add flashboards --url https://flashboards.yaroflasher.com/api/mcp
codex mcp login flashboards
codex mcp list

私がFlashBoardsを追加したときは、サービスにすでにログインしていたため、CodexがブラウザーでOAuthログインを自動的に開きました。ローカルで起動するサーバーはcodex mcp add 名前 -- コマンドで追加します。環境変数は区切り文字の前に--envを使って指定します。設定はすべてconfig.tomlの[mcp_servers.名前]セクションに保存されます。独自のサーバーの作り方は、MCPサーバーを15分で作る方法で説明しています。

インポーターのエラーと、移行しないほうがよいセッション

Codexには組み込みのインポーターがあります。アプリの設定に「インポート」があり、その裏ではmigrate-to-codexスキルが--scan-only、--plan、--dry-runの各モードで動作します。私のコンピューターで実行したところ、スキル6つだけが見つかり、コマンド、サブエージェント、全体用のCLAUDE.mdは検出されませんでした。プロジェクトの記憶はインポート対象ではありませんでしたが、私にとって最も重要な情報はそこにありました。

--planモードは、ポーランド語の文字を含む最初のスキルで失敗しました。エラーはUnicodeDecodeError: 'charmap' codec can't decode byte 0x98です。スクリプトがシステムの既定の文字コードでファイルを読み込むために発生します。ポーランド語版Windowsではcp1250が使われます。環境変数PYTHONUTF8=1を設定して実行すれば回避できます。私のスクリプトは常にUTF-8で読み込むため、この問題は起きません。

インポーターでは、過去30日間の会話をCodexのスレッドとして移すこともできます。私は実行しませんでした。長いセッションの場合はおすすめしません。会話に貼り付けたスクリーンショットは、すべてトランスクリプトに含まれます。以前、Codex Desktopで1つのスレッドが33 GBに達し、アプリがメモリーに読み込もうとしたことがありました。AGENTS.mdを整え、メモを参照できるようにしてから、Codexを新しい状態で使い始めるほうがよいでしょう。

Codexが設定を読み込んだか確認する

最後に、ターミナルからCodexへ4つの確認質問をしました。ダッシュ記号に関するルール、利用できるスキル、メモの目次の冒頭にある内容、FlashBoardsのツールを使えるかどうかです。ルールとスキルにはすぐ正しく答えました。メモのファイルを読み込めたのは、完全なアクセス権(-s danger-full-access)を与えた後でした。Windowsの読み取り専用モードでは、サンドボックスのエラーが発生したためです。アプリでも完全なアクセス権を有効にすれば、追加フラグなしで動作します。

これでCodexは、Claudeと同じルールと知識を使えるようになりました。メッセージごとの費用や、週間上限を使い切らない方法は、Codexの使用上限を使い切らない設定で解説しています。次に取り組んだのは逆方向の連携です。Claude CodeからCodexへタスクを依頼する方法は、OpenAI公式プラグインの記事をご覧ください。

Google · あなたの情報源GoogleでKiramesuをもっと上位に表示-ワンクリックで設定お気に入りの情報源に追加 →

出典

  • OpenAI「AGENTS.mdを使ったカスタム指示」: https://learn.chatgpt.com/docs/agent-configuration/agents-md
  • OpenAI「エージェントスキル」: https://learn.chatgpt.com/docs/build-skills
  • OpenAI「Codex CLIのModel Context Protocol」: https://learn.chatgpt.com/docs/extend/mcp?surface=cli
  • OpenAI「設定リファレンス」: https://learn.chatgpt.com/docs/config-file/config-reference
  • Daniel Vaughan「Codex CLIのエージェント移行システム」: https://codex.danielvaughan.com/2026/05/13/codex-cli-agent-migration-system-import-claude-code-sessions-skills-config/
  • 独自のインポート・設定テスト、Codex CLI 0.162.1、2026年11月3日
// 関連記事も読む

Kiramesuの関連記事

Kiramesu

Kiramesu

著者・編集

AIを理解し、活用するためのガイド、検証記事、ニュースをお届けします。

次に読むaiツール化学の勉強におすすめのAIは?ChatGPTの計算力を検証化学の計算問題に使えるAIを比較。化学量論とpHの検証結果、無料で使える選択肢、学習に役立つプロンプトを紹介します。

よく読まれている記事

  1. 1ChatGPT PlusとProの違いは?料金と選び方を解説
  2. 2basal-omni、JevBenchのオープンモデル首位に
  3. 3Claude Opus 5.5のデータ分析力を検証、44項目中43項目が正確

// サイトマップ

kiramesuの数字 0アーカイブの記事数0過去7日間のニュース件数
× ‹ 拡大 ›