도구 구성
도구 구성 (Tool Configuration)
내장 도구, MCP 도구, Docker 기반 도구를 구성하는 완전한 참조 문서예요.
출처: 문서
본문
내장 도구, MCP 도구, Docker 기반 도구를 구성하는 완전한 참조예요.
내장 도구 (Built-in Tools)
내장 도구는 Docker Agent에 포함되어 있고 외부 의존성이 필요 없어요. 에이전트의 toolsets 목록에 type별로 추가하면 돼요. 각 도구의 전용 페이지가 전체 구성 옵션, 사용 가능한 작업, 예제를 다뤄요.
| Type | 설명 | 페이지 |
|---|---|---|
filesystem |
읽기, 쓰기, 목록, 검색, 탐색 | Filesystem |
git |
읽기 전용 저장소 조사(status, log, branches, show, blame) | Git |
shell |
셸 명령 동기 실행 | Shell |
background_jobs |
장수 셸 명령 실행·관리 | Background Jobs |
scheduler |
특정 시간 또는 반복 간격으로 실행할 지시 예약 | Scheduler |
think |
추론 스크래치패드 | Think |
plan |
멀티 에이전트 협업을 위한 공유 영구 스크래치패드 | Plan |
session_plan |
draft-review-execute 워크플로우용 세션별 마크다운 플랜 | Session Plan |
session_context |
이전 세션을 컨텍스트로 참조(읽기 전용) | Session Context |
todo |
작업 목록 관리 | Todo |
memory |
영구 키-값 저장(SQLite) | Memory |
tasks |
세션 간 공유되는 영구 작업 데이터베이스 | Tasks |
fetch |
text/markdown/html 출력이 있는 HTTP GET 요청 | Fetch |
script |
커스텀 셸 스크립트를 도구로 | Script |
lsp |
Language Server Protocol 통합 | LSP |
api |
커스텀 HTTP API 도구 | API |
openapi |
OpenAPI 3.x 문서의 모든 작업을 도구로 가져오기 | OpenAPI |
rag |
인덱싱된 소스에 대한 검색 증강 생성 | RAG |
model_picker |
에이전트가 턴마다 여러 모델 중에서 고르게 하기 | Model Picker |
user_prompt |
대화형 사용자 입력 | User Prompt |
open_url |
사용자 기본 브라우저에서 고정 URL 열기 | Open URL |
transfer_task |
서브 에이전트에 위임(자동 활성화) | Transfer Task |
background_agents |
병렬 서브 에이전트 디스패치 | Background Agents |
webhook |
재시도가 있는 구성된 목적지로의 신뢰할 수 있는 알림(Slack, Discord, Telegram, IFTTT, Teams, …) | Webhook |
handoff |
같은 구성에서 다른 에이전트로의 로컬 대화 전환(handoffs:로 자동 활성화) |
Handoff |
a2a |
A2A 원격 에이전트 연결 | A2A |
mcp_catalog |
Docker MCP Catalog에서 원격 MCP 서버를 온디맨드로 발견·활성화 | MCP Catalog |
예제:
toolsets:
- type: filesystem
- type: shell
- type: background_jobs
- type: think
- type: todo
- type: memory
path: ./dev.db
MCP 도구 (MCP Tools)
Model Context Protocol로 외부 도구로 에이전트를 확장해요. mcp toolset의 독립형 개요는 MCP 도구 페이지를 보세요.
팁 — 재사용 가능한 MCP 정의: 반복되는 MCP 서버 정의는 최상위 mcps: 섹션으로 끌어올릴 수 있고 {type: mcp, ref: <name>}로 이름 참조할 수 있어요. Reusable MCP Servers 참조.
Docker MCP (권장)
MCP Gateway를 통해 MCP 서버를 안전한 Docker 컨테이너로 실행해요:
toolsets:
- type: mcp
ref: docker:duckduckgo # web search
- type: mcp
ref: docker:github-official # GitHub integration
사용 가능한 도구는 Docker MCP Catalog에서 확인할 수 있어요.
| 속성 | 타입 | 설명 |
|---|---|---|
ref |
string | Docker MCP 참조(docker:name) |
tools |
array | 선택: 이 도구들만 노출 |
instruction |
string | 에이전트 컨텍스트에 주입되는 커스텀 지시 |
config |
any | MCP 서버별 구성(초기화 중 전달) |
working_dir |
string | MCP 게이트웨이 서브프로세스의 작업 디렉토리. 카탈로그 항목이 로컬 프로세스로 실행될 때만 적용돼요(원격 아님). 상대 경로는 에이전트 작업 디렉토리 기준으로 해석돼요. ${env.VAR}(표준), ~ 및 셸 스타일 $VAR / ${VAR} 확장을 지원해요. |
로컬 MCP (stdio)
MCP 서버를 stdin/stdout을 통해 통신하는 로컬 프로세스로 실행해요:
toolsets:
- type: mcp
command: python
args: [ "-m", "mcp_server" ]
tools: [ "search", "fetch" ]
env:
API_KEY: value
| 속성 | 타입 | 설명 |
|---|---|---|
command |
string | MCP 서버를 실행할 명령 |
args |
array | 명령 인자 |
tools |
array | 선택: 이 도구들만 노출 |
env |
object | 환경 변수(키-값 쌍) |
working_dir |
string | MCP 서버 프로세스의 작업 디렉토리. 상대 경로는 에이전트 작업 디렉토리 기준. 생략하면 에이전트 작업 디렉토리로 기본 설정. ${env.VAR}(표준), ~ 및 셸 스타일 $VAR / ${VAR} 확장 지원. |
instruction |
string | 에이전트 컨텍스트에 주입되는 커스텀 지시 |
version |
string | 명령 바이너리를 자동 설치하기 위한 패키지 참조 |
원격 MCP (Streamable HTTP / SSE)
네트워크를 통해 MCP 서버에 연결해요:
toolsets:
- type: mcp
remote:
url: "https://mcp-server.example.com"
transport_type: "streamable"
headers:
Authorization: "Bearer your-token"
# Optional: allow OAuth helper requests to reach private/internal IPs.
allow_private_ips: true
tools: [ "search_web", "fetch_url" ]
| 속성 | 타입 | 설명 |
|---|---|---|
remote.url |
string | MCP 서버 URL. https://, http://, unix://(Unix 도메인 소켓) 스킴을 받아들여요. |
remote.transport_type |
string | streamable 또는 sse |
remote.headers |
object | 모든 요청에 보내는 HTTP 헤더. 값은 요청별로 해석되는 ${env.VAR}와 ${headers.NAME} 플레이스홀더를 지원해요. ${env.VAR}는 환경 변수를 읽고, ${headers.NAME}은 호출자의 수신 요청에서 헤더를 전달해요(Docker Agent가 API 서버로 실행될 때 유용). |
allow_private_ips |
boolean | 원격 MCP OAuth 헬퍼 요청이 비공개 IP 주소로 다이얼하는 것을 허용. 신뢰할 수 있는 내부 서버에만 사용하세요. |
도구 자동 설치 (Auto-Installing Tools)
바이너리 명령이 필요한 MCP나 LSP 도구를 구성할 때, 명령이 시스템에 없으면 Docker Agent가 자동으로 다운로드·설치할 수 있어요. 이는 CLI 도구 패키지의 큐레이션된 인덱스인 aqua 레지스트리를 사용해요.
동작 방식 (How It Works)
command가 있는 도구셋이 로드되면 Docker Agent는 명령이 PATH에 있는지 확인해요.- 없으면 Docker Agent 도구 디렉토리(
~/.cagent/tools/bin/)를 확인해요. - 그래도 없으면 aqua 레지스트리에서 명령을 찾아 자동 설치해요.
명시적 패키지 참조 (Explicit Package Reference)
version 속성으로 정확히 어떤 패키지를 설치할지 지정해요:
toolsets:
- type: mcp
command: gopls
version: "golang/[email protected]"
args: [ "mcp" ]
- type: lsp
command: rust-analyzer
version: "rust-lang/rust-analyzer@2024-01-01"
file_types: [ ".rs" ]
형식은 owner/repo 또는 owner/repo@version이에요. 버전을 생략하면 최신 릴리스를 사용해요.
자동 감지 (Automatic Detection)
version 속성이 없으면 Docker Agent는 aqua 레지스트리를 검색해 명령 이름에서 패키지를 자동 감지하려 해요:
toolsets:
- type: mcp
command: gopls # auto-detected as golang/tools
args: [ "mcp" ]
체크섬 검증 (Checksum Verification)
aqua 레지스트리가 체크섬 매니페스트를 포함하면 다운로드된 바이너리는 설치 전에 그에 대해 검증돼요. 검증 동작은 광고된 체크섬 유형에 따라 달라요:
- 강한 체크섬(sha256, sha512 등) — 바이너리 설치 전에 검증해요. 다운로드된 아카이브가 일치하지 않으면 설치가 중단되고 오류가 반환돼요(fail closed).
- 지원되지 않거나 약한 체크섬 유형(예: md5, sha1) — 경고와 함께 건너뛰고 검증 없이 설치를 진행해요.
- 매니페스트 없음 — 레지스트리 항목에 체크섬이 광고되지 않으면 바이너리는 검증 없이 설치돼요.
version_overrides 해석 (version_overrides Resolution)
자동 설치기는 aqua 레지스트리의 version_overrides 항목을 올바르게 해석해요. 많은 일반 도구(예: fzf)는 다운로드 URL과 체크섬을 포함한 패키지 구성을 레지스트리 항목의 최상위가 아닌 version_overrides 아래에 유지해요. 이런 도구들은 이전에 조용히 설치에 실패했지만 지금은 올바르게 처리돼요.
자동 설치 비활성화 (Disabling Auto-Install)
도구셋별 — version을 "false" 또는 "off"로 설정:
toolsets:
- type: mcp
command: my-custom-server
version: "false"
전역 — DOCKER_AGENT_AUTO_INSTALL 환경 변수 설정:
export DOCKER_AGENT_AUTO_INSTALL = false
환경 변수 (Environment Variables)
| 변수 | 기본값 | 설명 |
|---|---|---|
DOCKER_AGENT_AUTO_INSTALL |
(활성화) | false로 설정하면 모든 자동 설치 비활성화 |
DOCKER_AGENT_TOOLS_DIR |
~/.cagent/tools/ |
설치된 도구의 기본 디렉토리 |
GITHUB_TOKEN |
— | API 속도 제한을 올릴 GitHub 토큰(선택) |
설치된 바이너리는 ~/.cagent/tools/bin/에 놓이고 캐시되어 한 번만 다운로드돼요.
팁: 자동 설치는 Go 패키지(go install 경유)와 GitHub 릴리스 바이너리(아카이브 다운로드 경유) 둘 다 지원해요. aqua 레지스트리 메타데이터가 어떤 방법을 쓸지 결정해요.
도구셋 라이프사이클 (Toolset Lifecycle)
장수 도구셋 — 로컬 MCP 서버(stdio), 원격 MCP 서버(Streamable HTTP / SSE), LSP 서버 — 은 단일 감독자가 관리하며, 충돌·시간 초과·세션 드롭 시 자동 재연결할 수 있어요. 도구셋의 lifecycle 블록으로 도구셋별로 그 감독자를 조정할 수 있어요. 모든 type: mcp와 type: lsp 도구셋에 적용돼요.
가장 단순한 손잡이는 profile로, 사전 설정을 골라요:
| Profile | 자동 재시작 | 용도 |
|---|---|---|
resilient |
예 | 기본값. 연결 끊김 시 지수 백오프; 도구셋을 사용할 수 없어도 에이전트는 계속 실행돼요. 기존 Docker Agent 동작과 일치해요. |
strict |
아니오 | Fail-fast. 도구셋을 필수로 표시해요. 누락된 의존성이 하드 오류여야 하는 CI / 헤드리스 실행용. |
best-effort |
아니오 | 단일 시도, 재시도 없음. 깜빡임이 재시작 루프로 증폭되어서는 안 되는 실험적 MCP에 좋아요. |
toolsets:
- type: mcp
ref: docker:duckduckgo
lifecycle:
profile: resilient # default; shown here for clarity
- type: lsp
command: gopls
file_types: [ ".go" ]
lifecycle:
profile: strict
- type: mcp
ref: docker:openbnb-airbnb
lifecycle:
profile: best-effort
기본값 조정 (Tuning the defaults)
lifecycle에 설정된 어떤 필드든 profile 사전 설정을 재정의하므로 섞어 쓸 수 있어요: profile을 고르고 신경 쓰는 손잡이만 재정의하세요.
toolsets:
- type: mcp
command: [ "docker", "mcp", "gateway" ]
lifecycle:
profile: resilient
max_restarts: 10 # keep trying longer than the default of 5
backoff:
initial: 500ms
max: 1m
multiplier: 2
jitter: 0.2 # 20% random offset to avoid thundering-herd retries
| 속성 | 타입 | 설명 |
|---|---|---|
profile |
string | resilient(기본값), strict, best-effort 중 하나. 다른 모든 필드의 기본값을 골라요. |
restart |
string | 연결 끊김 후 감독자가 재연결해야 할 때: never, on_failure(기본값), always. 원격 MCP 도구셋(Streamable HTTP / SSE)에서는 idle-timeout 종료가 우아하게 재연결되도록 on_failure가 자동으로 always로 승격돼요 — never는 여전히 지켜져요. |
max_restarts |
int | 도구셋이 Failed로 표시되기 전의 최대 연속 재시작 시도. 0은 profile 기본값(5)을 사용하고 -1은 무제한. |
backoff.initial |
duration | 시도 사이 첫 대기(Go duration: 500ms, 1s, …). 기본값: 1s. |
backoff.max |
duration | 시도 사이 대기의 상한. 기본값: 32s. |
backoff.multiplier |
number | 각 시도마다 적용되는 승수. 기본값: 2. |
backoff.jitter |
number | 계산된 지연의 (0..1) 일부를 균일 랜덤 오프셋으로 적용. 0은 jitter 비활성화(기본값). |
required |
boolean | 도구셋을 중요로 표시. 현재는 정보 제공용. 미래 eager-startup 단계는 필수 도구셋이 Ready에 도달할 수 없으면 에이전트 시작을 거부할 것. strict 아래에서 기본 true, 그 외 false. |
startup_timeout |
duration | 초기 connect+initialize 기간의 상한. v1.94.0부터 적용: 만료 시 도구셋은 중지된 채 유지되고 런타임은 다음 턴에 재시도해요. |
call_timeout |
duration | 개별 도구 호출 기간의 상한(재연결-재시도 1회 포함). 적용: 만료 시 호출이 취소되고 모델에 도구 오류로 표면화되며, 취소는 서버에 전파돼요. 0/미설정은 시간 초과 없음 — opt-in 전용, profile 기본값 없음. |
참고 — required는 아직 적용되지 않아요: 스키마는 이 필드를 검증하고 감독자는 저장하지만 아직 그에 따라 동작하는 코드 경로는 없어요. 계획된 eager-startup 단계가 도래해도 오늘 작성된 구성 파일이 계속 동작하도록 지금 문서화하는 거예요. strict profile을 고르는 것은 전방 호환돼요 — required=true를 자동으로 적용하기 시작할 거예요.
런타임에 도구셋 검사·재시작 (Inspecting and restarting toolsets at runtime)
TUI는 감독자를 두 개의 슬래시 명령으로 노출해요:
/tools— 통합 도구 대화상자. 상단 섹션은 현재 에이전트의 모든 도구셋을 라이프사이클 상태(Stopped,Starting,Ready,Degraded,Restarting,Failed), 재시작 횟수, 마지막 오류와 함께 나열해요. 하단 섹션은 에이전트가 호출할 수 있는 모든 도구를 카테고리별로 그룹화해 나열해요. "에이전트가 무엇을 할 수 있나?"와 "무언가 저하됐나?"를 한 명령으로 답할 수 있어요./toolset-restart <name>— 감독자가 명명된 도구셋을 재연결하게 강제해요. OAuth 완료 후, 원격 MCP 서버가 재배포됐을 때,gopls같은 LSP가 막혔을 때 유용해요.
슬래시 명령의 전체 목록은 TUI 참조를 보세요.
전체 lifecycle 구성 예제는 examples/lifecycle.yaml을 참조하세요.
TOON 인코딩 도구 출력 (TOON-Encoded Tool Outputs)
많은 MCP 서버는 컨텍스트 예산을 많이 소비하는 장황한 JSON 응답을 반환해요. 도구셋의 toon 필드는 일치하는 도구의 JSON 출력을 모델에 보여주기 전에 TOON — 컴팩트하고 모델 친화적인 key/value 형식 — 으로 투명하게 재인코딩해요.
toolsets:
- type: mcp
ref: docker:github-official
toon: ".*" # toonify every tool from this MCP server
- type: mcp
command: my-server
toon: "list_.*,get_.*" # only toonify list_/get_ tools
| 속성 | 타입 | 설명 |
|---|---|---|
toon |
string | JSON 출력을 TOON으로 재인코딩해야 하는 도구 이름과 일치하는 정규식의 쉼표 구분 목록. 비-JSON 출력과 비일치 도구는 그대로 통과돼요. |
도구의 출력이 유효한 JSON이 아니면 변경 없이 반환돼요 — TOON 인코딩은 best-effort이고 평문 텍스트를 내는 도구를 절대 깨지 않아요.
참고 — TOON을 언제 사용할까: TOON은 보통 레코드 배열을 반환하는 MCP 도구(이슈 목록, 검색 결과, 파일 목록, …)에 대해 JSON보다 30-60% 더 작은 페이로드를 만들어요. 스키마가 규칙적일 때 가장 잘 동작해요. 깊게 중첩되거나 이질적인 모양의 일회성 응답은 이점이 적을 수 있어요.
도구셋별 모델 라우팅 (Per-Toolset Model Routing)
도구셋의 model 필드는 그 도구셋의 도구가 반환된 후 다음 턴에 호출되는 LLM을 재정의해요 — 단순한 도구 결과(파일 읽기, 지식 베이스 조회, 셸 stdout)를 더 싸고 빠른 모델로 처리하면서 에이전트의 기본 모델은 추론에 유지하게 해줘요.
models:
primary:
provider: anthropic
model: claude-sonnet-4-5
fast:
provider: anthropic
model: claude-haiku-4-5
agents:
root:
model: primary
toolsets:
- type: filesystem
model: fast # process file reads with the fast model
- type: shell
model: fast # ditto for shell stdout
- type: mcp
ref: docker:github-official
model: openai/gpt-4o-mini # inline provider/model also works
| 속성 | 타입 | 설명 |
|---|---|---|
model |
string | 이 도구셋의 도구 결과를 처리하는 LLM 턴에 사용하는 모델. models: 섹션의 이름 또는 인라인 provider/model(예: openai/gpt-4o-mini). 재정의는 one-shot이에요: 이후 턴은 에이전트 기본 모델로 돌아가요. |
한 턴의 여러 도구 호출이 서로 다른 모델 재정의를 가진 도구셋에서 오면, 런타임은 설정된 재정의가 있는 첫 번째 도구 호출의 것을 골라요. 전체 구성은 examples/per_tool_model_routing.yaml을 참조하세요.
도구 필터링 (Tool Filtering)
도구셋은 많은 도구를 노출할 수 있어요. tools 속성으로 에이전트가 필요로 하는 것만 화이트리스트할 수 있어요. 이것은 MCP뿐 아니라 모든 도구셋 유형에서 동작해요:
toolsets:
- type: mcp
ref: docker:github-official
tools: [ "list_issues", "create_issue", "get_pull_request" ]
- type: filesystem
tools: [ "read_file", "search_files_content" ]
- type: shell
tools: [ "shell" ]
팁: 도구 필터링은 에이전트 성능을 높여요 — 도구가 적을수록 모델이 어떤 도구를 쓸지 혼동이 적어요.
도구 지시 (Tool Instructions)
도구셋이 로드될 때 주입되는 컨텍스트별 지시를 추가해요:
toolsets:
- type: mcp
ref: docker:github-official
instruction: |
Use these tools to manage GitHub issues.
Always check for existing issues before creating new ones.
Label new issues with 'triage' by default.
기본적으로 instruction: 필드는 도구셋의 내장 지시(있으면)를 대체해요. 내장 안내를 유지하고 그 위에 자신의 규칙을 추가하려면 지시 텍스트 어디든 {ORIGINAL_INSTRUCTIONS} 플레이스홀더를 포함하세요. 런타임에 도구셋의 기본 지시로 확장돼요:
toolsets:
# Enrich: keep built-in instructions, then add your own rules
- type: filesystem
instruction: |
{ORIGINAL_INSTRUCTIONS}
## Project-specific rules
- Never modify files outside the `src/` directory.
- Always create a backup before overwriting a file.
# Enrich: prepend your rules before the built-in instructions
- type: shell
instruction: |
Important: only run commands inside the project root.
{ORIGINAL_INSTRUCTIONS}
# Replace: omit the placeholder to discard built-in instructions entirely
- type: mcp
ref: docker:github-official
instruction: |
Only read GitHub issues. Never create, edit, or close anything.
세 가지 패턴을 한눈에:
| 패턴 | 설명 |
|---|---|
{ORIGINAL_INSTRUCTIONS} 다음에 내 텍스트 |
내 규칙을 기본값 뒤에 추가 |
내 텍스트 다음에 {ORIGINAL_INSTRUCTIONS} |
내 규칙을 기본값 앞에 추가 |
| 플레이스홀더 없음 | 기본값을 완전히 대체 |
전체 예제는 examples/toolset_instructions.yaml을 참조하세요.
지연된 도구 로딩 (Deferred Tool Loading)
에이전트 시작을 빠르게 하기 위해 도구를 온디맨드로 로드해요. 도구셋이 defer되면 그 도구는 지연 등록돼요 — 에이전트가 그 도구 중 하나를 처음 호출할 때까지 도구 서버 프로세스가 시작되지 않아요. 수백 개 도구가 있는 MCP 서버처럼 시작 시간이 중요한 큰 도구셋에 유용해요.
toolsets:
- type: mcp
ref: docker:github-official
defer: true
- type: mcp
ref: docker:slack
defer: true
- type: filesystem
또는 도구셋 내 특정 도구만 defer:
toolsets:
- type: mcp
ref: docker:github-official
defer:
- "list_issues"
- "search_repos"
defer가 도구 이름 목록이면 그 특정 도구만 defer돼요. 도구셋의 다른 모든 도구는 즉시(전역적으로) 로드돼요. defer: true는 전체 도구셋을 defer해요.
search_tool로 도구 발견 (Tool Discovery with search_tool)
전체 도구셋이 defer되면(defer: true), defer된 도구셋은 에이전트에 두 개의 내장 도구를 노출해요:
search_tool— 키워드로 사용 가능한 지연 도구를 발견. 검색은 도구 이름과 설명 둘 다에 대해 퍼지 매칭을 사용해요. 쿼리의 모든 문자는 순서대로 대상 문자열에 나타나야 해요(반드시 인접할 필요는 없음). "crfil" 같은 쿼리는create_file과 일치해요. 일치하는 도구 이름과 설명 목록을 반환해요.add_tool— 발견된 도구를 이름으로 활성화해 사용 가능하게 해요.
이 도구들은 에이전트가 모든 도구를 미리 활성화하지 않고도 큰 도구셋을 온디맨드로 탐색하게 해줘요.
전체 예제는 examples/deferred.yaml을 참조하세요.
결합 예제 (Combined Example)
agents:
root:
model: anthropic/claude-sonnet-4-5
description: Full-featured developer assistant
instruction: You are an expert developer.
toolsets:
# Built-in tools
- type: filesystem
- type: shell
- type: think
- type: todo
- type: memory
path: ./dev.db
- type: user_prompt
# LSP for code intelligence
- type: lsp
command: gopls
file_types: [ ".go" ]
# Custom scripts
- type: script
shell:
run_tests:
description: Run the test suite
cmd: task test
lint:
description: Run the linter
cmd: task lint
# Custom API tool
- type: api
api_config:
name: get_status
method: GET
endpoint: "https://api.example.com/status"
instruction: Check service health
# Docker MCP tools
- type: mcp
ref: docker:github-official
tools: [ "list_issues", "create_issue" ]
- type: mcp
ref: docker:duckduckgo
# Remote MCP
- type: mcp
remote:
url: "https://internal-api.example.com/mcp"
transport_type: "streamable"
headers:
Authorization: "Bearer ${env.INTERNAL_TOKEN}"
경고 — 도구셋 순서가 중요해요: 여러 도구셋이 같은 이름의 도구를 제공하면 첫 번째가 이겨요. 도구셋을 의도적으로 순서화하세요.