Claude Code 를 사용하다 보면 CLAUDE.md 를 수정했을 때 AI 동작이 달라지는 것을 알 수 있는데, 실제로 Anthropic API 에 무엇을 보내는지 알아봅니다.
계기
- Claude Code 를 쓰다 보면 아래와 같은 의문이 생김
- CLAUDE.md 를 길게 쓰면 정말 비용이 늘어날까?
/commit같은 스킬을 실행하면 AI 에게 뭐가 전달되는 걸까?- 스크린샷을 찍으면 토큰을 얼마나 쓰는 걸까?
- 대화가 길어질수록 왜 느려지고 비싸지는 걸까?
- Anthropic API 스펙은 공개돼 있지만, Claude Code 가 실제로 어떻게 조립해서 보내는지는 공식 문서에 나와 있지 않음
- 직접 캡처해서 보는 것 외에 방법이 없다고 판단하여 Claude Inspector 를 만들게 됨
- MITM(Man-in-the-Middle) 프록시로 요청을 가로채어 시각화하는 앱
Claude Inspector 란?
- 동작 방식
- Claude Inspector 를 실행하면 localhost:9090 에서 HTTP 프록시가 시작됨
ANTHROPIC_BASE_URL=http://localhost:9090 claude로 Claude Code 를 실행하면, 이후 모든 API 요청이 Claude Inspector 를 통해 중계됨- 요청 내용(system, messages, tools)과 응답을 실시간으로 확인할 수 있음
- 설치
brew install --cask kangraemin/tap/claude-inspector-
또는 GitHub Releases: https://github.com/kangraemin/claude-inspector

- 좌측 패널: 캡처된 요청 목록 — 어떤 파일/도구가 연관됐는지, 요청 시점이 표시됨
- 우측 패널: 선택한 요청의 실제 전송 내용 — Request / Response / Analysis 탭으로 구성
- Request 탭을 열면
<system-reminder>태그 안에 CLAUDE.md 내용이 그대로 박혀 있는 것을 볼 수 있음
-
요청별 비용과 토큰 수를 직접 확인할 수 있음

- 우측 상단에 해당 요청의 입력/출력 토큰 수 + 비용($) 이 실시간으로 찍힘
- 직접 써보면 알겠지만 — CLAUDE.md 가 길면 아무 작업도 안 했는데 기본 입력 토큰이 이미 높게 찍혀 있음
-
Analysis 탭 에서 요청 내용을 구조화된 형태로 분석할 수 있음

- “You are Claude Sonnet, Anthropic’s official CLI for Claude.” — 이런 system 프롬프트가 어떻게 구성되는지 항목별로 볼 수 있음
- 어떤 규칙, 어떤 메모리가 이번 요청에 실제로 포함됐는지 확인 가능
직접 확인해보기
Claude Inspector 를 켜두고 Claude Code 를 써보면, 아래 것들을 직접 눈으로 확인할 수 있습니다.
1. CLAUDE.md 는 매 요청마다 전부 전송됨
- Claude Inspector 를 켜고 Claude Code 에서 아무 말이나 입력한 뒤 Request 탭 →
<system-reminder>태그를 찾으면, 본인의 CLAUDE.md 내용이 그대로 들어가 있는 것을 확인할 수 있음- 프로젝트 CLAUDE.md, 글로벌 CLAUDE.md, rules/, memory/ 파일들이 전부 합쳐져서 삽입됨
- CLAUDE.md 가 길수록 모든 요청의 입력 토큰이 올라가기 때문에 비용과 직결됨
- 1000줄짜리 CLAUDE.md 는 단 한 번만 쓰는 게 아니라 매 요청마다 전송됨
- 짧은 질문 하나를 보냈는데 페이로드가 수만 토큰인 경우도 있음 — 실제로 보면 충격적임
2. MCP 도구 는 지연 로드됨
- Tools 탭에서
tools[]배열을 확인하면 Read, Edit, Bash 등 빌트인 도구는 매번 전체 JSON 스키마가 포함되어 있는 것을 알 수 있음- MCP 도구 (context7, til-server 등) 는 처음엔
<available-deferred-tools>에 이름만 나열됨 - 실제 MCP 도구를 사용하는 순간 그 도구의 스키마가 추가되는 것을 실시간으로 확인할 수 있음
- 대화 중에
tools[]배열 크기가 늘어나는 이유가 이것
- MCP 도구 (context7, til-server 등) 는 처음엔
3. 이미지 는 Base64 로 JSON 본문에 인라인 삽입됨
- Claude Code 에서 스크린샷을 캡처한 뒤 해당 요청의 Request 탭 → messages 를 열면 엄청나게 긴 base64 문자열을 확인할 수 있음
- 우측 상단 비용 패널에서 스크린샷 찍기 전/후 입력 토큰 차이를 직접 비교해보면 됨
- 스크린샷 한 장이 생각보다 훨씬 비쌈
4. Slash Command 와 Skill 은 완전히 다른 경로로 처리됨
/clear를 입력하면 Claude Inspector 에 새 요청이 찍히지 않는 것을 확인할 수 있음 — 로컬에서 처리되기 때문/commit같은 스킬 입력 시 Messages 탭에서<command-message>래퍼로 스킬 전체 내용이 삽입된 것을 확인할 수 있음- 스킬 실행 이후 요청들을 보면 messages[] 에 스킬 내용이 계속 남아있음
- 긴 스킬일수록 그 이후 모든 요청의 입력 토큰이 올라간 것이 비용 패널에서 바로 보임
5. messages[] 는 매 요청마다 전체 재전송됨
- 대화를 10턴, 20턴 진행하면서 각 요청의 크기(입력 토큰 수)를 비교하면, 턴이 쌓일수록 선형으로 증가하는 것이 비용 패널에서 그대로 보임
- 30턴 넘어가면 단순한 한 마디 질문에도 입력 토큰이 이미 수만 개
- 대응 방법
/clear— 컨텍스트 초기화, messages[] 리셋 → 다음 요청부터 다시 낮아짐/compact— 대화를 요약으로 교체 (크기 감소)- 작업 단위로 세션 분리 권장
오픈소스: https://github.com/kangraemin/claude-inspector
"Android" 카테고리의 최근 포스팅
카테고리 모든 글 보기| [Tool] - Claude Code 가 AI 에게 보내는 프롬프트를 직접 뜯어봤다 | 2026. 03. 18 |
|---|---|
| Kotlin - 코루틴 동작 원리 ( Continuation / CPS / State Machine ) | 2025. 04. 23 |
| Kotlin - Thread vs Coroutine | 2025. 04. 22 |
| JVM - Runtime Data Area - Thread | 2025. 04. 21 |
| JVM - Runtime Data Area - Heap | 2025. 04. 21 |
| JVM - Runtime Data Area - Method | 2025. 04. 19 |
| JVM - Interned string | 2025. 04. 18 |
| Android - 직렬화 | 2025. 04. 17 |
| Hilt - ComponentScope | 2025. 04. 16 |
| Kotlin - Channel | 2025. 04. 15 |