Claude Code 첫 요청 토큰 수와 도구 제한 효과

이전의 실험실에서 Six CLAUDE.md files, six codewords , 같은 설정을 두 번 실행했더니 입력 토큰이 23,624와 24,410으로 나왔습니다. 두 트랜스크립트를 비교해 보니 유일한 차이는 지연 로드되는 도구 목록이었고, 한 번은 claude.ai 계정에 연결된 원격 커넥터의 도구가 포함되었지만 다른 한 번은 그렇지 않았습니다. --strict-mcp-config를 추가하자 두 값이 일치하기 시작했고, 그다음에는 CLAUDE.md 파일을 측정했습니다.
그렇게 해서 하나의 분명한 질문이 남았습니다. 한 커넥터의 도구 이름이 786토큰의 가치가 있다면, 프로젝트 파일이 관여하기 전 첫 요청에는 그 밖에 무엇이 들어 있고, 어떤 커맨드라인 플래그가 무엇을 제거하는 걸까? 이 글은 Claude Code 2.1.285(claude --version)에서 같은 기준선을 다시 측정하고, 아무것도 없는 디렉터리에서 하나씩 플래그를 적용해 그 내용을 분해합니다.
실험실: 비어 있지만, 머신 자체는 비어 있지 않은 디렉터리
실험실은 /tmp 아래의 빈 디렉터리 하나입니다. 여기에 CLAUDE.md, CLAUDE.local.md, .mcp.json, .claude/ 폴더는 없고, git 저장소도 아닙니다. Claude Code는 시작 시 상위 디렉터리에서 CLAUDE.md 파일을 읽어들이므로, /까지 모든 상위 디렉터리도 살펴봤지만 거기에도 그런 파일은 없었습니다.
하지만 이 디렉터리를 둘러싼 머신은 비어 있지 않고, 아래 모든 결과에 그 점이 중요하게 작용합니다. 사용자 설정에는 하나의 플러그인이 활성화되어 있는데, 이 플러그인은 15개의 도구와 21개의 스킬을 가진 MCP 서버를 가져옵니다. 로그인에 사용된 claude.ai 계정에는 네 개의 커넥터가 있는데, 그중 두 개는 연결되어 38개의 도구를 노출하고 있고, 두 개는 아직 로그인 대기 상태입니다. 그 계정에서 동기화된 스킬도 9개 더 있습니다. 사용자 설정은 또한 자동을 기본 권한 모드로 지정하고 있으며, 자동 메모리도 켜져 있습니다. 이 모든 것은 실험실 디렉터리 안에 있지 않습니다. 하지만 모두 첫 요청에 나타났습니다.
모든 실행은 같은 프롬프트와 같은 기본 플래그로 시작했고, 그 뒤에 테스트할 플래그를 붙였습니다:
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에 10개의 구성을 각각 두 번씩, 총 20회 실행했습니다. 각 쌍에서 두 번째 실행의 총합은 첫 번째 실행과 토큰 단위까지 정확히 일치했고, 모든 응답은 OK였습니다.
우리가 무엇을 세었는지, 그리고 현재 트랜스크립트에 무엇이 기록되는지
아래 모든 표의 숫자는 첫 요청의 총 입력량입니다. 즉, usage 블록의 input_tokens + cache_read_input_tokens + cache_creation_input_tokens입니다. --max-turns 1과 한 단어 답변을 사용하면 각 실행은 정확히 한 번의 요청만 만들므로, 스트림의 result 이벤트와 ~/.claude/projects/ 아래 트랜스크립트의 첫 번째 assistant 메시지는 같은 세 숫자를 담고 있었습니다. 우리는 둘 다 읽었습니다. 총합이 캐시 읽기와 캐시 쓰기 사이에서 어떻게 나뉘는지는 이전 실행들이 이미 무엇을 캐시했는지에 따라 달라졌습니다. 총합 자체는 달라지지 않았습니다.
2.1.285에서는 대화 기록이 사용량보다 훨씬 더 많은 것을 담습니다. Claude Code가 첫 사용자 메시지 주위에 추가하는 각 컨텍스트 블록은 attachment 레코드로 저장되며, 그 rendered 필드에는 모델이 실제로 받은 텍스트가 태그로 감싸인 형태로 들어 있습니다. 첨부 유형에는 읽을 수 있는 이름이 붙어 있습니다: 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개의 에이전트 유형입니다. 하지만 이 모든 것이 완전히 전송된 것은 아닙니다.
내장 도구 11개는 완전한 정의와 함께 나갔습니다: 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를 통해 스키마를 불러오라고 지시하는 줄 아래에 놓였습니다. 마지막 3개는 같은 안내문에서 "사용 준비 완료"라고 표시된 커넥터 도구였습니다. 이것으로 78개가 모두 설명됩니다.
요청의 나머지는 모두 텍스트입니다. 첫 사용자 메시지가 담고 있던 첨부 항목들을, 렌더된 텍스트의 문자 수로 측정하면 다음과 같습니다:
| 첨부 항목 | 담고 있는 내용 | 문자 수 |
|---|---|---|
| skill_listing | 48개 스킬의 이름과 설명 | 18,962 |
| deferred_tools_delta | 보류된 이름 64개, 즉시 사용 가능한 도구 3개, 2개 커넥터에 대한 로그인 안내 | 3,156 |
| mcp_instructions_delta | 1개 커넥터의 서버 지침 | 2,053 |
| agent_listing_delta | 5개 에이전트 유형과 그 설명 | 1,673 |
| remote_session_change | git 커밋과 pull request를 어떻게 귀속할지 | 579 |
| session_context | 로그인한 계정의 이메일 주소 | 568 |
| auto_mode | 자동 권한 모드에 대한 메모 | 516 |
| environment | 작업 디렉터리, git 여부, 플랫폼, 셸, OS 버전 | 364 |
| model | 모델 이름과 지식 컷오프 | 161 |
| total_tokens_reminder | 토큰 예산 줄 | 86 |
| date | 오늘 날짜 | 64 |
시스템 프롬프트 자체는 11개 부분으로 이루어진 6,659자입니다. 스냅샷에는 이런 종류의 실행에 대한 한 줄짜리 접두사도 기록됩니다: "You are a Claude agent, built on Anthropic's Claude Agent SDK." 가장 큰 부분인 2,200자는 자동 메모리 섹션으로, Claude에게 이 프로젝트의 메모리 디렉터리가 어디에 있는지와 그곳에 어떻게 쓰는지를 알려 줍니다.
문자 수로 보면, 시스템 프롬프트는 작은 부분입니다. 스킬 목록만 해도 그 크기의 거의 세 배이고, 11개의 도구 정의는 그보다 더 큽니다.
플래그를 하나씩 분해하기
우리는 스크립트에서 손이 먼저 가는 순서대로 부분들을 제거했습니다. 먼저 계정의 커넥터를 제거하고, 그다음 모든 MCP 서버를 제거하고, 그다음 가장 큰 목록 뒤에 있는 두 도구를 제거하고, 그다음 파일 및 셸 도구를 제외한 나머지를 제거하고, 마지막으로 그것들까지 제거했습니다. 각 행은 기본 명령에 추가된 플래그를 나열합니다.
| 기본 명령에 추가된 플래그 | 첫 요청 | 변화 |
|---|---|---|
| 없음 | 23,207 | |
| ENABLE_CLAUDEAI_MCP_SERVERS=false (환경 변수) | 20,707 | −2,500 |
| --strict-mcp-config | 20,316 | −391 |
| --strict-mcp-config --disallowedTools "Skill" "Workflow" | 11,161 | −9,155 |
| --strict-mcp-config --tools "Bash,Read,Edit,Write" | 5,671 | −5,490 |
| --strict-mcp-config --tools "" | 2,664 | −3,007 |

각 단계마다 이름 붙일 수 있는 무언가가 사라졌다. claude.ai 커넥터를 끄자 35개의 지연된 이름, 완전히 로드된 3개의 도구, 연결되지 않은 2개에 대한 로그인 안내, 그리고 2,053자짜리 지침 블록이 제거되었다: 2,500 토큰. 그다음 --strict-mcp-config는 플러그인의 서버를 제거했는데, 여기에는 다른 것은 붙어 있지 않고 지연된 이름 15개만 있었다: 391 토큰. Skill과 Workflow를 허용하지 않자 두 정의, 48개 Skill 목록, 그리고 Claude에게 Skill을 통해 /를 호출하라고 지시하는 시스템 프롬프트의 한 줄이 제거되었다: 9,155 토큰. 도구를 Bash, Read, Edit, Write로 좁히자 Agent, ListAgents, ReportFindings, ScheduleWakeup, ToolSearch 정의와 14개의 지연된 내장 이름, 그리고 에이전트 목록이 제거되었다: 5,490 토큰. --tools ""는 자동 모드 메모와 커밋 귀속 메모와 함께 마지막 4개 정의를 제거했다: 3,007 토큰.
이 단계들을 합치면 2,500 + 391 + 9,155 + 5,490 + 3,007 + 2,664 = 23,207이다. 이를 독립적인 가격이 아니라, 요청을 통과하는 하나의 경로로 읽어야 한다. 같은 항목을 다른 순서로 제거하면 다른 숫자가 나오며, 아래의 Skill 섹션은 한 단계에서 다른 단계로 8,000개가 넘는 토큰을 옮기는 순서를 보여준다.
Connectors: 이번에 --strict-mcp-config가 제거한 것
여기서 코드워드 실행이 분해되었으므로, 좀 더 자세히 살펴볼 가치가 있다. CLI 참고 문서는 이 플래그를 한 문장으로 설명한다: "Only use MCP servers from --mcp-config, ignoring all other MCP configurations." 우리는 --mcp-config를 전혀 넘기지 않았기 때문에 세션에는 MCP 서버가 하나도 남지 않았다. 4개의 커넥터와 플러그인의 서버가 모두 사라졌고, 초기화 이벤트에는 아무것도 표시되지 않았다.
ENABLE_CLAUDEAI_MCP_SERVERS=false는 더 좁다. 환경 변수 페이지에는 이렇게 적혀 있다: "Set to false to stop Claude Code from fetching claude.ai MCP servers. Enabled by default for logged-in users." 이 값을 설정하자 4개의 커넥터는 사라지고 플러그인의 서버는 계속 연결된 상태로 남았는데, 그래서 두 항목을 따로 가격 매길 수 있었다. 로컬 서버는 필요하지만 계정의 커넥터는 절대 보이면 안 되는 작업이라면, 이 스위치를 쓰면 된다. --strict-mcp-config에 명시적인 --mcp-config를 함께 쓰는 것이 다른 경로다.
플러그인의 15개 이름은 391 토큰이 들었고, 이름 하나당 약 26 토큰이었다. 이들은 지연 목록에 735자를 추가했으므로, 이 이름들은 토큰당 약 1.9자 비율로 계산되었다. 비교하자면, 이 글의 뒤에서 --append-system-prompt로 덧붙인 평범한 영어 문장은 토큰당 3.3자였다. 이름당 26토큰이라면, 코드워드 실행들 사이의 786토큰 차이는 대략 30개의 이름에 해당하고, 여기서 연결된 두 커넥터 중 하나는 정확히 30개의 도구를 노출한다. 이것은 맞아떨어지지만, 계산일 뿐 옛 실행에 대한 측정은 아니다.
레이스가 다시 나타났는가? 이 실행들에서는 아니다. 기본 실행 두 번 모두 4개의 커넥터를 그대로 포함했고, 같은 2개는 연결된 채였으며 같은 2개는 로그인 대기 상태였다. 환경 변수 페이지의 MCP_CONNECTION_NONBLOCKING 항목에는 이렇게 적혀 있다: "In non-interactive mode (-p) without --input-format stream-json, Claude Code also waits for still-pending servers before the first turn regardless of this variable." 서로 일치하는 두 실행만으로 레이스가 사라졌다고 증명할 수는 없다. 만약 동일한 실행이 다시 몇백 토큰씩 차이가 난다면, 먼저 두 전사본의 deferred_tools_delta 첨부물을 비교하라.
Skill을 허용하지 않아서 913 토큰을 절약했다
Skill 목록은 가장 큰 단일 첨부물이므로, Skill을 전혀 사용하지 않는 스크립트라면 가장 뻔한 방법은 Skill 도구를 제거하는 것이다. CLI 참고 문서는 --disallowedTools를 이렇게 설명한다: "Deny rules. A bare tool name removes the matching tools from Claude's context: "Edit" removes Edit, "*" removes every tool, and "mcp__*" removes every MCP tool."
우리는 --strict-mcp-config --disallowedTools "Skill"을 실행했다. Skill 정의가 사라졌고, 18,962자짜리 Skill 목록도 사라졌다. 첫 번째 요청은 20,316 토큰에서 19,403 토큰으로 줄었다. 도구 하나와 20,000자를 넘는 목록을 함께 제거하는 데 913 토큰이 든 셈이다.
전사본은 나머지 부분이 어디로 갔는지 보여준다. Skill을 사용할 수 있을 때 Workflow 도구의 설명에는 다음 문장이 들어 있다:

Skill을 허용하지 않자 그 줄은 # Workflow authoring reference라는 제목으로 바뀌고, 그 뒤에 133줄이 더 붙었습니다. 바로 그 참조 내용이 도구 설명 안에 들어간 것입니다. 설명은 3,480자에서 20,256자로 늘어났습니다. Skill 목록과 함께 빠져나간 대부분이 Workflow 안에서 다시 돌아왔습니다. 두 도구를 모두 허용하지 않았을 때에만 요청은 11,161 토큰으로 줄었고, 엄격한 기준선보다 9,155 토큰 적었습니다.
문서는 이름한 도구에 대해서는 정확합니다. Skill은 실제로 Claude의 컨텍스트에서 빠져나갔습니다. 하지만 문서가 말하지 않는 점, 그리고 우리가 예상하지 못했던 점은 다른 도구의 정의가 남아 있는 도구들을 기준으로 다시 구성된다는 것입니다. 우리가 여기서 얻은 규칙은 짧습니다. 도구 집합을 바꾼 뒤에는 다시 측정해야 합니다. 손대지 않은 정의도 바뀔 수 있기 때문입니다.
--tools는 목록도 함께 가져간다
CLI 레퍼런스는 이 플래그를 다음처럼 설명합니다. "Claude가 사용할 수 있는 기본 내장 도구를 제한합니다. 모든 도구를 비활성화하려면 ""를, 기본 세트를 사용하려면 "default"를, 또는 "Bash,Edit,Read" 같은 도구 이름을 사용하세요." 또한 이렇게 덧붙입니다. "이 플래그는 MCP 도구에는 영향을 주지 않습니다. 그것들까지 거부하려면 --disallowedTools "mcp__*"를 사용하세요." 그래서 위의 모든 --tools 실행에는 --strict-mcp-config도 함께 붙어 있습니다.
--tools "Bash,Read,Edit,Write"를 사용했을 때 요청은 5,671 토큰이었습니다. 네 개의 정의만 남고 목록은 사라졌습니다. 초기화 이벤트는 여전히 48개의 skill과 5개의 agent type을 보고했지만, Skill 도구와 Agent 도구가 없었으므로 어느 목록도 전송되지 않았습니다. 14개의 보류된 내장 이름도 함께 사라졌고, ToolSearch도 전송되지 않았습니다.
--tools ""로 하면 요청은 2,664 토큰까지 내려갔고, 마지막 네 도구와 함께 추가 첨부물 두 개도 사라졌습니다. 바로 자동 모드 메모와 커밋 저자 메모입니다. 둘 다 Bash, Read, Edit, Write만 허용한 실행에서는 여전히 존재했으므로, 각각은 이 네 도구 중 하나 이상에 매달려 있습니다. 어떤 도구인지는 테스트하지 않았습니다.
2,664 토큰에서 남는 것은 어떤 도구 플래그도 건드리지 않는 부분입니다. 6,523자짜리 시스템 프롬프트, 환경 블록, 모델 줄, 날짜, 토큰 예산 줄, 계정 메모, 그리고 프롬프트 자체입니다. 그 바닥에서 한 가지는 우리를 놀라게 했습니다. 2,200자짜리 자동 메모 섹션은 여전히 시스템 프롬프트 안에 있었는데, 그 섹션은 Claude에게 Write 도구로 메모를 저장하라고 지시하고 있었고, 이 세션에는 그 도구가 없었습니다.
기본 세트를 스크립트에서 받아들일지 결정하기 전에, 두 개의 가장 큰 내장 정의를 살펴볼 가치가 있습니다. 대화 기록에서 ScheduleWakeup의 설명은 "Schedule when to resume work in /loop dynamic mode"로 시작하고, Workflow의 설명은 Claude에게 "사용자가 명시적으로 다중 에이전트 오케스트레이션을 선택했을 때만 이 도구를 호출하라"고 지시합니다. 파일을 요약하거나 lint 오류를 수정하는 단발성 claude -p 호출에는 둘 중 어느 것도 필요하지 않습니다. 도구 목록이 달리 말하지 않는 한, 세션의 모든 요청에 이 둘은 전체가 그대로 전송됩니다.
무엇이 여러분의 것인가, 그리고 무엇이 Claude Code의 것인가
두 개의 플래그는 도구가 아니라 사용자 정의를 제거하며, 이 둘을 통해 이 머신이 추가한 것과 Claude Code가 자체적으로 가져오는 것을 구분할 수 있습니다.
CLI 레퍼런스는 --setting-sources를 "불러올 설정 원본의 쉼표로 구분된 목록 (user, project, local)"이라고 설명합니다. 이 실험 환경에는 project나 local 설정이 없으므로, --setting-sources project,local을 사용하면 명령줄의 --settings 오버라이드만 남습니다. --strict-mcp-config와 함께 사용했을 때 요청은 20,316 토큰에서 15,767 토큰으로 줄어들어, 4,549 토큰이 감소했습니다. skill 수는 48개에서 18개로 떨어졌습니다. 플러그인의 21개 skill은 플러그인과 함께 사라졌고, claude.ai 계정에서 동기화된 9개 skill도 함께 사라졌으므로, 이 머신에서는 그것들도 사용자 소스를 통해 들어오는 것입니다. 기본 권한 모드는 auto에서 default로 되돌아갔고, 그에 따라 자동 모드 메모도 함께 사라졌으며, skill 목록은 18,962자에서 6,332자로 줄었습니다.
--safe-mode는 다른 방향으로 작동합니다. CLI 레퍼런스에는 이것이 "모든 사용자 정의를 비활성화한 상태로 시작하여 깨진 설정을 디버깅한다: CLAUDE.md, skills, plugins, hooks, MCP servers, custom commands and agents, output styles, workflows, custom themes, custom keybindings, status line and file-suggestion commands, LSP servers, and auto memory do not load. Authentication, model selection, built-in tools, and permissions work normally, which differs from --bare."라고 되어 있습니다. 우리는 --strict-mcp-config 없이 실행했는데도, claude.ai connectors를 포함한 다섯 개의 MCP 서버를 모두 제거했습니다. --setting-sources project,local이 유지했던 18개의 skills는 그대로 유지되었고, auto memory 섹션은 제거되어 시스템 프롬프트가 6,659자에서 4,459자로 줄었습니다. permissions는 "정상적으로 작동"했고, permission mode는 auto로 유지되었습니다. 요청은 15,239 tokens였으며, 모든 built-in tool이 그대로 남아 있는 상태에서 측정한 값 중 가장 낮았습니다.
따라서 이 머신에서는 대략 23,207 tokens 중 15,200 tokens 정도가 Claude Code 자체에서 나오고, 약 8,000 tokens는 --safe-mode가 비활성화하는 부분에서 나옵니다. 여기에는 connectors, plugin, 동기화된 skills, auto memory가 포함됩니다. 다른 머신에서는 분포가 다르게 나타날 것이고, --safe-mode를 두 번 실행해 보면 그 차이를 파악하는 데 드는 비용이 적습니다.
--bare가 자연스러운 다음 행이었겠지만, 우리는 이를 실행할 수 없었습니다. headless page의 예시에는 bare mode가 subscription login을 사용하지 않기 때문에, 실행하기 전에 ANTHROPIC_API_KEY를 설정하라고 되어 있으며, 이 머신에는 subscription login만 있습니다.
--append-system-prompt: 953자, 285 tokens
마지막 플래그는 제거가 아니라 추가를 합니다. CLI 레퍼런스는 이를 "Append custom text to the end of the default system prompt"라고 설명합니다. 우리는 CI 규칙이 담긴 953자, 170단어 분량의 블록을 추가했습니다: 질문하지 말 것, 절대 push하지 말 것, src/와 test/만 수정할 것, 실패한 tests는 이름으로 보고할 것, 답변은 PASS 또는 FAIL로 시작할 것. --strict-mcp-config 위에 이 내용을 더하자 요청은 20,316 tokens에서 20,601 tokens로 늘어났고, 285 tokens가 추가되었습니다.
스냅샷에서 이 텍스트는 system prompt의 열두 번째이자 마지막 부분이 되었습니다. 기록된 기본 프롬프트의 두 번째 부분은 __SYSTEM_PROMPT_DYNAMIC_BOUNDARY__라는 줄입니다. CLI 레퍼런스는 이 마커를 사용자 정의 프롬프트용으로 설명하며, Claude Code는 그 줄에서 프롬프트를 나누고 이를 제거하여 "위쪽 부분은 캐시된 상태로 유지되고 아래쪽 부분은 바뀌게 됩니다."라고 되어 있습니다. 추가된 텍스트는 그 훨씬 아래에 위치합니다. 두 번째 실행에서는 전체 20,599개의 캐시된 tokens를 다시 읽어 왔으므로, 고정된 추가 텍스트도 나머지 접두사와 마찬가지로 캐시됩니다. 우리는 호출마다 바뀌는 텍스트는 시험하지 않았습니다.
스크립트 실행에 넘길 내용
아래는 미리 작업이 정해진 claude -p 호출에 대해, 위 수치들을 바탕으로 우리가 선택할 항목들입니다:
- 작업에 파일과 shell만 필요하고 그 외에는 아무것도 필요하지 않다면,
--tools에 명시적 목록을 주는 것이 가장 큰 단일 절감 효과를 냅니다. 여기서는 20,316에서 5,671 tokens로 줄었는데, 이는 해당 tools와 함께 가는 skill 및 agent 목록이 사라지기 때문입니다.
- 작업에 skills가 필요하다면 Skill은 유지하고, 사용자에게 있는 모든 skill과 plugin이 있을수록 목록이 커질 것이라고 예상하십시오.
--setting-sources project,local는 해당 사용자의 login 아래에서 실행되는 작업에서 사용자의 plugins와 동기화된 skills를 제외합니다.
- tokens를 아끼기 위해 Skill만 비활성화하지 마십시오. 2.1.285에서는 913이 절약되었습니다. 그와 함께 Workflow도 비활성화하거나,
--tools를 사용하십시오.
- 작업에 servers가 필요하다면
--strict-mcp-config를 사용하고, 필요에 따라 명시적인--mcp-config를 더하여 계정의 connectors가 작업을 CI로 따라가지 않게 하십시오.ENABLE_CLAUDEAI_MCP_SERVERS=false는 connectors만 제거합니다.
prefix는 세션당 한 번이 아니라 모든 요청마다 비용이 듭니다. total_cost_usd에서는 전체 prefix를 cache에서 다시 읽은 반복 호출이 23,207-token 기본값에 대해 $0.0047, 2,664-token 하한에 대해 $0.0006로 보고되었습니다. 첫 번째 기본 실행은 12,755 tokens를 cache에 기록했고, $0.104로 보고되었습니다.
측정하지 않은 것
여기의 모든 내용은 하나의 머신, 하나의 계정, 하나의 모델(Opus 5.5), 그리고 하나의 버전(2.1.285)에서 나온 것입니다. 다른 모델은 같은 텍스트를 다르게 계산하고, 다른 계정은 다른 connectors와 동기화된 skills를 가져옵니다.
lab은 git repository가 아니었으므로 git status는 관련이 없었습니다. codewords lab은 하나였고, CLAUDE.md가 없는 strict baseline은 2.1.273에서 18,442 tokens였으며, 여기서는 20,316 tokens였습니다. 두 lab은 버전만 다른 것이 아니므로, 우리는 이 1,874-token 차이를 업그레이드 탓으로 돌리지 않습니다.
우리는 API 키가 필요한 --bare를 실행하지 않았습니다. 또한 환경 변수를 사용했기 때문에 --system-prompt, --system-prompt-file, --exclude-dynamic-system-prompt-sections, --disallowedTools "mcp__*", 또는 disableClaudeAiConnectors 설정도 실행하지 않았습니다. --strict-mcp-config와 함께 --setting-sources만 실행했으므로, 사용자 소스를 빼는 것만으로도 커넥터를 막을 수 있는지는 말할 수 없습니다.
각 구성은 두 번씩 실행되었습니다. 코드워드 실험실의 커넥터 경합은 두 번의 기본 실행에서 나타나지 않았지만, 그렇다고 해서 발생할 수 없다는 증거는 아닙니다.
단계별 토큰 수는 제거 경로 하나에서 나온 것입니다. Skill 결과는 조각들이 독립적이지 않다는 것을 보여주므로, 순서가 달랐다면 같은 23,207개의 토큰이 다르게 분할되었을 것입니다.
attachment와 prompt_snapshot 레코드는 문서화되어 있지 않습니다. 그 이름과 내용은 어느 릴리스에서든 바뀔 수 있으며, 위의 모든 문자 수는 그것들에 의존합니다.
20개의 응답은 모두 OK였습니다. 도구를 제거했을 때 Claude가 한 단어로 답하는 것 이상의 일을 할 수 있었는지는 테스트하지 않았습니다. 20회의 실행 전체 비용은 total_cost_usd 기준으로 $0.60로 보고되었습니다.
재현하기
LAB=$(mktemp -d) && cd "$LAB"
probe() { # probe <name> [flags under test...]
local name=$1; shift
claude -p "Reply with just OK." --output-format stream-json --verbose \
--max-turns 1 --model opus --settings '{"disableAllHooks": true}' "$@" \
> "$name.jsonl" < /dev/null
}
first_in() {
for r in "$@"; do
printf '%-8s %6s\n' "$r" "$(jq -r 'select(.type=="result") | .usage
| .input_tokens + .cache_read_input_tokens + .cache_creation_input_tokens' "$r.jsonl")"
done
}
probe default
probe strict --strict-mcp-config
probe tools4 --strict-mcp-config --tools "Bash,Read,Edit,Write"
probe tools0 --strict-mcp-config --tools ""
probe noskill --strict-mcp-config --disallowedTools "Skill"
probe noskillwf --strict-mcp-config --disallowedTools "Skill" "Workflow"
first_in default strict tools4 tools0 noskill noskillwf조각들을 보려면 실행 트랜스크립트를 열고, 첨부 파일과 기록된 도구 설명을 나열하세요:
sid=$(jq -r 'select(.type=="result") | .session_id' default.jsonl)
t=$(ls ~/.claude/projects/*/"$sid".jsonl)
jq -r 'select(.type=="attachment" and .rendered != null)
| [.attachment.type, (.rendered | map(.content // "") | join("") | length)] | @tsv' "$t"
jq -r 'select(.type=="attachment" and .attachment.type=="prompt_snapshot" and .attachment.tools != null)
| .attachment | "system prompt: \(.systemPrompt | map(length) | add)",
(.tools[] | "\(.name)\t\(.schema.description | length)")' "$t"다른 Claude Code 세션 안에서 실행을 시작한다면, 위에서 설명한 대로 먼저 세션이 내보내는 환경 변수를 해제하세요. 결과는 여러분의 플러그인, 커넥터, 스킬에 의존하므로 우리와 일치하지 않을 것입니다. 형태는 익숙하게 보일 것입니다. 도구와 그 도구가 담고 있는 목록이 첫 번째 요청의 대부분을 차지하며, --tools가 그것들을 옮기는 플래그입니다.
Rulestack는 Claude Code용 규칙 파일, 스킬, 훅을 만들어 주며, rulestack.gumroad.com에서 판매됩니다. 이 글의 측정에는 claude, jq와 빈 디렉터리만 필요하므로, 각 Claude Code 업그레이드 후 반복하기에 저렴합니다.
빈 세션에서 분할이 다르게 나오면 아래 댓글에 여러분의 결과를 남겨 주세요. 그리고 이와 같은 더 많은 첫 요청 측정을 보려면 @ai-shop.bsky.social을 팔로우하세요.
출처
- 원문: https://dev.to/rulestack/claude-codes-disallowedtools-skill-dropped-18962-characters-of-skill-listing-and-saved-only-lga (2026-10-03 · Rulestack)