Claude Code로 일일 기록 자동화하기
ScreenPipe로 하루 활동을 수집하고, Claude Code Skill로 Notion에 자동 저장하는 시스템을 구축한 경험을 공유합니다. MCP에서 curl 기반으로 전환한 시행착오도 포함.
매일 하루를 기록하고 싶었는데
하루를 돌아보고 기록하는 게 중요하다는 건 알고 있습니다. 근데 막상 하려고 하면 에너지가 없습니다. 퇴근하고 나면 “오늘 뭐했지?” 하고 기억을 더듬는 것부터가 일이니까요.
그래서 항상 미뤄왔습니다. “내일부터 해야지”, “주말에 몰아서 정리해야지” 하다가 어느새 한 달이 지나있고, 그럼 더 하기 싫어지는 악순환이 반복됐습니다.
문제는 명확했습니다:
- 기억에 의존하면 안 된다 - 하루가 끝나면 뭘 했는지 기억이 안 남
- 수동으로 하면 안 된다 - 에너지가 없을 때는 안 하게 됨
- 복잡하면 안 된다 - 시작하기 전에 포기함
해결책: 컴퓨터가 기록하고, AI가 정리하자
컴퓨터는 제가 뭘 했는지 자동으로 기록해두고, 그걸 AI에게 넘겨서 정리하게 하면 되는 거였습니다.
이 아이디어를 구현하기 위해 세 가지 도구를 조합했습니다:
ScreenPipe (화면/음성 기록) ↓Claude Code Skill (워크플로우 정의) ↓Notion API (자동 저장)- ScreenPipe: 화면에 보이는 모든 텍스트를 OCR로 기록, 오디오도 녹음
- Claude Code Skill: “일일 기록 작성” 워크플로우를 명령어 하나로 실행
- Notion API: curl로 직접 호출해서 페이지 생성
ScreenPipe 설치 및 설정
설치
curl -fsSL get.screenpi.pe/cli | shmacOS 권한 문제 해결
ScreenPipe CLI를 설치하면 바로 문제에 부딪힙니다. macOS는 .app 번들만 화면 녹화 권한을 부여할 수 있어서, CLI 바이너리는 권한 목록에 추가가 안 됩니다.
해결책은 CLI를 감싸는 .app 래퍼를 만드는 것입니다:
# 1. 앱 구조 생성mkdir -p ~/Applications/ScreenPipe.app/Contents/MacOS
# 2. 실행 스크립트 생성cat > ~/Applications/ScreenPipe.app/Contents/MacOS/ScreenPipe << 'EOF'#!/bin/bashexec ~/.local/bin/screenpipe \ --ignored-windows "1Password,Keychain" \ -i "MacBook Pro 마이크 (input)" \ -i "MacBook Pro 스피커 (output)"EOF
chmod +x ~/Applications/ScreenPipe.app/Contents/MacOS/ScreenPipe
# 3. Info.plist 생성cat > ~/Applications/ScreenPipe.app/Contents/Info.plist << 'EOF'<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><dict> <key>CFBundleExecutable</key> <string>ScreenPipe</string> <key>CFBundleIdentifier</key> <string>com.screenpipe.wrapper</string> <key>CFBundleName</key> <string>ScreenPipe</string> <key>LSUIElement</key> <true/></dict></plist>EOF이제 ~/Applications/ScreenPipe.app을 더블클릭하면 권한 요청 팝업이 뜨고, 허용하면 시스템 설정의 화면 녹화 권한 목록에 추가됩니다.

자동 시작 설정
시스템 설정에서 로그인 항목으로 추가합니다:
- 시스템 설정 > 일반 > 로그인 항목 이동
- ”+” 버튼 클릭
~/Applications/ScreenPipe.app선택

설정 옵션 정리
| 옵션 | 설명 |
|---|---|
--ignored-windows | 녹화 제외할 창 (1Password 등 민감한 앱) |
-i "장치명 (input)" | 마이크 입력 |
-i "장치명 (output)" | 시스템 오디오 출력 |
오디오 장치 목록 확인:
screenpipe audio listClaude Code Skill 구조
Skill이란?
Claude Code Skill은 반복되는 워크플로우를 자연어로 실행할 수 있게 해주는 기능입니다. .claude/skills/ 폴더에 SKILL.md 파일을 만들면 됩니다.
SKILL.md 구조
---name: daily-digestdescription: ScreenPipe 데이터를 분석하여 일일 활동을 요약하고 Notion에 저장한다. "/daily-digest", "오늘 하루 정리해줘", "일일 요약해줘" 등의 요청 시 사용한다.---
# Daily Digest
ScreenPipe에서 수집된 컨텍스트를 분석하여 일일 활동을 요약하고 Notion "일기" DB에 저장한다.
## Workflow
1. 환경변수 로드2. 오늘 날짜의 기존 페이지 확인3. ScreenPipe 컨텍스트 수집4. 데이터 분석 및 요약 생성5. Notion 저장 (새로 생성 또는 기존 페이지 업데이트)
## Step 1: 환경변수 로드...(중략)...핵심 포인트:
description에 트리거 문구를 명시하면 Claude가 자동으로 스킬을 인식- Workflow는 Claude가 따라야 할 단계별 지침
- 각 Step에서 사용할 스크립트와 참조 문서를 명시
폴더 구조
.claude/skills/daily-digest/├── SKILL.md # 스킬 정의 및 워크플로우├── .env # 환경변수 (Notion 토큰)├── scripts/│ ├── collect-all.sh # 전체 수집 (OCR + 오디오)│ ├── ocr-by-app.sh # 앱별 OCR 텍스트│ ├── audio-transcript.sh # 오디오 트랜스크립션│ ├── get-time-range.sh # 시간대 라벨 추출│ ├── notion-create-page.sh # 페이지 생성 (curl)│ └── notion-add-blocks.sh # 블록 추가 (curl)└── references/ └── notion-format.md # Notion API 형식 가이드데이터 수집 스크립트
ScreenPipe는 SQLite DB(~/.screenpipe/db.sqlite)에 데이터를 저장합니다.
앱별 OCR 텍스트 수집 (ocr-by-app.sh):
#!/bin/bashDB="$HOME/.screenpipe/db.sqlite"TODAY=$(date +%Y-%m-%d)
echo "=== OCR by App (${TODAY}) ==="
sqlite3 "$DB" "SELECT COALESCE(NULLIF(f.app_name, ''), 'Unknown') as app, COUNT(*) as countFROM ocr_text oJOIN frames f ON o.frame_id = f.idWHERE date(f.timestamp) = '$TODAY' AND length(o.text) > 10GROUP BY f.app_nameORDER BY count DESC;"실행하면 이런 결과가 나옵니다:
=== OCR by App (2025-12-24) ===Antigravity|2363Dia|1019Notion|209시스템 설정|65카카오톡|58Notion 연동: MCP에서 curl로
처음엔 MCP로 시도했다
처음에는 Notion MCP 서버를 사용해서 Claude가 직접 API를 호출하도록 구성했습니다:
{ "mcpServers": { "notion": { "command": "npx", "args": ["-y", "@notionhq/notion-mcp-server"], "env": { "OPENAPI_MCP_HEADERS": "{\"Authorization\": \"Bearer {TOKEN}\"}" } } }}이론적으로는 Claude가 mcp__notion__API-post-page를 호출하면 바로 페이지가 생성되는 깔끔한 구조였습니다.
MCP의 한계
실제로 써보니 몇 가지 문제가 있었습니다:
| 문제 | 설명 |
|---|---|
| 파라미터 미지원 | 아이콘 설정, relation 연결 등 일부 파라미터가 MCP 스키마에서 지원 안 됨 |
| 토큰 소모 | 매번 API 스키마를 컨텍스트에 로드해서 토큰을 많이 잡아먹음 |
| 서버 의존성 | MCP 서버가 실행 중이어야 함. 서버가 죽으면 스킬 전체가 동작 안 함 |
특히 아이콘이나 연결된 페이지(relation) 설정이 안 되는 게 치명적이었습니다. 결국 원하는 형태의 페이지를 만들 수가 없었어요. 이 부분을 디버깅하는 것보다는 MCP를 걷어내고 curl로 직접 Notion API를 호출하는 방식으로 해야겠다 싶었습니다.
curl 기반으로 전환
결국 MCP를 걷어내고 curl로 직접 Notion API를 호출하는 방식으로 바꿨습니다:
페이지 생성 스크립트 (notion-create-page.sh):
#!/bin/bashsource "$(dirname "$0")/../.env"
TITLE="${1:-$(date +%Y.%m.%d)}"DATETIME="${2:-$(date +%Y-%m-%dT%H:%M:%S+09:00)}"HIGHLIGHT="${3:-}"
RESPONSE=$(curl -s -X POST "https://api.notion.com/v1/pages" \ -H "Authorization: Bearer ${NOTION_TOKEN}" \ -H "Notion-Version: 2022-06-28" \ -H "Content-Type: application/json" \ -d '{ "parent": {"database_id": "'"${NOTION_DB_ID}"'"}, "properties": { "제목": {"title": [{"text": {"content": "'"${TITLE}"'"}}]}, "날짜": {"date": {"start": "'"${DATETIME}"'"}} } }')
echo "$RESPONSE" | python3 -c "import sys,json; print(json.load(sys.stdin).get('id', ''))"curl 방식의 장점:
| 항목 | MCP | curl |
|---|---|---|
| 파라미터 | 스키마에 정의된 것만 | API 전체 기능 사용 가능 |
| 토큰 | 스키마 로드로 소모 큼 | 스크립트라 토큰 소모 없음 |
| 의존성 | MCP 서버 필요 | 없음 (curl만 있으면 됨) |
| 재사용 | 스킬 내에서만 | 스크립트로 어디서든 사용 |
스크립트로 분리하니 테스트도 쉬워졌습니다. ./notion-create-page.sh "테스트" 한 줄이면 바로 확인할 수 있으니까요.
실제 사용
하루가 끝나면 Claude Code에서 자연어로 말하면 됩니다:
오늘 하루 요약해줘Skill의 description에 트리거 조건을 정의해두면, Claude가 자동으로 해당 스킬을 인식하고 실행합니다. /daily-digest 같은 명령어를 외울 필요 없이, 그냥 하고 싶은 말을 하면 됩니다.

Claude가 알아서:
- ScreenPipe 스크립트를 실행해서 오늘 데이터를 수집하고
- 개발/문서/커뮤니케이션 등으로 분류해서 요약하고
- curl로 Notion “일기” 데이터베이스에 페이지를 생성합니다

같은 날 여러 번 실행하면 시간대별로 구분해서 기록합니다:
[오전~오후]작업 내용[저녁~밤]작업 내용
데이터 보존기간 설정
ScreenPipe는 기본적으로 데이터를 무기한 보관합니다. 장기간 사용하면 디스크 용량이 부족해질 수 있어서, 오래된 데이터를 자동으로 정리하는 설정이 필요합니다.
데이터 저장 위치
| 항목 | 경로 | 설명 |
|---|---|---|
| 비디오 | ~/.screenpipe/data/*.mp4 | 화면 녹화 파일 |
| DB | ~/.screenpipe/db.sqlite | OCR/오디오 텍스트 |
정리 스크립트
비디오 파일과 DB 데이터를 함께 정리하는 스크립트입니다:
#!/bin/bash# 사용법: cleanup.sh [보존일수]
RETENTION_DAYS="${1:-3}"DB="$HOME/.screenpipe/db.sqlite"DATA_DIR="$HOME/.screenpipe/data"
CUTOFF_DATE=$(date -v-${RETENTION_DAYS}d +%Y-%m-%d)echo "기준일: ${CUTOFF_DATE} 이전 데이터 삭제"
# MP4 파일 삭제find "$DATA_DIR" -name "*.mp4" -mtime +${RETENTION_DAYS} -delete 2>/dev/null
# SQLite DB 정리sqlite3 "$DB" <<EOFDELETE FROM ocr_text WHERE frame_id IN ( SELECT id FROM frames WHERE date(timestamp) < '${CUTOFF_DATE}');DELETE FROM chunked_text_entries WHERE date(timestamp) < '${CUTOFF_DATE}';DELETE FROM frames WHERE date(timestamp) < '${CUTOFF_DATE}';DELETE FROM audio_chunks WHERE date(timestamp) < '${CUTOFF_DATE}';DELETE FROM video_chunks WHERE id NOT IN (SELECT DISTINCT video_chunk_id FROM frames);DELETE FROM chunked_text_index WHERE text_id NOT IN (SELECT text_id FROM chunked_text_entries);EOFcrontab 설정
매일 새벽 3시에 자동 실행되도록 설정합니다:
# crontab -e0 3 * * * ~/.screenpipe/cleanup.sh 3 >> ~/.screenpipe/cleanup.log 2>&1이렇게 설정하면 3일이 지난 데이터는 자동으로 삭제됩니다. 보존기간을 늘리려면 3을 원하는 일수로 변경하면 됩니다.
써보면서 다듬기 (2025.12.26 추가)
며칠 쓰다 보니 지침이 모호한 부분들이 보였습니다.
과거 날짜 지정
“어제 요약해줘”라고 하면 될 것 같은데, 스킬 지침에 날짜 파싱 규칙이 없어서 Claude가 헷갈려했습니다. 날짜 결정 로직을 명시하니까 “3일 전”, “12월 20일” 같은 요청도 잘 처리합니다.
덮어쓰기 컨펌
같은 날 다시 실행하면 기존 기록을 덮어쓰는데, 아무 경고 없이 진행돼서 불안했습니다. 기존 페이지 확인 → 경고 → 컨펌 단계를 추가했습니다.
KST 시간대
SQLite 쿼리가 UTC 기준이라 밤늦게 정리하면 날짜가 안 맞았습니다. 쿼리에 +9 hours 보정을 넣어서 해결했습니다.
마치며
에너지 부족으로 미뤄왔던 일일 기록을, 이제는 자연어 한마디로 자동화했습니다.
이번 작업의 핵심 삽질 2가지:
- macOS 권한 문제 → CLI를
.app래퍼로 감싸서 해결 - MCP 불안정 → curl 기반 스크립트로 전환
특히 MCP는 개념은 좋은데, 실제로 안정적으로 쓰려면 아직 손이 많이 갑니다. 단순한 API 호출이라면 그냥 curl이 낫습니다.
핵심은 내가 할 일을 최소화하는 것:
- 기억할 필요 없음 → ScreenPipe가 기록
- 정리할 필요 없음 → Claude가 분석
- 복붙할 필요 없음 → curl이 저장
Claude Code Skill은 이런 자동화에 정말 유용합니다. 반복되는 워크플로우가 있다면 Skill로 만들어보세요.
관련 콘텐츠
Claude Code 대화 기록 분석으로 스킬 자동화 기회 찾기
로컬에 쌓이는 Claude Code 대화 기록을 컨텍스트로 활용해 반복 패턴을 찾고, 이를 Claude Skill로 자동화하는 방법.
productivityClaude Code 스킬로 블로그 트래픽 리포트 자동화하기
GA 대시보드 들여다보는 대신 /ga-report 한 줄로 트래픽과 성능을 확인합니다. Google Analytics 연동부터 스킬 구현, 실제 성능 개선 사례까지 공유합니다.
productivityClaude Code로 포트폴리오 + 기술 블로그 운영하기
AI 코딩 에이전트와 협업하여 포트폴리오 + 기술 블로그를 구축한 경험을 공유합니다. 효과적인 협업 방식, 자동화 시스템 구현, 운영 워크플로우까지 다룹니다.