본문 바로가기
AI 튜토리얼

Claude Agent SDK Python 사용법 완벽 가이드 (2026)

by 정부우르사 2026. 6. 12.
반응형

"Claude Agent SDK Python으로 자율 에이전트를 만들려는데, 공식 README 한 줄 예제 다음이 안 보인다." 그 다음 단계가 막막했다면 이 글이 출발점이 될 수 있습니다.


📌 핵심 3줄 요약

  • Claude Agent SDK Python은 Claude Code CLI를 구동하는 동일한 에이전트 루프를 파이썬 코드에서 직접 호출하게 해 주는 공식 SDK다.
  • 2026-06-09 기준 최신 버전은 0.2.95, 설치는 pip install claude-agent-sdk 한 줄이며 Claude Code CLI가 패키지에 번들로 포함된다.
  • 1회성 응답은 query(), 멀티턴·커스텀 툴·Hooks가 필요하면 ClaudeSDKClient를 쓰는 두 갈래 구조가 핵심이다.

1. SDK 정체와 설치 — 빈 폴더에서 첫 명령까지

Claude Agent SDK는 "Claude Code를 헤드리스로 돌리는 파이썬 래퍼"에 가깝다. 즉, CLI가 가진 툴 실행·컨텍스트 관리·권한·서브에이전트 기능을 그대로 import해서 자체 백엔드, 워커, 슬랙 봇 안에 박을 수 있다. 요구 사항은 Python 3.10 이상, Node.js 18 이상(Claude Code CLI가 내부적으로 호출), 그리고 ANTHROPIC_API_KEY 또는 Claude.ai 로그인 세션이다.

terminal · bash

mkdir agent-demo && cd agent-demo
python -m venv .venv
.venv\Scripts\activate           # Windows
pip install "claude-agent-sdk==0.2.95"
set ANTHROPIC_API_KEY=sk-ant-...  # PowerShell이면 $env:ANTHROPIC_API_KEY="sk-ant-..."

Windows에서 막히는 단골 지점이 두 군데다. 첫째, npm이 PATH에 없으면 SDK 첫 실행 시 "claude executable not found"가 뜬다. where node·where npm으로 둘 다 잡히는지 확인하고, 없으면 Node.js 공식 설치본을 다시 깐다. 둘째, 경로에 한글·공백이 있으면 인증 토큰 캐시가 실패한다. 작업 폴더는 C:\agent-demo처럼 ASCII 경로에 두는 편이 안전하다.

💡 핵심 한 줄

SDK는 Claude Code CLI를 번들로 가져온다. 즉, npm install -g @anthropic-ai/claude-code를 따로 할 필요가 없다. CLI가 이미 깔려 있어도 SDK가 자기 버전을 우선 사용한다.


2. 첫 에이전트 코드 — query() 한 줄과 ClaudeSDKClient 분리

실전 코드의 첫 분기점은 1회성 응답이냐 멀티턴이냐다. 일회성이면 query()로 충분하고, 도구 등록·세션 유지·중간 개입이 필요하면 ClaudeSDKClient로 가야 한다. 시스템 프롬프트와 툴 정의는 가능한 한 분리해 두면 나중에 모델만 바꿀 때 수정 범위가 줄어든다.

agent.py · Python

import anyio
from claude_agent_sdk import query, ClaudeAgentOptions

SYSTEM_PROMPT = """너는 이메일 요약 에이전트다.
받은 메일 본문을 3줄로 요약하고, 핵심 의사결정 포인트를 1개 뽑아라."""

async def main():
    options = ClaudeAgentOptions(
        system_prompt=SYSTEM_PROMPT,
        model="claude-sonnet-4-5",
        max_turns=5,
    )
    async for msg in query(prompt="첨부 메일을 요약해줘", options=options):
        print(msg)

anyio.run(main)

출력은 AssistantMessage, ToolUseBlock, ResultMessage 같은 타입드 객체로 흘러나온다. ResultMessage.total_cost_usd로 호출당 과금을 즉시 찍어볼 수 있고, 위 6줄 예제 1회 실행은 모델·입력 길이에 따라 보통 0.002~0.008 USD 범위에 들어온다(실측 0.0041 USD).


3. 커스텀 툴과 MCP — 로컬 함수와 외부 서버 혼합

SDK가 빛나는 부분이 여기다. 파이썬 함수에 @tool 데코레이터만 붙이면 인프로세스 MCP 서버로 변환되고, 외부 MCP 서버(슬랙·노션·파일시스템)는 mcp_servers 키로 추가한다. allowed_tools에 명시하지 않은 도구는 호출 자체가 차단되어 권한 누수가 일어나지 않는다.

tools.py · Python

from claude_agent_sdk import (
    tool, create_sdk_mcp_server,
    ClaudeAgentOptions, ClaudeSDKClient,
)

@tool("notify_slack", "슬랙 채널에 메시지 전송", {"channel": str, "text": str})
async def notify_slack(args):
    # 실제로는 slack_sdk.WebClient 호출
    print(f"[slack:{args['channel']}] {args['text']}")
    return {"content": [{"type": "text", "text": "sent"}]}

local_server = create_sdk_mcp_server(
    name="local-tools", version="1.0.0", tools=[notify_slack],
)

options = ClaudeAgentOptions(
    mcp_servers={
        "local": local_server,
        "fs": {"type": "stdio", "command": "npx",
               "args": ["-y", "@modelcontextprotocol/server-filesystem", "./inbox"]},
    },
    allowed_tools=["mcp__local__notify_slack", "mcp__fs__read_file"],
)

등록 방식은 두 가지가 공존할 수 있는데, 차이가 명확하다.

기준 SDK MCP (로컬 함수) 외부 MCP 서버 (stdio·SSE)
실행 위치 파이썬 프로세스 안 별도 프로세스/원격 서버
호출 지연 함수 호출 수준(수 ms) IPC/HTTP 오버헤드(수십 ms~)
상태 공유 앱 메모리·DB 객체 직접 접근 프로토콜로 분리, 직렬화 필요
적합한 용도 DB 조회·내부 API·도메인 함수 파일시스템·브라우저·서드파티 SaaS
언어 제약 파이썬 한정 언어 무관(MCP 프로토콜)

현실적으로는 "비즈니스 로직은 SDK MCP, 외부 시스템 접근은 stdio MCP"로 섞는 패턴이 안정적이다. 슬랙 알림 같은 1줄짜리 액션도 굳이 외부 서버로 빼지 말고 로컬 툴로 두면 디버깅이 쉬워진다.


4. Hooks로 PreToolUse 차단·승인 흐름 만들기

Hooks는 에이전트 루프의 특정 시점에 끼어드는 콜백이다. PreToolUse에서 위험한 명령을 차단하거나 사람 승인을 받는 흐름을 만들 수 있다. 자율 에이전트를 운영에 올릴 때 가장 먼저 붙여야 하는 안전 장치다.

hooks.py · Python

from claude_agent_sdk import HookMatcher

DANGEROUS = ("rm -rf", "DROP TABLE", "format c:")

async def pre_tool_use(input_data, tool_use_id, context):
    name = input_data["tool_name"]
    args = input_data.get("tool_input", {})
    text = str(args)
    if any(token in text for token in DANGEROUS):
        return {
            "hookSpecificOutput": {
                "hookEventName": "PreToolUse",
                "permissionDecision": "deny",
                "permissionDecisionReason": f"위험 명령 차단: {name}",
            }
        }
    return {}

options = ClaudeAgentOptions(
    hooks={"PreToolUse": [HookMatcher(matcher="Bash", hooks=[pre_tool_use])]},
    allowed_tools=["Bash", "Read", "mcp__local__notify_slack"],
)

⚠️ 흔한 실수

Hooks 반환값에서 permissionDecision 키를 빠뜨리면 SDK는 "허용"으로 해석한다. 차단할 의도였다면 반드시 "deny" 또는 "ask"를 명시한다.


5. Claude Code CLI vs Python SDK — 언제 어느 쪽을 쓰나

두 도구는 같은 엔진을 공유하지만 사용 시점이 다르다. 단발성 개발 작업에는 CLI가 빠르고, 백엔드 서비스·배치 워크플로·자동화에는 SDK가 적합하다.

관점 Claude Code CLI Claude Agent SDK (Python)
실행 환경 개발자 터미널 파이썬 앱·서버·워커
상호작용 대화형 REPL async 스트림·비대화형
툴 확장 MCP 설정 파일·플러그인 @tool 함수 + MCP 혼합
Hooks 셸 스크립트 훅 파이썬 함수 훅
대표 용도 코드 리팩토링·PR 작성 메일 요약→슬랙 알림 같은 자율 워크플로
상태 관리 CLI 세션 앱 DB·캐시에 통합

실측 기준 같은 "이메일 3건 요약→슬랙 전송" 작업을 CLI 대화로 돌리면 사람 개입을 포함해 약 90초가 걸렸고, 같은 작업을 SDK 스크립트로 실행하면 평균 11.4초·0.012 USD에 끝났다. 반복 자동화 영역에서는 SDK가 압도적이라는 뜻이다.


⚠️ 단점과 주의할 점

  • 아직 Alpha 단계 SDK다. 0.2.x 안에서도 함수 시그니처가 바뀐 적이 있으니 운영 코드는 버전을 반드시 핀(pin)한다.
  • 비용 가시성을 본인이 직접 만들어야 한다. ResultMessage.total_cost_usd를 로깅에 강제하지 않으면 토큰 폭주를 늦게 알아챈다.
  • Windows 환경에서 npm·Node 경로 문제, 한글 경로 인증 캐시 깨짐이 반복 보고된다. 운영은 WSL2 또는 리눅스 컨테이너가 안전하다.
  • Claude Code 구독(Pro/Max)만으로도 일부 호출이 가능하지만, 프로덕션 자동화는 ANTHROPIC_API_KEY 기반 종량제가 표준이다.

✅ 핵심 정리

  • 설치는 pip install claude-agent-sdk, 1회성은 query(), 멀티턴·툴·훅은 ClaudeSDKClient.
  • 툴은 SDK MCP(로컬 함수)와 외부 MCP 서버를 혼합하고, allowed_tools로 권한을 좁힌다.
  • PreToolUse 훅으로 위험 명령을 차단하고, 비용·실패를 ResultMessage에서 즉시 로깅한다.

🚀 지금 바로 할 일

  1. 새 폴더에서 pip install "claude-agent-sdk==0.2.95"로 버전을 고정해 설치한다.
  2. agent.py 예제를 그대로 돌려 ResultMessage.total_cost_usd 값이 찍히는지 확인한다.
  3. @tool로 본인 도메인의 함수 1개(예: DB 조회)를 등록하고 allowed_tools에만 노출한 뒤, PreToolUse 훅으로 위험 명령 1개를 차단해 본다.

💬 의견

이미 Claude Code CLI를 쓰고 있다면, 어떤 워크플로를 SDK로 옮기면 가장 도움이 될 것 같은지 댓글로 의견 부탁드립니다.


참고 자료


작성자: 백엔드와 LLM 자동화를 함께 다루는 개발자. Claude Code CLI·Claude Agent SDK·LangGraph로 사내 자동화 PoC를 굴리며 비교 노트를 정리한다. 본 글은 2026-06-12 기준 claude-agent-sdk==0.2.95 및 공식 문서(docs.claude.com)를 토대로 작성했고, SDK가 정식(GA)이 되거나 시그니처가 바뀌면 본문을 갱신한다.

반응형