Claude Code에서 OpenAI Codex로 전환할 때 컨텍스트 유실 없이 설정 변환하기
16 मई 2026
0
Computing/SoftwareComments (0)
Log in to leave a comment
No posts yet
Log in to leave a comment
No posts yet
Claude Code를 장시간 켜놓고 작업하다 보면 토큰이 무섭게 쌓입니다. 컨텍스트가 길어질수록 질문 한 번에 수백 원씩 날아가는 비용을 보면 숨이 턱 막힙니다. CLI 기반의 자율 리팩토링 편의성을 포기하기는 싫고, Anthropic의 영수증은 부담스러운 주니어 개발자들이 OpenAI Codex 데스크톱 환경으로 눈길을 돌리는 이유입니다.
하지만 아무 대책 없이 도구를 바꾸면 그동안 쌓아둔 프로젝트 전용 지시문과 MCP(Model Context Protocol) 서버 설정이 전부 날아갑니다. 처음부터 컨텍스트를 다시 주입하느라 터미널 앞에서 두세 시간을 허비하고 싶지 않다면, 기존 자산을 그대로 떼어다 옮겨야 합니다.
Claude Code와 OpenAI Codex는 프로젝트 규칙과 MCP를 관리하는 파일 포맷부터 다릅니다. Claude는 주로 json을 읽지만 Codex는 ~/.codex/config.toml 사양을 사용합니다. 파일 구조가 다르니 사람이 일일이 받아 적다가는 오타가 나기 십상입니다.
프로젝트 루트 디렉토리에 변환 스크립트를 하나 만들어서 실행하면 이 과정을 알아서 처리합니다. 수동으로 컨텍스트를 재입력하는 수고를 덜어주는 작업입니다.
우선 프로젝트 최상위 경로에 mcp-to-codex.js 파일을 만들고 아래 코드를 집어넣습니다. .mcp.json 파일에 적힌 커맨드, 인수 배열, 환경 변수를 Codex가 이해하는 [mcp_servers] 블록으로 재구성하는 스크립트입니다.
const fs = require('fs');
const path = require('path');
const sourceMcp = path.join(process.cwd(), '.mcp.json');
if (!fs.existsSync(sourceMcp)) {
console.error('.mcp.json file not found.');
process.exit(1);
}
const claudeMcp = JSON.parse(fs.readFileSync(sourceMcp, 'utf-8'));
const mcpServers = claudeMcp.mcpServers || claudeMcp;
let tomlOutput = '# OpenAI Codex Project MCP Settings\n\n';
for (const [name, config] of Object.entries(mcpServers)) {
tomlOutput += `[mcp_servers.${name}]\n`;
tomlOutput += `command = "${config.command}"\n`;
if (config.args && config.args.length > 0) {
tomlOutput += `args = ${JSON.stringify(config.args)}\n`;
}
if (config.env && Object.keys(config.env).length > 0) {
tomlOutput += `[mcp_servers.${name}.env]\n`;
for (const [envKey, envVal] of Object.entries(config.env)) {
tomlOutput += ` ${envKey} = "${envVal}"\n`;
}
}
tomlOutput += '\n';
}
const targetDir = path.join(process.cwd(), '.codex');
if (!fs.existsSync(targetDir)) fs.mkdirSync(targetDir);
fs.writeFileSync(path.join(targetDir, 'config.toml'), tomlOutput);
console.log('Successfully written settings to .codex/config.toml');
터미널에서 node mcp-to-codex.js를 실행하면 .codex/config.toml 파일이 떨어집니다. 그 다음 Codex 데스크톱 앱에서 이 프로필을 불러오거나 커맨드 라인에서 codex --profile <프로젝트명>을 입력해 활성화하면 설정 이관이 끝납니다.
여기서 주의할 점이 있습니다. Claude Code에서 파일 탐색용으로 자주 쓰던 @search 같은 프롬프트 지시자는 Codex 엔진에서 작동하지 않습니다. 이 지시문을 그대로 놔두면 Codex가 경로를 찾지 못해 멍청한 답변을 내놓습니다. 프롬프트 내에 존재하는 @search 표현들을 Codex가 인식할 수 있는 상대 경로 형태인 ./path/to/target/ 포맷으로 직접 고쳐주어야 컨텍스트 인식 오류가 발생하지 않습니다.
AI 에이전트에게 코드를 고치라고 명령해 두고 잠시 자리를 비우는 행동은 위험합니다. 에러 메시지를 만난 에인전트가 혼자 무한 루프에 빠져 똑같은 API 요청을 수천 번 반복할 수 있기 때문입니다. 선불 충전금 수백 달러가 순식간에 녹아내려 개발 환경 전체가 잠기는 불상사는 막아야 합니다.
하루 지출 비용은 입력 토큰과 출력 토큰의 단가, 그리고 입력 캐싱 적용 여부에 따른 할인율로 결정됩니다. 통제 장치 없이 에이전트를 방치하면 청구서가 감당할 수 없을 만큼 불어납니다.
지출 통제는 OpenAI 개발자 포털(platform.openai.com)에서 직접 설정해야 안전합니다.
이렇게 지정해 두면 하루 사용량이 2달러에 도달하는 순간 OpenAI 게이트웨이가 추가 API 요청을 거절하므로 토큰 폭탄을 물리적으로 막을 수 있습니다.
추가로, Codex 데스크톱 앱 설정에서 속도 우선 모드(Fast 모드)를 켜면 초당 토큰 방출 속도가 1,200개를 넘어섭니다. 평소보다 토큰이 3배 빠르게 소모된다는 뜻입니다. 하드 제한이 걸리기 전이라도 한두 시간 만에 선불 충전금이 바닥날 수 있으니, 백그라운드에서 좀비처럼 살아 움직이는 프로세스가 없는지 감시해야 합니다.
ps aux | grep codex
터미널에 이 명령어를 입력했을 때 내가 종료한 줄 알았던 에이전트 세션이 여전히 네트워크 트래픽을 붙잡고 있다면, kill -9 <PID> 명령어로 즉시 강제 종료해야 비용 누수를 막습니다.
두 개 이상의 AI CLI 도구를 번갈아 쓰다 보면 로컬 포트가 겹치거나 파일 권한을 두고 싸우는 현상이 일어납니다. OpenAI Codex 에이전트는 기동할 때 프록시 제어를 위해 50000번 포트를 기본값으로 선점하려고 합니다. 로컬 개발 서버나 특정 데이터베이스 표준 포트 대역과 겹치면 프로세스가 터지면서 셸이 먹통이 됩니다.
포트 바인딩 중복 문제를 피하려면 환경 변수와 별칭을 명확하게 갈라쳐야 합니다.
우선 터미널 세션이 열릴 때 프록시 포트를 다른 안전한 대역으로 돌리도록 지정합니다.
export CODEX_PORT=8089
그 다음 ~/.codex/config.toml 파일을 열고 포트 분산 설정을 추가해 줍니다. 여러 세션이 구동되더라도 설정한 범위 내에서 포트를 쪼개 쓰도록 만드는 설정입니다.
[port_allocation]
range = "8700-8999"
mode = "autonomous"
마지막으로 ~/.bashrc 또는 ~/.zshrc 파일 하단에 각 도구의 별칭을 등록합니다. 명령어 호출 경로가 꼬여서 엉뚱한 엔진이 켜지는 현상을 막기 위함입니다.
alias cc="claude"
alias cx="codex"
포트 문제만큼 골치 아픈 게 파일 감시 데몬 충돌입니다. 두 도구 모두 코드 변경 사항을 실시간으로 추적하겠다고 프로젝트 폴더 전체를 감시하려 듭니다. 이때 .git/ 폴더 내부까지 필터 없이 긁어가면 에이전트가 코드를 디스크에 쓰는 타이밍과 Git이 커밋 정보를 기록하는 타이밍이 충돌하면서 .git/index.lock 권한 에러가 뿜어집니다.
최악의 경우 커밋이 깨지거나 파일이 날아가므로, 프로젝트 루트에 .codexignore 파일을 만들고 .git 폴더와 .claude 메타 디렉토리를 제외 대상으로 반드시 명시해야 형상 관리가 정상적으로 돌아갑니다.
여러 AI 도구를 섞어 쓰다 보면 나중에 빌드가 깨졌을 때 원인 파악이 불가능해집니다. 이게 Claude가 작성한 코드인지, Codex가 짠 코드인지 알 길이 없으니 결국 사람이 코드를 한 줄씩 다 까보며 디버깅해야 합니다.
운영체제 프로세스 테이블에서 커밋을 실행한 부모 프로세스 ID($PPID)를 추적하면 어떤 AI가 코드를 고쳤는지 커밋 메시지에 꼬리표를 달 수 있습니다.
Git의 prepare-commit-msg 훅을 활용해 이 작업을 자동화하면 편리합니다.
프로젝트 폴더 안의 .git/hooks/prepare-commit-msg 파일을 열고 아래 Bash 스크립트를 작성합니다. 시스템 프로세스를 추적해 커밋을 실행한 주체가 누구인지 찾아내고, 메시지 맨 앞에 태그를 붙여주는 스크립트입니다.
#!/bin/bash
COMMIT_MSG_FILE=$1
COMMIT_SOURCE=$2
PARENT_PID=$PPID
PARENT_PROCESS=$(ps -o comm= -p $PARENT_PID 2>/dev/null | xargs)
GRAND_PARENT_PID=$(ps -o ppid= -p $PARENT_PID 2>/dev/null | xargs)
if [ -n "$GRAND_PARENT_PID" ]; then
GRAND_PARENT_PROCESS=$(ps -o comm= -p $GRAND_PARENT_PID 2>/dev/null | xargs)
fi
AI_TAG=""
if [ "$PARENT_PROCESS" = "claude" ] || [ "$GRAND_PARENT_PROCESS" = "claude" ]; then
AI_TAG="[Claude]"
elif [ "$PARENT_PROCESS" = "codex" ] || [ "$GRAND_PARENT_PROCESS" = "codex" ]; then
AI_TAG="[Codex]"
fi
if [ -n "$AI_TAG" ]; then
FIRST_LINE=$(head -n 1 "$COMMIT_MSG_FILE")
if [[ ! "$FIRST_LINE" == *"[Claude]"* ]] && [[ ! "$FIRST_LINE" == *"[Codex]"* ]]; then
sed -i.bak "1s/^/${AI_TAG} /" "$COMMIT_MSG_FILE" && rm -f "${COMMIT_MSG_FILE}.bak"
fi
fi
파일을 저장한 뒤 터미널에서 실행 권한을 부여합니다.
chmod +x .git/hooks/prepare-commit-msg
이제 주니어 개발자가 수동으로 커밋 메시지를 분리하지 않아도 [Claude]나 [Codex] 태그가 붙으면서 이력이 정리됩니다.
한 걸음 더 나아가서 변경 당시의 파일 디프(diff) 메타데이터까지 로그 파일로 아카이빙해 두면 추적이 훨씬 정교해집니다. 커밋 완료 직후 동작하는 .git/hooks/post-commit 파일을 만들고 아래 코드를 심어둡니다.
#!/bin/bash
LOG_FILE=".ai_history.log"
TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S")
PARENT_COMM=$(ps -o comm= -p $PPID 2>/dev/null | xargs)
DETERMINED_AGENT="Manual/Unknown"
if [[ "$PARENT_COMM" == *"claude"* ]]; then
DETERMINED_AGENT="Claude Code"
elif [[ "$PARENT_COMM" == *"codex"* ]]; then
DETERMINED_AGENT="OpenAI Codex"
fi
echo "[$TIMESTAMP] Generated by ${DETERMINED_AGENT}" >> "$LOG_FILE"
git log -1 --pretty=format:" Commit Hash: %H%n Subject: %s" >> "$LOG_FILE"
echo "" >> "$LOG_FILE"
git diff-tree --no-commit-id --name-status -r HEAD >> "$LOG_FILE"
echo "==================================================" >> "$LOG_FILE"
마찬가지로 chmod +x .git/hooks/post-commit으로 실행 권한을 줍니다. 이렇게 해두면 어떤 에이전트가 어떤 파일을 건드렸는지 .ai_history.log 파일에 고스란히 기록이 남습니다. 툴을 전환하는 과도기 단계에서 발생하는 코드 파편화 리스크를 통제하는 유일한 방법입니다.