์์ด์ ํธ ๋ฃจํ์ ์๋ ์๋ฆฌ
๋ฉ์์ง ์๋ช ์ฃผ๊ธฐ, ๋๊ตฌ ์คํ, ์ปจํ ์คํธ ์๋์ฐ, ๊ทธ๋ฆฌ๊ณ SDK ์์ด์ ํธ๋ฅผ ๊ตฌ๋ํ๋ ์ํคํ ์ฒ๋ฅผ ์ดํดํฉ๋๋ค.
Agent SDK๋ฅผ ์ฌ์ฉํ๋ฉด Claude Code์ ์์จ ์์ด์ ํธ ๋ฃจํ๋ฅผ ์์ ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ฒ ๋ํ ์ ์์ต๋๋ค. SDK๋ ๋๊ตฌ, ๊ถํ, ๋น์ฉ ์ ํ, ์ถ๋ ฅ์ ๋ํ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ ์ ์ด๋ฅผ ์ ๊ณตํ๋ ๋ ๋ฆฝํ ํจํค์ง์ ๋๋ค. ์ด๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด Claude Code CLI๋ฅผ ์ค์นํ ํ์๊ฐ ์์ต๋๋ค.
์์ด์ ํธ๋ฅผ ์์ํ๋ฉด SDK๋ Claude Code๋ฅผ ๊ตฌ๋ํ๋ ๋์ผํ ์คํ ๋ฃจํ๋ฅผ ์คํํฉ๋๋ค: Claude๊ฐ ํ๋กฌํํธ๋ฅผ ํ๊ฐํ๊ณ , ๋๊ตฌ๋ฅผ ํธ์ถํ์ฌ ์กฐ์น๋ฅผ ์ทจํ๊ณ , ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๊ณ , ์์ ์ด ์๋ฃ๋ ๋๊น์ง ๋ฐ๋ณตํฉ๋๋ค. ์ด ํ์ด์ง์์๋ ํด๋น ๋ฃจํ ๋ด์์ ๋ฌด์์ด ์ผ์ด๋๋์ง ์ค๋ช ํ๋ฏ๋ก ์์ด์ ํธ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๊ตฌ์ถ, ๋๋ฒ๊ทธ ๋ฐ ์ต์ ํํ ์ ์์ต๋๋ค.
๋ฃจํ ํ๋์ ๋ณด๊ธฐ
๋ชจ๋ ์์ด์ ํธ ์ธ์ ์ ๋์ผํ ์ฃผ๊ธฐ๋ฅผ ๋ฐ๋ฆ ๋๋ค:
- ํ๋กฌํํธ ์์ . Claude๊ฐ ํ๋กฌํํธ, ์์คํ
ํ๋กฌํํธ, ๋๊ตฌ ์ ์, ๋ํ ๊ธฐ๋ก๊ณผ ํจ๊ป ํ๋กฌํํธ๋ฅผ ๋ฐ์ต๋๋ค. SDK๋ ์ธ์
๋ฉํ๋ฐ์ดํฐ๋ฅผ ํฌํจํ๋ ์๋ธํ์
"init"์ด ์๋SystemMessage๋ฅผ ์์ฑํฉ๋๋ค. - ํ๊ฐ ๋ฐ ์๋ต. Claude๊ฐ ํ์ฌ ์ํ๋ฅผ ํ๊ฐํ๊ณ ์งํ ๋ฐฉ๋ฒ์ ๊ฒฐ์ ํฉ๋๋ค. ํ
์คํธ๋ก ์๋ตํ๊ฑฐ๋, ํ๋ ์ด์์ ๋๊ตฌ ํธ์ถ์ ์์ฒญํ๊ฑฐ๋, ๋ ๋ค ํ ์ ์์ต๋๋ค. SDK๋ ํ
์คํธ์ ๋๊ตฌ ํธ์ถ ์์ฒญ์ ํฌํจํ๋
AssistantMessage๋ฅผ ์์ฑํฉ๋๋ค. - ๋๊ตฌ ์คํ. SDK๊ฐ ์์ฒญ๋ ๊ฐ ๋๊ตฌ๋ฅผ ์คํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ์์งํฉ๋๋ค. ๊ฐ ๋๊ตฌ ๊ฒฐ๊ณผ ์ธํธ๊ฐ ๋ค์ ๊ฒฐ์ ์ ์ํด Claude์๊ฒ ๋ค์ ํผ๋๋ฐฑ๋ฉ๋๋ค. hooks๋ฅผ ์ฌ์ฉํ์ฌ ๋๊ตฌ ํธ์ถ์ ์คํ ์ ์ ๊ฐ๋ก์ฑ๊ณ , ์์ ํ๊ฑฐ๋, ์ฐจ๋จํ ์ ์์ต๋๋ค.
- ๋ฐ๋ณต. 2๋จ๊ณ์ 3๋จ๊ณ๊ฐ ์ฃผ๊ธฐ๋ก ๋ฐ๋ณต๋ฉ๋๋ค. ๊ฐ ์ ์ฒด ์ฃผ๊ธฐ๋ ํ ํด์ ๋๋ค. Claude๋ ๋๊ตฌ ํธ์ถ์ด ์๋ ์๋ต์ ์์ฑํ ๋๊น์ง ๋๊ตฌ๋ฅผ ๊ณ์ ํธ์ถํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
- ๊ฒฐ๊ณผ ๋ฐํ. SDK๋ ํ
์คํธ ์๋ต(๋๊ตฌ ํธ์ถ ์์)์ด ์๋ ์ต์ข
AssistantMessage๋ฅผ ์์ฑํ ํ, ์ต์ข ํ ์คํธ, ํ ํฐ ์ฌ์ฉ๋, ๋น์ฉ, ์ธ์ ID๊ฐ ์๋ResultMessage๋ฅผ ์์ฑํฉ๋๋ค.
๊ฐ๋จํ ์ง๋ฌธ("์ฌ๊ธฐ ์ด๋ค ํ์ผ์ด ์๋์?")์ Glob์ ํธ์ถํ๊ณ ๊ฒฐ๊ณผ๋ก ์๋ตํ๋ ํ๋ ํด์ด ๊ฑธ๋ฆด ์ ์์ต๋๋ค. ๋ณต์กํ ์์
("auth ๋ชจ๋์ ๋ฆฌํฉํ ๋งํ๊ณ ํ
์คํธ๋ฅผ ์
๋ฐ์ดํธํ์ธ์")์ ๋ง์ ํด์ ๊ฑธ์ณ ์์ญ ๊ฐ์ ๋๊ตฌ ํธ์ถ์ ์ฐ๊ฒฐํ ์ ์์ผ๋ฉฐ, ํ์ผ์ ์ฝ๊ณ , ์ฝ๋๋ฅผ ํธ์งํ๊ณ , ํ
์คํธ๋ฅผ ์คํํ๋ฉฐ, Claude๊ฐ ๊ฐ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ์ ๊ทผ ๋ฐฉ์์ ์กฐ์ ํฉ๋๋ค.
ํด๊ณผ ๋ฉ์์ง
ํด์ ๋ฃจํ ๋ด์ ํ ์๋ณต์ ๋๋ค: Claude๊ฐ ๋๊ตฌ ํธ์ถ์ ํฌํจํ๋ ์ถ๋ ฅ์ ์์ฑํ๊ณ , SDK๊ฐ ํด๋น ๋๊ตฌ๋ฅผ ์คํํ๊ณ , ๊ฒฐ๊ณผ๊ฐ ์๋์ผ๋ก Claude์๊ฒ ๋ค์ ํผ๋๋ฐฑ๋ฉ๋๋ค. ์ด๋ ์ฝ๋์ ์ ์ด๋ฅผ ๋ฐํํ์ง ์๊ณ ๋ฐ์ํฉ๋๋ค. Claude๊ฐ ๋๊ตฌ ํธ์ถ์ด ์๋ ์ถ๋ ฅ์ ์์ฑํ ๋๊น์ง ํด์ด ๊ณ์๋๋ฉฐ, ์ด ์์ ์์ ๋ฃจํ๊ฐ ๋๋๊ณ ์ต์ข ๊ฒฐ๊ณผ๊ฐ ์ ๋ฌ๋ฉ๋๋ค.
ํ๋กฌํํธ "auth.ts์ ์คํจํ ํ ์คํธ ์์ "์ ๋ํ ์ ์ฒด ์ธ์ ์ด ์ด๋ป๊ฒ ๋ณด์ผ ์ ์๋์ง ์๊ฐํด ๋ด ์๋ค.
๋จผ์ SDK๊ฐ ํ๋กฌํํธ๋ฅผ Claude์๊ฒ ๋ณด๋ด๊ณ ์ธ์
๋ฉํ๋ฐ์ดํฐ๊ฐ ์๋ SystemMessage๋ฅผ ์์ฑํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ฃจํ๊ฐ ์์๋ฉ๋๋ค:
- ํด 1: Claude๊ฐ
Bash๋ฅผ ํธ์ถํ์ฌnpm test๋ฅผ ์คํํฉ๋๋ค. SDK๋ ๋๊ตฌ ํธ์ถ์ด ์๋AssistantMessage๋ฅผ ์์ฑํ๊ณ , ๋ช ๋ น์ ์คํํ ํ, ์ถ๋ ฅ(3๊ฐ ์คํจ)์ด ์๋UserMessage๋ฅผ ์์ฑํฉ๋๋ค. - ํด 2: Claude๊ฐ
auth.ts์auth.test.ts์์Read๋ฅผ ํธ์ถํฉ๋๋ค. SDK๊ฐ ํ์ผ ๋ด์ฉ์ ๋ฐํํ๊ณAssistantMessage๋ฅผ ์์ฑํฉ๋๋ค. - ํด 3: Claude๊ฐ
Edit๋ฅผ ํธ์ถํ์ฌauth.ts๋ฅผ ์์ ํ ํ,Bash๋ฅผ ํธ์ถํ์ฌnpm test๋ฅผ ๋ค์ ์คํํฉ๋๋ค. 3๊ฐ ํ ์คํธ ๋ชจ๋ ํต๊ณผํฉ๋๋ค. SDK๋AssistantMessage๋ฅผ ์์ฑํฉ๋๋ค. - ์ต์ข
ํด: Claude๊ฐ ๋๊ตฌ ํธ์ถ์ด ์๋ ํ
์คํธ ์ ์ฉ ์๋ต์ ์์ฑํฉ๋๋ค: "auth ๋ฒ๊ทธ๋ฅผ ์์ ํ๊ณ , 3๊ฐ ํ
์คํธ ๋ชจ๋ ํต๊ณผํฉ๋๋ค." SDK๋ ์ด ํ
์คํธ๊ฐ ์๋ ์ต์ข
AssistantMessage๋ฅผ ์์ฑํ ํ, ๋น์ฉ ๋ฐ ์ฌ์ฉ๋์ด ์๋ResultMessage๋ฅผ ์์ฑํฉ๋๋ค.
์ด๋ 4ํด์ด์์ต๋๋ค: ๋๊ตฌ ํธ์ถ์ด ์๋ 3ํด, ์ต์ข ํ ์คํธ ์ ์ฉ ์๋ต 1ํด.
max_turns / maxTurns๋ก ๋ฃจํ๋ฅผ ์ ํํ ์ ์์ผ๋ฉฐ, ์ด๋ ๋๊ตฌ ์ฌ์ฉ ํด๋ง ๊ณ์ฐํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์์ ๋ฃจํ์์ max_turns=2๋ ํธ์ง ๋จ๊ณ ์ ์ ์ค์งํ์ ๊ฒ์
๋๋ค. max_budget_usd / maxBudgetUsd๋ฅผ ์ฌ์ฉํ์ฌ ์ง์ถ ์๊ณ๊ฐ์ ๋ฐ๋ผ ํด์ ์ ํํ ์๋ ์์ต๋๋ค.
์ ํ์ด ์์ผ๋ฉด Claude๊ฐ ์์ฒด์ ์ผ๋ก ์๋ฃ๋ ๋๊น์ง ๋ฃจํ๊ฐ ์คํ๋๋ฉฐ, ์ด๋ ์ ์ ์๋ ์์ ์๋ ๊ด์ฐฎ์ง๋ง ๊ฐ๋ฐฉํ ํ๋กฌํํธ("์ด ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๊ฐ์ ํ์ธ์")์์๋ ์ค๋ ์คํ๋ ์ ์์ต๋๋ค. ์์ฐ์ ์ค์ ํ๋ ๊ฒ์ ํ๋ก๋์ ์์ด์ ํธ์ ์ข์ ๊ธฐ๋ณธ๊ฐ์ ๋๋ค. ์ต์ ์ฐธ์กฐ๋ ์๋์ ํด๊ณผ ์์ฐ์ ์ฐธ์กฐํ์ธ์.
๋ฉ์์ง ํ์
๋ฃจํ๊ฐ ์คํ๋๋ฉด SDK๋ ๋ฉ์์ง ์คํธ๋ฆผ์ ์์ฑํฉ๋๋ค. ๊ฐ ๋ฉ์์ง๋ ๋ฃจํ์ ์ด๋ ๋จ๊ณ์์ ์๋์ง ์๋ ค์ฃผ๋ ํ์ ์ ์ ๋ฌํฉ๋๋ค. 5๊ฐ์ง ํต์ฌ ํ์ ์:
SystemMessage: ์ธ์ ์๋ช ์ฃผ๊ธฐ ์ด๋ฒคํธ.subtypeํ๋๊ฐ ์ด๋ฅผ ๊ตฌ๋ถํฉ๋๋ค:"init"์ ์ฒซ ๋ฒ์งธ ๋ฉ์์ง(์ธ์ ๋ฉํ๋ฐ์ดํฐ)์ด๊ณ ,"compact_boundary"๋ ์์ถ ํ์ ๋ฐ์ํฉ๋๋ค. TypeScript์์ ์์ถ ๊ฒฝ๊ณ๋SDKSystemMessage์ ์๋ธํ์ ์ด ์๋๋ผ ์์ฒดSDKCompactBoundaryMessageํ์ ์ ๋๋ค.AssistantMessage: ์ต์ข ํ ์คํธ ์ ์ฉ ์๋ต์ ํฌํจํ์ฌ ๊ฐ Claude ์๋ต ํ์ ์์ฑ๋ฉ๋๋ค. ํด๋น ํด์ ํ ์คํธ ์ฝํ ์ธ ๋ธ๋ก๊ณผ ๋๊ตฌ ํธ์ถ ๋ธ๋ก์ ํฌํจํฉ๋๋ค.UserMessage: ๊ฐ ๋๊ตฌ ์คํ ํ Claude์๊ฒ ๋ค์ ์ ์ก๋๋ ๋๊ตฌ ๊ฒฐ๊ณผ ์ฝํ ์ธ ์ ํจ๊ป ์์ฑ๋ฉ๋๋ค. ๋ฃจํ ์ค๊ฐ์ ์คํธ๋ฆฌ๋ฐํ๋ ๋ชจ๋ ์ฌ์ฉ์ ์ ๋ ฅ์ ๋ํด์๋ ์์ฑ๋ฉ๋๋ค.StreamEvent: ๋ถ๋ถ ๋ฉ์์ง๊ฐ ํ์ฑํ๋ ๊ฒฝ์ฐ์๋ง ์์ฑ๋ฉ๋๋ค. ์๋ณธ API ์คํธ๋ฆฌ๋ฐ ์ด๋ฒคํธ(ํ ์คํธ ๋ธํ, ๋๊ตฌ ์ ๋ ฅ ์ฒญํฌ)๋ฅผ ํฌํจํฉ๋๋ค. ์คํธ๋ฆผ ์๋ต์ ์ฐธ์กฐํ์ธ์.ResultMessage: ์์ด์ ํธ ๋ฃจํ์ ๋์ ํ์ํฉ๋๋ค. ์ต์ข ํ ์คํธ ๊ฒฐ๊ณผ, ํ ํฐ ์ฌ์ฉ๋, ๋น์ฉ, ์ธ์ ID๋ฅผ ํฌํจํฉ๋๋ค.subtypeํ๋๋ฅผ ํ์ธํ์ฌ ์์ ์ด ์ฑ๊ณตํ๋์ง ๋๋ ์ ํ์ ๋๋ฌํ๋์ง ํ์ธํฉ๋๋ค.prompt_suggestion๊ณผ ๊ฐ์ ์์์ ํํ ์์คํ ์ด๋ฒคํธ๊ฐ ์ดํ์ ๋์ฐฉํ ์ ์์ผ๋ฏ๋ก ๊ฒฐ๊ณผ์์ ์ค๋จํ์ง ๋ง๊ณ ์คํธ๋ฆผ์ ์๋ฃ๊น์ง ๋ฐ๋ณตํฉ๋๋ค. ๊ฒฐ๊ณผ ์ฒ๋ฆฌ๋ฅผ ์ฐธ์กฐํ์ธ์.
์ด 5๊ฐ์ง ํ์ ์ ๋ SDK ๋ชจ๋์์ ์ ์ฒด ์์ด์ ํธ ๋ฃจํ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๋ค๋ฃน๋๋ค. TypeScript SDK๋ ๋ํ ์ถ๊ฐ ๊ด์ฐฐ์ฑ ์ด๋ฒคํธ(hook ์ด๋ฒคํธ, ๋๊ตฌ ์งํ, ์๋ ์ ํ, ์์ ์๋ฆผ)๋ฅผ ์์ฑํ์ฌ ์ถ๊ฐ ์ธ๋ถ ์ ๋ณด๋ฅผ ์ ๊ณตํ์ง๋ง ๋ฃจํ๋ฅผ ๊ตฌ๋ํ๋ ๋ฐ ํ์ํ์ง ์์ต๋๋ค. Python ๋ฉ์์ง ํ์ ์ฐธ์กฐ์ TypeScript ๋ฉ์์ง ํ์ ์ฐธ์กฐ์์ ์ ์ฒด ๋ชฉ๋ก์ ์ฐธ์กฐํ์ธ์.
๋ฉ์์ง ์ฒ๋ฆฌ
์ฒ๋ฆฌํ๋ ๋ฉ์์ง๋ ๊ตฌ์ถํ๋ ๊ฒ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค:
- ์ต์ข
๊ฒฐ๊ณผ๋ง:
ResultMessage๋ฅผ ์ฒ๋ฆฌํ์ฌ ์ถ๋ ฅ, ๋น์ฉ, ์์ ์ด ์ฑ๊ณตํ๋์ง ๋๋ ์ ํ์ ๋๋ฌํ๋์ง ํ์ธํฉ๋๋ค. - ์งํ ์ํฉ ์
๋ฐ์ดํธ:
AssistantMessage๋ฅผ ์ฒ๋ฆฌํ์ฌ Claude๊ฐ ๊ฐ ํด์์ ๋ฌด์์ ํ๊ณ ์๋์ง, ์ด๋ค ๋๊ตฌ๋ฅผ ํธ์ถํ๋์ง ํ์ธํฉ๋๋ค. - ๋ผ์ด๋ธ ์คํธ๋ฆฌ๋ฐ: ๋ถ๋ถ ๋ฉ์์ง๋ฅผ ํ์ฑํํ์ฌ(
include_partial_messagesPython,includePartialMessagesTypeScript) ์ค์๊ฐ์ผ๋กStreamEvent๋ฉ์์ง๋ฅผ ๋ฐ์ต๋๋ค. ์ค์๊ฐ ์คํธ๋ฆผ ์๋ต์ ์ฐธ์กฐํ์ธ์.
๋ฉ์์ง ํ์ ์ ํ์ธํ๋ ๋ฐฉ๋ฒ์ SDK์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค:
- Python:
claude_agent_sdk์์ ๊ฐ์ ธ์จ ํด๋์ค์ ๋ํดisinstance()๋ก ๋ฉ์์ง ํ์ ์ ํ์ธํฉ๋๋ค(์:isinstance(message, ResultMessage)). - TypeScript:
type๋ฌธ์์ด ํ๋๋ฅผ ํ์ธํฉ๋๋ค(์:message.type === "result").AssistantMessage์UserMessage๋ ์๋ณธ API ๋ฉ์์ง๋ฅผ.messageํ๋์ ๋ํํ๋ฏ๋ก ์ฝํ ์ธ ๋ธ๋ก์message.content๊ฐ ์๋๋ผmessage.message.content์ ์์ต๋๋ค.
์์ : ๋ฉ์์ง ํ์ ํ์ธ ๋ฐ ๊ฒฐ๊ณผ ์ฒ๋ฆฌ
from claude_agent_sdk import query, AssistantMessage, ResultMessage
async for message in query(prompt="Summarize this project"):
if isinstance(message, AssistantMessage):
print(f"Turn completed: {len(message.content)} content blocks")
if isinstance(message, ResultMessage):
if message.subtype == "success":
print(message.result)
else:
print(f"Stopped: {message.subtype}")
import { query } from "@anthropic-ai/claude-agent-sdk";
for await (const message of query({ prompt: "Summarize this project" })) {
if (message.type === "assistant") {
console.log(`Turn completed: ${message.message.content.length} content blocks`);
}
if (message.type === "result") {
if (message.subtype === "success") {
console.log(message.result);
} else {
console.log(`Stopped: ${message.subtype}`);
}
}
}
๋๊ตฌ ์คํ
๋๊ตฌ๋ ์์ด์ ํธ์๊ฒ ์กฐ์น๋ฅผ ์ทจํ ์ ์๋ ๋ฅ๋ ฅ์ ์ ๊ณตํฉ๋๋ค. ๋๊ตฌ๊ฐ ์์ผ๋ฉด Claude๋ ํ ์คํธ๋ก๋ง ์๋ตํ ์ ์์ต๋๋ค. ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ฉด Claude๋ ํ์ผ์ ์ฝ๊ณ , ๋ช ๋ น์ ์คํํ๊ณ , ์ฝ๋๋ฅผ ๊ฒ์ํ๊ณ , ์ธ๋ถ ์๋น์ค์ ์ํธ์์ฉํ ์ ์์ต๋๋ค.
๋ด์ฅ ๋๊ตฌ
SDK๋ Claude Code๋ฅผ ๊ตฌ๋ํ๋ ๋์ผํ ๋๊ตฌ๋ฅผ ํฌํจํฉ๋๋ค:
| ์นดํ ๊ณ ๋ฆฌ | ๋๊ตฌ | ๊ธฐ๋ฅ |
|---|---|---|
| ํ์ผ ์์ | Read, Edit, Write |
ํ์ผ ์ฝ๊ธฐ, ์์ , ์์ฑ |
| ๊ฒ์ | Glob, Grep |
ํจํด์ผ๋ก ํ์ผ ์ฐพ๊ธฐ, ์ ๊ท์์ผ๋ก ์ฝํ ์ธ ๊ฒ์ |
| ์คํ | Bash |
์ ธ ๋ช ๋ น, ์คํฌ๋ฆฝํธ, git ์์ ์คํ |
| ์น | WebSearch, WebFetch |
์น ๊ฒ์, ํ์ด์ง ๊ฐ์ ธ์ค๊ธฐ ๋ฐ ํ์ฑ |
| ๊ฒ์ | ToolSearch |
๋ชจ๋ ๋๊ตฌ๋ฅผ ๋ฏธ๋ฆฌ ๋ก๋ํ๋ ๋์ ํ์์ ๋ฐ๋ผ ๋๊ตฌ๋ฅผ ๋์ ์ผ๋ก ์ฐพ๊ณ ๋ก๋ |
| ์ค์ผ์คํธ๋ ์ด์ | Agent, Skill, AskUserQuestion, TaskCreate, TaskUpdate |
์๋ธ์์ด์ ํธ ์์ฑ, ์คํฌ ํธ์ถ, ์ฌ์ฉ์์๊ฒ ์ง๋ฌธ, ์์ ์ถ์ |
๋ด์ฅ ๋๊ตฌ ์ธ์๋ ๋ค์์ ์ํํ ์ ์์ต๋๋ค:
- MCP ์๋ฒ๋ก ์ธ๋ถ ์๋น์ค ์ฐ๊ฒฐ(๋ฐ์ดํฐ๋ฒ ์ด์ค, ๋ธ๋ผ์ฐ์ , API)
- ์ฌ์ฉ์ ์ ์ ๋๊ตฌ ํธ๋ค๋ฌ๋ก ์ฌ์ฉ์ ์ ์ ๋๊ตฌ ์ ์
- ์ค์ ์์ค๋ฅผ ํตํด ํ๋ก์ ํธ ์คํฌ ๋ก๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ํฌํ๋ก์ฐ
๋๊ตฌ ๊ถํ
Claude๋ ์์ ์ ๋ฐ๋ผ ํธ์ถํ ๋๊ตฌ๋ฅผ ๊ฒฐ์ ํ์ง๋ง, ํด๋น ํธ์ถ์ด ์คํ๋๋๋ก ํ์ฉํ ์ง ์ฌ๋ถ๋ฅผ ์ ์ดํฉ๋๋ค. ํน์ ๋๊ตฌ๋ฅผ ์๋ ์น์ธํ๊ฑฐ๋, ๋ค๋ฅธ ๋๊ตฌ๋ฅผ ์์ ํ ์ฐจ๋จํ๊ฑฐ๋, ๋ชจ๋ ๊ฒ์ ๋ํด ์น์ธ์ ์๊ตฌํ ์ ์์ต๋๋ค. 3๊ฐ์ง ์ต์ ์ด ํจ๊ป ์๋ํ์ฌ ์คํ๋๋ ๊ฒ์ ๊ฒฐ์ ํฉ๋๋ค:
allowed_tools/allowedTools๋์ด๋ ๋๊ตฌ๋ฅผ ์๋ ์น์ธํฉ๋๋ค.["Read", "Glob", "Grep"]์ด ํ์ฉ๋ ๋๊ตฌ ๋ชฉ๋ก์ ์๋ ์ฝ๊ธฐ ์ ์ฉ ์์ด์ ํธ๋ ํ๋กฌํํธ ์์ด ํด๋น ๋๊ตฌ๋ฅผ ์คํํฉ๋๋ค. ๋์ด๋์ง ์์ ๋๊ตฌ๋ ์ฌ์ ํ ์ฌ์ฉ ๊ฐ๋ฅํ์ง๋ง ๊ถํ์ด ํ์ํฉ๋๋ค.disallowed_tools/disallowedTools๋ค๋ฅธ ์ค์ ์ ๊ด๊ณ์์ด ๋์ด๋ ๋๊ตฌ๋ฅผ ์ฐจ๋จํฉ๋๋ค. ๋๊ตฌ๊ฐ ์คํ๋๊ธฐ ์ ์ ๊ท์น์ด ํ์ธ๋๋ ์์๋ ๊ถํ์ ์ฐธ์กฐํ์ธ์.permission_mode/permissionModeํ์ฉ ๋๋ ๊ฑฐ๋ถ ๊ท์น์ผ๋ก ๋ค๋ฃจ์ง ์๋ ๋๊ตฌ์ ์ด๋ค ์ผ์ด ๋ฐ์ํ๋์ง ์ ์ดํฉ๋๋ค. ์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋๋ ๊ถํ ๋ชจ๋๋ฅผ ์ฐธ์กฐํ์ธ์.
"Bash(npm *)" ๊ฐ์ ๊ท์น์ผ๋ก ๊ฐ๋ณ ๋๊ตฌ์ ๋ฒ์๋ฅผ ์ง์ ํ ์๋ ์์ต๋๋ค. ์ ์ฒด ๊ท์น ๊ตฌ๋ฌธ์ ๊ถํ์ ์ฐธ์กฐํ์ธ์.
๋๊ตฌ๊ฐ ๊ฑฐ๋ถ๋๋ฉด Claude๋ ๋๊ตฌ ๊ฒฐ๊ณผ๋ก ๊ฑฐ๋ถ ๋ฉ์์ง๋ฅผ ๋ฐ๊ณ ์ผ๋ฐ์ ์ผ๋ก ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ ์๋ํ๊ฑฐ๋ ์งํํ ์ ์๋ค๊ณ ๋ณด๊ณ ํฉ๋๋ค.
๋ณ๋ ฌ ๋๊ตฌ ์คํ
Claude๊ฐ ๋จ์ผ ํด์์ ์ฌ๋ฌ ๋๊ตฌ ํธ์ถ์ ์์ฒญํ๋ฉด ๋ SDK ๋ชจ๋ ๋๊ตฌ์ ๋ฐ๋ผ ๋์ ๋๋ ์์ฐจ์ ์ผ๋ก ์คํํ ์ ์์ต๋๋ค. ์ฝ๊ธฐ ์ ์ฉ ๋๊ตฌ(Read, Glob, Grep, ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ํ์๋ MCP ๋๊ตฌ)๋ ๋์์ ์คํํ ์ ์์ต๋๋ค. ์ํ๋ฅผ ์์ ํ๋ ๋๊ตฌ(Edit, Write, Bash)๋ ์ถฉ๋์ ํผํ๊ธฐ ์ํด ์์ฐจ์ ์ผ๋ก ์คํ๋ฉ๋๋ค.
์ฌ์ฉ์ ์ ์ ๋๊ตฌ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์์ฐจ ์คํ๋ฉ๋๋ค. ์ฌ์ฉ์ ์ ์ ๋๊ตฌ์ ๋ํด ๋ณ๋ ฌ ์คํ์ ํ์ฑํํ๋ ค๋ฉด ์ฃผ์์์ readOnlyHint๋ฅผ ์ค์ ํฉ๋๋ค. TypeScript์ Python SDK ๋ชจ๋ MCP SDK์ ์ด ํ๋ ์ด๋ฆ์ ์ฌ์ฉํฉ๋๋ค.
๋ฃจํ ์คํ ๋ฐฉ์ ์ ์ด
๋ฃจํ๊ฐ ์ทจํ๋ ํด ์, ๋น์ฉ, Claude๊ฐ ์ถ๋ก ํ๋ ๊น์ด, ๋๊ตฌ๊ฐ ์คํ ์ ์ ์น์ธ์ ์๊ตฌํ๋์ง ์ฌ๋ถ๋ฅผ ์ ํํ ์ ์์ต๋๋ค. ์ด ๋ชจ๋ ๊ฒ์ ClaudeAgentOptions(Python) / Options(TypeScript)์ ํ๋์
๋๋ค.
ํด๊ณผ ์์ฐ
| ์ต์ | ์ ์ด ๋์ | ๊ธฐ๋ณธ๊ฐ |
|---|---|---|
์ต๋ ํด(max_turns / maxTurns) |
์ต๋ ๋๊ตฌ ์ฌ์ฉ ์๋ณต | ์ ํ ์์ |
์ต๋ ์์ฐ(max_budget_usd / maxBudgetUsd) |
์ค์ง ์ ์ต๋ ๋น์ฉ | ์ ํ ์์ |
์ ํ ์ค ํ๋์ ๋๋ฌํ๋ฉด SDK๋ ํด๋น ์ค๋ฅ ์๋ธํ์
(error_max_turns ๋๋ error_max_budget_usd)์ด ์๋ ResultMessage๋ฅผ ๋ฐํํฉ๋๋ค. ์ด๋ฌํ ์๋ธํ์
์ ํ์ธํ๋ ๋ฐฉ๋ฒ์ ๊ฒฐ๊ณผ ์ฒ๋ฆฌ๋ฅผ ์ฐธ์กฐํ๊ณ , ๊ตฌ๋ฌธ์ ClaudeAgentOptions / Options๋ฅผ ์ฐธ์กฐํ์ธ์.
๋ ธ๋ ฅ ์์ค
effort ์ต์
์ Claude๊ฐ ์ ์ฉํ๋ ์ถ๋ก ์ ์์ ์ ์ดํฉ๋๋ค. ๋ฎ์ ๋
ธ๋ ฅ ์์ค์ ํด๋น ๋ ์ ์ ํ ํฐ์ ์ฌ์ฉํ๊ณ ๋น์ฉ์ ์ค์
๋๋ค. ๋ชจ๋ ๋ชจ๋ธ์ด ๋
ธ๋ ฅ ๋งค๊ฐ๋ณ์๋ฅผ ์ง์ํ๋ ๊ฒ์ ์๋๋๋ค. ์ด๋ค ๋ชจ๋ธ์ด ์ง์ํ๋์ง๋ ๋
ธ๋ ฅ์ ์ฐธ์กฐํ์ธ์.
| ์์ค | ๋์ | ์ ํฉํ ๊ฒฝ์ฐ |
|---|---|---|
"low" |
์ต์ ์ถ๋ก , ๋น ๋ฅธ ์๋ต | ํ์ผ ์กฐํ, ๋๋ ํ ๋ฆฌ ๋์ด |
"medium" |
๊ท ํ ์กํ ์ถ๋ก | ์ผ์์ ์ธ ํธ์ง, ํ์ค ์์ |
"high" |
์ฒ ์ ํ ๋ถ์ | ๋ฆฌํฉํ ๋ง, ๋๋ฒ๊น |
"xhigh" |
ํ์ฅ๋ ์ถ๋ก ๊น์ด | ์ฝ๋ฉ ๋ฐ ์์ด์ ํธ ์์ ; Opus 4.7์์ ๊ถ์ฅ |
"max" |
์ต๋ ์ถ๋ก ๊น์ด | ๊น์ ๋ถ์์ด ํ์ํ ๋ค๋จ๊ณ ๋ฌธ์ |
effort๋ฅผ ์ค์ ํ์ง ์์ผ๋ฉด Python SDK๋ ๋งค๊ฐ๋ณ์๋ฅผ ์ค์ ํ์ง ์์ ์ํ๋ก ๋๊ณ ๋ชจ๋ธ์ ๊ธฐ๋ณธ ๋์์ผ๋ก ๋ฏธ๋ฃน๋๋ค. TypeScript SDK๋ ๊ธฐ๋ณธ๊ฐ์ผ๋ก "high"๋ฅผ ์ฌ์ฉํฉ๋๋ค.
effort๋ ๊ฐ ์๋ต ๋ด์์ ์ถ๋ก ๊น์ด์ ๋ํ ์ง์ฐ ์๊ฐ๊ณผ ํ ํฐ ๋น์ฉ์ ๊ตํํฉ๋๋ค. ํ์ฅ ์ฌ๊ณ ๋ ์ถ๋ ฅ์์ ๋ณด์ด๋ ์ฌ๊ณ ์ ์ฐ์ ๋ธ๋ก์ ์์ฑํ๋ ๋ณ๋์ ๊ธฐ๋ฅ์
๋๋ค. ์ด๋ค์ ๋
๋ฆฝ์ ์
๋๋ค: effort: "low"๋ฅผ ํ์ฅ ์ฌ๊ณ ํ์ฑํ๋ก ์ค์ ํ๊ฑฐ๋, effort: "max"๋ฅผ ๋นํ์ฑํ๋ก ์ค์ ํ ์ ์์ต๋๋ค.
๊ฐ๋จํ๊ณ ์ ์ ์๋ ์์
(ํ์ผ ๋์ด ๋๋ ๋จ์ผ grep ์คํ)์ ์ํํ๋ ์์ด์ ํธ์ ๊ฒฝ์ฐ ๋น์ฉ๊ณผ ์ง์ฐ ์๊ฐ์ ์ค์ด๊ธฐ ์ํด ๋ฎ์ ๋
ธ๋ ฅ์ ์ฌ์ฉํฉ๋๋ค. ์ ์ฒด ์ธ์
์ ๋ํด ์ต์์ query() ์ต์
์์ effort๋ฅผ ์ค์ ํ๊ฑฐ๋, AgentDefinition์ effort ํ๋๋ก ์๋ธ์์ด์ ํธ๋น ์ค์ ํ์ฌ ์ธ์
์์ค์ ์ฌ์ ์ํฉ๋๋ค.
๊ถํ ๋ชจ๋
๊ถํ ๋ชจ๋ ์ต์
(Python์ permission_mode, TypeScript์ permissionMode)์ ์์ด์ ํธ๊ฐ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ ์น์ธ์ ์์ฒญํ๋์ง ์ฌ๋ถ๋ฅผ ์ ์ดํฉ๋๋ค:
| ๋ชจ๋ | ๋์ |
|---|---|
"default" |
ํ์ฉ ๊ท์น์ผ๋ก ๋ค๋ฃจ์ง ์๋ ๋๊ตฌ๋ ์น์ธ ์ฝ๋ฐฑ์ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค; ์ฝ๋ฐฑ์ด ์์ผ๋ฉด ๊ฑฐ๋ถ |
"acceptEdits" |
ํ์ผ ํธ์ง ๋ฐ ์ผ๋ฐ์ ์ธ ํ์ผ์์คํ
๋ช
๋ น(mkdir, touch, mv, cp ๋ฑ)์ ์๋ ์น์ธํฉ๋๋ค; ๋ค๋ฅธ Bash ๋ช
๋ น์ ๊ธฐ๋ณธ ๊ท์น์ ๋ฐ๋ฆ
๋๋ค |
"plan" |
์ฝ๊ธฐ ์ ์ฉ ๋๊ตฌ ์คํ; Claude๋ ์์ค ํ์ผ์ ํธ์งํ์ง ์๊ณ ํ์ํ๊ณ ๊ณํ์ ์์ฑํฉ๋๋ค |
"dontAsk" |
์ ๋ ํ๋กฌํํธํ์ง ์์ต๋๋ค. ๊ถํ ๊ท์น์ผ๋ก ์ฌ์ ์น์ธ๋ ๋๊ตฌ๊ฐ ์คํ๋๊ณ , ๋๋จธ์ง๋ ๊ฑฐ๋ถ๋ฉ๋๋ค |
"auto"(TypeScript๋ง) |
๋ชจ๋ธ ๋ถ๋ฅ๊ธฐ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ๋๊ตฌ ํธ์ถ์ ์น์ธํ๊ฑฐ๋ ๊ฑฐ๋ถํฉ๋๋ค. ๊ฐ์ฉ์ฑ ๋ฐ ๋์์ ์๋ ๋ชจ๋๋ฅผ ์ฐธ์กฐํ์ธ์ |
"bypassPermissions" |
์์ฒญํ์ง ์๊ณ ๋ชจ๋ ํ์ฉ๋ ๋๊ตฌ๋ฅผ ์คํํฉ๋๋ค. Unix์์ ๋ฃจํธ๋ก ์คํํ ๋๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์์ด์ ํธ์ ์กฐ์น๊ฐ ๊ด์ฌ ์๋ ์์คํ ์ ์ํฅ์ ๋ฏธ์น ์ ์๋ ๊ฒฉ๋ฆฌ๋ ํ๊ฒฝ์์๋ง ์ฌ์ฉํฉ๋๋ค |
๋ํํ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฒฝ์ฐ "default"๋ฅผ ๋๊ตฌ ์น์ธ ์ฝ๋ฐฑ๊ณผ ํจ๊ป ์ฌ์ฉํ์ฌ ์น์ธ ํ๋กฌํํธ๋ฅผ ํ์ํฉ๋๋ค. ๊ฐ๋ฐ ๋จธ์ ์ ์์จ ์์ด์ ํธ์ ๊ฒฝ์ฐ "acceptEdits"๋ ํ์ผ ํธ์ง ๋ฐ ์ผ๋ฐ์ ์ธ ํ์ผ์์คํ
๋ช
๋ น(mkdir, touch, mv, cp ๋ฑ)์ ์๋ ์น์ธํ๋ฉด์ ๋ค๋ฅธ Bash ๋ช
๋ น์ ํ์ฉ ๊ท์น ๋ค์ ์ ์งํฉ๋๋ค. CI, ์ปจํ
์ด๋ ๋๋ ๊ธฐํ ๊ฒฉ๋ฆฌ๋ ํ๊ฒฝ์ ๋ํด "bypassPermissions"๋ฅผ ์์ฝํฉ๋๋ค. ์ ์ฒด ์ธ๋ถ ์ ๋ณด๋ ๊ถํ์ ์ฐธ์กฐํ์ธ์.
๋ชจ๋ธ
model์ ์ค์ ํ์ง ์์ผ๋ฉด SDK๋ Claude Code์ ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ฉํ๋ฉฐ, ์ด๋ ์ธ์ฆ ๋ฐฉ๋ฒ ๋ฐ ๊ตฌ๋
์ ๋ฐ๋ผ ๋ค๋ฆ
๋๋ค. ํน์ ๋ชจ๋ธ์ ๊ณ ์ ํ๊ฑฐ๋ ๋ ๋น ๋ฅด๊ณ ์ ๋ ดํ ์์ด์ ํธ๋ฅผ ์ํด ๋ ์์ ๋ชจ๋ธ์ ์ฌ์ฉํ๋ ค๋ฉด ๋ช
์์ ์ผ๋ก ์ค์ ํฉ๋๋ค(์: model="claude-sonnet-4-6"). ์ฌ์ฉ ๊ฐ๋ฅํ ID๋ ๋ชจ๋ธ์ ์ฐธ์กฐํ์ธ์.
์ปจํ ์คํธ ์๋์ฐ
์ปจํ ์คํธ ์๋์ฐ๋ ์ธ์ ์ค์ Claude๊ฐ ์ฌ์ฉํ ์ ์๋ ์ด ์ ๋ณด๋์ ๋๋ค. ์ธ์ ๋ด์ ํด ์ฌ์ด์ ์ฌ์ค์ ๋์ง ์์ต๋๋ค. ๋ชจ๋ ๊ฒ์ด ๋์ ๋ฉ๋๋ค: ์์คํ ํ๋กฌํํธ, ๋๊ตฌ ์ ์, ๋ํ ๊ธฐ๋ก, ๋๊ตฌ ์ ๋ ฅ, ๋๊ตฌ ์ถ๋ ฅ. ํด ์ ์ฒด์์ ๋์ผํ๊ฒ ์ ์ง๋๋ ์ฝํ ์ธ (์์คํ ํ๋กฌํํธ, ๋๊ตฌ ์ ์, CLAUDE.md)๋ ์๋์ผ๋ก ํ๋กฌํํธ ์บ์๋ฉ๋๋ค. ์ด๋ ๋ฐ๋ณต๋ ์ ๋์ฌ์ ๋ํ ๋น์ฉ๊ณผ ์ง์ฐ ์๊ฐ์ ์ค์ ๋๋ค.
์ปจํ ์คํธ๋ฅผ ์๋นํ๋ ๊ฒ
SDK์์ ๊ฐ ๊ตฌ์ฑ ์์๊ฐ ์ปจํ ์คํธ์ ์ด๋ป๊ฒ ์ํฅ์ ๋ฏธ์น๋์ง๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
| ์์ค | ๋ก๋ ์๊ธฐ | ์ํฅ |
|---|---|---|
| ์์คํ ํ๋กฌํํธ | ๋ชจ๋ ์์ฒญ | ์์ ๊ณ ์ ๋น์ฉ, ํญ์ ์กด์ฌ |
| CLAUDE.md ํ์ผ | ์ธ์
์์, settingSources๋ฅผ ํตํด |
๋ชจ๋ ์์ฒญ์์ ์ ์ฒด ์ฝํ ์ธ (ํ๋กฌํํธ ์บ์๋๋ฏ๋ก ์ฒซ ๋ฒ์งธ ์์ฒญ๋ง ์ ์ฒด ๋น์ฉ ์ง๋ถ) |
| ๋๊ตฌ ์ ์ | ๋ชจ๋ ์์ฒญ; MCP ์คํค๋ง๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์ฐ๋จ | ๊ธฐ๋ณธ ์ ๊ณต ๋๊ตฌ ์คํค๋ง๋ ๋ชจ๋ ์์ฒญ์์ ๋ก๋๋ฉ๋๋ค. ๋๊ตฌ ๊ฒ์์ ๊ธฐ๋ณธ์ ์ผ๋ก MCP ๋๊ตฌ ์คํค๋ง๋ฅผ ์ง์ฐ์ํค๋ฉฐ, Vertex AI ๋๋ ๋น์์ฌ ANTHROPIC_BASE_URL์์ ์ฌ์ ๋ก๋๋ก ํด๋ฐฑํฉ๋๋ค. ์ ์ฒด ๋งคํธ๋ฆญ์ค๋ ๋๊ตฌ ๊ฒ์ ๊ตฌ์ฑ์ ์ฐธ์กฐํ์ธ์ |
| ๋ํ ๊ธฐ๋ก | ํด์ ๊ฑธ์ณ ๋์ | ๊ฐ ํด์ผ๋ก ์ฆ๊ฐ: ํ๋กฌํํธ, ์๋ต, ๋๊ตฌ ์ ๋ ฅ, ๋๊ตฌ ์ถ๋ ฅ |
| ์คํฌ ์ค๋ช | ์ธ์ ์์, ์ค์ ์์ค๋ฅผ ํตํด | ์งง์ ์์ฝ; ์ ์ฒด ์ฝํ ์ธ ๋ ํธ์ถ๋ ๋๋ง ๋ก๋ |
ํฐ ๋๊ตฌ ์ถ๋ ฅ์ ์๋นํ ์ปจํ ์คํธ๋ฅผ ์๋นํฉ๋๋ค. ํฐ ํ์ผ์ ์ฝ๊ฑฐ๋ ์์ธํ ์ถ๋ ฅ์ด ์๋ ๋ช ๋ น์ ์คํํ๋ฉด ๋จ์ผ ํด์์ ์์ฒ ๊ฐ์ ํ ํฐ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ปจํ ์คํธ๋ ํด์ ๊ฑธ์ณ ๋์ ๋๋ฏ๋ก ๋ง์ ๋๊ตฌ ํธ์ถ์ด ์๋ ๋ ๊ธด ์ธ์ ์ ์งง์ ์ธ์ ๋ณด๋ค ํจ์ฌ ๋ ๋ง์ ์ปจํ ์คํธ๋ฅผ ๊ตฌ์ถํฉ๋๋ค.
์๋ ์์ถ
์ปจํ
์คํธ ์๋์ฐ๊ฐ ์ ํ์ ๊ฐ๊น์์ง๋ฉด SDK๋ ์๋์ผ๋ก ๋ํ๋ฅผ ์์ถํฉ๋๋ค: ๋ ์ค๋๋ ๊ธฐ๋ก์ ์์ฝํ์ฌ ๊ณต๊ฐ์ ํ๋ณดํ๊ณ , ๊ฐ์ฅ ์ต๊ทผ์ ๊ตํ๊ณผ ์ฃผ์ ๊ฒฐ์ ์ ์ ์งํฉ๋๋ค. SDK๋ ์ด๊ฒ์ด ๋ฐ์ํ ๋ ์คํธ๋ฆผ์์ type: "system"๊ณผ subtype: "compact_boundary"๊ฐ ์๋ ๋ฉ์์ง๋ฅผ ์์ฑํฉ๋๋ค(Python์์๋ SystemMessage; TypeScript์์๋ ๋ณ๋์ SDKCompactBoundaryMessage ํ์
).
์์ถ์ ๋ ์ค๋๋ ๋ฉ์์ง๋ฅผ ์์ฝ์ผ๋ก ๋ฐ๊พธ๋ฏ๋ก ๋ํ ์ด๊ธฐ์ ํน์ ์ง์นจ์ด ๋ณด์กด๋์ง ์์ ์ ์์ต๋๋ค. ์ง์์ ์ธ ๊ท์น์ ์ด๊ธฐ ํ๋กฌํํธ๊ฐ ์๋๋ผ CLAUDE.md์ ์ํฉ๋๋ค(settingSources๋ฅผ ํตํด ๋ก๋๋จ). CLAUDE.md ์ฝํ
์ธ ๋ ๋ชจ๋ ์์ฒญ์์ ๋ค์ ์ฃผ์
๋๊ธฐ ๋๋ฌธ์
๋๋ค.
์์ถ ๋์์ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์ฌ์ฉ์ ์ ์ํ ์ ์์ต๋๋ค:
- CLAUDE.md์ ์์ฝ ์ง์นจ: ์์ถ๊ธฐ๋ ๋ค๋ฅธ ์ปจํ ์คํธ์ฒ๋ผ CLAUDE.md๋ฅผ ์ฝ์ผ๋ฏ๋ก ์์ฝํ ๋ ๋ณด์กดํ ๋ด์ฉ์ ์๋ ค์ฃผ๋ ์น์ ์ ํฌํจํ ์ ์์ต๋๋ค. ์น์ ํค๋๋ ์์ ํ์์ ๋๋ค(๋งค์ง ๋ฌธ์์ด์ด ์๋); ์์ถ๊ธฐ๋ ์๋์ ์ผ์นํฉ๋๋ค.
PreCompacthook: ์์ถ ์ ์ ์ฌ์ฉ์ ์ ์ ๋ก์ง์ ์คํํฉ๋๋ค(์: ์ ์ฒด ๊ธฐ๋ก์ ๋ณด๊ด). hook์triggerํ๋(manual๋๋auto)๋ฅผ ๋ฐ์ต๋๋ค. hooks๋ฅผ ์ฐธ์กฐํ์ธ์.- ์๋ ์์ถ:
/compact๋ฅผ ํ๋กฌํํธ ๋ฌธ์์ด๋ก ๋ณด๋ด ํ์์ ๋ฐ๋ผ ์์ถ์ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค. ์ด ๋ฐฉ์์ผ๋ก ์ ์ก๋ ๋ช ๋ น์ SDK ์ ๋ ฅ์ด๋ฉฐ, CLI ์ ์ฉ ๋ฐ๋ก ๊ฐ๊ธฐ๊ฐ ์๋๋๋ค. SDK์ ์ฌ๋์ ๋ช ๋ น์ ์ฐธ์กฐํ์ธ์.
์์ : CLAUDE.md์ ์์ฝ ์ง์นจ
ํ๋ก์ ํธ์ CLAUDE.md์ ์น์ ์ ์ถ๊ฐํ์ฌ ์์ถ๊ธฐ์ ๋ณด์กดํ ๋ด์ฉ์ ์๋ฆฝ๋๋ค. ํค๋ ์ด๋ฆ์ ํน๋ณํ์ง ์์ต๋๋ค; ๋ช ํํ ๋ ์ด๋ธ์ ์ฌ์ฉํฉ๋๋ค.
# ์์ฝ ์ง์นจ
์ด ๋ํ๋ฅผ ์์ฝํ ๋ ํญ์ ๋ณด์กดํฉ๋๋ค:
- ํ์ฌ ์์
๋ชฉํ ๋ฐ ์์ฉ ๊ธฐ์ค
- ์ฝ๊ฑฐ๋ ์์ ํ ํ์ผ ๊ฒฝ๋ก
- ํ
์คํธ ๊ฒฐ๊ณผ ๋ฐ ์ค๋ฅ ๋ฉ์์ง
- ๊ฒฐ์ ๋ฐ ๊ทธ ๋ค์ ์ถ๋ก
์ปจํ ์คํธ ํจ์จ์ฑ ์ ์ง
์ฅ๊ธฐ ์คํ ์์ด์ ํธ๋ฅผ ์ํ ๋ช ๊ฐ์ง ์ ๋ต:
- ์๋ธ์์ ์ ์๋ธ์์ด์ ํธ ์ฌ์ฉ. ๊ฐ ์๋ธ์์ด์ ํธ๋ ์๋ก์ด ๋ํ๋ก ์์ํฉ๋๋ค(์ด์ ๋ฉ์์ง ๊ธฐ๋ก ์์, ์์ ์ ์์คํ ํ๋กฌํํธ ๋ฐ CLAUDE.md ๊ฐ์ ํ๋ก์ ํธ ์์ค ์ปจํ ์คํธ๋ ๋ก๋ํจ). ๋ถ๋ชจ์ ํด์ ๋ณด์ง ์์ผ๋ฉฐ, ์ต์ข ์๋ต๋ง ๋๊ตฌ ๊ฒฐ๊ณผ๋ก ๋ถ๋ชจ์๊ฒ ๋ฐํ๋ฉ๋๋ค. ์ฃผ ์์ด์ ํธ์ ์ปจํ ์คํธ๋ ์ ์ฒด ์๋ธ์์ ๊ธฐ๋ก์ด ์๋๋ผ ํด๋น ์์ฝ์ผ๋ก ์ฆ๊ฐํฉ๋๋ค. ์๋ธ์์ด์ ํธ๊ฐ ์์ํ๋ ๊ฒ์ ์ฐธ์กฐํ์ธ์.
- ๋๊ตฌ๋ฅผ ์ ํ์ ์ผ๋ก ์ฌ์ฉํฉ๋๋ค. ๋ชจ๋ ๋๊ตฌ ์ ์๋ ์ปจํ
์คํธ ๊ณต๊ฐ์ ์ฐจ์งํฉ๋๋ค.
AgentDefinition์toolsํ๋๋ฅผ ์ฌ์ฉํ์ฌ ์๋ธ์์ด์ ํธ๋ฅผ ํ์ํ ์ต์ ์ธํธ๋ก ๋ฒ์๋ฅผ ์ง์ ํฉ๋๋ค. - MCP ์๋ฒ ๋น์ฉ์ ์ฃผ์ํฉ๋๋ค. MCP ๋๊ตฌ ๊ฒ์์ ๊ธฐ๋ณธ์ ์ผ๋ก MCP ๋๊ตฌ ์คํค๋ง๋ฅผ ์ง์ฐ์ํค๊ณ ํ์์ ๋ฐ๋ผ ๋ก๋ํฉ๋๋ค. ๋๊ตฌ ๊ฒ์์ด ๊บผ์ ธ ์๊ฑฐ๋, Vertex AI์ ์๊ฑฐ๋, ๋น์์ฌ
ANTHROPIC_BASE_URL๋ค์ ์์ผ๋ฉด ๊ฐ MCP ์๋ฒ๋ ๋ชจ๋ ๋๊ตฌ ์คํค๋ง๋ฅผ ๋ชจ๋ ์์ฒญ์ ์ถ๊ฐํ๋ฏ๋ก ๋ง์ ๋๊ตฌ๊ฐ ์๋ ๋ช ๊ฐ์ ์๋ฒ๋ ์์ด์ ํธ๊ฐ ์์ ์ ์ํํ๊ธฐ ์ ์ ์๋นํ ์ปจํ ์คํธ๋ฅผ ์๋นํ ์ ์์ต๋๋ค. - ์ผ์์ ์ธ ์์
์ ๋ฎ์ ๋
ธ๋ ฅ์ ์ฌ์ฉํฉ๋๋ค. ํ์ผ์ ์ฝ๊ฑฐ๋ ๋๋ ํ ๋ฆฌ๋ฅผ ๋์ดํ๊ธฐ๋ง ํ๋ฉด ๋๋ ์์ด์ ํธ์ ๊ฒฝ์ฐ ๋
ธ๋ ฅ์
"low"๋ก ์ค์ ํฉ๋๋ค. ์ด๋ ํ ํฐ ์ฌ์ฉ๋๊ณผ ๋น์ฉ์ ์ค์ ๋๋ค.
๊ธฐ๋ฅ๋ณ ์ปจํ ์คํธ ๋น์ฉ์ ์์ธํ ๋ถ์์ ์ปจํ ์คํธ ๋น์ฉ ์ดํด๋ฅผ ์ฐธ์กฐํ์ธ์.
์ธ์ ๋ฐ ์ฐ์์ฑ
SDK์์ ๊ฐ ์ํธ์์ฉ์ ์ธ์
์ ์์ฑํ๊ฑฐ๋ ๊ณ์ํฉ๋๋ค. ResultMessage.session_id์์ ์ธ์
ID๋ฅผ ์บก์ฒํฉ๋๋ค(๋ SDK ๋ชจ๋์์ ์ฌ์ฉ ๊ฐ๋ฅ). TypeScript SDK๋ ๋ํ init SystemMessage์ ์ง์ ํ๋๋ก ๋
ธ์ถํฉ๋๋ค; Python์์๋ SystemMessage.data์ ์ค์ฒฉ๋ฉ๋๋ค.
์ฌ๊ฐํ ๋ ์ด์ ํด์ ์ ์ฒด ์ปจํ ์คํธ๊ฐ ๋ณต์๋ฉ๋๋ค: ์ฝ์ ํ์ผ, ์ํ๋ ๋ถ์, ์ทจํ ์กฐ์น. ์๋ณธ์ ์์ ํ์ง ์๊ณ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ผ๋ก ๋ถ๊ธฐํ๊ธฐ ์ํด ์ธ์ ์ ํฌํฌํ ์๋ ์์ต๋๋ค.
์ฌ๊ฐ, ๊ณ์, ํฌํฌ ํจํด์ ์ ์ฒด ๊ฐ์ด๋๋ ์ธ์ ๊ด๋ฆฌ๋ฅผ ์ฐธ์กฐํ์ธ์.
Python์์ ClaudeSDKClient๋ ์ฌ๋ฌ ํธ์ถ์ ๊ฑธ์ณ ์ธ์
ID๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค. ์ธ๋ถ ์ ๋ณด๋ Python SDK ์ฐธ์กฐ๋ฅผ ์ฐธ์กฐํ์ธ์.
๊ฒฐ๊ณผ ์ฒ๋ฆฌ
๋ฃจํ๊ฐ ๋๋๋ฉด ResultMessage๋ ๋ฌด์์ด ์ผ์ด๋ฌ๋์ง ์๋ ค์ฃผ๊ณ ์ถ๋ ฅ์ ์ ๊ณตํฉ๋๋ค. subtype ํ๋(๋ SDK ๋ชจ๋์์ ์ฌ์ฉ ๊ฐ๋ฅ)๋ ์ข
๋ฃ ์ํ๋ฅผ ํ์ธํ๋ ์ฃผ์ ๋ฐฉ๋ฒ์
๋๋ค.
| ๊ฒฐ๊ณผ ์๋ธํ์ | ๋ฌด์์ด ์ผ์ด๋ฌ๋๊ฐ | result ํ๋ ์ฌ์ฉ ๊ฐ๋ฅ? |
|---|---|---|
success |
Claude๊ฐ ์ ์์ ์ผ๋ก ์์ ์ ์๋ฃํ์ต๋๋ค | ์ |
error_max_turns |
์๋ฃ ์ ์ maxTurns ์ ํ์ ๋๋ฌํ์ต๋๋ค |
์๋์ค |
error_max_budget_usd |
์๋ฃ ์ ์ maxBudgetUsd ์ ํ์ ๋๋ฌํ์ต๋๋ค |
์๋์ค |
error_during_execution |
์ค๋ฅ๊ฐ ๋ฃจํ๋ฅผ ์ค๋จํ์ต๋๋ค(์: API ์คํจ ๋๋ ์ทจ์๋ ์์ฒญ) | ์๋์ค |
error_max_structured_output_retries |
๊ตฌ์กฐํ๋ ์ถ๋ ฅ ๊ฒ์ฆ์ด ๊ตฌ์ฑ๋ ์ฌ์๋ ์ ํ ํ ์คํจํ์ต๋๋ค | ์๋์ค |
result ํ๋(์ต์ข
ํ
์คํธ ์ถ๋ ฅ)๋ success ๋ณํ์๋ง ์กด์ฌํ๋ฏ๋ก ํญ์ ์ฝ๊ธฐ ์ ์ ์๋ธํ์
์ ํ์ธํฉ๋๋ค. ๋ชจ๋ ๊ฒฐ๊ณผ ์๋ธํ์
์ total_cost_usd, usage, num_turns, session_id๋ฅผ ์ ๋ฌํ๋ฏ๋ก ๋น์ฉ์ ์ถ์ ํ๊ณ ์ค๋ฅ ํ์๋ ์ฌ๊ฐํ ์ ์์ต๋๋ค. Python์์ total_cost_usd์ usage๋ ์ ํ์ ์ผ๋ก ์
๋ ฅ๋๋ฉฐ ์ผ๋ถ ์ค๋ฅ ๊ฒฝ๋ก์์ None์ผ ์ ์์ผ๋ฏ๋ก ํ์์ ์ง์ ํ๊ธฐ ์ ์ ๋ณดํธํฉ๋๋ค. usage ํ๋ ํด์์ ๋ํ ์ธ๋ถ ์ ๋ณด๋ ๋น์ฉ ๋ฐ ์ฌ์ฉ๋ ์ถ์ ์ ์ฐธ์กฐํ์ธ์.
๊ฒฐ๊ณผ๋ ๋ํ ๋ชจ๋ธ์ด ์ต์ข
ํด์์ ์์ฑ์ ์ค์งํ ์ด์ ๋ฅผ ๋ํ๋ด๋ stop_reason ํ๋(TypeScript์์ string | null, Python์์ str | None)๋ฅผ ํฌํจํฉ๋๋ค. ์ผ๋ฐ์ ์ธ ๊ฐ์ end_turn(๋ชจ๋ธ์ด ์ ์์ ์ผ๋ก ์๋ฃ๋จ), max_tokens(์ถ๋ ฅ ํ ํฐ ์ ํ์ ๋๋ฌํจ), refusal(๋ชจ๋ธ์ด ์์ฒญ์ ๊ฑฐ๋ถํจ)์
๋๋ค. ์ค๋ฅ ๊ฒฐ๊ณผ ์๋ธํ์
์์ stop_reason์ ๋ฃจํ๊ฐ ๋๋๊ธฐ ์ ์ ๋ง์ง๋ง ์ด์์คํดํธ ์๋ต์ ๊ฐ์ ์ ๋ฌํฉ๋๋ค. ๊ฑฐ๋ถ๋ฅผ ๊ฐ์งํ๋ ค๋ฉด stop_reason === "refusal"(TypeScript) ๋๋ stop_reason == "refusal"(Python)์ ํ์ธํฉ๋๋ค. ์ ์ฒด ํ์
์ SDKResultMessage(TypeScript) ๋๋ ResultMessage(Python)์ ์ฐธ์กฐํ์ธ์.
Hooks
Hooks๋ ๋ฃจํ์ ํน์ ์ง์ ์์ ๋ฐ์ํ๋ ์ฝ๋ฐฑ์ ๋๋ค: ๋๊ตฌ๊ฐ ์คํ๋๊ธฐ ์ , ๋ฐํ๋ ํ, ์์ด์ ํธ๊ฐ ์๋ฃ๋ ๋ ๋ฑ. ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ์ผ๋ถ hooks๋:
| Hook | ๋ฐ์ ์๊ธฐ | ์ผ๋ฐ์ ์ธ ์ฌ์ฉ |
|---|---|---|
PreToolUse |
๋๊ตฌ๊ฐ ์คํ๋๊ธฐ ์ | ์ ๋ ฅ ๊ฒ์ฆ, ์ํํ ๋ช ๋ น ์ฐจ๋จ |
PostToolUse |
๋๊ตฌ๊ฐ ๋ฐํ๋ ํ | ์ถ๋ ฅ ๊ฐ์ฌ, ๋ถ์์ฉ ํธ๋ฆฌ๊ฑฐ |
UserPromptSubmit |
ํ๋กฌํํธ๊ฐ ์ ์ก๋ ๋ | ํ๋กฌํํธ์ ์ถ๊ฐ ์ปจํ ์คํธ ์ฃผ์ |
Stop |
์์ด์ ํธ๊ฐ ์๋ฃ๋ ๋ | ๊ฒฐ๊ณผ ๊ฒ์ฆ, ์ธ์ ์ํ ์ ์ฅ |
SubagentStart / SubagentStop |
์๋ธ์์ด์ ํธ๊ฐ ์์ฑ๋๊ฑฐ๋ ์๋ฃ๋ ๋ | ๋ณ๋ ฌ ์์ ๊ฒฐ๊ณผ ์ถ์ ๋ฐ ์ง๊ณ |
PreCompact |
์ปจํ ์คํธ ์์ถ ์ | ์์ฝ ์ ์ ์ ์ฒด ๊ธฐ๋ก ๋ณด๊ด |
Hooks๋ ์์ด์ ํธ์ ์ปจํ
์คํธ ์๋์ฐ ๋ด๊ฐ ์๋๋ผ ์ ํ๋ฆฌ์ผ์ด์
ํ๋ก์ธ์ค์์ ์คํ๋๋ฏ๋ก ์ปจํ
์คํธ๋ฅผ ์๋นํ์ง ์์ต๋๋ค. Hooks๋ ๋ํ ๋ฃจํ๋ฅผ ๋จ๋ฝ์ํฌ ์ ์์ต๋๋ค: ๋๊ตฌ ํธ์ถ์ ๊ฑฐ๋ถํ๋ PreToolUse hook์ ์คํ์ ๋ฐฉ์งํ๊ณ Claude๋ ๊ฑฐ๋ถ ๋ฉ์์ง๋ฅผ ๋์ ๋ฐ์ต๋๋ค.
๋ SDK ๋ชจ๋ ์์ ๋ชจ๋ ์ด๋ฒคํธ๋ฅผ ์ง์ํฉ๋๋ค. TypeScript SDK๋ Python์ด ์์ง ์ง์ํ์ง ์๋ ์ถ๊ฐ ์ด๋ฒคํธ๋ฅผ ํฌํจํฉ๋๋ค. ์ ์ฒด ์ด๋ฒคํธ ๋ชฉ๋ก, SDK๋ณ ๊ฐ์ฉ์ฑ, ์ ์ฒด ์ฝ๋ฐฑ API๋ hooks๋ก ์คํ ์ ์ด๋ฅผ ์ฐธ์กฐํ์ธ์.
๋ชจ๋ ํจ๊ป ์ฌ์ฉ
์ด ์์ ๋ ์ด ํ์ด์ง์ ์ฃผ์ ๊ฐ๋ ์ ์คํจํ ํ ์คํธ๋ฅผ ์์ ํ๋ ๋จ์ผ ์์ด์ ํธ๋ก ๊ฒฐํฉํฉ๋๋ค. ํ์ฉ๋ ๋๊ตฌ(์๋ ์น์ธ๋๋ฏ๋ก ์์ด์ ํธ๊ฐ ์์จ์ ์ผ๋ก ์คํ๋จ), ํ๋ก์ ํธ ์ค์ , ํด ๋ฐ ์ถ๋ก ๋ ธ๋ ฅ์ ๋ํ ์์ ์ ํ์ผ๋ก ์์ด์ ํธ๋ฅผ ๊ตฌ์ฑํฉ๋๋ค. ๋ฃจํ๊ฐ ์คํ๋๋ฉด ์ ์ฌ์ ์ฌ๊ฐ๋ฅผ ์ํด ์ธ์ ID๋ฅผ ์บก์ฒํ๊ณ , ์ต์ข ๊ฒฐ๊ณผ๋ฅผ ์ฒ๋ฆฌํ๊ณ , ์ด ๋น์ฉ์ ์ธ์ํฉ๋๋ค.
import asyncio
from claude_agent_sdk import query, ClaudeAgentOptions, ResultMessage
async def run_agent():
session_id = None
async for message in query(
prompt="Find and fix the bug causing test failures in the auth module",
options=ClaudeAgentOptions(
allowed_tools=[
"Read",
"Edit",
"Bash",
"Glob",
"Grep",
], # Listing tools here auto-approves them (no prompting)
setting_sources=[
"project"
], # Load CLAUDE.md, skills, hooks from current directory
max_turns=30, # Prevent runaway sessions
effort="high", # Thorough reasoning for complex debugging
),
):
# Handle the final result
if isinstance(message, ResultMessage):
session_id = message.session_id # Save for potential resumption
if message.subtype == "success":
print(f"Done: {message.result}")
elif message.subtype == "error_max_turns":
# Agent ran out of turns. Resume with a higher limit.
print(f"Hit turn limit. Resume session {session_id} to continue.")
elif message.subtype == "error_max_budget_usd":
print("Hit budget limit.")
else:
print(f"Stopped: {message.subtype}")
if message.total_cost_usd is not None:
print(f"Cost: ${message.total_cost_usd:.4f}")
asyncio.run(run_agent())
import { query } from "@anthropic-ai/claude-agent-sdk";
let sessionId: string | undefined;
for await (const message of query({
prompt: "Find and fix the bug causing test failures in the auth module",
options: {
allowedTools: ["Read", "Edit", "Bash", "Glob", "Grep"], // Listing tools here auto-approves them (no prompting)
settingSources: ["project"], // Load CLAUDE.md, skills, hooks from current directory
maxTurns: 30, // Prevent runaway sessions
effort: "high" // Thorough reasoning for complex debugging
}
})) {
// Save the session ID to resume later if needed
if (message.type === "system" && message.subtype === "init") {
sessionId = message.session_id;
}
// Handle the final result
if (message.type === "result") {
if (message.subtype === "success") {
console.log(`Done: ${message.result}`);
} else if (message.subtype === "error_max_turns") {
// Agent ran out of turns. Resume with a higher limit.
console.log(`Hit turn limit. Resume session ${sessionId} to continue.`);
} else if (message.subtype === "error_max_budget_usd") {
console.log("Hit budget limit.");
} else {
console.log(`Stopped: ${message.subtype}`);
}
console.log(`Cost: $${message.total_cost_usd.toFixed(4)}`);
}
}
๋ค์ ๋จ๊ณ
์ด์ ๋ฃจํ๋ฅผ ์ดํดํ์ผ๋ฏ๋ก ๊ตฌ์ถํ๋ ๊ฒ์ ๋ฐ๋ผ ๋ค์ ์์น๋ก ์ด๋ํฉ๋๋ค:
- ์์ง ์์ด์ ํธ๋ฅผ ์คํํ์ง ์์๋์? ๋น ๋ฅธ ์์์ผ๋ก ์์ํ์ฌ SDK๋ฅผ ์ค์นํ๊ณ ๋์์ ๋๊น์ง ์คํ๋๋ ์ ์ฒด ์์ ๋ฅผ ํ์ธํฉ๋๋ค.
- ํ๋ก์ ํธ์ ์ฐ๊ฒฐํ ์ค๋น๊ฐ ๋์๋์? CLAUDE.md, ์คํฌ, ํ์ผ์์คํ hooks ๋ก๋ํ์ฌ ์์ด์ ํธ๊ฐ ํ๋ก์ ํธ ๊ท์น์ ์๋์ผ๋ก ๋ฐ๋ฅด๋๋ก ํฉ๋๋ค.
- ๋ํํ UI๋ฅผ ๊ตฌ์ถํ๊ณ ์๋์? ์คํธ๋ฆฌ๋ฐ์ ํ์ฑํํ์ฌ ๋ฃจํ๊ฐ ์คํ๋๋ฉด์ ๋ผ์ด๋ธ ํ ์คํธ ๋ฐ ๋๊ตฌ ํธ์ถ์ ํ์ํฉ๋๋ค.
- ์์ด์ ํธ๊ฐ ํ ์ ์๋ ๊ฒ์ ๋ํด ๋ ์๊ฒฉํ ์ ์ด๊ฐ ํ์ํ์ ๊ฐ์? ๊ถํ์ผ๋ก ๋๊ตฌ ์ ๊ทผ์ ์ ๊ทธ๊ณ , hooks๋ฅผ ์ฌ์ฉํ์ฌ ์คํ ์ ์ ๋๊ตฌ ํธ์ถ์ ๊ฐ์ฌ, ์ฐจ๋จ ๋๋ ๋ณํํฉ๋๋ค.
- ์ฅ๊ธฐ ๋๋ ๋น์ฉ์ด ๋ง์ด ๋๋ ์์ ์ ์คํํ๊ณ ์๋์? ๊ฒฉ๋ฆฌ๋ ์์ ์ ์๋ธ์์ด์ ํธ๋ก ์คํ๋ก๋ํ์ฌ ์ฃผ ์ปจํ ์คํธ๋ฅผ ๊น๋ํ๊ฒ ์ ์งํฉ๋๋ค.
์์ด์ ํธ ๋ฃจํ์ ๋ ๊ด๋ฒ์ํ ๊ฐ๋ ์ ๊ทธ๋ฆผ(SDK ํน์ ์ด ์๋)์ Claude Code์ ์๋ ์๋ฆฌ๋ฅผ ์ฐธ์กฐํ์ธ์.