Skip to main content
Glama
README.md
# plant-mcp

반려식물의 물주기와 상태를 기록하고 조회하는 **MCP(Model Context Protocol) 서버**입니다.
Claude Desktop에 연결하면 대화로 식물을 관리할 수 있습니다.

> "몬스테라 물 줬어" → 기록됨
> "오늘 뭐 목말라?" → 밀린 순서로 알려 줌
> "몬스테라 아랫잎이 노래져" → 관리 이력을 근거로 원인 추정

## 왜 MCP인가

식물 관리 앱은 이미 많습니다. 이 프로젝트의 목적은 앱을 하나 더 만드는 게 아니라,
**내 개인 데이터를 LLM이 직접 다룰 수 있는 형태로 노출**하는 것입니다.
사용자는 UI를 익힐 필요 없이 평소 말투로 기록하고, 조회하고, 상담합니다.

## MCP 3요소를 모두 사용

| 구성요소 | 이 프로젝트에서의 쓰임 |
|---|---|
| **Tools** (9개) | 등록·기록·수정·삭제·조회. LLM이 호출하는 동작 |
| **Resources** | `plant://{name}` — 식물 한 그루의 프로필을 JSON으로 노출 |
| **Prompts** | `diagnose` — 증상과 관리 이력을 묶어 진단을 요청하는 템플릿 |

### Tools

| 툴 | 하는 일 |
|---|---|
| `add_plant` | 식물 등록 (품종·위치·물주기 간격·입양일) |
| `log_watering` | 물 준 기록. 날짜 생략 시 오늘 |
| `log_note` | 관찰 기록 ("아랫잎이 노래짐", "새순 나옴") |
| `update_plant` | 품종·위치·물주기 간격 수정 |
| `remove_plant` | 삭제. `confirm=True` 없이는 실행되지 않음 |
| `list_plants` | 전체 목록 + 경과일 + 다음 예정일 |
| `plants_needing_water` | 물 줄 때가 된 것만, 많이 밀린 순 |
| `get_plant` | 한 그루 상태 요약 |
| `plant_history` | 물주기·관찰 기록 통합 타임라인 |

조회 툴은 구조화된 JSON을 돌려주고, 기록 툴은 사람이 읽을 수 있는 확인 문장을
돌려줍니다. LLM이 결과를 그대로 사용자에게 전달해도 자연스럽도록 한 설계입니다.

## 설계 노트

- **파괴적 동작에는 가드를 뒀습니다.** `remove_plant`는 첫 호출에서 삭제하지 않고
  확인을 요구하는 문장을 돌려줍니다. LLM이 실수로 데이터를 날리지 못하게 하는
  최소한의 안전장치입니다.
- **오류 메시지를 LLM이 고쳐 부를 수 있게 썼습니다.** 없는 식물을 조회하면 등록된
  식물 목록을 함께 돌려주므로, 오타가 있어도 다음 호출에서 바로 교정됩니다.
- **저장 계층을 서버와 분리했습니다.** `storage.py`는 MCP를 모릅니다. 서버 없이
  단독 테스트가 가능하고, 나중에 다른 인터페이스를 붙이기도 쉽습니다.
- **커넥션은 호출마다 엽니다.** 서버가 툴을 여러 스레드에서 실행해도 안전합니다.
- **DB 경로가 설치 방식에 의존하지 않습니다.** 패키지 위치가 아니라 OS의 사용자
  데이터 폴더를 씁니다. 편집 설치든 일반 설치든 같은 DB를 가리킵니다.

## 설치

필요한 것: [uv](https://docs.astral.sh/uv/), Python 3.12 이상

```bash
git clone <repo> plant-mcp
cd plant-mcp
uv sync
```

## Claude Desktop 연결

`claude_desktop_config.json`에 다음을 추가합니다.

- Windows: `%APPDATA%\Claude\claude_desktop_config.json`
- macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`

```json
{
  "mcpServers": {
    "plant-care": {
      "command": "<프로젝트 경로>/.venv/Scripts/plant-mcp.exe"
    }
  }
}
```

macOS·Linux에서는 `command`를 `<프로젝트 경로>/.venv/bin/plant-mcp`로 지정합니다.
저장한 뒤 **Claude Desktop을 완전히 종료했다가 다시 실행**해야 서버가 잡힙니다.

## 데이터 저장 위치

기본값은 OS의 사용자 데이터 폴더입니다.

- Windows: `%LOCALAPPDATA%\plant-mcp\plants.db`
- macOS·Linux: `~/.local/share/plant-mcp/plants.db`

`PLANT_MCP_DB` 환경변수로 바꿀 수 있습니다.

```json
{
  "mcpServers": {
    "plant-care": {
      "command": "...",
      "env": { "PLANT_MCP_DB": "D:/data/plants.db" }
    }
  }
}
```

SQLite 파일 하나이므로 백업은 복사, 이전은 이동으로 끝납니다.

## 다른 기기에서 이어서 작업하기

### 새 컴퓨터에 설치

```bash
git clone https://github.com/azureiraraavis-png/plant-mcp.git
cd plant-mcp
uv sync
```

그다음 그 기기의 `claude_desktop_config.json`에 등록합니다. 경로는 OS마다 다릅니다.

| OS | 설정 파일 | `command` 값 |
|---|---|---|
| Windows | `%APPDATA%\Claude\claude_desktop_config.json` | `<프로젝트>\.venv\Scripts\plant-mcp.exe` |
| macOS | `~/Library/Application Support/Claude/claude_desktop_config.json` | `<프로젝트>/.venv/bin/plant-mcp` |

`command`에는 **절대 경로**를 넣어야 합니다. 저장한 뒤 Claude Desktop을 완전히
종료했다가 다시 실행합니다.

기존 설정에 다른 MCP 서버가 이미 있다면 `mcpServers` 안에 항목만 추가하세요.
설정 파일 전체를 덮어쓰면 Claude Desktop의 다른 설정이 날아갑니다.

### 기록(DB)은 따라오지 않습니다

코드는 git으로 옮겨가지만 `plants.db`는 **기기마다 별개**입니다. 개인 기록이라
저장소에 넣지 않기 때문입니다(`.gitignore`에 `*.db`).

기기 간에 같은 기록을 보시려면 `PLANT_MCP_DB`를 클라우드 동기화 폴더로 지정합니다.

```json
{
  "mcpServers": {
    "plant-care": {
      "command": "...",
      "env": { "PLANT_MCP_DB": "C:/Users/사용자명/OneDrive/plant-mcp/plants.db" }
    }
  }
}
```

두 가지를 주의하셔야 합니다.

- **두 기기에서 동시에 쓰면 DB가 손상될 수 있습니다.** SQLite는 클라우드 동기화를
  전제하지 않습니다. Claude Desktop을 양쪽에서 동시에 켜두지 마세요.
- OneDrive·Google Drive의 온디맨드 기능으로 파일이 클라우드에만 있으면 읽기가
  실패할 수 있습니다. 해당 폴더를 **"이 디바이스에 항상 유지"**로 설정하세요.

한 기기에서만 쓰신다면 기본 경로 그대로 두는 편이 안전합니다.

### 휴대폰에서는 아직 안 됩니다

Claude 모바일 앱은 로컬 stdio MCP 서버를 붙일 수 없습니다. 폰에서 쓰려면 이 서버를
원격 MCP(HTTP)로 전환해 인터넷에 호스팅해야 합니다. 코드 변경 자체는 작지만
(`run("stdio")` → `run("streamable-http")`) 호스팅과 인증이 별도 작업입니다.
로드맵에 있습니다.

## 사용 예시

```
나:     거실 창가에 몬스테라 들였어. 일주일에 한 번 물 주면 된대.
Claude: (add_plant 호출) '몬스테라' 등록했습니다. 7일마다 물주기로 잡아뒀어요.

나:     오늘 몬스테라 물 흠뻑 줬어
Claude: (log_watering 호출) 기록했습니다. 다음 예정일은 8월 7일이에요.

나:     오늘 뭐 목말라?
Claude: (plants_needing_water 호출) 산세베리아가 3일 밀렸습니다.

나:     몬스테라 아랫잎이 계속 노래져
Claude: (diagnose 프롬프트 + plant_history 참고)
        마지막 물주기가 11일 전이고 간격이 7일이니 물부족 가능성이 우선...
```

## 데이터 모델

```
plants     id, name(unique), species, location, acquired_on,
           water_every_days, created_at
waterings  id, plant_id → plants, watered_on, amount, created_at
notes      id, plant_id → plants, noted_on, body, created_at
```

`needs_water`는 저장하지 않고 조회 시점에 계산합니다
(`마지막 물준 날 + 간격 <= 기준일`). 배치 작업이나 갱신 로직이 필요 없습니다.

## 개발

저장 계층만 단독으로 두드려 보기:

```bash
uv run python -c "from plant_mcp import storage; print(storage.list_plants())"
```

서버를 직접 띄우기:

```bash
uv run plant-mcp
```

stdio로 JSON-RPC를 주고받으므로 터미널에서는 응답 없이 대기하는 것이 정상입니다.

## 로드맵

- [x] 관리 기록 서버 (Tools / Resources / Prompts)
- [ ] 식물 관리 지식베이스 RAG 검색 툴 추가
- [ ] 물주기 간격 자동 보정 (계절·실제 기록 기반)

## 라이선스

MIT

TDQS

A3.8/5.0

Scored across 9 tools

Disambiguation5/5

Each tool serves a clearly distinct purpose: plant CRUD (add, get, update, remove, list), event logging (watering, notes), and specialized queries (history, needing water). Even closely related tools like list_plants and plants_needing_water are unambiguously differentiated by their descriptions.

Naming Consistency4/5

Most tools follow a consistent verb_noun snake_case pattern (add_plant, log_watering, update_plant, remove_plant, list_plants). Two tools, plant_history and plants_needing_water, deviate by being noun phrases, but the overall pattern remains readable and predictable.

Tool Count5/5

With 9 tools, the server is well-scoped for a plant care domain. Each tool earns its place by covering essential plant management and care tracking without unnecessary bloat.

Completeness4/5

The tool set covers the full plant lifecycle: create, read, update, delete, list, plus care logging and querying. Minor gaps like the ability to edit or delete individual log entries exist, but they do not hinder core workflows.

Maintenance

ActivityStale
ResponsivenessNo issues