카테고리 | 설명 | 위치 |
브라우저 제어 | 웹 브라우저 자동화 | /src/browser/ |
Canvas/A2UI | 에이전트 주도 시각 작업공간 | /src/canvas-host/ |
디바이스 노드 | 디바이스 하드웨어 제어 | /src/node-host/ |
Cron & 웹훅 | 자동화 및 외부 트리거 | /src/cron/ |
세션 도구 | 에이전트 간 통신 | /src/sessions/ |
파일 시스템 | 파일 읽기/쓰기/편집 | /src/process/ |
크롬 작업 | 주기적 작업 스케줄링 | /src/cron/service.ts |
기능 | 설명 | 권한 |
페이지 탐색 | URL로 이동, 뒤로가기, 새고기 | browser |
요소 상호작용 | 클릭, 입력, 선택 | browser |
스크린샷 | 전체 화면 또는 요소 캡처 | browser |
스크립트 실행 | JavaScript 코드 실행 | browser |
파일 업로드 | 로컬 파일 업로드 | browser |
미디어 다운로드 | 파일 다운로드 경로 제어 | browser |
페이지 탭 관리 | 새 탭, 닫기, 전환 | browser |
쿠키 및 스토리지 | 쿠키 관리, localStorage/세션Storage | browser |
// 에이전트에서 브라우저 도구 사용
const result = await tool('browser_navigate', {
url: 'https://example.com'
});
const screenshot = await tool('browser_screenshot', {
selector: 'body',
fullPage: true
});
const click = await tool('browser_click', {
selector: '#submit-button'
});기능 | 설명 | 권한 |
Live Canvas | 실시간 편집 가능한 HTML 캔버스 | canvas |
A2UI (Agent-to-User Interface) | 푸시된 React 구성요소 | canvas |
캔버스 업데이트 | 실시간 캔버스 상태 업데이트 | canvas |
사용자 입력 캡처 | 클릭, 키 입력, 스크롤 캡처 | canvas |
스냅샷 | 캔버스 상태 저장 | canvas |
캔버스 호스트 | 별도의 서버 (포트 18793) | canvas |
// A2UI 예시: 푸시된 React 컴포넌트
interface A2UIProps {
title: string;
data: unknown;
onEvent: (event: unknown) => void;
}
// 예: 차트 A2UI
const ChartA2UI: React.FC<A2UIProps> = ({ title, data, onEvent }) => {
return (
<div>
<h2>{title}</h2>
<Chart data={data} />
<button onClick={() => onEvent({ type: 'export' })}>
Export
</button>
</div>
);
};// 에이전트에서 Canvas 사용
await tool('canvas_update', {
html: '<h1>Hello, Canvas!</h1>',
width: 800,
height: 600
});
await tool('canvas_a2ui', {
component: 'ChartA2UI',
props: {
title: 'Sales Data',
data: salesData
},
onEvent: { type: 'export' }
});명령 | 설명 | 권한 |
canvas.* | 캔버스 제어 | 캔버스 권한 |
camera.snap | 사진 캡처 | 카메라 권한 |
camera.clip | 비디오 클립 | 카메라 권한 |
screen.record | 화면 녹화 | 화면 녹화 권한 |
location.get | 현재 위치 정보 | 위치 권한 |
system.run | 명령 실행 | 승인된 elevated 모드 |
system.notify | 알림 전송 | 알림 권한 |
// 노드 연결 요청
{
"type": "req",
"method": "connect",
"params": {
"role": "node",
"deviceId": "device-uuid",
"name": "My iPhone",
"caps": [
"camera.snap",
"screen.record",
"location.get"
],
"permissions": {
"camera": true,
"screen": false,
"location": true
}
}
}// 에이전트에서 노드 명령 사용
const photo = await tool('camera_snap', {
quality: 'high'
});
const location = await tool('location_get', {
accuracy: 'high'
});
const screen = await tool('screen_record', {
duration: 30,
format: 'mp4'
});// 크론 작업 정의
interface CronJob {
id: string;
schedule: string; // cron syntax: "0 9 * * 1-5"
agent: string; // 워크스페이스 이름
message: string; // 에이전트에 보낼 메시지
enabled: boolean;
}{
cron: {
jobs: {
"daily-report": {
schedule: "0 9 * * 1-5",
agent: "main",
message: "오늘의 일정을 정리해줘",
enabled: true
},
"weekly-summary": {
schedule: "0 18 * * 5",
agent: "main",
message: "이번 주 목표를 정리해줘",
enabled: true
}
}
}
}// 웹훅 정의
interface Webhook {
path: string;
secret: string;
method: 'POST' | 'GET';
agent: string;
message?: string;
enabled: boolean;
}{
webhooks: {
"/api/triggers/backup": {
secret: "webhook-secret-key",
method: "POST",
agent: "backup-agent",
message: "백업을 실행해줘",
enabled: true
},
"/api/triggers/deploy": {
secret: "deploy-secret-key",
method: "POST",
agent: "deploy-agent",
enabled: true
}
}
}// Gmail 기반 트리거
interface GmailPubSub {
enabled: boolean;
agent: string;
filters?: {
from?: string[];
subject?: string[];
body?: string[];
};
}도구 | 설명 | 권한 |
sessions_list | 모든 활성 세션 목록 조회 | sessions_list |
sessions_history | 특정 세션의 기록 조회 | sessions_history |
sessions_send | 다른 세션으로 메시지 전송 | sessions_send |
sessions_context_update | 다른 세션의 컨텍스트 업데이트 | sessions_context |
// 모든 세션 목록 조회
const sessions = await tool('sessions_list');
// => [
// { id: 'whatsapp:+1234567890', workspace: 'main', ... },
// { id: 'telegram:@bot', workspace: 'main', ... }
// ]
// 특정 세션 기록 조회
const history = await tool('sessions_history', {
session: 'whatsapp:+1234567890'
});
// 다른 세션으로 메시지 전송
await tool('sessions_send', {
to: 'telegram:@other_bot',
message: '이 작업을 처리해줘'
});
// 다른 세션 컨텍스트 업데이트
await tool('sessions_context_update', {
session: 'whatsapp:+1234567890',
context: {
data: sharedData,
lastUpdated: '2026-01-26'
}
});도구 | 설명 | 권한 |
read | 파일 읽기 | read |
write | 파일 쓰기 | write |
edit | 파일 편집 | edit |
list | 디렉토리 목록 | read |
delete | 파일 삭제 | write |
// 파일 읽기
const content = await tool('read', {
path: '~/clawd/config/settings.json'
});
// 파일 쓰기
await tool('write', {
path: '~/clawd/output/result.txt',
content: 'Hello, World!'
});
// 파일 편집
await tool('edit', {
path: '~/clawd/src/app.ts',
edits: [
{
search: 'console.log("Hello")',
replace: 'console.log("Updated!")'
}
]
});// 도구 권한 체크
interface ToolPermission {
tool: string;
allowed: boolean;
reason?: string;
}
// 권한 검사 로직
function checkPermission(tool: string, session: Session): boolean {
if (session.isMain) {
return true; // main 세션은 모든 도구 허용
}
if (sandbox.mode === 'non-main') {
return sandbox.allowlist.includes(tool);
}
return false;
}모드 | 설명 | 대상 세션 |
none | 샌드박스 비활성화 | 모든 세션 |
non-main | 비-main 세션만 샌드박스 | 그룹, 공개 DM |
all | 모든 세션 샌드박스 | 모든 세션 |
{
sandbox: {
mode: "non-main",
allowlist: [
"bash",
"process",
"read",
"write",
"edit",
"sessions_list",
"sessions_history"
],
denylist: [
"browser",
"canvas",
"nodes",
"cron",
"discord",
"slack",
"gateway"
]
}
}