Claude Code CLI를 효과적으로 실행하고 제어하기 위한 전략 문서입니다. MCP 서버 선택, 권한 관리, 출력 형식 등 다양한 실행 옵션을 조합하여 목적에 맞는 실행 환경을 구성할 수 있습니다.
claude [options] [query]| 옵션 | 설명 | 사용 시점 |
|---|---|---|
-p, --print |
헤드리스 모드 (비대화형) | 자동화, 스크립트 실행 |
--verbose |
상세 로그 출력 | 디버깅, 분석 |
--dangerously-skip-permissions |
권한 확인 건너뛰기 | 자동화, 신뢰된 환경 |
--mcp-config <path> |
MCP 설정 파일 지정 | 특정 MCP 서버만 사용 |
--strict-mcp-config |
지정된 MCP만 사용 | 서버 격리, 테스트 |
--model <name> |
모델 선택 | 작업별 최적 모델 |
--max-turns <n> |
최대 에이전트 턴 제한 | 비용 제어 |
--output-format <format> |
출력 형식 지정 | 파싱, 분석 |
claude -p "분석 쿼리"특징:
- User, Project, Local 모든 scope의 MCP 서버 로드
- 가장 많은 기능 사용 가능
- 초기화 시간이 가장 김
- 컨텍스트 사용량이 높음
사용 시점:
- 대화형 개발 작업
- 다양한 도구 필요
- MCP 기능 전체 탐색
claude --mcp-config .claude/.mcp.json --strict-mcp-config -p "쿼리"특징:
- 지정된 설정 파일의 MCP만 로드
--strict-mcp-config로 다른 scope 무시- 빠른 초기화
- 컨텍스트 효율적
사용 시점:
- 특정 작업에 필요한 MCP만 사용
- 빠른 실행 필요
- 비용 최적화
- 프로덕션 환경
설정 예시 (.claude/.mcp.json):
{
"mcpServers": {
"serena": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@serena/mcp-server"]
},
"sequential-thinking": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-sequential-thinking"]
}
}
}# 빈 MCP 설정 사용
echo '{"mcpServers":{}}' > .claude/.mcp-empty.json
claude --mcp-config .claude/.mcp-empty.json --strict-mcp-config -p "쿼리"특징:
- MCP 서버 없음
- 가장 빠른 초기화
- 기본 Claude 기능만 사용
사용 시점:
- 순수 언어 모델 기능만 필요
- 최소 컨텍스트
- 빠른 질의응답
// .claude/settings.json
{
"permissions": {
"allow": [
"Read(./src/**)",
"Write(./src/**)",
"Bash(npm run test)",
"Bash(git commit:*)"
],
"deny": [
"Read(./.env)",
"Bash(rm:*)",
"Bash(git push:*)"
]
}
}# settings.json이 자동 로드됨
claude -p "TODO 주석 수정"특징:
- 세밀한 도구/파일별 권한 제어
- 팀 공유 가능 (버전 관리)
- 안전하면서도 자동화 가능
--dangerously-skip-permissions불필요
사용 시점:
- 프로덕션 환경 (필수)
- 팀 협업 프로젝트
- CI/CD 파이프라인
- 자동화 워크플로우
장점:
- ✅ 최소 권한 원칙 적용
- ✅ 민감한 파일/명령 차단
- ✅ 감사 추적 가능
- ✅ 팀 정책 공유
상세 문서: Permissions Configuration
claude "파일 수정해줘"특징:
- 모든 작업에 사용자 확인 요청
- 안전하지만 느림
- 수동 개입 필요
사용 시점:
- 탐색 및 학습
- 중요한 파일 작업
- 검토가 필요한 변경
claude --permission-mode plan -p "분석해줘"특징:
- 읽기 전용
- 코드 변경 불가
- 안전한 분석
사용 시점:
- 코드 탐색
- 아키텍처 분석
- 영향도 분석
- 학습
claude --permission-mode acceptAll -p "자동화 작업"특징:
- 모든 작업 자동 승인
- 빠르지만 위험함
- 세밀한 제어 불가
사용 시점:
- 격리된 테스트 환경
- 신뢰된 스크립트
- 임시 자동화
대안: settings.json으로 세밀하게 제어 (권장)
claude --dangerously-skip-permissions -p "작업"특징:
- 권한 시스템 완전 우회
- 가장 빠름
- 보안 위험
문제점:
- ❌ 민감한 파일 보호 불가
- ❌ 위험한 명령 차단 불가
- ❌ 팀 정책 적용 불가
- ❌ 감사 추적 불가
대안: settings.json으로 필요한 권한만 allow (권장)
claude -p "쿼리" --output-format stream-json출력 형식 (JSONL):
{"type":"system","subtype":"init","session_id":"...","model":"..."}
{"type":"message","subtype":"assistant","message":{"role":"assistant","content":[{"type":"text","text":"응답"}]}}
{"type":"tool_use","tool":"Read","parameters":{"file_path":"..."}}
{"type":"tool_result","tool":"Read","result":"..."}
{"type":"result","result":{"status":"success","duration_ms":1234}}특징:
- 각 이벤트가 완전한 JSON 객체
- 줄바꿈으로 구분
- 실시간 파싱 가능
- 도구 호출 추적
사용 시점:
- 실시간 모니터링
- 이벤트 추적
- 도구 사용 분석
- UI 업데이트
파싱 방법:
import { StreamParser, UserEvent } from './lib/StreamParser'
const parser = new StreamParser()
process.stdin.on('data', (chunk: Buffer) => {
const events = parser.processChunk(chunk.toString())
events.forEach(event => {
switch(event.type) {
case 'system':
console.log('Session:', event.session_id)
break
case 'message':
console.log('Assistant:', event.message.content)
break
case 'tool_use':
console.log('Tool:', event.tool, event.parameters)
break
case 'result':
console.log('Status:', event.result.status)
break
}
})
})claude -p "쿼리" # 기본특징:
- 읽기 쉬운 형식
- Markdown 렌더링
- 사람이 읽기 위한 출력
사용 시점:
- 대화형 사용
- 리포트 생성
- 문서화
claude -p "쿼리" --output-format json특징:
- 최종 결과만 JSON
- 전체 응답 구조화
- 후처리 용이
사용 시점:
- API 통합
- 배치 처리
- 결과 저장
claude \
--permission-mode plan \
--mcp-config .claude/.mcp-analysis.json \
--strict-mcp-config \
-p "코드베이스 아키텍처 분석"최적화 포인트:
- Plan 모드로 안전성 확보
- 분석용 MCP만 로드 (serena 등)
- 빠른 실행
// .claude/settings.json
{
"permissions": {
"allow": [
"Read(./src/**)",
"Write(./src/**)",
"Edit(./src/**)",
"Bash(npm run test)",
"Bash(git add:*)",
"Bash(git commit:*)"
],
"deny": [
"Read(./.env)",
"Bash(rm:*)",
"Bash(git push:*)"
]
}
}claude \
--mcp-config .claude/.mcp-dev.json \
--strict-mcp-config \
--output-format stream-json \
--verbose \
-p "모든 TODO 주석에 이슈 번호 추가"최적화 포인트:
- settings.json으로 필요한 권한만 허용 (안전)
- 개발용 MCP만 로드
- Stream JSON으로 진행상황 추적
- 상세 로그로 디버깅
// .claude/settings.json
{
"permissions": {
"allow": [
"Read(**/*)",
"Write(./src/**)",
"Write(./tests/**)",
"Edit(./src/**)",
"Edit(./tests/**)",
"Bash(npm run build)",
"Bash(npm run test:*)",
"Bash(git add:*)",
"Bash(git commit:*)"
],
"deny": [
"Bash(npm publish:*)",
"Bash(git push origin main:*)",
"WebFetch",
"Read(./.env.production)"
]
}
}claude \
--mcp-config .claude/.mcp-ci.json \
--strict-mcp-config \
--max-turns 5 \
--output-format json \
-p "테스트 실패 원인 분석하고 수정"최적화 포인트:
- settings.json으로 CI 작업만 허용 (프로덕션 보호)
- CI 전용 MCP 설정
- max-turns로 비용 제어
- JSON 출력으로 결과 파싱
claude \
--model sonnet \
--mcp-config .claude/.mcp-full.json \
--strict-mcp-config최적화 포인트:
- 대화형 모드
- 필요한 모든 MCP 로드
- 수동 권한 확인
// .claude/settings.json
{
"permissions": {
"allow": [
"Read(**/*)",
"Bash(git:*)"
]
}
}time claude \
--mcp-config .claude/.mcp-empty.json \
--strict-mcp-config \
-p "/context" \
> /dev/null최적화 포인트:
- 빈 MCP로 순수 성능 측정
- settings.json으로 필요한 권한만 허용 (오버헤드 최소)
- 출력 무시로 I/O 최소화
{
"mcpServers": {
"serena": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@serena/mcp-server"]
},
"sequential-thinking": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-sequential-thinking"]
}
}
}용도: 코드 분석, 아키텍처 탐색, Plan 모드
{
"mcpServers": {
"serena": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@serena/mcp-server"]
},
"context7": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@context7/mcp-server"]
},
"magic": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@magic/mcp-server"]
}
}
}용도: 일반 개발, 코드 작성, UI 생성
{
"mcpServers": {
"serena": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@serena/mcp-server"]
}
}
}용도: 자동화된 테스트 수정, CI 파이프라인
{
"mcpServers": {
"serena": {...},
"context7": {...},
"magic": {...},
"sequential-thinking": {...},
"playwright": {...}
}
}용도: 대화형 개발, 모든 기능 필요
{
"mcpServers": {}
}용도: 순수 LLM 기능, 성능 테스트
# ❌ 나쁜 예: 불필요한 MCP 로드
claude -p "간단한 질문" # 모든 MCP 로드
# ✅ 좋은 예: 필요한 MCP만
claude --mcp-config .claude/.mcp-minimal.json --strict-mcp-config -p "간단한 질문"# 탐색 단계: 읽기만
claude --permission-mode plan -p "코드 구조 파악"
# 실행 단계: 수정
claude --resume # 이전 컨텍스트 이어서# ❌ 나쁜 예: 한 번에 모든 작업
claude -p "전체 시스템 리팩토링"
# ✅ 좋은 예: 단계별 실행
claude -p "1단계: 모델 리팩토링" --max-turns 3
claude -p "2단계: 컨트롤러 리팩토링" --max-turns 3
claude -p "3단계: 테스트 수정" --max-turns 3# ❌ 나쁜 예: 디렉토리 전체
claude -p "@src/ 모든 파일 분석"
# ✅ 좋은 예: 필요한 파일만
claude -p "@src/models/User.ts @src/api/users.ts 일관성 확인"claude --verbose -p "쿼리" 2>&1 | tee claude-debug.logtime claude \
--mcp-config .claude/.mcp-test.json \
--strict-mcp-config \
-p "테스트 쿼리"claude \
--output-format stream-json \
--verbose \
-p "쿼리" | \
jq -r 'select(.type=="tool_use") | .tool'claude \
--verbose \
-p "쿼리" 2>&1 | \
grep -i "token"- 프로덕션: 절대
--dangerously-skip-permissions사용 금지 - 개발:
acceptAll신중히 사용 - CI/CD: 격리된 환경에서만 자동 승인
- 탐색: Plan 모드 기본 사용
{
"mcpServers": {
"database": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@bytebase/dbhub", "--dsn", "${DATABASE_URL}"]
// ✅ 환경 변수 사용
// ❌ 하드코딩 금지: "--dsn", "postgresql://user:pass@host/db"
}
}
}# .gitignore
.mcp.local.json
.claude/settings.local.json
*.log# 1. 순수 LLM (MCP 없음)
time claude --mcp-config .claude/.mcp-empty.json --strict-mcp-config \
--dangerously-skip-permissions -p "/context" > /dev/null
# 예상: 2-3초
# 2. 최소 MCP (serena만)
time claude --mcp-config .claude/.mcp-minimal.json --strict-mcp-config \
--dangerously-skip-permissions -p "/context" > /dev/null
# 예상: 3-5초
# 3. 전체 MCP
time claude --dangerously-skip-permissions -p "/context" > /dev/null
# 예상: 5-10초- 작업 목적에 맞는 MCP 설정 선택
- 권한 모드 적절히 설정
- 출력 형식 결정
- 필요시 verbose 로깅 활성화
- max-turns로 비용 제어 (비대화형)
- 불필요한 MCP 서버 제거
-
--strict-mcp-config사용 - Plan 모드로 탐색 먼저
- 작업 단위 적절히 분할
- 파일 참조 최소화
- 민감 정보 환경 변수 처리
- .gitignore 설정 확인
- 프로덕션 환경 권한 검증
- MCP 서버 신뢰성 확인