Claude Code의 첫 요청에 무엇이 채워지는가: 빈 폴더에서 23,207 토큰, 두 개의 플래그 적용 후 2,664 토큰
요약
본 기사는 Claude Code의 초기 요청에 포함되는 입력 토큰을 분석합니다. 빈 디렉터리에서도 23,000개 이상의 방대한 토큰이 측정되며, 이는 사용자 설정이나 커넥터 도구 등 환경적 요인에서 비롯됩니다. 다양한 명령줄 플래그를 적용하여 이 기본값을 줄이는 방법을 실험하고 있습니다.
핵심 포인트
- Claude Code는 빈 디렉터리에서도 수만 개의 입력 토큰을 로드합니다.
- 이 토큰들은 주로 사용자 설정, 커넥터 도구 등 환경적 요인에서 발생합니다.
- 명령줄 플래그(예: --strict-mcp-config)를 사용하면 기본 입력 크기를 크게 줄일 수 있습니다.
우리가 --disallowedTools "Skill"을 전달했을 때, skill 목록 중 18,962 문자가 Claude Code의 첫 요청에 남아 있었고, 이 요청은 단지 913 토큰만 줄어들었습니다. 그 이유는 Workflow 도구 설명이 일반적으로 skill에서 로드하는 참조를 인라인화하여 3,480자에서 20,256자로 늘어났기 때문입니다. 2.1.285 버전의 빈 디렉터리에서 claude -p "Reply with just OK."의 첫 요청은 기본적으로 23,207개의 입력 토큰을 측정했으며, --strict-mcp-config --tools ""를 사용했을 때는 시스템 프롬프트와 몇 가지 짧은 메모만 남기고 2,664개로 줄었습니다.
이전 실험에서 Six CLAUDE.md files, six codewords에서는 동일한 설정으로 두 번 실행했을 때 각각 23,624개와 24,410개의 입력 토큰이 나왔습니다. 두 기록을 비교했을 때 유일한 차이점은 지연된 도구 목록(deferred tool list)이었습니다. 한 실행에는 우리의 claude.ai 계정의 원격 커넥터 도구가 포함되어 있었고 다른 하나에는 그렇지 않았습니다. 우리는 --strict-mcp-config를 추가하자 쌍들이 일치하기 시작했고, CLAUDE.md 파일을 측정하는 것으로 넘어갔습니다.
그것은 명백히 답을 찾지 못한 질문을 남겼습니다. 만약 하나의 커넥터 도구 이름이 786 토큰의 가치가 있다면, 프로젝트 파일이 개입되기 전에 첫 요청에는 또 무엇이 들어있으며 어떤 명령줄 플래그가 어느 부분을 제거하는 것일까요? 이 글에서는 Claude Code 2.1.285 버전(claude --version)에서 아무것도 없는 디렉터리 기준으로 그 기준선(baseline)을 다시 측정하고, 플래그별로 분해합니다.
실험: 비어있지 않은 기계의 빈 디렉터리
실험은 /tmp 아래에 있는 빈 디렉터리입니다. 여기에는 CLAUDE.md, CLAUDE.local.md, .mcp.json, .claude/ 폴더가 없으며, git 저장소도 아닙니다. Claude Code는 시작 시 상위 디렉터리의 CLAUDE.md 파일을 로드하므로, 우리는 또한 /까지 모든 상위 디렉터리를 탐색했지만 그 어떤 파일도 발견할 수 없었습니다.
주변의 기계는 비어있지 않으며, 이는 아래 모든 것에 중요합니다. 사용자 설정은 하나의 플러그인을 활성화하는데, 이 메모리 플러그인은 15개의 도구와 21개의 기술을 가진 MCP 서버를 가져옵니다. 로그인 뒤에 있는 claude.ai 계정에는 네 개의 커넥터가 있습니다: 두 개는 연결되어 있으며 그 사이에서 38개의 도구를 노출하고, 나머지 두 개는 로그인을 기다리고 있습니다. 아홉 개의 추가 기술이 해당 계정에서 동기화됩니다. 사용자 설정은 또한 기본 권한 모드를 auto로 설정하고, 자동 메모리 기능이 켜져 있습니다. 이 모든 것은 lab 디렉토리에 존재하지 않습니다. 이 모든 것이 첫 번째 요청에 나타났습니다.
모든 실행은 동일한 프롬프트와 동일한 기본 플래그를 사용했으며, 그 뒤에 테스트 중인 플래그가 이어졌습니다:
claude -p "Reply with just OK." --output-format stream-json --verbose \
--max-turns 1 --model opus --settings '{"disableAllHooks": true}'
--settings 오버라이드는 실행 동안 후크를 비활성화하여, 사용자 설정의 알림 후크가 조용히 유지되도록 했습니다. --model opus는 모델을 고정하는데, 이는 Opus 5.5로 해결되었습니다. 왜냐하면 동일한 텍스트가 다른 토크나이저 아래에서 다르게 계산되기 때문입니다. 우리는 또 다른 Claude Code 세션 내부에서 실행을 시작했기 때문에, 부모 세션이 내보내는 CLAUDECODE와 같은 환경 변수를 제거하는 작은 래퍼를 사용하여 claude를 호출했습니다. 이 단계가 없었다면, 자식 프로세스는 자신이 다른 세션 아래에서 실행되고 있다는 것을 알았을 것입니다.
우리는 2026-09-30에 총 20회의 실행(두 가지 구성 각각)으로 열 가지 구성을 실행했습니다. 모든 쌍에서 두 번째 실행의 총 토큰 수는 첫 번째 실행과 일치했고, 모든 답변은 OK였습니다.
우리가 계산한 것, 그리고 현재 스크립트가 기록하는 내용
아래 모든 표의 숫자는 첫 번째 요청의 총 입력 토큰 수입니다. 이는 usage 블록에서 가져온 input_tokens, cache_read_input_tokens, cache_creation_input_tokens을 합한 값입니다. --max-turns 1과 한 단어 답변으로 인해, 각 실행은 정확히 하나의 요청만 했으므로, 스트림의 result 이벤트와 ~/.claude/projects/ 아래 기록된 트랜스크립트의 첫 번째 어시스턴트 메시지는 동일한 세 가지 숫자를 담고 있었습니다. 우리는 이 두 가지를 모두 읽었습니다. 총합이 캐시 읽기와 캐시 쓰기 사이에서 어떻게 분할되었는지가 이전 실행들이 이미 무엇을 캐싱했는지에 따라 달라졌는지 확인했습니다. 합계는 그렇지 않았습니다.
2.1.285 버전에서는 트랜스크립트가 usage보다 훨씬 많은 것을 기록합니다. Claude Code가 첫 사용자 메시지 주변에 추가하는 모든 컨텍스트 블록은 attachment 레코드로 저장되며, 그 rendered 필드는 모델이 받은 텍스트를 <system-reminder> 태그로 감싸서 담고 있습니다. 첨부 파일 유형에는 사람이 읽을 수 있는 이름이 있습니다: environment, skill_listing, deferred_tools_delta, agent_listing_delta, mcp_instructions_delta 등입니다. 또한 시스템 프롬프트를 여러 부분의 목록으로, 그리고 스키마와 함께 나간 모든 도구 정의를 포함하는 prompt_snapshot 레코드도 있습니다. CLI 참고 자료는 그러한 것이 존재하는 이유를 설명합니다: "기본적으로 Claude Code는 대화의 첫 요청 시점에 적용된 시스템 프롬프트 플래그의 텍스트로 시스템 프롬프트를 한 번 구축하고, 이를 세션에 기록합니다." 우리는 문서화된 출력이 아닌 이 레코드를 읽고 있으며, 이는 변경될 수 있습니다.
따라서 요청의 모든 조각을 이름으로 볼 수 있고 문자로 측정할 수 있습니다. 트랜스크립트는 각 조각이 몇 토큰 비용이 드는지 말해주지 않습니다. 그 점에 대해 우리는 플래그가 붙은 조각들을 제거하고 빼는 방식으로 확인했습니다.
23,207 토큰을 조각별로 분석하기
스트림의 init 이벤트는 기본 세션이 무엇에 대해 알고 있었는지 나열합니다: 78개의 도구, 5개의 MCP 서버, 48개의 스킬, 그리고 5가지 에이전트 유형입니다. 이 모든 것이 전부 전송된 것은 아니었습니다.
Eleven개의 내장 도구는 완전한 정의와 함께 전송되었습니다: Agent, Bash, Edit, ListAgents, Read, ReportFindings, ScheduleWakeup, Skill, ToolSearch, Workflow 그리고 Write입니다. 이들의 설명만 합쳐도 14,590자이며, 입력 스키마와 직렬화하면 총 27,291자가 됩니다. 가장 긴 두 개의 설명은 Workflow가 3,480자로, ScheduleWakeup이 3,148자입니다. 추가로 64개의 도구(내장 14개, MCP 서버 50개)는 이름만 전송되었으며, 이들은 Claude에게 ToolSearch를 통해 스키마를 로드한 후 호출하라는 안내 문 아래에 포함되었습니다. 마지막 세 개는 동일한 알림에서 '사용 준비 완료'라고 언급된 커넥터 도구들입니다. 이것이 총 78개의 도구를 구성합니다.
요청의 나머지 모든 것은 텍스트입니다. 이들은 첫 번째 사용자 메시지가 담고 있던 첨부 파일들로, 렌더링된 텍스트 문자 수로 측정되었습니다:
| Attachment | What it holds | Characters |
|---|---|---|
skill_listing | 48개 스킬의 이름 및 설명 | 18,962 |
| ... |
시스템 프롬프트 자체는 11개의 부분으로 구성되어 총 6,659자입니다. 이 스냅샷은 또한 이러한 유형의 실행에 대한 한 줄 접두사도 기록하고 있습니다: "You are a Claude agent, built on Anthropic's Claude Agent SDK." 가장 큰 부분인 2,200자는 자동 메모리 섹션으로, Claude에게 이 프로젝트의 메모리 디렉터리가 어디인지 그리고 어떻게 쓰기해야 하는지 알려줍니다.
따라서 문자 수로 측정했을 때 시스템 프롬프트는 작은 부분입니다. 스킬 목록만 해도 그 크기의 거의 3배에 달하며, 11개의 도구 정의는 또다시 더 큰 규모입니다.
플래그별 분석
우리는 스크립트에서 접근하는 순서대로 조각들을 제거했습니다: 계정의 커넥터들부터 먼저, 그다음 모든 MCP 서버들, 그 다음 가장 큰 목록 뒤에 있는 두 도구, 그리고 파일 및 셸 도구를 제외한 나머지 전부, 마지막으로 그것들입니다. 각 행은 기본 명령어에 추가된 플래그를 나열합니다.
| Flags added to the base command | 첫 요청 (First request) | 변경량 (Change) |
|---|---|---|
| none | 23,207 | |
| ... | ||
![]() |
각 단계마다 이름 붙일 수 있는 무언가를 제거했습니다. claude.ai 커넥터를 끄자 35개의 지연된 이름(deferred names)과 완전히 로드되었던 세 가지 도구, 연결되지 않은 두 개의 플러그인에 대한 로그인 알림, 그리고 2,053자로 구성된 명령어 블록이 제거되어 총 2,500 토큰을 차지했습니다. --strict-mcp-config를 적용하자 플러그인의 서버가 제거되었는데, 여기에는 지연된 이름 15개와 다른 것은 없었습니다: 391 토큰. Skill과 Workflow 사용 금지는 두 정의, 48개의 스킬 목록, 그리고 Claude에게 시스템 프롬프트에서 /<skill-name>을 통해 Skill로 호출하라고 알려주는 한 줄까지 제거되어 총 9,155 토큰이 감소했습니다. 도구를 Bash, Read, Edit, Write로 좁히자 Agent, ListAgents, ReportFindings, ScheduleWakeup 및 ToolSearch 정의와 지연된 내장 이름 14개, 그리고 에이전트 목록까지 제거되어 5,490 토큰을 차지했습니다. `--tools
ENABLE_CLAUDEAI_MCP_SERVERS=false가 더 제한적입니다. 환경 변수 페이지에는 "Claude Code가 claude.ai MCP 서버를 가져오는 것을 중지하려면 false로 설정하세요. 로그인한 사용자에게는 기본적으로 활성화되어 있습니다."라고 명시되어 있습니다. 이 설정을 사용하자 네 개의 커넥터가 사라지고 플러그인의 서버만 연결된 상태가 되었으며, 이를 통해 두 가지 항목을 개별적으로 가격 책정할 수 있었습니다. 로컬 서버가 필요하지만 계정의 커넥터를 절대 볼 필요가 없는 작업의 경우 이 스위치를 사용하면 됩니다. 다른 경로는 명시적인 --mcp-config와 함께 사용하는 --strict-mcp-config입니다.
플러그인의 15개 이름은 391 토큰을 소모하며, 이름당 약 26 토큰에 달합니다. 그들은 지연 목록(deferred list)에 735 문자를 추가하여, 이 이름들이 토큰당 약 1.9문자로 실행되게 했습니다. 비교하자면, 본문 후반부에서 --append-system-prompt를 사용하여 추가한 일반 영어는 토큰당 3.3문자에 달했습니다. 이름당 26 토큰이라는 기준으로 볼 때, 코드워드(codewords) 실행에서 발생한 786 토큰의 차이는 대략 30개 이름이 소모할 비용과 비슷하며, 여기에 연결된 두 커넥터 중 하나가 정확히 30개의 도구를 노출합니다. 이는 일치하지만, 이전 실행에 대한 측정치가 아니라 단순 산술 계산입니다.
레이스가 돌아왔을까요? 이 실행들에서는 그렇지 않습니다. 기본 실행(default runs) 모두 네 개의 커넥터를 가지고 있었으며, 두 개는 연결되어 있고 나머지 두 개는 로그인 대기 상태였습니다. 환경 변수 페이지의 MCP_CONNECTION_NONBLOCKING 항목에는 "비대화형 모드(-p)에서 --input-format stream-json 없이 실행할 경우, Claude Code는 이 변수와 관계없이 첫 번째 턴 전에 여전히 보류 중인 서버를 기다립니다."라고 적혀 있습니다. 일치하는 두 번의 실행이 레이스가 사라졌음을 증명하지 못합니다. 만약 동일한 실행들이 다시 수백 토큰 차이를 보인다면, 먼저 두 트랜스크립트의 deferred_tools_delta 첨부 파일을 비교해야 합니다.
Skill 비활성화로 913 토큰 절감
스킬 목록(skill listing)이 가장 큰 단일 첨부 파일이기 때문에, 스킬을 전혀 사용하지 않는 스크립트의 경우 명백한 조치는 Skill 도구를 제거하는 것입니다. CLI 레퍼런스는 --disallowedTools를 다음과 같이 설명합니다: "거부 규칙. 빈 도구 이름은 Claude의 컨텍스트에서 일치하는 도구를 제거합니다: "Edit"는 Edit을 제거하고, "*"는 모든 도구를 제거하며, "mcp__*"는 모든 MCP 도구를 제거합니다."
우리는 --strict-mcp-config --disallowedTools "Skill"을 실행했습니다. Skill 정의가 제거되었고, 그와 함께 18,962자 길이의 스킬 목록도 사라졌습니다. 첫 번째 요청은 20,316 토큰에서 19,403 토큰으로 줄었습니다. 이는 도구 하나와 합쳐서 20,000자를 초과했던 목록을 제거하는 데 913 토큰이 사용된 것입니다.
스크립트(transcript)는 나머지 부분이 어디로 갔는지 보여줍니다. Skill이 사용 가능한 상태에서, Workflow 도구의 설명에는 다음 줄이 포함되어 있습니다:
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기
