Migrate To Codex
OpenAIOfficialPublished by OpenAI
- Skill
- Workflow
- Automation and integrations
- Apache-2.0
- Low risk
- Has scripts
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
The migrate-to-codex skill provides a structured, automated procedure to migrate existing Claude Code setups into the Codex ecosystem. It handles the conversion of instruction files, slash commands, skills, agents, and MCP server configurations. The tool follows a rigorous process involving scanning, planning, dry-running, and validating the migration to ensure artifacts are correctly mapped while preserving project-specific configurations. It includes a self-healing loop to resolve manual migration requirements and ensures that generated Codex artifacts are validated against target standards.
What it does
- Converts Claude Code instruction files into Codex-compatible formats.
- Migrates slash commands and skills into the Codex skill structure.
- Updates MCP server configurations for use in Codex.
- Generates a migration report detailing added items and manual review requirements.
- Validates generated Codex artifacts to ensure configuration integrity.
- Provides a dry-run mode to preview changes before applying them.
When to use it
- When transitioning a development environment from Claude Code to Codex.
- When you need to port custom skills or agents to a new Codex project.
- When updating global or project-level configurations to align with Codex standards.
- When you need to verify the readiness of existing Claude artifacts for Codex.
Advantages
- Automates complex migration steps, reducing manual effort.
- Provides clear reporting on what was successfully migrated and what requires manual attention.
- Includes a self-healing loop to iteratively resolve migration issues.
- Ensures project-specific configurations are preserved during the transition.
- Validates targets post-migration to prevent configuration errors.
Usage examples
- “Run a scan to see what Claude artifacts are available for migration.”
- The tool lists active and inactive source surfaces from the specified Claude directory.
- “Perform a dry-run migration of my project settings to Codex.”
- The tool generates a plan and reports potential changes without modifying any files.
- “Execute the full migration of my global Claude configuration to Codex.”
- The tool migrates instructions, skills, and MCP configs, creating a report of the results.
- “Validate the Codex target after my migration.”
- The tool checks the generated Codex files for errors and reports any remaining manual fixes.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/openai/migrate-to-codex/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip migrate-to-codex.zip -d .agents/skills
Documentation by OpenAI
Migrate to Codex
Autonomy
Keep going until the selected migration is completely done: run the migrator, inspect the report, fix migrated Codex instructions/skills/agents/MCP config, and re-run checks without stopping to ask for confirmation of the next step. If the user has selected a target, do not ask before creating, editing, replacing, or deleting generated Codex artifacts in that target (AGENTS.md, .codex/, .agents/, or ~/.codex/). Preserve unrelated existing Codex config entries in .codex/config.toml or ~/.codex/config.toml, such as notify, projects, marketplaces, or unrelated MCP servers; do not ask about them unless they fail validation or directly conflict with the migration. Do not edit source Claude Code files (.claude/, ~/.claude/, .mcp.json, or .claude.json), unrelated project code, secrets, or another repository.
Migration Order
Run the migration in this order for each selected global or project source:
Start by using Codex's built-in TODO/task list tool. Do not create
MIGRATION_TODOS.mdor any TODO file unless the user explicitly asks. The TODO list input has aplanarray whose items each havestepandstatus; use statusespending,in_progress, andcompleted. Make the TODOs specific to the selected artifacts. Before finishing, update the TODO list so every finished step is markedcompletedand no step remainsin_progress. Use literal source → Codex target labels, for example:Inspect
.claude/commands→ Codex skills/promptsInspect
.claude/agents→.codex/agentsInspect
.mcp.json→.codex/config.tomlMCP serversInspect
.claude/settings.jsonhooks →.codex/hooks.jsonMigrate safe selected artifacts → Codex files
Validate generated
.codex/config.tomlValidate generated
.codex/agentsReport migrated artifacts and manual-review items
Read
references/differences.md(and refresh Codex docs if itsDocs last checkeddate is old).Scan and inspect before writing:
--scan-onlylists active and inactive source surfaces.--planprints staged Codex artifact paths and report rows.--doctorsummarizes readiness, manual-review work, and validation risks.
Convert surfaces in the same order the CLI uses:
instructions:
CLAUDE.md/AGENTS.mdtoAGENTS.mdplugins: report Claude plugin trees and marketplaces as manual migration work
hooks: rewrite supported Claude hooks into
.codex/hooks.jsonand enable[features].codex_hooks = trueskills and commands: write Codex skills under
.agents/skills/config: write
.codex/config.tomlfrom Claude model/sandbox settings and MCP servers, includingpersonality = "friendly"when config is generatedsubagents: write Codex custom agents under
.codex/agents/
Dry-run, then write the selected target. Use
--replaceonly when orphan generated skills or agents should be deleted.Inspect the terminal output and
.codex/migrate-to-codex-report.txtafter real runs.Review generated artifacts in this order:
AGENTS.md,.agents/skills/,.codex/config.toml,.codex/hooks.json,.codex/agents/, then report-only plugin items.Run
--validate-targetagainst each target after edits.Re-run checks and
--dry-runafter edits.Return the final migration report as one markdown table per scope that has rows. The tables cover only the non-native follow-up migration work you performed, such as skills created from slash commands, subagents, MCP servers, hooks, unsupported/local plugin notes, and manual-review caveats. Include programmatic native import rows for config, instructions, skills, or supported plugins only if you personally migrated them in this follow-up run.
If only one scope has rows, render only the table with no heading. If multiple scopes have rows, render one heading before each table. Use
**User Config**for user-scope rows. For project-scope rows, use the actual project folder name as the heading, for example**northstar-support-portal**; do not useCurrent Projectas the heading. Do not add prose before or after the table output.Use exactly these columns:
northstar-support-portal
Status Item Notes AddedSlash commandpr-reviewConverted into a Codex skill AddedSubagentrelease-leadAdded as a Codex subagent Check before usingHookPreToolUseConverted, but some Claude hook behavior differs in Codex Not AddedHookNotificationCodex does not have an equivalent notification hook Not AddedPluginteam-macrosPlugin needs manual setup Statusmust beAdded,Check before using, orNot Added. UseAddedwhen a Codex-facing artifact was created or changed and needs no special review. UseCheck before usingwhen a Codex-facing artifact was created or changed but the migration changed semantics, inferred behavior, preserved tool rules as guidance, or dropped unsupported behavior. UseNot Addedwhen a source artifact was detected but no Codex-facing artifact was created.Itemcombines the artifact type and concrete item name in one cell. Artifact type must be singular:Skill,Slash command,Subagent,MCP,Hook, orPlugin. Wrap the artifact type in inline code; write the item name as plain text after it.Notesis always required; never leave it empty. Keep notes short, plain, and literal. Avoid internal implementation terms such as runtime expansion. Prefer phrases likeConverted into a Codex skill,Added as a Codex subagent,Added to Codex config,Converted into a Codex hook,Converted, but some Claude hook behavior differs in Codex,Codex does not have an equivalent notification hook,Plugin needs manual setup, orPlugin marketplace needs manual setup.
Self-Healing Loop
Keep looping until the selected migration is complete:
Run
--planor--doctor.Run the migration with
--dry-run.Run the migration for real.
Fix every generated
## MANUAL MIGRATION REQUIREDblock and everymanual_fix_requiredorskippedreport row that can be resolved inside Codex artifacts.Run
--validate-target.Re-run the migrator and validator until the report and validator have no actionable generated-artifact fixes left.
Do not edit source Claude Code files, unrelated project code, secrets, or another repository during this loop. If a report row requires source-provider changes or product judgment, leave the generated Codex artifact with clear manual guidance instead of changing the source.
Commands
Choose the migrator command.
MIGRATE_TO_CODEX='python3 .codex/skills/migrate-to-codex/scripts/migrate-to-codex.py'Inspect the migration before writing.
$MIGRATE_TO_CODEX --source ~/.claude/ --scan-only
$MIGRATE_TO_CODEX --source ~/.claude/ --target ~/.codex/ --plan
$MIGRATE_TO_CODEX --source ~/.claude/ --target ~/.codex/ --doctorDry-run, then run without --dry-run, for global and project.
$MIGRATE_TO_CODEX --source ~/.claude/ --target ~/.codex/ --dry-run
$MIGRATE_TO_CODEX --source ~/.claude/ --target ~/.codex/
$MIGRATE_TO_CODEX --source ./.claude/ --target ./.codex/ --dry-run
$MIGRATE_TO_CODEX --source ./.claude/ --target ./.codex/Run the post-migration validator against each target after edits.
$MIGRATE_TO_CODEX --validate-target ~/.codex/
$MIGRATE_TO_CODEX --validate-target ./.codex/Run $MIGRATE_TO_CODEX --help for flags (--scan-only, --plan, --doctor, --validate-target, defaults, and so on). Deep tables and more links are in references/differences.md.
Files
- ATTRIBUTION.mdAdded by AutoGineer890 B
- LICENSE.txt11.1 KiB
- SKILL.md7.8 KiB
- agents/openai.yaml144 B
- references/differences.md13.4 KiB
- scripts/cli.pyScript29.4 KiB
- scripts/migrate-to-codex.pyScript208 B
- scripts/migrate/__init__.pyScript285 B
- scripts/migrate/agents.pyScript9.8 KiB
- scripts/migrate/codex_config.pyScript3.9 KiB
- scripts/migrate/common.pyScript11.2 KiB
- scripts/migrate/hooks.pyScript8.0 KiB
- scripts/migrate/instructions.pyScript2.4 KiB
- scripts/migrate/mcps.pyScript6.9 KiB
- scripts/migrate/plugins.pyScript660 B
- scripts/migrate/settings.pyScript1.0 KiB
- scripts/migrate/skills.pyScript12.3 KiB
- scripts/utils/__init__.pyScript35 B
- scripts/utils/scan.pyScript4.3 KiB
- scripts/utils/util.pyScript9.2 KiB
references/differences.md
Migration Differences
Summary
This reference covers Claude Code to Codex migration only. It lists migration differences, partial mappings, and unsupported Claude Code behavior. Direct 1:1 mappings are intentionally omitted. When the converter preserves Claude-only semantics as prompt guidance, it also emits a manual_fix_required report row and writes a ## MANUAL MIGRATION REQUIRED block into the generated file.
Docs last checked: 2026-04-20. If today's date is later, re-open the official Codex docs below and the Claude Code docs map before trusting these mappings.
Instructions
| Source | Codex | Migration behavior | Caveat |
|---|---|---|---|
.claude/CLAUDE.md, CLAUDE.md, or claude.md | AGENTS.md symlink | Linked automatically when content looks provider-neutral | This keeps one shared instruction body instead of duplicating docs. |
Root AGENTS.md | Root AGENTS.md | Reported as active | The converter does not overwrite or symlink the target file to itself. |
Instruction content with /hooks, .claude/agents/, settings paths, subagent language, or permission-mode assumptions | Generated AGENTS.md copy | Manual rewrite pass | The converter intentionally breaks the symlink when obvious Claude-only semantics need a Codex-specific edit. |
Commands
| Source | Codex | Migration behavior | Caveat |
|---|---|---|---|
.claude/commands/*.md | .agents/skills/source-command-<name>/SKILL.md | Converted to one-file Codex skills | Slash-command invocation, argument-hint, allowed-tools, $ARGUMENTS, shell-output interpolation, and file-reference expansion are preserved as manual-review text. |
| Command files with runtime expansion | One-file Codex skills plus manual_fix_required rows | Preserved as prompt text | Argument placeholders, shell-output interpolation, automatic file expansion, model/agent routing, and executable hook behavior have different runtime behavior and must be checked manually. |
Skills
| Source | Codex | Migration behavior | Caveat |
|---|---|---|---|
.claude/skills/<name>/SKILL.md | .agents/skills/<name>/SKILL.md | Converted; selected support directories are copied | Skill-local scripts/, references/, and assets/ are copied when they are real files under the source skill root. |
.claude/skills/<name>.md | .agents/skills/<name>/SKILL.md | Converted as a single-file skill | No sibling support directories are copied for this legacy shape. |
allowed-tools | No strict skill allowlist | Preserved as prompt guidance in SKILL.md | agents/openai.yaml can declare tool dependencies, but that is not a permission boundary. |
user-invocable | policy.allow_implicit_invocation | Manual review only | Similar intent, not equivalent semantics. |
model / effort | No skill-level model pin | Unsupported | Codex model selection is session/agent scoped in this converter. |
disable-model-invocation | No direct equivalent | Unsupported | Requires a manual rewrite if the source skill depends on this behavior. |
argument-hint / context / agent / hooks / paths / shell | No direct equivalent | Unsupported | Keep only if the behavior can be rewritten into prompt guidance or config. |
MCP and config
| Source | Codex | Migration behavior | Caveat |
|---|---|---|---|
.mcp.json or .claude.json mcpServers | .codex/config.toml [mcp_servers.<name>] | Converted | Project .mcp.json and global .claude.json use the same source shape for this migrator. Codex supports additional MCP server fields such as cwd, enabled_tools, disabled_tools, and timeout settings, but this converter only writes fields that map clearly from Claude source config. |
| Claude Code model/sandbox settings or MCP config | personality = "friendly" | Written when the migrator generates .codex/config.toml | Codex supports none, friendly, and pragmatic; Claude Code migrations default to friendly to preserve a warm assistant style. |
type: sse | No SSE support | Unsupported | Codex supports stdio and streamable HTTP in current docs. |
headers.Authorization: Bearer ${VAR} | bearer_token_env_var | Direct auth rewrite | Only the bearer-token shape is rewritten this way; ${VAR:-default} fallbacks are not preserved. |
headers with ${VAR} | env_http_headers | Partial mapping | Static headers map to http_headers; ${VAR:-default} fallbacks are not preserved. |
env with ${VAR} | env_vars | Partial mapping | Literal values stay in env; self-references become env_vars, and ${VAR:-default} fallbacks are not preserved. |
oauth.callbackPort | mcp_oauth_callback_port | Manual review only | oauth.clientId, oauth.authServerMetadataUrl, and headersHelper are unsupported. |
enabledMcpjsonServers / disabledMcpjsonServers | Per-server enabled | Partial mapping | enableAllProjectMcpServers has no direct equivalent in this converter. |
allowedMcpServers / deniedMcpServers | requirements.toml | Manual policy mapping | Not written by this converter. |
.claude/settings.local.json | No local-only Codex equivalent | Unsupported | Codex project config is tied to trusted project behavior. |
Subagents
| Source | Codex | Migration behavior | Caveat |
|---|---|---|---|
.claude/agents/*.md | .codex/agents/*.toml | Converted | Missing name or description is inferred and reported for review. |
tools / disallowedTools | No source-style fine-grained agent permissions | Preserved as prompt guidance in developer_instructions | Use sandbox_mode, [permissions], MCP tool filters, or app tool filters manually when intent is clear. |
skills | No spawn-time preload equivalent | Preserved as prompt guidance in developer_instructions | skills.config is enable/disable config, not preload behavior. |
mcpServers | Codex custom-agent mcp_servers or shared Codex MCP config | Manual review only | Codex custom-agent files can include MCP config, but this converter does not automatically map Claude subagent mcpServers. Use shared Codex MCP config or manually add agent-local mcp_servers when the source intent is clear. |
permissionMode | sandbox_mode | Partial mapping | Only acceptEdits and readOnly are mapped; default, dontAsk, bypassPermissions, and plan are preserved as manual-review prompt guidance. |
model + effort | model + model_reasoning_effort | Partial mapping by model family | Sonnet-family effort is biased one tier higher for coding-agent behavior; source max maps to Codex xhigh. |
hooks / memory / background / isolation / maxTurns | No direct equivalent | Unsupported | Foreground/background and resume behavior do not map cleanly to Codex custom-agent files. |
initialPrompt | No direct equivalent | Unsupported | Only applies when the agent runs as the main Claude session agent. |
Auto-delegation by description | Automatic or explicit Codex sub-agent spawning | Behavior change | Not a 1:1 match; verify generated agent descriptions manually. |
| Independent agent permissions | Parent sandbox inheritance + runtime overrides | Behavior change | Codex custom-agent files set defaults, not hard isolation from the parent turn. |
Plugin Marketplaces
| Source | Codex | Migration behavior | Caveat |
|---|---|---|---|
.claude/plugins/ | Codex plugins / skills / MCP servers / apps | Reported as manual_fix_required only | Codex plugins can bundle skills, MCP servers, and apps, but the migrator does not copy plugin trees. Migrate the plugin, bundled skills, commands, agents, hooks, and MCP config by hand. |
.claude/plugin-marketplaces.json | Codex plugin install or local plugin path | Reported as manual_fix_required only | Marketplace entries can point to local or remote plugin sources; the migrator does not fetch or install them. Codex marketplace metadata lives under .agents/plugins/marketplace.json or ~/.agents/plugins/marketplace.json. |
.claude-plugin/marketplace.json | Codex plugin install or local plugin path | Reported as manual_fix_required only | Treat it as marketplace source material. Do not copy it into Codex as a legacy marketplace; adapt it to the Codex plugin marketplace layout if you keep it local. |
metadata.pluginRoot | No direct equivalent | Unsupported | Shorthand plugin sources that depend on metadata.pluginRoot need manual layout. |
Marketplace or plugin.json custom skills / agents paths | Codex plugin manifest and bundled skill paths | Manual review only | Codex plugins can declare bundled skills, MCP servers, and apps. Custom Claude plugin paths still need manual layout review; no automated scan. |
Plugin commands/ | .agents/skills/<name>/SKILL.md | Manual | Treat like any other command migration if you copy files by hand. |
strict, hooks, mcpServers, lspServers, outputStyles | No direct equivalent | Unsupported | No automatic plugin config import. |
Hooks
| Source | Codex | Migration behavior | Caveat |
|---|---|---|---|
hooks in ~/.claude/settings.json, .claude/settings.json, or .claude/settings.local.json | .codex/hooks.json + [features].codex_hooks = true | Partial conversion | Review behavior before relying on migrated hooks; Claude and Codex hook runtimes are not 1:1. |
Notification | notify | Manual rewrite only | notify is a turn-complete notification command, not a general lifecycle hook or approval-prompt hook. |
PreToolUse | PreToolUse in .codex/hooks.json | Partial conversion | Codex currently runs PreToolUse for shell commands only and blocks only permissionDecision: "deny", legacy decision: "block", or exit code 2. |
PostToolUse | PostToolUse in .codex/hooks.json | Partial conversion | Codex currently runs PostToolUse for shell commands only; decision: "block" becomes model feedback, and continue: false stops execution. Formatting or fixups that Claude tied to Edit/Write should move to a Stop hook, because only Bash is matched for PostToolUse. |
UserPromptSubmit | UserPromptSubmit in .codex/hooks.json | Partial conversion | Codex can inject context or block a prompt, but it ignores matcher for this event and does not support source if filters. |
SessionStart | SessionStart in .codex/hooks.json | Partial conversion | Codex matches startup and resume; Claude may also expose other session flows. |
Stop | Stop in .codex/hooks.json | Partial conversion | Codex ignores matcher for Stop, can request a continuation prompt, and does not expose every source subagent/teammate stop lifecycle. |
PermissionRequest / SubagentStart / SubagentStop / TaskCreated / TaskCompleted / StopFailure / PreCompact / PostCompact / SessionEnd | No direct equivalent | Unsupported | Keep as manual follow-up items; Codex does not expose matching lifecycle coverage today. |
type: "command" | type: "command" | Partial conversion | command, timeout / timeoutSec, and statusMessage map. Empty commands are skipped by Codex. |
type: "prompt" / type: "agent" / type: "http" / async: true | No direct equivalent | Unsupported | Codex parses prompt / agent but skips them, and async hooks are skipped. HTTP hooks need a wrapper command. |
Hook matcher + if filters | Regex matcher only | Partial conversion | Codex keeps regex matcher for PreToolUse, PostToolUse, and SessionStart only. Source if filters do not map. |
| Hooks in skills, agents, and plugins | No direct equivalent | Unsupported | Codex discovers hooks from config layers, not from skill or subagent manifests. |
Planning and validation
| Command | Behavior | Caveat |
|---|---|---|
--plan | Prints staged migration output and generated artifact paths without writing files | Still depends on the selected source, target, and component flags. |
--doctor | Prints readiness, risk counts, and manual-review items without writing files | Static guidance only; it does not prove the migrated setup works. |
--validate-target | Validates an already migrated Codex target | Checks TOML parseability, skill frontmatter, custom-agent TOML fields, AGENTS.md size, and MCP command availability. |
Minimal examples
Source skill metadata becomes prompt guidance:
allowed-tools:
- Read
- Bash## MANUAL MIGRATION REQUIRED
Claude `allowed-tools` was preserved as prompt guidance, not a Codex permission boundary.
You're allowed to use these tools:
- Read
- BashSource subagent metadata becomes TOML plus prompt guidance:
skills:
- release-notes
tools:
- Read
disallowedTools:
- Bashsandbox_mode = "workspace-write"
developer_instructions = """
## Skills
- $release-notes
## Tools
You're allowed to use these tools:
- Read
Don't use these tools:
- Bash
"""Sources
Requirements and compatibility
Written for: OpenAI Codex
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs an MCP server, Needs Python
Security
What our scanner noticed· Low risk
- Scripts that your agent may run
This skill includes scripts that your agent may run. Read them before you use it.
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Published by
- OpenAI
- Publisher
- OpenAI (Official)
- Source
- openai/skills · skills/.curated/migrate-to-codex · commit 49f948f
- Licence
- Apache License 2.0 (redistribution allowed)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by OpenAI.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download migrate-to-codex.zip