# proactive-mcp
모든 AI 에이전트가 먼저 말을 걸 수 있게 합니다.
읽기 전용 신호와 로컬 메모리에서 지금 알려야 할 상황만 골라, 이미 사용 중인 에이전트가 전달하게 하는 로컬 우선 MCP 서버입니다.
English ·
한국어
     [](https://ko-fi.com/madrobot)
[왜](#왜-proactive-mcp인가) · [작동 방식](#작동-방식) · [시작하기](#시작하기) · [에이전트 연결](#에이전트-연결) · [문서](#문서)
## 시작하기
로컬 watcher와 OS 알림부터 설정합니다. 에이전트 연결은 선택 사항입니다. [uv](https://docs.astral.sh/uv/getting-started/installation/)와 Git을 설치하고, 본인의 [Google Cloud Desktop OAuth 클라이언트 JSON](docs/SETUP_GOOGLE.md)을 준비하세요.
PyPI에 배포된 `0.2.0`에는 아직 마법사가 없습니다. 온보딩 기능이 배포되기 전까지 아래 명령은 `uvx --from`으로 main에 병합된 `7cd0f03` 커밋의 소스를 설치합니다. 직접 체크아웃할 필요는 없습니다. 모든 명령에서 같은 `--from` 경로를 사용하세요. `uvx proactive-mcp`만 실행하면 이전 PyPI 패키지를 선택합니다. 아래 경로는 소스 설치이며 새 PyPI 릴리스가 아닙니다.
1. 설치와 대화형 설정을 시작합니다.
```bash
uvx --from git+https://github.com/madrobotnet/proactive-mcp@7cd0f03243027df464084c3957f03d3c42169268 proactive-mcp setup
```
2. 마법사가 본인의 Google Cloud Desktop OAuth 클라이언트 JSON 경로와 이 장치에서 브라우저를 열지 묻습니다. 본인 클라이언트로만 Gmail과 Calendar의 읽기 전용 동의를 승인하세요. 전체 흐름은 [`docs/SETUP_GOOGLE.md`](docs/SETUP_GOOGLE.md)에 있습니다.
3. Google 인증 뒤 watcher service를 등록하겠다는 제안을 수락하세요. `proactive-mcp service install|status|remove`라는 공통 인터페이스가 Linux의 systemd user service, macOS의 LaunchAgent, Windows의 Task Scheduler를 관리합니다.
4. service 등록을 거절했거나 등록에 성공하면, 대화형 `setup`은 제목이 `proactive-mcp`이고 본문이 `Setup test notification`인 PII 없는 고정 OS test notification을 시도합니다. 이 알림에는 Gmail, Calendar, 계정, Situation 데이터가 없습니다. redacted `unavailable`, `timeout`, `failed`, `unsupported_platform` 경고가 나오면 알림을 표시할 수 없었다는 뜻입니다.
5. service 등록을 거절했거나 권한 문제 등으로 등록에 실패하면 watcher를 직접 실행하세요. 등록 실패 시 `setup`은 test notification을 시도하기 전에 종료됩니다.
**터미널 1, 포그라운드 daemon**
```bash
uvx --from git+https://github.com/madrobotnet/proactive-mcp@7cd0f03243027df464084c3957f03d3c42169268 proactive-mcp daemon
```
**터미널 2, daemon 상태**
```bash
uvx --from git+https://github.com/madrobotnet/proactive-mcp@7cd0f03243027df464084c3957f03d3c42169268 proactive-mcp status
```
`daemon --once`는 한 번만 평가하고 종료하며 `--poll-interval-minutes MINUTES`로 주기를 덮어쓸 수 있습니다. `status`는 연결과 daemon 상태를 redacted JSON으로 보여 줍니다. daemon은 로컬 동기화, 결정론적 평가, 큐 관리, 문서화된 OS fallback만 수행합니다. 호스트나 LLM을 실행하지 않습니다. 호스트 예약은 별개입니다. host/operator가 예약된 에이전트 실행을 시작하고, 그 실행이 `proactive_check`를 호출합니다.
OS fallback은 에이전트 전달을 대신하지 않으며 Situation을 `delivered`로 표시하지도 않습니다. fallback이 활성화된 경우, 수신 이력이 없고 알림 조건을 충족하는 첫 Situation 한 건에만 일회성 bootstrap 예외가 적용됩니다. 그 뒤 기본 fallback은 critical-only입니다. 에이전트가 실제 전달을 시작하려면 `proactive_check`를 호출해야 합니다.
### 호환 모드
`--non-interactive`, `--headless`, `--client-secrets PATH`, `--reauth`는 모두 마법사를 건너뜁니다. 마법사 답변을 미리 채우는 옵션이 아니며 service 제안과 setup test notification도 건너뜁니다. OAuth를 직접 설정해야 할 때만 사용한 뒤 service를 직접 설치하거나 위의 수동 daemon 경로를 사용하세요. service를 관리할 때도 같은 소스 경로를 붙입니다.
```bash
uvx --from git+https://github.com/madrobotnet/proactive-mcp@7cd0f03243027df464084c3957f03d3c42169268 proactive-mcp service install
```
service 상태를 보려면 `install`을 `status`로, 등록을 해제하려면 `remove`로 바꾸세요. `uvx`는 셸에 영구적인 `proactive-mcp` 명령을 추가하지 않습니다. 이 문서의 `proactive-mcp status` 같은 명령 이름에는 위의 `uvx --from` 경로를 붙여 실행하세요.
## 왜 proactive-mcp인가
AI 에이전트는 답하는 방법은 알지만 언제 먼저 말을 걸어야 하는지는 거의 모릅니다.
proactive-mcp는 이 공백을 메웁니다. 승인된 읽기 전용 소스를 백그라운드에서 확인한 다음, 사용자가 의도적으로 저장한 메모리와 합칩니다. 지금 알려야 할 때만 구조화된 상황(Situation)을 만듭니다.
| 읽기 전용 신호 | 로컬 컨텍스트 | 에이전트 중립 전달 |
|:---|:---|:---|
| Gmail과 Google Calendar를 최소 scope로만 읽습니다. | 메모리, 상황, 전달 확정 기록, sync 상태는 로컬 SQLite에 남습니다. | 어떤 로컬 MCP 클라이언트든 같은 도구를 사용해 자기 채널로 전달합니다. |
### 알림이 아니라 상황
새 이벤트를 모두 대화창에 쏟아붓지 않습니다. 결정론적 감지기는 소스 데이터에서 근거가 있는 상황만 추립니다.
| 상황 | 예시 |
|:---|:---|
| `reply_deadline` | 회신 가능성이 있는 메일을 보수적으로 뽑은 후보입니다. 사용자가 행동해야 한다는 판정은 아닙니다. |
| `calendar_conflict` | 수락했거나 내가 소유한 시간 지정 일정 두 개가 겹칩니다. |
| `personal_occasion` | 저장해 둔 개인 기념일이 다가와 지금 알릴 만합니다. |
각 결과에는 제목, 지금 중요한 이유, 범위가 제한된 근거, 제안 행동, 우선순위, 만료 시각이 들어 있습니다. 외부에서 들어온 텍스트는 명시적으로 신뢰하지 않습니다.
## 작동 방식
```mermaid
flowchart LR
G["Gmail