전체 문서
Tool 이름·설치·효과 참조
이 표는 production source가 정적으로 제공하는 30개 runtime tool 이름을 constructor/registry 경로에서 전부 열거한다. RO와 C는 각각 IsReadOnly({}), IsConcurrencySafe({}), self는 CheckPermissions({})의 자체 판정이다. 실제 허용 여부는 deny rule·permission mode·allow rule을 앞뒤로 적용한 permission pipeline이 결정한다. 인자에 따라 hard deny하는 Bash 계열 같은 예외는 “효과/실패”에 적었다.
정적 catalog 30개
정적 catalog 30개 · 관계
이 대상을 사용하는 기능·모듈·계약 · 2개
- 계약 사용 · Direct tool call의 실행 순서 · 실행 전 정적 tool catalog, metadata와 install 조건을 확인 · tool-defaults · tool-optional
- 계약 사용 · tool, permission, hook · tool module이 제공하는 정적 constructor catalog와 metadata 계약 · tool-defaults · tool-optional
| # | tool name | 설치 조건 | RO | C | self | 효과와 실패 경계 | source |
|---|---|---|---|---|---|---|---|
| 1 | Read |
Options.Tools == nil 기본 |
Y | Y | allow | 파일 일부/전체 읽기; WorkingDir는 sandbox가 아니며 output cap 적용 | 근거 |
| 2 | Write |
기본 | N | N | ask | 파일 생성/덮어쓰기; parent dir 생성, path 격리 없음 | 근거 |
| 3 | Edit |
기본 | N | N | ask | exact old-text 교체; 불일치/복수 match는 error result | 근거 |
| 4 | MultiEdit |
기본 | N | N | ask | 한 파일에 순차 edit; 중간 오류의 transaction rollback 없음 | 근거 |
| 5 | LS |
기본 | Y | Y | allow | 디렉터리 목록; host filesystem을 그대로 봄 | 근거 |
| 6 | Glob |
기본 | Y | Y | allow | path pattern 열거; symlink/absolute 경계가 sandbox는 아님 | 근거 |
| 7 | Grep |
기본 | Y | Y | allow | metadata상 읽기 전용이지만 첫 RipgrepPath가 rg 부재 시 exact npm install -g @vscode/ripgrep을 실행할 수 있음; 실패하면 pure-Go 검색 |
근거 |
| 8 | Bash |
기본 | N | N | ask | shell command/선택적 background process; catastrophic pattern은 hard deny하지만 sandbox/egress는 없음 | 근거 |
| 9 | sleep |
기본, 이름은 소문자 | Y | Y | allow | context-aware 대기; duration parse/상한 규칙 위반은 error result | 근거 |
| 10 | TaskOutput |
background가 global/per-session disable이 아니고 manager 생성 성공 | Y | Y | allow | task output tail 읽기, 선택적 block | 근거 |
| 11 | TaskStop |
같은 조건 | N | N | allow | 한 task 또는 전부의 process tree 중단 | 근거 |
| 12 | TaskList |
같은 조건 | Y | Y | allow | current session task 상태 열거 | 근거 |
| 13 | Monitor |
같은 조건 | N | N | ask | long-running command spawn·notification; Bash hard-deny self-check 재사용 | 근거 |
| 14 | shell_open |
host가 ShellSessionTools() 추가 + background manager 사용 가능 + global PTY 미차단 |
N | N | allow | persistent PTY process 시작; Bash deny parser는 거치지 않음 | 근거 |
| 15 | shell_send |
같은 조건 | N | N | allow | PTY byte/key/paste 입력, 선택적 wait | 근거 |
| 16 | shell_read |
같은 조건 | Y | N | allow | stream cursor 또는 VT screen 읽기; cursor state를 변경해 concurrency false | 근거 |
| 17 | shell_close |
같은 조건 | N | N | allow | PTY kill·registry 제거 | 근거 |
| 18 | shell_list |
같은 조건 | Y | N | allow | PTY session 목록; manager lock 사용 | 근거 |
| 19 | WebFetch |
EnableWebFetch 또는 host 직접 추가 |
N | N | ask | GET/redirect/HTML 변환; 30s, 2 MiB read cap, 50k output cap, proxy 오류 direct-intended fallback(환경 proxy 재상속 가능) | 근거 |
| 20 | web_search |
EnableWebSearch+유효 backend 또는 host 직접 추가 |
Y | Y | ask | provider outbound search; 기본 5/최대 20 results, 30s(DeepSeek 120s) | 근거 |
| 21 | TodoWrite |
Options.Todos != nil |
N | N | allow | in-memory todo 전체 교체 | 근거 |
| 22 | AskUserQuestion |
Options.AskUser != nil |
N | N | allow | 동기 host callback; blocking이어서 exclusive | 근거 |
| 23 | SearchExtraTools |
DeferredTools non-empty |
Y | N | allow | 숨긴 registry metadata 검색/선택; capability gate가 아님 | 근거 |
| 24 | ExecuteExtraTool |
DeferredTools non-empty |
N | N | allow | unlock 확인 뒤 inner Call 직접 수행; inner permission/hook 재실행 없음 |
근거 |
| 25 | EnterPlanMode |
Options.Plan != nil |
Y | N | allow | controller mode를 plan으로 변경; state mutation이지만 plan에서 호출하도록 RO=true | 근거 |
| 26 | ExitPlanMode |
Options.Plan != nil |
Y | N | allow | approver 호출·승인 시 target mode 변경 | 근거 |
| 27 | RecallMemory |
Memory.Store != nil |
Y | Y | allow | 관련 memory 최대 5개 읽기 | 근거 |
| 28 | RecordMemory |
Memory.Store != nil |
N | N | allow | markdown memory 저장·index rebuild | 근거 |
| 29 | Skill |
Options.Skills != nil |
Y | N | allow | skill instructions를 별도 user guidance로 주입하고 optional OnInvoke 실행 |
근거 |
| 30 | Agent |
host가 subagent.NewTool 또는 coordinator tool 추가 |
N | N | allow | child harness를 동기 실행; 자체 call은 allow지만 child tool permission은 별도 | 근거 |
기본 9개 근거 선택 도구 근거 background 근거 PTY 근거
Grep의 RO=Y, C=Y, self=allow는 등록 metadata 값일 뿐 첫 실행의 숨은 설치 효과를 나타내지 않는다. rg가 PATH에 없고 NORMA_DISABLE_RIPGREP와 NORMA_RIPGREP_NO_INSTALL도 비어 있으면 process-wide sync.Once 안에서 npm의 global prefix와 network를 사용할 수 있다. 자세한 trigger와 fallback은 Grep bootstrap operation을 확인한다. 구현 근거
Adapter가 추가하는 내부 runtime tool
noaadapter.Enable*은 위 30개 catalog와 별도로 Compress를 registry에 설치한다. private constructor라 host-facing 정적 constructor catalog에는 포함하지 않았지만 model-visible tool이다. RO=N, C=N, self=allow, RawInput=true이며 Noa state를 바꾸고 archive를 쓴다. malformed JSON을 자체 복구하려고 중앙 schema validation을 건너뛴다. Noa 설치 Compress tool
동적 MCP와 host tool
정적 30개는 runtime 전체 개수의 상한이 아니다.
| 공급자 | 이름/수 | metadata 기본 | 효과 경계 |
|---|---|---|---|
| remote stdio MCP | mcp__<server>__<remote-name>, tools/list 결과만큼 |
fail-closed RO=N, C=N, self ask |
tools/call; text만 보존, resource/image/structured content 손실 |
| in-process MCP | mcp__<server>__<name>, host slice만큼 |
RO=N, C=N, self ask |
임의 host handler |
host tool.Build / CoreTool |
임의 이름·수 | 생략하면 RO=N, C=N, self ask |
host 구현이 선언과 실제 effect를 일치시켜야 함 |
| registry duplicate | 새 개수가 아니라 같은 이름 교체 | 마지막 등록 객체 | constructor catalog와 실제 session object가 달라질 수 있음 |
MCP/host tool은 이름이 동적으로 결정되므로 정적 30개 분모와 섞지 않는다. 정책은 이름 catalog가 아니라 실행 직전 resource/argument를 평가해야 한다. MCP 근거 CoreTool 근거
inventory 산출 방식
고정 revision의 production(non-test) Go에서 DefaultTools, exported optional constructors, agentcore 자동 주입, plan/memory/skill/subagent constructors를 추적했다. 30개 객체를 실제 구성해 빈 object 입력에 대한 세 metadata method를 호출했고, input-dependent deny/effect는 runner source로 보완했다. Compress는 private adapter constructor, MCP/host는 runtime-derived이므로 별도 구획으로 유지했다.