AI 코치 구축하기: MCP를 통해 Claude와 Garmin, Yazio, FitDays 연결 및 Git 레포지토리를 메모리로 활용한 방법
요약
사용자가 가진 다양한 건강 데이터(Garmin, Yazio 등)를 Claude AI와 연결하여 개인 맞춤형 코치 시스템을 구축하는 방법을 설명합니다. MCP(Model Context Protocol) 서버와 Git 레포지토리를 메모리 및 규칙 저장소로 활용하며, 이를 통해 실시간으로 데이터를 분석하고 의사결정을 내리는 AI 에이전트를 구현할 수 있습니다.
핵심 포인트
- MCP를 이용해 여러 외부 데이터 소스(Garmin, Yazio 등) 연결 가능
- Git 레포지토리를 영구 메모리 및 규칙 저장소로 활용하는 것이 핵심
- AI 코치는 역할 정의와 명확한 규칙을 부여받아 전문성을 갖춤
- 시스템은 데이터를 읽고 계획을 세우며 캘린더에 동기화하는 기능을 수행
시작점
제 Garmin 시계는 제가 얼마나 잤는지 알고 모든 건강 지표를 추적하며, Yazio는 제가 무엇을 얼마나 먹었는지 알고, 제 FitDays 체중계는 제가 얼마나 나가는지 그리고 (대략적으로) 근육량이 얼마나 되는지 알고 있습니다.
저는 이 데이터를 가지고 있었지만 아무도 읽어낼 수 없었습니다. 이를 유용한 것(식단 계획, 훈련 프로그램, '왜 개선되지 않는가?'에 대한 답변 등)으로 바꾸려면 수면 시간, 칼로리, 체중을 교차 참조하여 의사결정(영양사, 개인 트레이너의 역할)으로 만들어 줄 사람이 필요합니다. 그래서 저는 스스로에게 질문했습니다. 만약 AI가 이 읽기 작업을 제가 가진 실제 수치들로 수행하고 제 질문에 실시간으로 답변해 준다면 어떨까?
그래서 저는 Claude를 MCP(Model Context Protocol)를 통해 이 세 가지 모두와 연결했고, 명확한 역할(영양사 및 개인 트레이너), 작성된 규칙, Git 레포지토리에 저장되는 영구 메모리, 그리고 반복 작업을 위한 일련의 명령어들을 부여했습니다. 그 결과는 제 실제 데이터를 읽고, 계획을 작성하며, 이를 Garmin 캘린더에 동기화하고, 모든 결정의 이유를 기억하는 AI 코치입니다.
이 글에서는 다음 내용을 다룹니다:
- MCP 서버 연결 방법 (MyFitnessPal 또는 Renpho 체중계를 사용하는 경우 대안 포함);
- 일반적인 챗봇을 코치로 변신시키는
CLAUDE.md파일; - 파일 기반 메모리 작동 방식과 이것이 가장 중요한 이유;
- 제가 매일, 그리고 매주 사용하는 슬래시 명령어들
참고: 저는 이탈리아인이기 때문에 레포지토리의 원본 프롬프트와 파일 이름은 이탈리아어입니다. 본문의 스니펫들은 번역되었습니다.
아키텍처: 세 가지 진실의 출처와 기억하는 레포지토리
이 시스템은 두 개의 절반으로 구성되어 있습니다:
- 첫 번째는 Claude가 제 데이터에 읽기 및 쓰기 접근 권한을 제공받는 MCP 서버입니다.
- 두 번째는 뇌이자 메모리 역할을 하는 단순한 Git 레포지토리입니다. Claude는 매 세션 시작 시 이를 읽고, 끝날 때 업데이트합니다.
각 서버는 하나의 도메인을 소유하며, 코치는 이들을 혼동해서는 안 됩니다:
| 도메인 | 출처 | 제공 정보 |
|---|---|---|
| 활동 및 회복 (Activity and recovery) | Garmin | 운동(workouts), 수면(sleep), HRV, 안정 시 심박수(resting heart rate), 바디 배터리(body battery), 훈련 상태(training status) |
| ... | ||
| The repo는 다음과 같습니다: |
coach_planner/
├── CLAUDE.md # 역할(role), 규칙(rules), 주의사항(red flags):
Garmin 서버는 설정에 인증 정보가 필요하지 않습니다. 저장된 토큰을 사용하기 때문입니다. 만약 110개의 도구가 컨텍스트를 범람시킨다면, `GARMIN_ENABLED_TOOLS` 변수를 사용하여 필요한 도구만 허용 목록(allowlist)으로 전달할 수 있습니다.
### 대안: MyFitnessPal 및 Renpho
다른 앱을 사용한다면 시스템은 동일하게 작동합니다. 변경되는 것은 `CLAUDE.md`에서 참조하는 도구 이름과 명령어뿐입니다.
- **MyFitnessPal** → [AdamWalt/myfitnesspal-mcp-python](https://github.com/AdamWalt/myfitnesspal-mcp-python). 다이어리, 측정값, 운동 및 물을 읽고 작성합니다. Yazio보다 나은 점은 `mfp_set_goals`를 가지고 있어 코치가 칼로리와 매크로 목표(macro targets)를 자체적으로 업데이트할 수 있다는 것입니다. Python 3.10–3.12가 필요하며, 가급적 로그인된 브라우저 세션의 쿠키를 사용하여 인증해야 합니다.
- **Renpho** → [StartupBros-com/renpho-mcp-server](https://github.com/StartupBros-com/renpho-mcp-server). 전신 체성분, N일간의 추세(trends), 그리고 동기화되지 않은 측정값에 대한 진단 도구를 제공합니다. Renpho Health 앱(레거시 버전 아님)과 작동하며, 레포지토리를 클론하고 빌드하여 설치해야 합니다.
## CLAUDE.md: 챗봇에서 코치로
데이터를 연결하는 것은 쉬운 부분입니다. 지침이 없다면, 앱에 접근할 수 있는 Claude는 일반적인 내용을 알려주는 훌륭한 분석가일 뿐입니다. `CLAUDE.md`는 제가 Claude에게 자신이 누구인지, 무엇을 할 수 있는지, 그리고 가장 중요하게는 무엇을 해서는 안 되는지를 알려주는 곳입니다. 차이를 만든 부분들은 다음과 같습니다.
### 시작 의식과 끝 의식
모든 세션은 프로필, 현재 계획, 로그의 마지막 줄, 그리고 모든 학습 내용을 읽는 것으로 시작합니다. 그리고 항상 같은 방식으로 끝납니다:
Session close — ALWAYS
memoria/DIARIO.md에 최대 8줄.- 계획 변경 시 →
archivio/YYYY-MM-DD-*.md로 아카이브하고,CORRENTE.md를 재작성합니다.
...
이것이 메모리를 신뢰할 수 있게 만드는 요소입니다. Claude가 저장하는 것을
제가 가장 좋아하는 부분은 목표(goals)에 관한 것입니다. 한 번에 하나의 주요 목표를 설정하고, 각각 측정 가능한 종료 기준을 가지며, 전환 과정이 명시적으로 처리됩니다:
- 한 번에 하나의 주요 목표만 가집니다. 만약 제가 활성화된 상태에서 새로운 목표를 요청하면,
중지합니다: 이전 목표를 닫거나 새 목표를 보류(ON HOLD)해야 합니다. 여러 개를 쌓지 마세요. - 충돌을 플래그 지정합니다. 칼로리 적자 + 최대 근력 증가, 또는 고볼륨
...```
이 규칙이 없으면 LLM은 당신의 기분을 맞춰주려는 경향이 있습니다: 근력과 체지방 감소를 요청하면 둘 다 제대로 처리하지 못하는 계획을 제시합니다.
작성 시 항상 확인 필요
코치는 Garmin에서 운동을 만들고 Yazio에서 음식을 기록할 수는 있지만, 스스로의 주도적인 판단으로는 절대 할 수 없습니다. 먼저 무엇을 작성하려는지 정확히 보여주고, 그 후에 저의 승인을 기다립니다. 만약 다섯 가지 작업이 있다면, 모두 나열하고 단일 확인을 요청하여 세션이
모든 'AI 코치'의 약점은 모든 대화가 처음부터 시작한다는 것입니다. 저는 이 문제를 목적별로 분할된 Markdown 파일을 사용하여 해결했습니다. 왜냐하면 단일 노트 파일은 몇 주 안에 읽기 어려워지기 때문입니다.
| File | Purpose | Rule |
|---|---|---|
memoria/DIARIO.md | 각 세션에서 발생한 일 | 추가 전용(append-only), 세션당 최대 8줄 |
| ... |
로그와 학습 내용 사이의 분리가 이 시스템의 핵심입니다. 로그는 연대기이며, 학습 내용은 지식입니다. 패턴은 최소 세 번 반복되었을 때만 로그에서 학습 내용으로 승격되며, 가설이 기각되면 그 상태가 보이도록 취소선 처리하고 그 아래에 새로운 내용을 추가합니다.
결정 파일(decisions file)에는 거부된 대안도 기록됩니다. 이는 관료주의처럼 들릴 수 있지만, 코치가 왜 이미 거절했는지 모른 채 두 달 후에 같은 아이디어를 다시 제안하는 것을 막아줍니다.
목표 파일(obiettivi.md) 역시 지속 가능하도록 설계되었습니다:
- ACTIVE: 하나의 목표를 가지며, 종료 기준과 검토 날짜가 있습니다. 비어 있으면 코치는 계획을 생성하기를 거부합니다.
- ON HOLD: 현재 추구하고 있지는 않지만 원하는 것(이유와 활성화에 필요한 전제 조건 포함).
- HISTORY: 모든 완료된 목표로, 그 결과와 종료 이유가 기록됩니다. 절대 삭제되지 않습니다.
마지막으로, CSV 파일 덕분에 Claude는 모든 계산을 위해 MCP 서버를 호출할 필요가 없습니다. 계획 수립 시 로컬 데이터를 기반으로 작동하며, 신선한 데이터가 필요할 때만 서버에 쿼리합니다. 시간이 지나 로그가 200줄을 초과하면, 주간 검토 명령어(weekly review command)가 오래된 항목들을 아카이브하고 월별 요약을 남깁니다.
명령어: 여덟 개의 파일로 구성된 전체 워크플로우
반복적인 작업은 .claude/commands/에 있으며, 명령어마다 하나의 Markdown 파일을 사용합니다. 이렇게 하면 매번 주간 검토를 위한 프롬프트를 다시 작성할 필요가 없고, 코치는 항상 같은 방식으로 작업을 수행하게 됩니다. (명령어 이름은 이탈리아어로 되어 있고, 번역은 대괄호 안에 있습니다.)
| 명령어 | 언제 | 기능 설명 |
|---|---|---|
/obiettivo (목표) | 방향이 바뀔 때 | 오리엔테이션 세션: 90일간의 데이터, 최대 5가지 질문, 현실 점검. 운동 계획 대신 작성된 목표를 가지고 떠나게 됩니다. |
| ... |
/nuovo-piano: 세 번의 개별 확인
가장 복잡한 명령어이자 가장 많은 체크포인트를 가진 명령어입니다. 먼저 다이어트 수치(TDEE, 목표, 매크로)를 보여주고 OK를 기다립니다. 다음으로 실제 프로그램이 아닌 훈련 유형을 제안하며, 각 유형에는 목표와 연결된 하나의 추론 라인이 있습니다:
각 제안된 유형에 대해, 이 목표에 왜 추천하는지 한 문장으로 설명하세요.
(예:
**형용사 대신 숫자를 쓰세요.** 저에게 '쉬운 달리기(Easy run)'는 170 bpm을 의미했습니다. 하지만 'Z2 달리기, HR < 145, 최대 40분'은 그렇지 않았습니다. 이는 Claude뿐만 아니라 저에게도 해당합니다.
**모델이 멈추게 하세요.** 가장 유용한 명령어들은 Claude가 멈춰서 질문해야 하는 지점을 가지고 있습니다: 프로그램 전의 유형들, 동기화 전의 달력, `/analisi`에서의 변경 사항 전의 보고서. 이것들이 없다면, LLM은 모든 것을 한 번에 생성하여 당신이 전체 패키지를 수락하도록 만듭니다.
**'아니요'라고 말할 권한을 주세요.** 칼로리 하한선, 위험 신호(red flags), 누락된 목표: 적절한 답변이 계획을 생성하지 않는 상황들이 있습니다. 이것은 명시적으로 작성되어야 하며, 그렇지 않으면 모델은 항상 당신을 만족시키는 방법을 찾아냅니다.
**답변에서 노이즈를 제거하세요.** '반복되는 면책 조항 없음, 모든 답변에 '전문가와 상담하십시오' 포함 금지'는 신중함을 덜 요구하는 것처럼 들립니다. 실제로는 그 반대입니다. 정확하게 정의된 위험 신호(red flags)를 통해 경고는 필요할 때 나오고 수백 개의 일반적인 경고 속에 묻히지 않습니다.
## 한계점 (Limits)
프로젝트를 복사하기 전에 몇 가지 솔직한 주의사항이 있습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기