macOS를 자동화하는 MCP 서버는 여럿 있다. 하지만 대부분 매 세션마다 처음부터 시작한다. 같은 앱에서 같은 작업을 반복해도 이전 경험을 기억하지 못한다. Mac-Pilot은 이 문제를 해결한다. 실행한 명령을 기억하고, 성공한 패턴을 레시피로 저장하며, 앱별 지식을 축적하는 자기학습 macOS 자동화 MCP 서버다.
1. 왜 만들었나
위반 사례
세션 1: "Finder에서 선택한 파일 경로를 가져와줘"
→ AppleScript 실행 → 실패 → 수정 → 성공 (3분 소요)
세션 2: "Finder에서 선택한 파일 경로를 가져와줘"
→ 또 처음부터 시행착오 (3분 소요)
세션 N: 매번 같은 삽질 반복
기존 macOS MCP 서버의 문제점:
- 세션 간 학습 없음
- 같은 실수를 반복
- 보안 검증 없이 명령 실행
- 재사용 가능한 워크플로우 저장 불가
개선안
세션 1: 실행 → 성공 → 레시피 저장 + 앱 지식 축적
세션 2: 레시피 검색 → 즉시 실행 (0.5초)
세션 N: 지식이 쌓일수록 빨라짐
2. 핵심 아키텍처
7가지 도구
| 도구 | 역할 | 예시 |
|---|---|---|
mac_run |
AppleScript/JXA/셸 명령 실행 | 앱 열기, 클릭, 타이핑 |
mac_state |
시스템 상태 조회 | 현재 앱, 클립보드, 창 목록 |
mac_find_ui |
UI 요소 탐색 (Accessibility API) | 버튼, 입력 필드 찾기 |
mac_screenshot |
스크린샷 캡처 | 전체 화면, 특정 영역 |
mac_recipe_save |
성공한 작업을 레시피로 저장 | 파라미터화된 워크플로우 |
mac_recipe_run |
저장된 레시피 실행 | 파라미터 치환 후 순차 실행 |
mac_recipe_search |
레시피/히스토리 전문 검색 | 키워드 기반 FTS5 검색 |
기술 스택
TypeScript 5.0 (strict mode)
├── MCP SDK v1.0.0
├── better-sqlite3 (WAL mode)
├── Zod (입력 검증)
└── Vitest (144+ 테스트)
3. 자기학습 시스템
Mac-Pilot의 핵심 차별점이다. 모든 실행 결과가 SQLite 데이터베이스에 저장되고, 시간이 지날수록 지식이 축적된다.
데이터베이스 구조
~/.mac-pilot/pilot.db
├── action_log — 모든 실행 기록 (타입, 앱, 성공 여부, 소요 시간)
├── action_log_fts — 전문 검색 인덱스
├── recipes — 저장된 자동화 레시피
├── recipes_fts — 레시피 전문 검색 인덱스
├── app_knowledge — 앱별 학습 지식 (셀렉터, 워크어라운드)
└── security_log — 보안 감사 로그
학습 루프
// 1. 명령 실행 시 자동 학습
if (result.success && appContext) {
db.saveAppKnowledge({
appName: appContext,
knowledgeType: 'selector',
content: `Successful script hash: ${hashScript(script)}`
});
}
// 2. 실패 시에도 학습
if (!result.success) {
db.saveAppKnowledge({
appName: appContext,
knowledgeType: 'workaround',
content: `AppleScript error: ${result.error.slice(0, 200)}`
});
}
성공하면 셀렉터 정보를, 실패하면 에러 패턴을 저장한다. 다음 세션에서 같은 앱을 다룰 때 이 지식을 참조한다.
신뢰도 점수
앱 지식에는 신뢰도 점수(0~1.0)가 있다:
- 반복 성공 시 +0.1 증가
- 실패 시 -0.2 감소
- 신뢰도 0.3 이하인 지식은 자동 필터링
검증된 지식만 AI 에이전트에게 제공된다.
4. 레시피 시스템
레시피 저장
성공한 작업 시퀀스를 파라미터화된 레시피로 저장한다.
// 레시피 저장
mac_recipe_save({
name: "open-terminal-at",
description: "특정 경로에서 터미널 열기",
steps: [
{
type: "shell",
command: "open -a Terminal {{path}}"
}
],
parameters: ["path"],
tags: ["terminal", "dev"]
})
{{path}}는 실행 시 실제 값으로 치환된다.
레시피 실행
// 파라미터만 전달하면 즉시 실행
mac_recipe_run({
name: "open-terminal-at",
params: { path: "/Users/me/project" }
})
실행 통계 추적
각 레시피는 실행 횟수, 성공 횟수, 성공률을 추적한다. 검색 결과에 성공률이 표시되어 AI 에이전트가 검증된 레시피를 선택할 수 있다.
내장 레시피 21개
cold start 없이 바로 사용할 수 있도록 21개의 내장 레시피를 제공한다.
| 카테고리 | 레시피 | 파라미터 |
|---|---|---|
| 시스템 | toggle-dark-mode, set-volume, lock-screen 등 | volume: 0~100 |
| Finder | new-finder-window, get-selected-files | path |
| Safari | safari-current-url, safari-current-title | - |
| 클립보드 | get-clipboard, set-clipboard | text |
| 터미널 | open-terminal-at, kill-process | path, processName |
| 윈도우 | list-windows, close-front-window | - |
| 음악 | music-play-pause, music-next-track | - |
| 알림 | notify | title, message |
5. 보안 감사 시스템
macOS 자동화는 시스템 전체에 접근할 수 있어 보안이 중요하다. Mac-Pilot은 3단계 보안 체계를 갖추고 있다.
하드 블록 (27개 패턴)
위험한 명령은 실행 전에 차단한다.
const BLOCKED_SHELL_PATTERNS = [
/rm\s+(-[rRf]+\s+)[\/~]/, // rm -rf / 또는 rm -rf ~
/sudo\s+/, // 권한 상승
/curl\s.*\|\s*(ba)?sh/, // curl | sh (원격 코드 실행)
/dd\s+if=/, // 디스크 복사 (디스크 삭제 가능)
/csrutil\s+disable/, // SIP 비활성화
/launchctl\s+(load|submit)/, // 데몬 로드
/\$\(/, // 서브셸 인젝션
// ... 20개 이상
];
위험도 분류 (4단계)
모든 명령은 실행 전에 위험도가 분류된다.
| 레벨 | 설명 | 예시 | |
|---|---|---|---|
blocked |
실행 차단 | rm -rf /, sudo, curl \ |
sh |
high |
확인 필요 | 파일 수정, 프로세스 종료, chmod | |
medium |
주의 | 네트워크 접근, 패키지 설치, UI 자동화 | |
low |
안전 | 읽기 전용, open, 스크린샷 |
Dry Run 모드
dryRun: true를 전달하면 실제 실행 없이 위험도 분류 결과만 확인할 수 있다.
감사 로그
모든 실행(차단된 것 포함)이 SQLite에 기록된다. 액션 타입, 위험도, 허용/차단 여부, 타임스탬프가 저장되어 사후 추적이 가능하다.
6. 전문 검색 (FTS5)
레시피와 실행 히스토리를 키워드로 검색할 수 있다.
mac_recipe_search({
query: "Figma export",
scope: "all" // "recipes" | "history" | "all"
})
SQLite FTS5 인덱스를 사용하여 수백 개의 레시피와 수천 개의 실행 기록에서 관련성 순으로 결과를 반환한다. 레시피 검색 결과에는 성공률이 포함되어 AI 에이전트가 가장 신뢰할 수 있는 자동화를 선택할 수 있다.
7. 다른 macOS MCP 서버와 비교
| 기능 | Mac-Pilot | 다른 macOS MCP 서버 |
|---|---|---|
| 자기학습 시스템 | O | X |
| 레시피 저장/실행 | O | X |
| 내장 레시피 21개 | O | 0개 |
| 전문 검색 (FTS5) | O | X |
| 보안 감사 로그 | O | 드물게 |
| 위험도 분류 (4단계) | O | X |
| 하드 블록 (27+ 패턴) | O | X |
| JXA + AppleScript | 둘 다 | 보통 하나만 |
| Dry Run 모드 | O | 드물게 |
| 앱별 지식 축적 | O | X |
| 성공률 추적 | O | X |
면접 예상 질문
1. MCP 서버의 자기학습 시스템은 어떻게 구현했는가?
2. SQLite FTS5를 선택한 이유는? 다른 검색 엔진과 비교하면?
3. 보안 샌드박스의 위험도 분류 기준은 어떻게 설계했는가?
4. 레시피 파라미터 치환에서 인젝션 공격은 어떻게 방지하는가?
5. WAL 모드를 사용한 이유는?
정리
- Mac-Pilot은 macOS 자동화에 학습 능력을 추가한 MCP 서버다
- 성공/실패 패턴을 자동으로 저장하고 신뢰도를 관리한다
- 레시피 시스템으로 검증된 워크플로우를 재사용할 수 있다
- 27개 하드 블록 패턴과 4단계 위험도 분류로 보안을 확보한다
- FTS5 전문 검색으로 축적된 지식을 빠르게 찾을 수 있다
- 세션이 쌓일수록 자동화가 빨라지는 복리 효과를 제공한다
참고:
'AI관련' 카테고리의 다른 글
| Claude Code in Action 후기 (1) | 2026.04.04 |
|---|---|
| 클로드 전용 연속성 관련 mcp 개발 (0) | 2026.03.26 |
| Claude Code Hooks로 AI 개발 자동화하기 (0) | 2026.03.22 |
| TypeScript MCP 서버를 npm에 배포하기 (0) | 2026.03.22 |
| MCP 서버 직접 만들기: Python FastMCP (0) | 2026.01.29 |