본문으로 건너뛰기

© 2026 Molayo

Zenn헤드라인2026. 06. 15. 12:55

Codex의 MCP 도입 방법 정리 — config.toml / Claude Code와의 비교 (2026년 6월 시점)

요약

Codex에서 MCP(Model Context Protocol)를 도입하고 설정하는 방법을 상세히 다룹니다. config.toml을 활용한 설정 방식과 Claude Code와의 차이점, stdio 및 HTTP 트랜스포트 설정법을 설명합니다.

핵심 포인트

  • Codex의 MCP 설정은 config.toml을 통해 관리됨
  • 사용자/글로벌 및 프로젝트 단위의 스코프 설정 지원
  • CLI와 IDE 확장이 동일한 설정 레이어를 공유
  • stdio 및 Streamable HTTP 두 가지 트랜스포트 방식 지원

서론

Claude Code를 위한 MCP 설정 방법을 정리한 전편에 이어, 이번에는 Codex에서의 MCP 도입 방법을 정리하면서 config.toml의 기술 방식 및 Claude Code와의 차이점에 대해서도 다루어 보고자 합니다.

Codex의 MCP 기본 아키텍처

설정 파일의 위치와 스코프 (Scope)

Codex의 MCP 설정은 config.toml에 집약되어 있으며, 주로 다음 두 가지 스코프(Scope)로 관리합니다.

스코프경로대상
사용자 / 글로벌~/.codex/config.toml모든 Codex 세션에 적용
프로젝트.codex/config.toml해당 프로젝트 하위에서만. 신뢰된 프로젝트에서만 읽힘

중요한 점은, Codex CLI와 IDE 확장(Extension)은 동일한 설정 레이어를 참조한다는 것입니다. CLI 측에서 MCP 서버를 추가하면 IDE 확장 측에서도 사용할 수 있으며, IDE 확장에서 config.toml을 열어 편집한 내용도 CLI 측에 반영됩니다.

설정 우선순위는 대체로 다음과 같습니다. 상위일수록 우선순위가 높습니다.

  • CLI 플래그 / --config를 통한 일시적 덮어쓰기
  • 프로젝트 config (.codex/config.toml, 신뢰된 프로젝트만. 현재 위치와 가까운 것이 우선)
  • 프로필 config (--profile로 선택하는 ~/.codex/<profile-name>.config.toml)
  • 사용자 config (~/.codex/config.toml)
  • 시스템 config (Unix에서는 /etc/codex/config.toml이 존재하는 경우)
  • 내장 기본값

MCP 서버의 설정 방법

Codex에서 MCP 서버를 설정하는 방법은 두 가지가 있습니다.

  • codex mcp 명령어로 추가·삭제한다
  • config.toml을 직접 편집한다

Codex가 다루는 주요 MCP 트랜스포트(Transport)는 다음 두 종류입니다.

트랜스포트방식인증·시크릿(Secret) 전달 방식
stdio로컬 프로세스를 자식 프로세스로 실행하여 표준 입출력으로 통신env / env_vars를 통해 자식 프로세스에 환경 변수를 전달
Streamable HTTPHTTPS 엔드포인트로 접속OAuth, Bearer Token, HTTP 헤더

stdio 서버의 설정

로컬에서 실행되는 MCP 서버를 stdio를 통해 사용할 경우의 설정 예시입니다.

CLI 명령어로 추가하기

# Context7(개발자용 문서 MCP)을 추가하는 예시
codex mcp add context7 -- npx -y @upstash/context7-mcp
# 설정 확인
...

config.toml에 직접 작성하기

# ~/.codex/config.toml
[mcp_servers.context7]
command = "npx"
...

command는 문자열이며, args는 배열입니다.

stdio 서버에 환경 변수 전달하기

stdio 서버가 외부 API를 호출하는 경우, API 토큰을 환경 변수로 전달하는 경우가 있습니다.

Codex에서는 주로 두 가지 방법이 있습니다.

# 기존 로컬 환경 변수를 허용하여 자식 프로세스에 전달
[mcp_servers.internal_tools]
command = "node"
...

또는, 고정값을 해당 서버의 환경 변수로 설정합니다.

[mcp_servers.internal_tools]
command = "node"
args = ["./scripts/mcp-server.js"]
...

Streamable HTTP 서버의 설정

Remote MCP 서버에 접속할 경우에는 url을 지정합니다.

[mcp_servers.linear]
url = "https://mcp.linear.app/mcp"

CLI에서 추가할 경우에는 --url을 사용합니다.

codex mcp add linear --url https://mcp.linear.app/mcp
codex mcp login linear

--url을 붙이면, stdio 실행 명령어가 아닌 Streamable HTTP 서버로 등록됩니다.

Bearer Token을 사용하는 경우

Bearer Token 인증을 지원하는 Remote MCP 서버에서는 토큰을 환경 변수에서 읽어옵니다.

# Stripe MCP를 Bearer Token으로 사용하는 예
# STRIPE_API_KEY에는 restricted API key를 설정해 둡니다
codex mcp add stripe \
...

config.toml에 직접 작성하는 경우에는 bearer_token_env_var를 사용합니다.

# Stripe — 결제·청구 관련 작업
[mcp_servers.stripe]
url = "https://mcp.stripe.com"
...

HTTP 헤더를 사용하는 경우

고정 헤더는 http_headers를, 환경 변수에서 헤더 값을 읽는 경우에는 env_http_headers를 사용할 수 있습니다.

[mcp_servers.example]
url = "https://mcp.example.com/mcp"
http_headers = { "X-Client" = "codex" }
...

단, 일반적인 Bearer Token이라면 bearer_token_env_var를 사용하는 것이 의도가 더 명확합니다.

OAuth를 사용한 Remote MCP 연동

OAuth 플로우의 기본

Codex는 Streamable HTTP MCP 서버의 OAuth 인증을 지원합니다.

OAuth 지원 서버를 추가했다면, 최초 1회만 codex mcp login <server-name>을 실행합니다.

# OAuth 지원 서버 로그인
codex mcp login <server-name>
# 인증 정보 삭제
...

OAuth 지원 서버의 최소 구성은 기본적으로 url뿐입니다.

[mcp_servers.notion]
url = "https://mcp.notion.com/mcp"
[mcp_servers.figma]
...

등록 후에 로그인합니다.

codex mcp login notion
codex mcp login figma
codex mcp login linear

OAuth 스코프(Scope)를 지정하기

서버 측에서 scopes_supported를 통지하는 경우, Codex는 서버가 통지한 스코프를 우선합니다. 필요에 따라 config.tomlscopes를 작성할 수도 있습니다.

[mcp_servers.atlassian]
url = "https://mcp.atlassian.com/v1/mcp/authv2"
scopes = ["read:jira-work", "write:jira-work", "read:confluence-content.all"]

CLI 로그인 시에 지정할 수도 있습니다.

codex mcp login atlassian --scopes read:jira-work,write:jira-work,read:confluence-content.all

OAuth의 resource 파라미터가 필요한 서버에서는 oauth_resource를 사용합니다.

[mcp_servers.example]
url = "https://mcp.example.com/mcp"
oauth_resource = "https://api.example.com"

OAuth 콜백 URL 커스터마이징

Devbox나 Remote 환경 등, localhost로의 콜백을 사용하기 어려운 경우에는 최상위 레벨(top-level)에 다음 설정을 작성할 수 있습니다.

# ~/.codex/config.toml의 최상위 레벨(top-level)에 설정
# 고정 포트가 필요한 OAuth 프로바이더(Provider)용
mcp_oauth_callback_port = 54321
...

대표적인 OAuth 대응 MCP 서버 예시

# Notion
[mcp_servers.notion]
url = "https://mcp.notion.com/mcp"
...
codex mcp login notion
codex mcp login figma
codex mcp login linear
...

Codex를 MCP 서버로 사용하기

Codex는 MCP 클라이언트(Client)로서 외부 서버에 접속할 수 있을 뿐만 아니라, Codex 자체를 MCP 서버(Server)로서 다른 에이전트(Agent)나 도구(Tool)에 제공할 수도 있습니다.

# Codex를 MCP 서버 모드로 실행 (stdio)
codex mcp-server

이 모드에서는 Claude Desktop, Claude Code, OpenAI Agents SDK, 독자적인 오케스트레이터(Orchestrator) 등의 MCP 클라이언트로부터 Codex를 호출할 수 있습니다.

공개되는 도구

codex mcp-server는 주로 다음 두 가지 도구를 공개합니다.

도구 이름역할
codex()새로운 Codex 세션을 시작하여 태스크(Task)를 실행
codex-reply()기존 Codex 세션을 지속하여 추가 지시를 전달

codex-reply()를 사용함으로써, 오케스트레이터 측에서 Codex 세션을 상태 유지(Stateful)가 가능한 작업 단위로 다룰 수 있습니다. 한 번의 지시로 완결되지 않는 다단계 구현 태스크를 대화를 지속하며 위임할 수 있습니다.

Claude Code에서 Codex 호출하기

수동으로 codex mcp-server를 계속 실행해 둘 필요는 기본적으로 없습니다.

Claude Code와 같은 MCP 클라이언트 측에 stdio 서버로 등록해 두면, 세션 시작 시 자식 프로세스(Child Process)로서 자동으로 실행됩니다.

Claude Code의 프로젝트 설정인 .mcp.json에 작성한다면, 예를 들어 다음과 같은 형태가 됩니다.

{
"mcpServers": {
"codex-worker": {
...

CLI에서 추가할 경우에는 stdio 서버로서 codex mcp-server를 등록합니다.

claude mcp add codex-worker -- codex mcp-server

stdio 서버는 "URL에 접속하는" 것이 아니라, "명령어를 실행하여 표준 입출력(Standard I/O)을 통신 경로로 사용하는" 방식입니다. 따라서 Claude Code 세션이 종료되면, 통상적으로 자식 프로세스인 codex mcp-server도 함께 종료됩니다.

실전 유스케이스 (Use Case)

Claude Code에서 호출하는 MCP 브로커(Broker) 구성

Codex 측에 Backlog, Sentry, Linear 등 여러 MCP를 설정해 두고, Claude Code는 이를 직접 보유하지 않고 Codex를 경유하여 질의하는 구성을 취할 수도 있습니다.

Claude Code (사고·판단·설계·구현에 집중)
↓ codex() 도구를 호출
Codex (MCP의 창구 역할 = 브로커)
...

Claude Code 측의 컨텍스트(Context)에는 Codex로부터 반환된 요약(Summary) 정보만 들어가기 때문에, 외부 서비스의 로우 데이터(Raw Data)나 MCP의 도구 정의가 Claude Code의 컨텍스트를 압박하기 어렵습니다.

Claude Code도 MCP 서버로 사용할 수 있음

"MCP 서버로 공개할 수 있는 것은 Codex 고유의 기능"이라고 설명되는 경우가 있지만, 현재의 Claude Code에도 claude mcp serve가 있습니다 (사실 조사하기 전까지는 몰랐습니다... w)

claude mcp serve

하지만 Codex와 달리 Claude Code의 경우, 추론 능력을 이용할 수 있는 것도 아니며, Codex처럼 다른 MCP를 간접적으로 이용할 수 있는 것도 아닙니다. 간단히 말하면 Claude Code의 "손발"(파일 조작·셸 실행 도구)을 다른 MCP 클라이언트에게 도구로서 빌려주는 것이며, 주요 이용 용도는 Claude Desktop이 됩니다. Claude Desktop에 파일 편집·명령 실행 기능을 사후에 추가할 수 있게 됩니다.

"Codex에서 Claude 측의 Backlog 등의 MCP를 간접 이용하고 싶다"라거나 "Codex에서 태스크를 통째로 Claude에게 위임하여 자율적으로 수행하게 하고 싶다"는 경우, claude mcp serve로는 불가능한 것으로 보입니다.

MCP 서버 방식과 Codex 플러그인(codex-plugin-cc)의 차이

Claude Code에서 Codex를 사용하는 방법으로, 본 기사에서 해설한 MCP 서버 방식과는 별개로 OpenAI가 제공하는 **Codex 플러그인(codex-plugin-cc)**도 있습니다.

MCP 서버 방식 (본 기사)Codex 플러그인 (codex-plugin-cc)
연계 방식Claude Code 등의 MCP 클라이언트로부터 codex mcp-server를 기동
주요 진입점codex() / codex-reply()
실행 모델MCP 도구로서 직접 호출. 세션 지속에 적합
범용성임의의 MCP 클라이언트나 자체 제작 오케스트레이터에서 사용 가능
설정(Setup).mcp.json이나 MCP 클라이언트 측의 설정이 필요
적합한 케이스멀티 에이전트 구성, 외부 MCP 브로커, Agents SDK 연계

두 방식 모두 Codex 측의 ~/.codex/config.toml에 설정한 MCP 서버를 활용할 수 있습니다. 차이점은 연계의 깊이와 진입점입니다.

  • Codex와 대화를 지속하면서 여러 단계의 작업을 진행하고 싶다 → MCP 서버 방식
  • Claude Code 내부에서 간편하게 Codex 리뷰나 태스크 위임을 호출하고 싶다 → Codex 플러그인

Claude Code와의 비교

상급자를 위해, 두 도구의 MCP 설정을 횡단적으로 비교합니다.

설정 파일

비교 항목Claude CodeCodex
주요 설정 형식.mcp.json / ~/.claude.json (JSON)config.toml (TOML)
글로벌 설정~/.claude.json의 user scope~/.codex/config.toml
프로젝트 설정.mcp.json (리포지토리 루트).codex/config.toml (trust 필수)
CLI·IDE 설정 공유Claude Code의 스코프 설정으로 관리CLI와 IDE 확장이 동일한 설정 레이어를 공유
스코프local / project / useruser / project + profile / system 등

트랜스포트(Transport) 지원

트랜스포트Claude CodeCodex
stdio
...

인증

인증 방식Claude CodeCodex
환경 변수 (stdio)
Bearer Tokenbearer_token_env_var
OAuthcodex mcp login <name>
OAuth 콜백 조정클라이언트 측 구현에 의존mcp_oauth_callback_port / mcp_oauth_callback_url

MCP 서버 기능

기능Claude CodeCodex
MCP 서버로 공개claude mcp servecodex mcp-server
공개되는 주요 경험Claude Code의 도구 모음을 MCP를 통해 이용codex() / codex-reply()를 통해 Codex 세션을 작업 단위로 호출
프로젝트 신뢰 모델스코프 (Scope)로 제어projects.<path>.trust_level로 제어
IDE 설정의 일원성Claude Code의 설정 스코프를 따름CLI 및 IDE 확장이 공통의 config.toml을 참조
프로젝트 지시 파일CLAUDE.mdAGENTS.md

설계 사상의 차이

Claude Code의 MCP 설계는 local, project, user 스코프를 사용한 관리가 중심입니다. 팀과 공유하고 싶은 MCP는 .mcp.json에 두고, 개인 설정은 ~/.claude.json에 분리하는 방식이 자연스럽습니다.

반면 Codex는 config.toml을 중심으로 CLI와 IDE 확장을 일원 관리하는 설계입니다. 프로젝트 설정도 .codex/config.toml에 둘 수 있지만, 신뢰된 프로젝트에서만 읽어옵니다. 또한, Codex 자신을 MCP 서버로서 다른 오케스트레이터(Orchestrator)에서 호출할 수 있기 때문에 멀티 에이전트 (Multi-agent) 구성을 만들기 쉽다는 것이 특징입니다.

팀 개발에서의 설정 예시

프로젝트에 Codex의 MCP 설정을 포함하는 경우의 구성 예시입니다.

project/
├── .codex/
│   └── config.toml # 팀 공통 MCP 설정 (git 관리)
...

.codex/config.toml에는 시크릿(Secret) 값이 아니라, 환경 변수 이름이나 OAuth 대응 URL을 작성합니다.

# .codex/config.toml (git 관리하는 팀 공통 설정)
# GitHub Remote MCP (PAT를 사용하는 경우)
[mcp_servers.github]
...

최초 셋업 시에는 다음과 같은 형태가 됩니다.

cd project/
# 최초 실행 시 trust를 요청하는 프롬프트가 표시되면 내용을 확인하고 승인
codex
...

trust 승인을 수행하면, 사용자 측의 ~/.codex/config.toml에 다음과 같은 설정이 추가됩니다. 수동으로 작성할 수도 있습니다.

[projects."/path/to/project"]
trust_level = "trusted"

보안상의 주의점

Codex 고유의 리스크: trusted project

프로젝트의 .codex/config.toml이 유효해지는 것은 trust한 디렉토리뿐이지만, 한 번 trust하면 이후에는 자동으로 읽어옵니다.

  • OSS 컨트리뷰션이나 외부 리포지토리를 클론했을 때, codex trust나 최초 trust 승인 전에 .codex/config.toml의 내용을 확인한다.
  • 알 수 없는 .codex/config.toml이 포함된 리포지토리에 대한 trust는 신중하게 수행한다.
  • 프로젝트 config에서 실행되는 stdio MCP 서버의 command / args / cwd를 반드시 확인한다.

툴 포이즈닝 (Tool Poisoning) · 프롬프트 인젝션 (Prompt Injection)

MCP 서버의 툴 설명문이나 외부 서비스 유래 데이터에 악의적인 명령이 매립될 리스크는 Codex에서도 마찬가지입니다. Codex가 다루는 코드베이스에는 기밀 정보가 포함되는 경우가 많기 때문에 더욱 주의가 필요합니다.

  • 사용하는 MCP 서버는 공식적이고 신뢰할 수 있는 소스로 한정한다
  • 커뮤니티 제작 서버는 소스 코드를 확인한 후 도입한다
  • codex mcp get <name> --json 명령으로 실제로 로드되고 있는 설정을 정기적으로 확인한다
  • 불필요한 MCP 서버는 enabled = false로 무효화하거나, codex mcp remove <name>으로 삭제한다
  • 권한이 넓은 토큰이 아니라, 읽기 전용(read-only)이나 제한된 키(restricted key) 등 최소 권한의 인증 정보를 사용한다

HTTP MCP의 인증 정보

Streamable HTTP MCP에서는 OAuth 토큰이나 Bearer Token이 외부 서비스에 대한 액세스 권한이 됩니다.

[mcp_servers.stripe]
url = "https://mcp.stripe.com"
bearer_token_env_var = "STRIPE_API_KEY"

이러한 설정에서는 STRIPE_API_KEY의 값을 어디에서 관리할지가 중요합니다.

  • .env.local.gitignore에 포함시킨다
  • CI / devbox에서는 시크릿 매니저(Secret Manager)를 사용한다
  • API 키는 용도별로 분리하고, 정기적으로 로테이션(rotation)한다
  • 운영 권한(production) 키를 로컬 검증용 MCP에 유용하지 않는다

마치며

Codex의 MCP는 CLI, IDE, 기타 에이전트와의 연동을 일원적으로 다룰 수 있다는 점이 큰 특징입니다.

Claude Code와의 차이점을 파악하면서, 용도에 따라 적절히 구분하여 사용하면 좋을 것 같습니다.

참고 링크

Discussion

AI 자동 생성 콘텐츠

본 콘텐츠는 Zenn AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0