Care Mate AI MCP
by songjinseon1
README.md
# Care Mate AI MCP
> **AI가 함께하는 평생 건강 파트너**
> 병원 진료 이후의 문진, 재활운동, 회복 추적, 재방문 판단, 의료진 리포트를 하나의 흐름으로 연결하는 한국어 MCP 서버
Care Mate AI는 2026 카카오 **AGENTIC PLAYER 10** 출품을 위한 실행 가능한 MVP입니다. 답변만 하는 챗봇이 아니라 같은 `user_id`의 문진과 일별 회복 기록을 연결하여 다음 행동을 수행하는 Agentic AI 도구입니다.
## 심사 포인트
- **연속 관리:** 문진 → 기록 → 운동 → 회복 분석 → 재방문 → EMR 리포트가 하나의 사용자 여정으로 연결됩니다.
- **Human First Safety:** 응급 신호를 항상 먼저 선별하고, 위험 시 운동 추천을 자동 보류합니다.
- **설명 가능한 판단:** 위험 점수뿐 아니라 감지 근거와 권장 행동을 함께 반환합니다.
- **즉시 체험:** LLM API 키 없이도 결정론적 도구가 동작하므로 PlayMCP/Kakao Tools에서 빠르고 안정적으로 시연할 수 있습니다.
- **확장 가능:** 현재 SQLite 저장소를 PostgreSQL/EMR API/카카오 알림 어댑터로 교체할 수 있는 서비스 구조입니다.
## 제공 도구
| MCP Tool | 역할 | 상태 변경 |
|---|---|---|
| `detect_risk` | 응급·고위험 신호 우선 선별 | 없음 |
| `analyze_symptom` | AI 문진, 위험도, 추가 질문, 의료진 요약 | 문진 저장 |
| `log_pain` | 통증·붓기·움직임·걸음 수 기록 | 일별 기록 저장/갱신 |
| `recommend_exercise` | 단계별 운동·용량·중단 기준 추천 | 없음 |
| `analyze_recovery` | 이전/최근 구간 비교와 차트 데이터 | 없음 |
| `plan_visit` | 악화 추세에 따른 재방문 우선순위 | 없음 |
| `generate_clinical_report` | EMR 붙여넣기용 환자 자기보고 요약 | 없음 |
| `manage_reminder` | 운동·기록·예약 알림 생성/조회/완료 | 알림 저장/갱신 |
| `coach_nutrition` | 알레르기·기저질환을 고려한 일반 영양 행동 | 없음 |
| `daily_health_coach` | 수면·걷기·수분·운동 기반 오늘의 행동 | 없음 |
MCP resource `caremate://safety-policy`와 전체 여정을 지시하는 `rehabilitation_journey` prompt도 제공합니다.
## 로컬 실행
Python 3.11 이상이 필요합니다.
```powershell
py -m venv .venv
.venv\Scripts\Activate.ps1
python -m pip install -e ".[dev]"
caremate-mcp
```
Streamable HTTP MCP 주소는 다음과 같습니다.
```text
http://localhost:8000/mcp
```
MCP Inspector로 확인:
```powershell
npx -y @modelcontextprotocol/inspector
```
Inspector의 연결 주소에 `http://localhost:8000/mcp`를 입력합니다.
## Docker 실행
```powershell
docker compose up --build
```
운영 배포 시 `/app/data` 볼륨을 유지하거나 `Database` 어댑터를 PostgreSQL로 교체해야 합니다. PlayMCP에는 TLS가 적용된 공개 URL `https://<your-domain>/mcp`를 등록합니다.
## 3분 데모 시나리오
PlayMCP 또는 MCP Inspector에서 모든 호출에 `user_id: "demo-knee-001"`을 사용합니다.
1. `detect_risk`
```json
{"symptom":"계단을 내려갈 때 무릎이 아파요","pain":6,"red_flags":[]}
```
2. `analyze_symptom`
```json
{"user_id":"demo-knee-001","symptom":"계단을 내려갈 때 오른쪽 무릎 앞쪽 통증","pain":6,"duration_days":14,"body_part":"무릎","red_flags":[]}
```
3. `log_pain`을 서로 다른 날짜로 3~4회 호출
```json
{"user_id":"demo-knee-001","pain":7,"swelling":2,"mobility":4,"steps":3200,"recorded_on":"2026-07-07"}
```
```json
{"user_id":"demo-knee-001","pain":5,"swelling":1,"mobility":6,"steps":4800,"recorded_on":"2026-07-10"}
```
```json
{"user_id":"demo-knee-001","pain":3,"swelling":0,"mobility":8,"steps":6100,"recorded_on":"2026-07-13"}
```
4. `recommend_exercise`
```json
{"user_id":"demo-knee-001","body_part":"무릎","pain":3,"phase":"회복","diagnosis":"무릎 염좌","contraindications":[]}
```
5. `analyze_recovery`, `plan_visit`, `generate_clinical_report` 순서로 호출합니다.
마지막 메시지: **“병원 밖에서도 AI가 회복을 함께합니다.”**
### 안전성 반전 데모
차별성을 짧게 보여주려면 다음을 `detect_risk`에 입력합니다.
```json
{"symptom":"허리가 아프고 갑자기 다리 힘이 빠지며 소변이 안 나와요","pain":8,"red_flags":["다리 힘이 빠짐","배뇨 장애"]}
```
결과는 `risk: "응급"`, `exercise_allowed: false`이며, 같은 내용을 `recommend_exercise`의 `contraindications`로 전달하면 추천이 자동 보류됩니다.
## 테스트
```powershell
python -m pytest -q
```
테스트는 응급 신호 차단, 회복 추세, EMR 리포트, 저위험 운동 추천을 검증합니다.
## 운영 전 필수 보강
이 저장소는 공모전 MVP이며 의료기기가 아닙니다. 실제 환자 대상 운영 전에는 다음이 필요합니다.
- 의료진 검수 운동 프로토콜과 버전 관리
- 개인정보 보호법에 맞춘 동의, 철회, 보유 기간, 삭제 및 접근통제
- 전송/저장 암호화, 사용자별 인증·인가, 감사 로그, 비밀정보 관리
- 의료기기 해당 여부 및 광고·의료법 관련 법률 검토
- 응급 문구 임상 검수, 오탐/미탐 모니터링, human escalation
- EMR/카카오 알림 연동 시 명시적 사용자 동의와 기관별 API 계약
## 환경 변수
| 이름 | 기본값 | 설명 |
|---|---|---|
| `CAREMATE_DB_PATH` | `./data/caremate.db` | SQLite 파일 경로 |
| `CAREMATE_HOST` | `0.0.0.0` | 서버 바인드 주소 |
| `CAREMATE_PORT` | `8000` | 서버 포트 |
## 구조
```text
src/caremate/
├── server.py # MCP 도구·리소스·프롬프트 및 HTTP transport
├── service.py # 연속 관리 비즈니스 로직
├── safety.py # 위험 신호와 운동 차단 정책
├── db.py # 영속 저장소
└── models.py # 입력 검증 모델
tests/
└── test_service.py
```
## 면책
Care Mate AI는 진단이나 처방을 대신하지 않습니다. 증상이 악화되거나 판단이 어려우면 의료기관에 문의해야 하며, 응급 증상은 119 또는 응급실을 이용해야 합니다.
This server cannot be deployed
Maintenance
ActivitySlowing
ResponsivenessNo issues