Python SDK wrapping Claude CLI - Use Skills, Hooks, Slash Commands, Agents without official SDK
Project description
Python Claude CLI SDK
Claude CLI를 subprocess로 감싸서 Python SDK처럼 사용하는 구현체
핵심 발견: SDK 없이 CLI만으로 모든 기능 사용 가능
공식 SDK가 하는 일 = CLI 호출 + JSON 파싱
┌─────────────────────────────────────────┐
│ Your Python Application │
├─────────────────────────────────────────┤
│ claude_sdk.py (이 구현체) │
│ - subprocess.Popen("claude", ...) │
│ - JSON stream 파싱 │
│ - 이벤트 핸들링 │
├─────────────────────────────────────────┤
│ Claude CLI │
│ (모든 기능이 플래그로 노출됨) │
└─────────────────────────────────────────┘
테스트 결과: 모든 기능 동작 확인
| 기능 | CLI 플래그 | 테스트 결과 |
|---|---|---|
| Skills 호출 | --setting-sources "user,project" + --allowed-tools "Skill" |
✅ 성공 |
| Hooks 로드 | --setting-sources "user,project" |
✅ 성공 |
| Agent (Task tool) | --allowed-tools "Task" |
✅ 성공 |
| Slash Command | --allowed-tools "SlashCommand" |
✅ 성공 |
| 양방향 통신 | --input-format stream-json |
✅ 성공 |
| MCP 서버 | --mcp-config config.json |
✅ 지원 |
| CLAUDE.md | --setting-sources "user,project" |
✅ 성공 |
핵심 CLI 플래그
claude -p "prompt" \
--setting-sources "user,project" \ # Skills, Hooks, CLAUDE.md, Subagents 로드
--allowed-tools "Skill,Task,SlashCommand,Read,Write,Bash" \
--output-format stream-json \ # JSON 스트림 출력
--verbose \ # stream-json에 필수
--input-format stream-json \ # 양방향 통신
--permission-mode acceptEdits \ # 권한 자동 승인
--mcp-config config.json # MCP 서버 설정
플래그 상세 설명
| 플래그 | 설명 |
|---|---|
--setting-sources "user,project" |
~/.claude/settings.json과 .claude/settings.json에서 Skills, Hooks, CLAUDE.md 로드 |
--allowed-tools |
사용 허용할 도구 목록 (쉼표 구분) |
--output-format stream-json |
각 이벤트를 JSON 라인으로 출력 |
--verbose |
stream-json 출력에 필수 |
--permission-mode acceptEdits |
파일 편집 자동 승인 |
--max-turns N |
최대 턴 수 제한 |
실제 테스트 결과
1. Skill 호출 테스트
Tool used: Skill
Skill input: {'skill': 'frontend-design:frontend-design'}
>>> SUCCESS
2. Slash Command 호출 테스트
Tool used: SlashCommand
Command: {'command': '/ralph-wiggum:help'}
>>> SUCCESS
3. Agent (Task tool) 호출 테스트
Tool used: Task
Agent type: Explore
Result: Found 4 Python files in the directory
>>> SUCCESS
Python SDK 사용법
설치
# 의존성 없음 - 표준 라이브러리만 사용
cp claude_sdk.py your_project/
기본 사용
import asyncio
from claude_sdk import ClaudeSDK, ClaudeConfig, PermissionMode
async def main():
sdk = ClaudeSDK(ClaudeConfig(
setting_sources=["user", "project"],
permission_mode=PermissionMode.ACCEPT_EDITS
))
result = await sdk.run("Hello!")
print(result["result"])
asyncio.run(main())
Skills 호출
# 특정 Skill 호출
result = await sdk.run_with_skill(
"frontend-design:frontend-design",
"Create a login form"
)
Agent 호출
# Explore 에이전트로 코드베이스 탐색
result = await sdk.run_with_agent(
"Explore",
"Find all Python files"
)
Slash Command 호출
# 슬래시 커맨드 실행
result = await sdk.run_slash_command(
"code-review:code-review"
)
동기 API
from claude_sdk import ClaudeSDKSync, ClaudeConfig
sdk = ClaudeSDKSync(ClaudeConfig())
result = sdk.run("Hello!")
SDK 구조
# ClaudeConfig - 설정 클래스
@dataclass
class ClaudeConfig:
model: Optional[str] = None
permission_mode: PermissionMode = PermissionMode.ACCEPT_EDITS
output_format: OutputFormat = OutputFormat.STREAM_JSON
setting_sources: list[str] = ["user", "project"]
allowed_tools: Optional[list[str]] = None
mcp_config: Optional[str] = None
max_turns: Optional[int] = None
system_prompt: Optional[str] = None
# ClaudeSDK - 메인 클래스
class ClaudeSDK:
async def run(prompt: str) -> dict
async def run_with_skill(skill_name: str, prompt: str) -> dict
async def run_with_agent(agent_type: str, task: str) -> dict
async def run_slash_command(command: str, args: str) -> dict
# 양방향 통신
async def start_session() -> None
async def send_message(message: str) -> None
async def read_stream() -> AsyncIterator[StreamEvent]
응답 구조
result = await sdk.run("Hello")
# result 구조
{
"events": [
{"type": "system", "session_id": "..."},
{"type": "assistant", "message": {...}},
{"type": "result", "result": "..."}
],
"result": {"type": "result", "result": "Hello!"},
"session_id": "abc123",
"stderr": None
}
이벤트 타입
| 타입 | 설명 |
|---|---|
system |
세션 정보 (session_id 포함) |
assistant |
Claude 응답 (텍스트, 도구 사용) |
tool_use |
도구 호출 |
tool_result |
도구 실행 결과 |
result |
최종 결과 |
파일 구조
claude-cli-sdk-test/
├── claude_sdk.py # SDK 메인 구현
├── test_sdk.py # 기본 테스트
├── simple_test.py # CLI 플래그 테스트
├── real_test.py # 실제 기능 호출 테스트
└── readme.md # 이 문서
결론
공식 SDK 없이 Python subprocess로 Claude CLI를 직접 호출하면:
- Skills -
--setting-sources로 로드,--allowed-tools "Skill"로 호출 ✅ - Hooks -
--setting-sources로 자동 적용 ✅ - Slash Commands -
--allowed-tools "SlashCommand"로 호출 ✅ - Agents -
--allowed-tools "Task"로 호출 ✅ - MCP 서버 -
--mcp-config로 설정 ✅ - CLAUDE.md -
--setting-sources로 자동 로드 ✅
SDK = CLI의 편의 래퍼일 뿐, 핵심 기능은 전부 CLI 플래그로 노출됨
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
claude_cli_sdk-0.1.0.tar.gz
(8.7 kB
view details)
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file claude_cli_sdk-0.1.0.tar.gz.
File metadata
- Download URL: claude_cli_sdk-0.1.0.tar.gz
- Upload date:
- Size: 8.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9437d9c17f02d6ba7b87f6dc7e2a84721d1ded2d6bd4fa7027a640cf9f5ae57d
|
|
| MD5 |
b5f464d6f89ff8df0d85afa14954c021
|
|
| BLAKE2b-256 |
9be64e41108d4c42694fa67e6d91b73fa6b2edc530c717b3a4be18c5732d368f
|
File details
Details for the file claude_cli_sdk-0.1.0-py3-none-any.whl.
File metadata
- Download URL: claude_cli_sdk-0.1.0-py3-none-any.whl
- Upload date:
- Size: 11.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b41d1a8c91f6bbf24173fecef2d43a21b70e8f402f818e4118c1ed597bd1f385
|
|
| MD5 |
6c539e8bbb4b74e8263603e9ddd5ac70
|
|
| BLAKE2b-256 |
ad6073815babda3e1e93c213e7ca5de2e064840ea973162240396738a9456a2d
|