Skip to main content
Glama
README.md
# ๐Ÿฉธ T1D Manager (1ํ˜• ๋‹น๋‡จ ๊ด€๋ฆฌ MCP)

<p align="center">
  <img src="./t1d_mcp_icon.png" alt="T1D Manager Icon" width="200"/>
</p>

**์นด์นด์˜ค MCP Develop Competition (MCP Player 10) ์ถœํ’ˆ์ž‘**

1ํ˜• ๋‹น๋‡จ ํ™˜์ž์™€ ๋ณดํ˜ธ์ž๋ฅผ ์œ„ํ•œ **AI ์—์ด์ „ํŠธ ์„œ๋ฒ„**์ž…๋‹ˆ๋‹ค.
๋ณต์žกํ•œ ์„ค์ • ์—†์ด๋„ ์‹ค์‹œ๊ฐ„ ํ˜ˆ๋‹น ๊ด€๋ฆฌ์™€ ์•„ํ”ˆ ๋‚ (Sick Day) ์ผ€์–ด๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

---

## ๐Ÿ“‹ PlayMCP ๋“ฑ๋ก ์ •๋ณด

### ๐ŸŽฏ Lite ๋ฒ„์ „ (๊ฒฝ์—ฐ์šฉ - OAuth ๋ถˆํ•„์š”)

| ํ•ญ๋ชฉ | ๊ฐ’ |
|------|-----|
| **MCP ์ด๋ฆ„** | T1D Manager Lite |
| **MCP Endpoint** | `https://t1d-mcp-lite.fly.dev/mcp` |
| **๋„๊ตฌ ๊ฐœ์ˆ˜** | 3๊ฐœ |

**MCP ์„ค๋ช… (๋ณต์‚ฌ์šฉ)**:
> 1ํ˜• ๋‹น๋‡จ ํ™˜์ž์™€ ๋ณดํ˜ธ์ž๋ฅผ ์œ„ํ•œ AI ํ˜ˆ๋‹น ๊ด€๋ฆฌ ๋„์šฐ๋ฏธ์ž…๋‹ˆ๋‹ค. ์ธ์А๋ฆฐ ์šฉ๋Ÿ‰ ๊ณ„์‚ฐ(ISF/ICR ๊ธฐ๋ฐ˜), ISPAD/ADA ์ž„์ƒ ๊ฐ€์ด๋“œ๋ผ์ธ ๊ธฐ๋ฐ˜ ์•„ํ”ˆ ๋‚ (Sick Day) ์ผ€์–ด, ๋„ค์ด๋ฒ„/๋‹ค์Œ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๊ฒ€์ƒ‰์œผ๋กœ ๋‹น๋‡จ ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ฟ€ํŒ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. OAuth ์„ค์ • ์—†์ด ๋ฐ”๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

---

### ๐Ÿ” Full ๋ฒ„์ „ (Dexcom OAuth ํฌํ•จ)

| ํ•ญ๋ชฉ | ๊ฐ’ |
|------|-----|
| **MCP ์ด๋ฆ„** | T1D Manager |
| **MCP Endpoint** | `https://t1d-mcp.fly.dev/mcp` |
| **๋„๊ตฌ ๊ฐœ์ˆ˜** | 6๊ฐœ |

**MCP ์„ค๋ช… (๋ณต์‚ฌ์šฉ)**:
> 1ํ˜• ๋‹น๋‡จ ํ™˜์ž์™€ ๋ณดํ˜ธ์ž๋ฅผ ์œ„ํ•œ AI ํ˜ˆ๋‹น ๊ด€๋ฆฌ ๋„์šฐ๋ฏธ์ž…๋‹ˆ๋‹ค. Dexcom CGM ์‹ค์‹œ๊ฐ„ ์—ฐ๋™(OAuth 2.0)์œผ๋กœ ํ˜„์žฌ ํ˜ˆ๋‹น๊ณผ ์ถ”์„ธ๋ฅผ ํ™•์ธํ•˜๊ณ , ISPAD/ADA ์ž„์ƒ ๊ฐ€์ด๋“œ๋ผ์ธ ๊ธฐ๋ฐ˜ ์•„ํ”ˆ ๋‚ (Sick Day) ์ผ€์–ด ๋ฐ ์ธ์А๋ฆฐ ๊ณ„์‚ฐ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋„ค์ด๋ฒ„/๋‹ค์Œ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๊ฒ€์ƒ‰์œผ๋กœ ๋‹น๋‡จ ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ฟ€ํŒ๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

---

## ๐Ÿ› ๏ธ ๋„๊ตฌ ๋ชฉ๋ก

### ํ•ต์‹ฌ ๋„๊ตฌ (Lite/Full ๊ณตํ†ต)

| ๋„๊ตฌ | ์„ค๋ช… |
|------|------|
| `calculate_insulin_dosage` | ํ˜ˆ๋‹น/ํƒ„์ˆ˜ํ™”๋ฌผ ๊ธฐ๋ฐ˜ ์ธ์А๋ฆฐ ์šฉ๋Ÿ‰ ๊ณ„์‚ฐ |
| `search_diabetes_community` | ๋„ค์ด๋ฒ„/๋‹ค์Œ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๊ฒ€์ƒ‰ (ํ™˜์ž ๊ฒฝํ—˜๋‹ด, ๊ฟ€ํŒ) |
| `analyze_sick_day_guidelines` | ISPAD/ADA ๊ธฐ๋ฐ˜ ์•„ํ”ˆ ๋‚  ์ผ€์–ด ๊ฐ€์ด๋“œ๋ผ์ธ |

### Dexcom ๋„๊ตฌ (Full ๋ฒ„์ „๋งŒ)

| ๋„๊ตฌ | ์„ค๋ช… |
|------|------|
| `get_dexcom_auth_url` | Dexcom OAuth ์ธ์ฆ URL ์ƒ์„ฑ |
| `get_cgm_sandbox` | Authorization Code๋กœ CGM ๋ฐ์ดํ„ฐ ์กฐํšŒ |
| `get_cgm_with_token` | Access Token์œผ๋กœ CGM ๋ฐ์ดํ„ฐ ์กฐํšŒ |

---

## ๐Ÿ’ฌ ๋Œ€ํ™” ์˜ˆ์‹œ

| ๋ฒˆํ˜ธ | ์˜ˆ์‹œ |
|------|------|
| 1 | ๋ฐฅ ๋จน์œผ๋ ค๋Š”๋ฐ ํƒ„์ˆ˜ํ™”๋ฌผ 60g์ด์•ผ. ์ธ์А๋ฆฐ ์–ผ๋งˆ๋‚˜ ๋งž์•„์•ผ ํ•ด? |
| 2 | ๋‚˜ ์—ด๋‚˜๊ณ  ํ† ํ–ˆ์–ด. ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ด? |
| 3 | ์ €ํ˜ˆ๋‹น ๊ฐ„์‹ ์ถ”์ฒœํ•ด์ค˜ |
| 4 | Dexcom ๋กœ๊ทธ์ธ ํ• ๋ž˜ (Full ๋ฒ„์ „) |

---

## โœจ ํ•ต์‹ฌ ๊ธฐ๋Šฅ

### 1. ๐Ÿฝ๏ธ ์Šค๋งˆํŠธ ์ธ์А๋ฆฐ ๊ณ„์‚ฐ
- **๊ธฐ๋Šฅ**: ํ˜ˆ๋‹น/ํƒ„์ˆ˜ํ™”๋ฌผ ์ž…๋ ฅ ์‹œ ์ •ํ™•ํ•œ ์ธ์А๋ฆฐ ์šฉ๋Ÿ‰๊ณผ ๊ต์œก ์ž๋ฃŒ๋ฅผ **๊ตฌ์กฐํ™”๋œ JSON**์œผ๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
- ํ• ๋ฃจ์‹œ๋„ค์ด์…˜ ์—†๋Š” ์ •ํ™•ํ•œ ๊ณ„์‚ฐ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

### 2. ๐Ÿฅ ์•„ํ”ˆ ๋‚  (Sick Day) ์ผ€์–ด
- **๊ธฐ๋Šฅ**: \"๋‚˜ ์—ด ๋‚˜๊ณ  ํ† ํ–ˆ์–ด\" โ†’ ISPAD/ADA ๊ฐ€์ด๋“œ๋ผ์ธ ๊ธฐ๋ฐ˜ ์œ„ํ—˜๋„ ๋ถ„์„ ๋ฐ ํ–‰๋™ ์ง€์นจ ์ œ๊ณต.
- **๋ฐ์ดํ„ฐ**: ์ˆ˜๋ถ„ ์„ญ์ทจ, ์ผ€ํ†ค ์ธก์ •, ์‘๊ธ‰์‹ค ๋ฐฉ๋ฌธ ๊ธฐ์ค€ ๋“ฑ ์•ˆ์ „ํ•œ ์˜๋ฃŒ ์ง€์นจ์„ ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค.

### 3. ๐Ÿ” ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ฒ€์ƒ‰
- **๊ธฐ๋Šฅ**: ๋„ค์ด๋ฒ„ ๋ธ”๋กœ๊ทธ(ํ™˜์ž ๊ฒฝํ—˜๋‹ด)์™€ ๋‹ค์Œ ์›น(์ •๋ณด)์„ ๋™์‹œ์— ๊ฒ€์ƒ‰ํ•˜์—ฌ ์‹ค์งˆ์ ์ธ ๊ฟ€ํŒ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

### 4. ๐Ÿ“Š Dexcom CGM ์‹ค์‹œ๊ฐ„ ์—ฐ๋™ (Full ๋ฒ„์ „)
- **๊ธฐ๋Šฅ**: Dexcom ๊ณต์‹ Developer API (OAuth 2.0) ์ง€์›์œผ๋กœ ์‹ค์‹œ๊ฐ„ ํ˜ˆ๋‹น ๋ฐ ์ถ”์„ธ ํ™•์ธ.

---

## ๐Ÿ› ๏ธ ๊ธฐ์ˆ  ์Šคํƒ & ๊ตฌ์กฐ
- **Core**: Python 3.12, `mcp` (Model Context Protocol), `FastMCP`
- **Transport**: **Streamable HTTP** (MCP ํ‘œ์ค€ ์ค€์ˆ˜)
- **Integrations**: Dexcom Developer API (OAuth), Naver/Kakao Search
- **Infra**: Docker, Fly.io

```
t1d-mcp/
โ”œโ”€โ”€ src/
โ”‚   โ”œโ”€โ”€ server.py          # Streamable HTTP Server Entrypoint
โ”‚   โ”œโ”€โ”€ main.py            # FastMCP Tool Definitions
โ”‚   โ”œโ”€โ”€ tools/
โ”‚   โ”‚   โ””โ”€โ”€ dexcom_tools.py  # Dexcom OAuth Tools (์กฐ๊ฑด๋ถ€ ๋กœ๋“œ)
โ”‚   โ”œโ”€โ”€ cgm/               # Dexcom Official API Client
โ”‚   โ”œโ”€โ”€ treatment/         # Sick Day Logic, Insulin Calc
โ”‚   โ””โ”€โ”€ community/         # Hybrid Search
โ””โ”€โ”€ tests/                 # ๋‹จ์œ„ ํ…Œ์ŠคํŠธ
```

---

## ๐Ÿš€ ์‹œ์ž‘ํ•˜๊ธฐ

### 1. ๋กœ์ปฌ ์‹คํ–‰
```bash
# ์˜์กด์„ฑ ์„ค์น˜ (uv ์‚ฌ์šฉ ๊ถŒ์žฅ)
uv sync

# ์„œ๋ฒ„ ์‹คํ–‰ (Streamable HTTP on port 8080)
uv run uvicorn src.server:app --host 0.0.0.0 --port 8080
```

### 2. MCP Inspector๋กœ ํ…Œ์ŠคํŠธ
```bash
# Lite ๋ฒ„์ „ (OAuth ์—†์Œ)
npx @modelcontextprotocol/inspector --transport http --server-url https://t1d-mcp-lite.fly.dev/mcp

# Full ๋ฒ„์ „ (Dexcom ํฌํ•จ)
npx @modelcontextprotocol/inspector --transport http --server-url https://t1d-mcp.fly.dev/mcp
```

---

## ๐Ÿ”ง ํ™˜๊ฒฝ ์„ค์ •

### Lite ๋ฒ„์ „ (๊ธฐ๋ณธ)
Dexcom ๋„๊ตฌ ์—†์ด ํ•ต์‹ฌ 3๊ฐœ ๋„๊ตฌ๋งŒ ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.

```bash
# fly.lite.toml
ENABLE_DEXCOM = "false"
```

### Full ๋ฒ„์ „
Dexcom OAuth ๋„๊ตฌ๊นŒ์ง€ ๋ชจ๋‘ ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.

```bash
# fly.toml (๊ธฐ๋ณธ๊ฐ’)
ENABLE_DEXCOM = "true"  # ๋˜๋Š” ๋ฏธ์„ค์ •
```

---

## ๐Ÿ“… To-Do / Roadmap

### ์™„๋ฃŒ๋จ
- [x] SSE โ†’ Streamable HTTP ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜
- [x] Sick Day ๊ฐ€์ด๋“œ๋ผ์ธ ๋„๊ตฌ ๊ฐœ์„  (JSON ๊ตฌ์กฐํ™”, ์˜ํ•™์  ๊ทผ๊ฑฐ ๋ณด๊ฐ•)
- [x] Fly.io ๋ฐฐํฌ ์™„๋ฃŒ
- [x] Dexcom Developer Portal ์•ฑ ๋“ฑ๋ก (Sandbox)
- [x] Legacy ID/PW ๋„๊ตฌ ์ œ๊ฑฐ (์‹ฌ์‚ฌ ๊ธฐ์ค€ ์ค€์ˆ˜)
- [x] ๋„๊ตฌ ์ตœ์ ํ™” (9๊ฐœ โ†’ 6๊ฐœ)
- [x] Lite/Full ๋ฒ„์ „ ๋ถ„๋ฆฌ (ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๊ธฐ๋ฐ˜)

### ์˜ˆ์ •
- [ ] Dexcom Production ํ™˜๊ฒฝ ํ…Œ์ŠคํŠธ
- [ ] ์˜์–‘์ •๋ณด API ์—ฐ๋™ (FoodSafetyKorea ๋“ฑ ์™ธ๋ถ€ API)

---

## โš ๏ธ ๋ฉด์ฑ… ์กฐํ•ญ (Medical Disclaimer)
> ๋ณธ ์„œ๋น„์Šค๋Š” ์˜๋ฃŒ ๊ธฐ๊ธฐ๊ฐ€ ์•„๋‹ˆ๋ฉฐ, ์ œ๊ณต๋˜๋Š” ์ •๋ณด๋Š” ์ฐธ๊ณ ์šฉ์ž…๋‹ˆ๋‹ค.
> ์˜ํ•™์  ๊ฒฐ์ •์€ ๋ฐ˜๋“œ์‹œ ๋‹ด๋‹น ์˜๋ฃŒ์ง„๊ณผ ์ƒ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
> ์ธ์А๋ฆฐ ์šฉ๋Ÿ‰ ๊ณ„์‚ฐ์ด๋‚˜ Sick Day ๊ด€๋ฆฌ๋Š” ํ™˜์ž์˜ ๊ฐœ๋ณ„ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

### ๐Ÿ“š ๊ด€๋ จ ๋ฌธ์„œ
- [DEPLOYMENT.md](./DEPLOYMENT.md): Fly.io ๋ฐฐํฌ ๊ฐ€์ด๋“œ
- [GUIDELINE.md](./GUIDELINE.md): MCP ์„œ๋ฒ„ ์ƒ์„ฑ ๊ฐ€์ด๋“œ ๋ฐ ์‹ฌ์‚ฌ ์ •์ฑ