GrepBoard/매뉴얼
51 편 ·

exec 의 「user cancelled MCP tool call」 해결

·Codex CLI 0.163.0 · Ubuntu 24.04 · Node 24 (설정 검사는 직접 재현, 실제 도구 호출은 이슈 #24135 기준)·6 단계

codex exec 에서 MCP 도구 호출이 곧바로 취소될 때, 효과 없는 설정 키를 걸러 내고 서버·도구 단위 approval_mode 로 승인하며 샌드박스는 그대로 두는 방법입니다.

output
mcp: spike/echo_hello startedmcp: spike/echo_hello (failed)user cancelled MCP tool call

비대화형 codex exec 에서 MCP 도구가 시작되자마자 이렇게 실패하는 사례가 이슈 openai/codex#24135 에 있습니다(보고 버전 0.130.0). 승인을 물어볼 사람이 없어 취소로 처리된 것인데, 설정으로 막으려던 키 대부분이 아무 일도 하지 않았습니다. 서버가 안 뜨는 증상은 Codex 「MCP client for … timed out」 해결하기 에서 다룹니다. 여기는 서버는 떴는데 호출이 취소되는 경우입니다.

[1] 설정을 쓴 뒤 --strict-config 로 먼저 읽혀 봅니다. 이 옵션이 없으면 모르는 키는 조용히 무시됩니다.

console
$ codex --strict-config exec --skip-git-repo-check "hi"

[2] 이슈 작성자가 시도한 키를 0.163.0 에서 돌려 보면 다음과 같이 갈립니다. 서버 표 아래의 approval_policy 도 거부됩니다.

~/.codex/config.toml
[mcp_servers.spike]command = "python3"args = ["mock.py"]approval_policy = "never"
output
Error loading config.toml:~/.codex/config.toml:5:1: unknown configuration field `mcp_servers.spike.approval_policy`
키위치0.163.0 결과
approval_policy최상위허용 (untrusted · on-failure · on-request · granular · never)
approval_policy[mcp_servers.x] 아래unknown configuration field
default_tools_approval_mode최상위unknown configuration field
tools_require_approval · mcp_approval_policy · trusted_mcp_servers최상위unknown configuration field

[3] 최상위 approval_policy = "never" 는 모델이 실행하는 셸 명령 승인에 대한 설정입니다. MCP 도구 승인은 별도의 키로 정합니다. 0.163.0 에서 받아들이는 것은 서버 표 아래 default_tools_approval_mode 와 도구별 approval_mode 이고, 값은 auto · prompt · writes · approve 중 하나입니다.

~/.codex/config.toml
[mcp_servers.spike]command = "python3"args = ["mock.py"]default_tools_approval_mode = "approve"

잘못된 값은 읽는 단계에서 걸립니다.

output
~/.codex/config.toml:4:31: unknown variant `bogus`, expected one of `auto`, `prompt`, `writes`, `approve`

[4] 도구 하나만 열려면 도구 이름 아래에 둡니다. 서버 전체를 approve 로 두는 것보다 범위가 좁습니다.

~/.codex/config.toml
[mcp_servers.spike]command = "python3"args = ["mock.py"] [mcp_servers.spike.tools.echo_hello]approval_mode = "approve"

이 방식은 이슈 댓글에서 Windows 사용자가 알려 준 우회와 같습니다. 그 사용자는 approval_policy = "never" 만으로는 부족했고 필요한 도구마다 approval_mode = "approve" 를 적어서 호출이 통과했다고 했습니다.

[5] 샌드박스는 따로 정합니다. 승인과 샌드박스는 별개의 설정이라 서로 대신하지 않습니다.

console
$ codex --strict-config exec -s read-only --skip-git-repo-check "echo_hello 도구를 호출해"

--dangerously-bypass-approvals-and-sandbox 를 붙이면 승인 확인이 모두 사라지고 샌드박스도 꺼집니다. 도움말 문구는 「EXTREMELY DANGEROUS. Intended solely for running in environments that are externally sandboxed」 입니다. 이슈 작성자가 -s read-only 를 유지하려고 이 우회를 피하고 싶어 한 이유가 이것입니다. 컨테이너처럼 바깥에서 격리된 환경이 아니면 쓰지 않습니다.

[6] 버전에 따라 증상 문구가 다릅니다. 이슈 댓글에는 0.160.0 에서 호출이 디스패치되기 전에 MCP tool call requires approval, but approval policy is never 가 나온다는 보고가 있습니다. 두 문구 모두 0.163.0 바이너리 문자열에 들어 있습니다. 어느 문구가 나오든 3·4단계의 approval_mode 를 적은 뒤 같은 명령을 다시 돌려 확인합니다. 두 문구가 갈리는 조건은 확인하지 못했습니다.

#codex#mcp#approval#exec