mogee.
<< BACK
#ttapp#T봇#에이전트#MCP#CalDAV#Claude#개발기

ttapp에 T봇 에이전트를 붙였다 — 통합 관리자가 되기까지

DATE: 2026년 4월 20일TIME: 6분 읽기VIEWS: 1

왜 만들었나

ttapp은 원래 "모바일에서 데스크톱 Claude Code를 원격 조종하는" 도구였다. 내가 메시지를 보내면 맥이 실행하고 결과가 돌아온다. 개발용으로는 충분했는데, 쓰다 보니 한 가지가 계속 걸렸다.

"ttapp 안의 것들을 ttapp이 스스로 관리하게 할 수는 없을까?"

내 프로젝트, 핀, 자동화, 스케줄, 사용량, 그리고 얼마 전 붙인 이메일/캘린더 계정까지 — 이 모든 걸 하나의 에이전트가 통합 관리해주면 편할 텐데. 그래서 T봇(T-bot) 이라는 전용 에이전트를 하나 더 붙였다.

단순 비서가 아니다. ttapp 통합 관리자다.

무엇을 할 수 있나

T봇 채팅방에 들어가서 말만 하면 된다.

  • "매일 아침 8시에 오늘 일정이랑 메일 3개 요약해줘" → 스케줄 예약 + 브리핑 모드 자동 설정
  • "네이버 메일에서 쿠팡 주문 확인 메일 찾아줘" → IMAP 검색 → 본문 파싱
  • "내일 오후 3시에 '치과 예약' 캘린더에 넣어줘" → CalDAV 이벤트 생성
  • "ttapp 프로젝트 핀 중에 API 키만 보여줘" → Firestore 쿼리
  • "어제 자동화 알림이 몇 번 울렸어?" → usage 조회

실제로 한 달째 쓰고 있는데, 아침마다 브리핑이 오고 스케줄이 맞고 메일이 읽힌다. 진짜로 작동한다.

핵심 기능 7가지

1. 자연어 스케줄링

"매주 월수금 오전 9시에 주간 리포트 만들어줘" 같은 문장을 파싱해서 cron-like 예약을 만든다. repeat/weekdays/onceDate/endDate 다 지원.

2. 브리핑 모드

아침에 자동으로 켜지는 모드. Gmail/Calendar MCP를 능동적으로 호출해서 모바일 읽기 좋게 포맷한 요약을 푸시한다.

3. 이메일 통합 (SMTP/IMAP)

OAuth 없이 앱 비밀번호 하나로 Gmail, 네이버, 다음, 카카오, iCloud, Outlook 등 9개 도메인 자동 추론. nodemailer + imapflow + mailparser 조합. 첨부파일 다운로드, 스레드 체인 유지까지.

4. 캘린더 통합 (CalDAV)

역시 OAuth 없이 앱 비밀번호로 Google/iCloud/네이버/Daum. 기존 tsdav 라이브러리가 불안정해서 네이티브 fetch로 PROPFIND/REPORT/PUT/DELETE를 직접 구현했다.

5. TODO 핀

일반 핀과 별개로 체크박스 UI. TODO_DONE/TODO_UNDONE 명령어로 토글. 완료하면 strike-through.

6. 프로젝트/핀/메시지 통합 관리

ttapp 안의 모든 프로젝트, 핀, 메시지, 자동화 노드를 한 곳에서 조회하고 편집.

7. 알림 브리지

alert.type === 'tbot' 이면 일반 알림 대신 T봇 프로젝트에 user 메시지로 위임한다. 전체 T봇 플로우를 재사용.

제일 오래 삽질한 건 역시 인증 없는 캘린더/이메일

CalDAV는 RFC 4791 잘 읽고 iCal(RFC 5545) 포맷만 맞추면 된다. 근데 그게 은근히 까다롭다.

  • Floating time vs UTC: DTSTART는 floating(Z 없음), DTSTAMP는 UTC(Z 필수), REPORT time-range 필터는 또 UTC. 이 세 개 섞여 있다.
  • VALARM이 SUMMARY를 덮어쓰던 버그: 이벤트 제목이 "Alarm notification"으로 찍혔다. 정규식이 VEVENT 블록 안의 VALARM까지 파싱하고 있었던 것.
  • Google CalDAV URL: apidata.googleusercontent.com 이 아니라 www.google.com/calendar/dav/{email}/ 이다. 공식 문서가 오래돼서 검색으로도 잘 안 나온다.
  • 앱 비밀번호 공백: Google이 복사 편의를 위해 4자리씩 공백으로 보여주는데, 실제로는 공백 제거 후 사용해야 한다. 이거 때문에 반나절 날렸다.

그리고 AES-256-CBC 이중 모드 암호화. MCP(T봇)가 등록하면 AES로 암호화해서 저장, 모바일 UI에서 등록하면 plaintext로 저장. encrypted: true/false 플래그 하나로 복호화 스킵 분기. 덕분에 사용자는 모바일 설정에서 한 번 적으면 T봇이 바로 쓰고, T봇 채팅으로 등록해도 T봇이 바로 쓴다.

XML 태그에서 MCP stdio로

초기엔 <tbot_command>, <tbot_schedule>, <tbot_query> 같은 XML 태그로 T봇 도구를 호출했다. 파서가 간단해서 빨랐지만, 도구가 17개 넘어가니 시스템 프롬프트가 비대해지고 유지보수가 어려워졌다.

Phase 2에서 MCP stdio 서버로 전면 이전. desktop/ttapp-mcp/ 번들 패키지로 만들고 기동 시 ~/.claude.json에 자동 등록. 이메일 14개 + 캘린더 8개 + 알림 + 스케줄 + 프로젝트 + 핀 관리까지 총 43개 도구가 표준 MCP로 동작한다.

듀얼 모드(XML + MCP 병행)로 롤백 안전 장치도 뒀다. 한 번에 밀어버리기엔 너무 크니까.

지금까지 배운 것

  1. 에이전트는 "읽고 쓸 수 있는 도구"가 전부가 아니다. 위험 작업(삭제, 수정)은 확인 프롬프트가 필수다. T봇 시스템 프롬프트에 CRITICAL RULES로 박아놨다.
  2. OAuth 없이 가는 길이 의외로 실용적이다. 사용자가 앱 비밀번호 한 번만 발급받으면 나머지는 다 자동. Google은 OAuth보다 앱 비밀번호 쪽이 오히려 안 끊긴다.
  3. MCP로 이전하면 모델이 바뀌어도 안 깨진다. XML 파서는 모델이 약간만 포맷을 바꿔도 터졌는데, MCP는 스키마로 강제되니까 안정적이다.

앞으로

  • T봇 MCP 격리 강화 (현재 --dangerously-skip-permissions 때문에 소프트 격리만 돼 있음)
  • 이메일/캘린더 외 추가 통합 (Notion, Slack 등은 기존 연동 서비스 쪽에서)
  • 능동적 알림 (사용자가 요청 안 해도 중요한 변화 감지 시 푸시)

T봇은 내가 만든 것 중 가장 쓸만한 에이전트다. 단순히 "동작한다"가 아니라 매일 쓴다. ttapp을 만드는 이유 자체가 "모바일에서도 Claude를 일처럼 부리고 싶다" 였는데, 이제 ttapp 자체도 Claude가 대신 관리한다. 재귀적으로 유용하다.

열심히 만든 김에 기록을 남긴다.

이 글 공유하기

[X] X에 공유

// SPONSORED

[>]댓글

아직 댓글이 없어요. 첫 댓글을 남겨보세요!