지난번에 LLM Wiki + Telegram Bot을 만들었다. Claude Code가 개인 위키를 관리하고, Telegram으로 원격 조종하는 구조였다. 이번에는 여기에 Microsoft 365 연동을 붙였다. 회사 메일, 캘린더, Teams 대화를 자동으로 가져와서 위키에 쌓고, 중요한 건 Telegram으로 알려주는 시스템이다.
문제: 정보가 흩어져 있다
하루에 확인해야 할 채널이 너무 많다. Outlook 메일, Teams 채팅, 캘린더 일정이 각각 다른 앱에 흩어져 있다. 중요한 메시지를 놓치거나, “오늘 뭐 해야 하지?” 하고 여러 앱을 번갈아 열어보는 시간이 아깝다.
원하는 건 단순하다:
- 메일, 캘린더, Teams를 한 곳에 모아서 보고
- 중요한 건 알아서 알려주고
- 나머지는 나중에 찾을 수 있게 쌓아두기
해결: mogcli + Claude + Telegram
mogcli라는 오픈소스 CLI 도구를 발견했다. Microsoft Graph API를 래핑해서, 터미널에서 메일/캘린더/Teams를 조작할 수 있다. 이걸 5분마다 자동 실행하고, Claude가 중요도를 판단해서 Telegram으로 알려주는 파이프라인을 만들었다.
전체 구조
systemd timer (5분 주기)
|
v
m365-sync.sh (bash 스크립트)
|
+-- mogcli: 메일, 캘린더 가져오기
+-- Graph API: Teams 대화 가져오기
|
v
raw/m365/ (JSON 원본 축적)
|
+-- latest-mail.json (항상 최신)
+-- latest-calendar.json
+-- latest-teams.json
+-- 2026-04-16/ (일별 히스토리)
| mail-1043.json
| calendar-1043.json
| teams-1043.json
|
v
새 메시지 감지 (이전 스냅샷과 비교)
|
v
claude -p --model haiku (중요도 판단)
|
+-- 중요하면 --> Telegram 알림
+-- 아니면 --> 조용히 넘어감
|
v
Claude가 위키에 ingest (CLAUDE.md 규칙에 따라)
1단계: mogcli 설치
mogcli는 Go로 작성되어 있어서 go install로 바로 설치할 수 있다.
# Go 설치 (mise 사용)
mise use -g go@latest
# mogcli 설치
go install github.com/jaredpalmer/mogcli/cmd/mog@latest
2단계: Microsoft Entra 앱 등록
mogcli가 회사 Microsoft 365에 접근하려면 Entra(구 Azure AD)에 앱을 등록해야 한다.
- entra.microsoft.com에서 App registrations > New registration
- Authentication 탭에서:
- Mobile and desktop applications 플랫폼 추가
https://login.microsoftonline.com/common/oauth2/nativeclient체크- Settings 탭에서 Allow public client flows > Yes
- API permissions에서 Microsoft Graph Delegated 권한 추가:
Mail.Read,Calendars.Read,Contacts.Read,Tasks.Read,User.Read- Teams용:
Chat.Read,ChannelMessage.Read.All
- Grant admin consent 클릭 (Teams 권한에 필요)
3단계: 인증
mog auth
# Application (client) ID 입력
# Tenant ID 입력
# 브라우저에서 디바이스 코드 인증 완료
인증이 완료되면 바로 사용할 수 있다:
# 메일 가져오기
mog mail list --max 20 --json
# 이번 주 캘린더
mog calendar list --from 2026-04-14 --to 2026-04-20 --json
Teams는 mogcli에서 아직 지원하지 않아서, mogcli의 토큰을 꺼내서 Graph API를 직접 호출한다:
TOKEN=$(cat ~/.config/mogcli/keyring/... | python3 -c "import sys,json; print(json.load(sys.stdin)['access_token'])")
curl -s -H "Authorization: Bearer $TOKEN" \
"https://graph.microsoft.com/v1.0/me/chats?\$top=10&\$expand=lastMessagePreview"
4단계: 5분마다 자동 수집
bash 스크립트를 만들어서 systemd user timer로 5분마다 실행한다.
# systemd service
# ~/.config/systemd/user/m365-sync.service
[Unit]
Description=Microsoft 365 Sync
[Service]
Type=oneshot
ExecStart=/home/user/llmwiki/bot/m365-sync.sh
# systemd timer
# ~/.config/systemd/user/m365-sync.timer
[Unit]
Description=Microsoft 365 Sync every 5 minutes
[Timer]
OnBootSec=1min
OnUnitActiveSec=5min
Persistent=true
[Install]
WantedBy=timers.target
# 활성화
systemctl --user daemon-reload
systemctl --user enable --now m365-sync.timer
스크립트는 매번:
- 메일, 캘린더, Teams 원본 JSON을
raw/m365/에 축적 latest-*.json으로 최신 스냅샷 유지- 이전 스냅샷과 비교하여 새 메시지 감지
- 내가 보낸 메시지, 뉴스레터, GitLab 알림 등은 자동 필터링
5단계: Claude가 중요도 판단
여기가 핵심이다. 키워드 매칭이 아니라, Claude가 내용을 읽고 판단한다.
# 새 메시지를 Claude에게 파이프
echo "$NEW_MESSAGES" | claude -p --model haiku \
"이 메시지들 중 즉시 확인해야 할 중요한 것이 있는지 판단하라.
중요하면 Telegram 알림 메시지를 작성하라.
출처를 명시하라 (메일/Teams).
중요한 게 없으면 NONE만 출력하라."
Claude(haiku 모델)가 빠르게 판단해서:
- 팀원의 업무 요청, 장애 보고, 미팅 변경 등은 알림
- 광고, 뉴스레터, 단순 정보 공유는 무시
알림이 결정되면 Telegram Bot API로 발송한다. 각 메시지에 출처(메일/Teams)가 명시되어 있어서, 어디서 온 건지 바로 알 수 있다.
6단계: Claude가 위키에 정리
축적된 raw JSON은 Claude가 위키에 정리한다. CLAUDE.md에 ingest 규칙을 정의해두면, Claude가 대화 중에 자연스럽게 데이터를 읽고 일간 노트에 정리한다:
- 오늘 일정을 타임라인으로 표시
- 중요 메일만 필터링하여 목록
- Teams 대화에서 액션 아이템 추출
- 할 일 목록 업데이트
결과
이제 아침에 Telegram만 확인하면 된다. 중요한 메일이나 Teams 메시지가 오면 Claude가 알아서 판단해서 알려준다. Outlook이나 Teams 앱을 열지 않아도, 놓치는 게 없다.
raw 데이터는 날짜별로 쌓이니까, 나중에 “지난주에 누가 뭐라고 했더라?” 같은 질문에도 Claude가 검색해서 답해줄 수 있다.
지난번 LLM Wiki + Telegram Bot이 “내가 Claude에게 물어보는” 구조였다면, 이번에는 “Claude가 먼저 알려주는” 구조가 추가된 셈이다. 수동 질의에서 능동 알림으로.
사용한 도구
- mogcli – Microsoft Graph CLI (Go, MIT)
- Claude Code – CLI에서 claude -p로 파이프 분석
- systemd user timer – 5분 주기 실행
- Telegram Bot API – 알림 발송
- Microsoft Entra – 앱 등록 및 OAuth 인증