naver-reservation-watcher-mcp
Monitors Naver reservation availability (restaurants, cafes, hotels, etc.) and can automatically book, request approval before booking, or send notifications when matching slots become available, with support for time preferences, coupon selection, and safety gates for payments and CAPTCHA.
naver-reservation-watcher-mcp
네이버 예약(식당/카페/호텔 등)의 빈자리를 백그라운드에서 계속 감시하고, 사용자가 지정한 조건이 충족되면 자동으로 예약하거나 알려주고 승인 후 예약하거나 알림만 보내는 시스템입니다. Claude Desktop이 꺼져 있어도 감시는 계속됩니다.
이 프로젝트는 각자 자신의 PC에 설치해서 자신의 네이버 계정으로 직접 로그인해 쓰는 용도입니다. 어떤 서버도 사용자의 로그인 정보나 예약 데이터를 수집하지 않습니다 - 코드를 내려받아 실행하는 이 PC 안에만 모든 데이터(로그인 세션, 감시 목록, 예약 기록)가 남습니다.
구조
Claude Desktop <--(MCP, stdio)--> nrw.mcp_server.server ┐
├── 같은 SQLite DB (data/nrw.sqlite3) 공유
Windows 작업 스케줄러 --(상시 실행)--> nrw.watcher.service ┘
│
└── Playwright persistent profile (data/browser_profile) 로
네이버 로그인 세션을 재사용해 실제 감시/예약 수행MCP 서버는 브라우저를 직접 조작하지 않습니다.
check_availability/reserve_now/approve_reservation은 SQLitejobs테이블에 작업을 넣고, watcher가 처리한 결과를 기다려서 돌려주는 얇은 클라이언트입니다. (Playwright persistent profile은 한 번에 하나의 프로세스만 열 수 있기 때문입니다.)watcher 서비스가 실제로 Playwright로 브라우저를 열어 감시/예약을 수행하는 유일한 프로세스입니다. Claude Desktop과 별개로, Windows 작업 스케줄러에 등록되어 로그온 시 자동으로 계속 실행됩니다.
감시 내역, 예약 결과, 작업 큐, 이벤트 로그는 모두
data/nrw.sqlite3(SQLite, WAL 모드)에 저장됩니다. 이data/폴더는 설치 후 각 사용자의 PC에서 자동으로 새로 생성되며, 저장소에 포함되어 있지도, 커밋되지도, 어디로도 전송되지도 않습니다.
Related MCP server: SysControl MCP
설치
git clone https://github.com/LEESUJEONG1030/naver-reservation-watcher-mcp.git
cd naver-reservation-watcher-mcp
powershell -ExecutionPolicy Bypass -File scripts\setup_venv.ps1가상환경 생성, 의존성 설치, Playwright Chromium 다운로드까지 한 번에 진행합니다. 이후
data/ 디렉터리(SQLite DB, 로그, 브라우저 프로필)는 이 프로젝트 폴더 안에 자동으로
생성됩니다 - 설정 없이 그대로 써도 되고, NRW_DATA_DIR 환경변수로 다른 위치를 지정할
수도 있습니다.
Windows 전용입니다 (Task Scheduler,
win11toast알림에 의존). Playwright/Python 부분 자체는 크로스플랫폼이지만, 지금은 Windows에서의 상시 실행 경로만 만들어졌습니다.
1) 네이버 로그인 (최초 1회, 반드시 직접 해야 하는 단계)
비밀번호는 코드/설정 어디에도 저장하지 않습니다. Playwright persistent profile을 이용해
로그인 세션(쿠키)만 이 PC의 data/browser_profile 에 재사용합니다 - 이 폴더는 다른 곳으로
복사/전송/커밋되지 않아야 합니다(.gitignore에 이미 포함되어 있습니다).
.venv\Scripts\python.exe scripts\login_naver.py열리는 브라우저 창에서 직접 로그인(2단계 인증 포함)하면, 로그인 완료를 자동으로 감지해 세션을 저장합니다. watcher가 실행 중이어도 실행할 수 있습니다.
2) watcher 서비스 실행
수동으로 (디버깅용, 창을 띄워 로그를 바로 보고 싶을 때):
powershell -ExecutionPolicy Bypass -File scripts\run_watcher.ps1재부팅해도 자동으로 계속 실행되게 하려면 Windows 작업 스케줄러에 등록:
powershell -ExecutionPolicy Bypass -File scripts\register_task_scheduler.ps1이 사용자로 로그온할 때 자동 시작, 실패 시 최대 999회까지 1분 간격으로 재시작하도록 등록됩니다. 시스템에 영구적으로 남는 작업이므로 필요 없어지면
scripts\unregister_task_scheduler.ps1로 제거하세요.로그는
data\logs\watcher.log에 남습니다.
3) Claude Desktop에 MCP 서버 연결
Claude Desktop 버전/설치 방식에 따라 두 가지 방법 중 하나를 씁니다. Extensions 설치 UI가 있으면 방법 A를, 그 메뉴가 없거나 동작하지 않으면 방법 B를 쓰세요 - 실제로 Microsoft Store(MSIX)로 설치된 Claude Desktop 일부 버전에는 방법 A의 메뉴 자체가 없는 경우가 있었고, 그때는 방법 B로 정상적으로 연결됐습니다.
방법 A: .mcpb Desktop Extension 설치 (Extensions 설치 UI가 있는 경우)
mcpb/폴더가manifest.json+server/main.py(얇은 launcher)로 구성되어 있습니다. 패키징하려면:npx --yes @anthropic-ai/mcpb validate mcpb\manifest.json npx --yes @anthropic-ai/mcpb pack mcpb dist\naver-reservation-watcher-mcp.mcpbClaude Desktop에서 Settings → Extensions → Advanced settings → Install Extension… 로 방금 만든
.mcpb파일을 설치합니다.설치 시 "프로젝트 설치 경로" 설정에 이 프로젝트를 클론/설치한 실제 폴더를 직접 지정합니다. 이 확장은 그 경로의
.venv\Scripts\python.exe로 실행되고, 같은 경로의data\nrw.sqlite3를 watcher와 공유합니다 - 확장 자체는 Playwright나 watcher를 직접 실행하지 않고, 이미 실행 중인 watcher와 SQLitejobs/watches테이블을 통해서만 통신하는 얇은 MCP 인터페이스입니다.일반 채팅에서
add_reservation_watch등 7개 도구가 보이는지 확인합니다.
방법 B: 로컬 MCP 서버 직접 등록 (Extensions 설치 UI가 없는 경우)
일부 Claude Desktop 설치(특히 Microsoft Store/MSIX 버전)는 Settings → Extensions
메뉴 자체가 없을 수 있습니다. 이 경우 Settings → Developer(개발자) → Local MCP
servers(로컬 MCP 서버) → Edit Config(구성 편집) 로 들어가면 열리는 설정 파일에
mcpServers 항목을 직접 추가합니다.
<프로젝트경로> 는 이 프로젝트를 클론/설치한 본인의 실제 폴더 경로로 바꿔주세요
(예: C:\Users\you\naver-reservation-watcher-mcp-oss). 아래는 형태를 보여주는
예시이며, 실제 값은 각자 환경에 맞게 채워야 합니다:
"mcpServers": {
"naver-reservation-watcher-mcp": {
"command": "<프로젝트경로>\\.venv\\Scripts\\python.exe",
"args": ["-m", "nrw.mcp_server.server"],
"cwd": "<프로젝트경로>"
}
}기존에 다른 MCP 서버 항목이 이미 있다면 mcpServers 객체 안에 이 항목만 추가하고
나머지는 그대로 두세요. 저장 후 Claude Desktop을 재시작하면 방법 A와 동일하게
add_reservation_watch 등 7개 도구가 보여야 합니다.
두 방법 모두 이 MCP 서버는 Playwright나 watcher를 직접 실행하지 않습니다 - 이미
실행 중인 watcher와 SQLite jobs/watches 테이블을 통해서만 통신하는 얇은
인터페이스입니다. (1)/(2) 단계를 먼저 완료해 watcher가 실행 중이어야 합니다.
사용 예시 (Claude 채팅에서)
"OO식당 10월 3일 저녁 6시~8시, 2명, 19시 우선으로 감시해줘. 자리 나면 자동으로 예약해줘." →
add_reservation_watch(store_name="OO식당", target_date="2026-10-03", time_min="18:00", time_max="20:00", party_size=2, time_priority=["19:00"], mode="AUTO")"지금 감시 목록 보여줘" →
list_reservation_watches()"지금 예약 가능한 시간 있어?" →
check_availability(watch_id=...)"지금 바로 19시로 예약해줘" →
reserve_now(watch_id=..., time="19:00")"실제로 예약하기 전에 흐름만 점검해줘 (클릭은 하지 마)" →
reserve_now(watch_id=..., time="19:00", dry_run=True)"그 예약 진행해줘" (ASK 알림을 받은 뒤) →
approve_reservation(watch_id=..., approve=True)"예약 상태 어때?" →
reservation_status(watch_id=...)
예약 방식 (mode)
AUTO: 조건(시간대/우선순위)에 정확히 맞는 자리가 나오면 자동으로 예약을 진행합니다. 단, 결제/선결제/보증금/취소수수료/마케팅성 동의가 필요하면 절대 자동으로 진행하지 않고AWAITING_APPROVAL상태로 전환해 사용자에게 알립니다. 예약 완료에 필수인 일반 이용약관/개인정보 동의(화면에 "필수"로 명확히 표시된 것만)는 자동으로 체크합니다 - 아래 "필수 동의 자동 처리" 참고.ASK: 자리를 발견하면 "OO식당 10/3 19:00 2명 자리가 생겼습니다. 예약할까요?" 알림을 Windows 토스트로 보냅니다. 토스트에는 예약하기 / 이번 자리 넘기기 버튼이 있어 Claude Desktop을 열지 않아도 바로 승인/거절할 수 있습니다. 채팅에서approve_reservation으로도 동일하게 처리할 수 있습니다. 승인 즉시 클릭하지 않습니다 - 예약을 시도하기 직전에 그 슬롯이 여전히 유효한지 다시 조회하고, 이미 사라졌다면 예약을 진행하지 않고WATCHING상태로 돌아가 사용자에게 알립니다.NOTIFY: 알림만 보내고 예약은 하지 않습니다.
중복 알림 방지: 같은 시간대가 계속 열려 있는 동안은 같은 알림을 반복해서 보내지 않습니다. 다만 그 시간이 마감되었다가 취소 등으로 다시 열리면(재오픈), 새로운 발견으로 간주해 다시 알릴 수 있습니다.
안전장치
CAPTCHA, 추가 본인인증, 비밀번호 재입력이 감지되면 절대 우회하지 않고
NEEDS_HUMAN상태로 전환해 사용자에게 알리고 대기합니다.NEEDS_HUMAN상태인 동안은 자동 감시를 완전히 일시 중지합니다 - 사용자가 직접 확인을 완료한 뒤 Claude에게 "다시 확인해줘" (=check_availability(watch_id=...))라고 요청하면 감시가 재개됩니다.결제/선결제/보증금/취소수수료/마케팅성 동의 화면이 보이면
AWAITING_APPROVAL로 전환하고 절대 자동으로 결제/동의하지 않습니다.필수 동의 자동 처리 (AUTO_ACCEPT_REQUIRED_TERMS): 예약 완료에 반드시 필요한, 화면에 "필수"로 명확히 표시된 이용약관/개인정보 동의 체크박스만 자동으로 체크합니다. 마케팅 수신/알림받기/광고성/멤버십 가입 등은 필수로 표시돼 있어도 절대 자동 체크하지 않습니다. 필수/선택 여부를 확실히 판별할 수 없는(새로운/다른 형태의) 동의 항목을 만나면 추측하지 않고
NEEDS_HUMAN으로 멈춥니다. 자동으로 체크한 항목 이름은 이벤트 로그와 알림에 남습니다.실제 예약 버튼을 누르기 직전, 화면에 표시된 날짜/시간/인원을 다시 읽어 요청과 다르면 중단합니다 (
reserve_now, ASK 승인, AUTO 모두 동일하게 적용).예약 성공 시 업체명/날짜/시간/인원/예약번호(확인 가능한 경우)/적용한 쿠폰/자동 체크한 필수 동의 항목을 이벤트 로그와 Windows 토스트에 남기고 해당 감시를 자동 종료합니다. 실패해도 원인을 명확히 남기고, 재시도 가능한 실패(검증 실패/슬롯 선점 등)는 감시를 계속합니다.
reserve_now(..., dry_run=True): 실제 예약과 완전히 동일한 절차(날짜/인원/시간 선택, 필수 동의 자동 체크, 쿠폰 확인, 안전 게이트 확인, 클릭 직전 재검증)를 그대로 수행하되 최종 확인 버튼은 절대 클릭하지 않고 어디까지 도달했는지, 어떤 버튼을 누르게 됐을지를 보고합니다. 사이트가 바뀐 뒤에도 안전하게 흐름을 점검할 수 있는 도구입니다.
쿠폰 자동 수집/적용
nrw/coupon_utils.py 가 선택 로직을, 각 어댑터가 조회/다운로드/적용을 담당합니다. 쿠폰은
두 곳에서 확인합니다: 업체 홈 페이지(/home)의 쿠폰 목록, 그리고 예약 화면 자체에 내장된
쿠폰 선택 UI(있는 경우) - 후자가 실제 이 예약에 적용 가능한지에 대해 더 신뢰도 높은
소스입니다.
무료로 즉시 받을 수 있는/선택 가능한 쿠폰은 자동으로 받아 적용합니다 (ASK/AUTO 모드 모두). 이미 보유 중인 쿠폰은 다시 받지 않습니다.
여러 쿠폰을 받을 수 있으면 그 예약의 예상 결제금액 기준으로 실제 할인액이 가장 큰 쿠폰을 고릅니다.
유료 멤버십 가입/구독/개인정보 추가 제공/마케팅 동의/별도 결제가 필요한 쿠폰은 자동으로 받거나 적용하지 않습니다 - 존재는 알림/이벤트 로그에 남기되("확인 필요"), 항상 사용자 확인을 거쳐야 합니다.
예약 버튼을 누르기 직전, 선택했던 쿠폰이 여전히 유효한지 다시 확인합니다. 그 사이 만료되거나 더 이상 적용할 수 없게 됐다면 할인 없이 강행하지 않고 멈춰서 알립니다.
예약 성공 기록(
reservation_status)에 적용한 쿠폰명과 할인액이 함께 저장됩니다.실제 네이버 업체 페이지 두 곳(서로 다른 업체)을 대상으로 쿠폰 조회/게이트 감지 및
dry_run전체 흐름(최종 확인 버튼 직전까지)을 검증했습니다. 실제 예약 확정 클릭은 검증하지 않았습니다 - 업체별 DOM 구조 차이가 있을 수 있어 셀렉터는naver_selectors.py의COUPON_*/SUBMIT_BUTTON_*항목에 모여 있습니다.
폴링 정책 (네이버 서버에 과도한 요청 방지)
config/config.toml (없으면 config/config.example.toml 기본값 사용)에서 조정 가능:
평상시 45~120초 사이 랜덤 간격으로 확인.
에러가 나면 30초부터 지수 백오프(최대 15분).
페이지에 "O월 O일 O시부터 예약 가능" 같은 오픈 예정 문구가 보이면, 그 시각 2분 전부터 5~15초 간격으로 타이트하게 전환해 오픈 직후를 빠르게 잡습니다.
마감된 시간이 취소 등으로 다시 열리는 것도 매 확인마다 이전 스냅샷과 비교해 감지합니다.
알림 (Notifier)
기본은 Windows Toast (win11toast). nrw/notifier/base.py 의 Notifier 인터페이스만
구현하면 다른 채널(Telegram 등)로 쉽게 바꿀 수 있습니다 - 뼈대는
nrw/notifier/telegram_stub.py 에 있습니다. 채널 전환은 config.toml 의
[notify] channel = "telegram" 로 지정합니다.
테스트 (실제 네이버를 건드리지 않는 mock/로컬 픽스처)
.venv\Scripts\python.exe -m pytest -qmock_site/server.py 가 로컬에 "오픈 전 → 오픈 → 마감 → 취소자리 발생 → 예약 성공"
전체 흐름을 흉내내는 페이지를 띄우고, tests/test_e2e_mock_flow.py 가 watcher의 핵심
로직(오픈 감지, 우선순위 매칭, AUTO/ASK/NOTIFY 분기, 결제/캡차 안전장치, 클릭 직전
재검증)을 실제 Playwright로 그 페이지를 조작하며 검증합니다.
쿠폰 시나리오, dry-run 흐름, 필수 동의 자동 처리 정책, 실제 예약 위젯의 DOM 구조(로컬
정적 HTML 픽스처로 재현)는 각각 tests/test_coupons_e2e.py, tests/test_dry_run.py,
tests/test_naver_widget_flow.py, tests/test_reservation_logging.py 에서 검증합니다.
한계 / 고지
네이버 예약 페이지의 실제 DOM 구조는 업체/업종마다 다르고 네이버가 자주 개편합니다.
src/nrw/browser/naver_selectors.py에 문구/셀렉터를 한곳에 모아뒀으니, 특정 업체에서 동작이 어긋나면 이 파일만 조정하면 됩니다.실제 예약 확정(최종 버튼 클릭)은 검증하지 않았습니다 - 로그인은 사용자 본인만 할 수 있고, 실제 결제/예약을 만드는 행위이기 때문입니다.
reserve_now(dry_run=True)로 최종 클릭 직전까지의 전체 흐름을 안전하게 점검할 수 있습니다.headless 여부는
config.toml의[browser] headless로 조정합니다. 기본은false(창이 보이는 채로 실행) 이며, 결제/캡차 등 사용자 확인이 필요할 때 화면을 볼 수 있게 하기 위함입니다.watcher는 PC가 켜져 있고 로그온되어 있어야 동작합니다 (완전 종료/절전 상태에서는 동작 하지 않습니다). 이 프로젝트는 로컬 실행 구조라 "PC가 꺼져 있어도 클라우드에서 계속 감시"는 지원하지 않습니다.
SQLite 스키마 요약
watches: 감시 등록 정보 + 현재 상태reservations: 성공한 예약 기록jobs: MCP → watcher 작업 큐 (즉시 확인/예약/승인/거절)events: 감시별 이벤트/알림 로그heartbeat: watcher 생존 확인용
라이선스
Available Tools
7 toolsadd_reservation_watchAdd Reservation WatchC
새 예약 감시를 등록합니다.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | "AUTO"(조건 일치 시 자동 예약) | "ASK"(발견 시 승인 요청) | "NOTIFY"(알림만). | ASK |
| time_max | Yes | 원하는 시간대의 끝, HH:MM. | |
| time_min | Yes | 원하는 시간대의 시작, HH:MM. | |
| store_url | No | 네이버 예약 URL (있으면 store_name 검색 없이 바로 사용, 더 안정적). | |
| party_size | Yes | 인원 수. | |
| store_name | Yes | 업체명 (예: "OO식당"). store_url이 없으면 이 이름으로 네이버에서 검색합니다. | |
| target_date | Yes | 예약하고 싶은 날짜, YYYY-MM-DD. | |
| watch_end_at | No | 감시 종료 시각(ISO). 생략하면 target_date 다음날 00:00. | |
| time_priority | No | 우선순위 시간 목록, 예: ["19:00", "18:30", "19:30"]. 없으면 time_min~time_max 중 가장 빠른 시간을 사용. | |
| watch_start_at | No | 감시 시작 시각(ISO). 생략하면 지금부터. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden for behavioral disclosure. It only says 'registers a new reservation watch' and does not explain that this creates an ongoing monitor, that it may search Naver, that it can auto-book or ask for approval based on mode, or what side effects occur. The parameter descriptions in the schema cover some details, but the core behavior is undisclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one short sentence, which is efficient but under-specified for a tool with 10 parameters and 5 required fields. It front-loads nothing useful beyond the name itself. The extreme brevity comes at the expense of conveying any operational detail, so it is not appropriate conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex tool with 10 parameters, no annotations, and only a one-line description, the definition is severely incomplete. It fails to explain prerequisites (e.g., Naver login), the lifecycle of a watch, what successful registration returns (even though an output schema exists), and how mode affects behavior. An agent cannot confidently invoke this tool correctly from the description alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The tool description adds no parameter-level meaning beyond the schema, but the schema itself richly defines parameters (mode, time_priority, store_url, etc.). Thus the description neither helps nor harms parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('등록합니다' / registers) and resource ('새 예약 감시' / new reservation watch), making the core purpose clear. It does not explicitly differentiate from sibling tools like reserve_now or check_availability, but the noun-phrase 'reservation watch' is distinct enough from immediate reservation actions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given about when to use this tool versus alternatives. The description does not mention that this tool is for monitoring future availability, nor does it distinguish itself from reserve_now (immediate booking) or check_availability (one-time check). The schema hints at modes but the description provides no usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
approve_reservationApprove ReservationB
ASK 모드에서 발견된 예약 제안을 승인(예약 진행)하거나 거절합니다.
| Name | Required | Description | Default |
|---|---|---|---|
| approve | No | True면 예약 진행, False면 이번 제안을 무시하고 계속 감시. | |
| watch_id | Yes | 대상 감시 id (상태가 AWAITING_APPROVAL 이어야 함). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full responsibility for disclosing side effects. It only says 'approve or reject' without mentioning consequences like triggering a reservation or ignoring the proposal, though the schema hints at behavior for the approve parameter. This is insufficient for a mutating action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence with no redundancy. It states the purpose efficiently without any filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter tool with a full schema and an output schema, the description covers the core action and context (ASK mode). It doesn't address usage vs siblings, but that's a usage guideline gap rather than completeness. Overall, it's adequate for the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for both parameters, so the baseline is 3. The description adds no extra meaning beyond the schema, relying entirely on parameter descriptions already present.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('approve or reject') on a specific resource ('reservation proposal found in ASK mode'). It is clear and distinguishes from siblings that handle watch management or direct reservation, though it doesn't explicitly name alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context (ASK mode proposals) but doesn't explicitly state when to use this tool versus siblings like reserve_now or reservation_status. No exclusion criteria or conditional guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_availabilityCheck AvailabilityA
지금 이 순간 예약 가능한 시간을 확인합니다 (watcher 서비스를 통해 실제 브라우저로 조회).
watch_id를 주면 등록된 감시의 조건을 그대로 사용하고, 아니면 store_name/store_url + target_date + party_size 를 직접 지정해 즉석으로 조회할 수 있습니다.
| Name | Required | Description | Default |
|---|---|---|---|
| watch_id | No | ||
| store_url | No | ||
| party_size | No | ||
| store_name | No | ||
| target_date | No | ||
| timeout_sec | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses that the lookup happens through the watcher service with a real browser, which is meaningful behavioral context. Yet it does not mention potential delays, dependency on the watcher service, failure modes, or the effect of timeout_sec beyond its name. Some transparency is provided, but gaps remain.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core purpose and followed by concise parameter-mode guidance. The parenthetical is used efficiently. It could be bulleted for even faster parsing, but the current structure is clean and free of fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists and the tool has 6 optional parameters with no annotations or schema descriptions, the description covers the main modes and real-browser behavior reasonably well. It leaves moderate ambiguities (e.g., required parameters when watch_id is absent, relationship between store_name and store_url, behavior on invalid inputs), but these are minor enough that an agent can make a correct first call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must explain parameters. It does so effectively by mapping watch_id to a reuse mode and store_name/store_url + target_date + party_size to a direct-query mode, adding clear semantic grouping. It does not explain timeout_sec or clarify whether store_name and store_url are alternatives or both required, but overall it adds substantial meaning beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool checks available reservation times in real time ('지금 이 순간 예약 가능한 시간을 확인합니다') and distinguishes two invocation modes (watch_id vs direct parameters). It does not explicitly contrast with siblings, but the verb-resource pairing is specific enough to separate it from reservation_status or reserve_now.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear instructions for using the tool: provide watch_id to reuse watch conditions, or directly specify store_name/store_url, target_date, and party_size. However, there is no guidance on when to choose this tool over its siblings (e.g., reservation_status) and no exclusions or prerequisites are mentioned. Usage context is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_reservation_watchesList Reservation WatchesA
현재 등록된 예약 감시 목록을 반환합니다.
| Name | Required | Description | Default |
|---|---|---|---|
| include_inactive | No | True면 RESERVED/EXPIRED/CANCELLED 상태도 포함. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It signals a non-destructive read by saying 'returns', and adds the behavioral nuance 'currently registered'. However, it does not mention ordering, pagination, or whether this is purely read-only, though these are minor for a simple list operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded Korean sentence with no unnecessary words. It is appropriately sized for a simple list operation, though it is minimal and could include usage context without becoming verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the low complexity, one optional parameter, complete schema documentation, and an output schema, the description is nearly sufficient. Missing usage guidance and explicit read-only wording are gaps, but they do not block correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameter semantics are already fully documented: include_inactive controls whether RESERVED/EXPIRED/CANCELLED statuses are included. The description adds no extra parameter context, but none is needed beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it returns the currently registered reservation watch list. This distinguishes it from add/remove/status siblings, though it does not explicitly name an alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: the tool returns the list of existing reservation watches FAQs. There is no explicit statement about when to choose this over siblings, but the naming and sibling set make the intended use reasonably clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_reservation_watchRemove Reservation WatchB
등록된 예약 감시를 삭제합니다.
| Name | Required | Description | Default |
|---|---|---|---|
| watch_id | Yes | 삭제할 감시의 id (add_reservation_watch 또는 list_reservation_watches로 확인). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It states that the tool deletes a reservation watch, but does not disclose irreversibility, side effects, required permissions, or what happens if the watch_id does not exist. For a destructive operation this is thin.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded Korean sentence with no filler or redundancy. It states the action and object efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with one parameter and an output schema, but the description lacks usage guidance and behavioral caveats. It is minimally sufficient for basic invocation, but not rich enough to fully guide an agent around failure modes or consequences.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single parameter watch_id is adequately described in the schema. The tool description adds no parameter-level meaning, but with full schema coverage, baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb, '삭제합니다' (deletes), with a clear resource, '등록된 예약 감시' (registered reservation watch). This makes the tool's purpose immediately distinct from siblings like list_reservation_watches, add_reservation_watch, and check_availability.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to use this tool versus alternatives, nor does it state any conditions or exclusions. The only hint about finding watch_id appears in the schema parameter description, not in the tool-level usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reservation_statusReservation StatusB
예약 성공/실패/대기 상태를 확인합니다.
| Name | Required | Description | Default |
|---|---|---|---|
| watch_id | No | 지정하면 해당 감시의 상세 상태 + 최근 이벤트 로그를 반환. 생략하면 전체 감시 목록 요약 + 성공한 예약 목록을 반환. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It only says the tool checks status categories; it does not mention side effects, permissions, freshness, or what happens when no watch_id is given beyond what the schema already says.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short Korean sentence with no filler; the core purpose is front-loaded. This is appropriately sized for a simple status tool whose only parameter is already fully documented in the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The optional parameter is fully documented and an output schema exists, so return values do not need to be described. However, with no annotations and no sibling differentiation, the description leaves the agent to infer when to use this tool and what behavioral guarantees exist.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the watch_id field description fully explains the conditional behavior (detailed status + event log vs. summary + successful reservations). The tool description itself adds no parameter semantics, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific operation ('확인합니다' – checks) on a specific resource (reservation success/failure/pending status). It is not a tautology and is distinguishable from action-oriented siblings like approve_reservation and reserve_now, though it does not explicitly differentiate from list_reservation_watches.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use this tool versus list_reservation_watches or other siblings. The input schema's conditional behavior (watch_id present vs omitted) provides parameter-level context, not tool-selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reserve_nowReserve NowA
지정된 조건으로 지금 즉시 실제 예약을 시도합니다.
결제/선결제/보증금/취소수수료/추가 동의가 필요하거나 캡차/추가 인증이 나타나면 자동으로 진행하지 않고 AWAITING_APPROVAL/NEEDS_HUMAN 상태로 멈춥니다. 클릭 직전에 화면의 날짜/시간/인원을 다시 확인해 요청과 다르면 진행하지 않습니다.
watch_id를 주면 등록된 감시의 업체/날짜/인원을 사용하고, time만 지정하면 됩니다.
dry_run=True 로 호출하면 실제 예약을 절대 완료하지 않습니다 - 업체 확인, 날짜/ 시간/인원 선택, 쿠폰 탐지(다운로드는 안 함), 결제/보증금/취소수수료/마케팅동의/ 본인인증 안전 게이트 확인, 클릭 직전 재검증까지 실제 사이트에서 그대로 수행하되 최종 확인 버튼을 누르기 직전에 멈추고 무엇을 관찰했는지 보고합니다 (DB에 예약 기록도 남기지 않고 "예약 완료" 알림도 보내지 않습니다). 사이트가 바뀐 뒤 실제 예약 흐름이 여전히 안전하게 동작하는지 점검할 때 사용하세요.
| Name | Required | Description | Default |
|---|---|---|---|
| time | Yes | ||
| dry_run | No | ||
| watch_id | No | ||
| store_url | No | ||
| party_size | No | ||
| store_name | No | ||
| target_date | No | ||
| timeout_sec | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden, and it does so thoroughly. It discloses automatic stops on payment, prepayment, deposit, cancellation fees, captcha, and additional authentication; it also explains the final pre-click revalidation and the dry_run side-effect guarantees of no DB record and no completion notification.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence serves a purpose: the main action, the safety stop conditions, watch_id usage, and the dry_run mode. The critical behavioral details are front-loaded, and the length is justified by the high-risk nature of the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is quite complete for a complex, mutation-capable tool: it covers real booking, safety gates, dry_run semantics, and watch_id behavior. Minor gaps remain around timeout_sec and the exact interplay of store_url, store_name, party_size, and target_date, but the output schema and descriptive parameter names mitigate this.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains dry_run, watch_id, and the role of time, but store_url, store_name, party_size, target_date, and timeout_sec remain largely undefined. This is a partial compensation, not a complete one.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description immediately states that the tool attempts an actual reservation immediately under specified conditions, with a clear verb and resource. It also distinguishes the real-booking mode from dry_run mode, making its purpose unambiguous relative to the watch-management siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context: use watch_id to reuse a registered watch's details Bennett, and use dry_run=True specifically to verify that the real reservation flow still works safely after a site change. It does not explicitly contrast with check_availability or approve_reservation, but the intended cases are clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
7 tool updates
v0.1.0- First observed
add_reservation_watch - First observed
approve_reservation - First observed
check_availability - First observed
list_reservation_watches - First observed
remove_reservation_watch - First observed
reservation_status - First observed
reserve_now
TDQS
Scored across 7 tools
Each tool targets a distinct operation: watch CRUD, availability checking, reservation execution, approval, and status. Even though add_reservation_watch, check_availability, and reserve_now can share store/date/party parameters, their descriptions clearly distinguish monitoring, checking, and immediate action.
Most tools follow a snake_case verb-first pattern (list_, remove_, add_, check_, approve_, reserve_). reservation_status breaks the pattern by being noun-first, and list_reservation_watches is plural while remove/add_reservation_watch are singular, but the overall style is still predictable.
Seven tools is appropriate for this server's scope: watch lifecycle (list/add/remove), availability check, immediate reservation, approval, and status. Each tool covers a necessary step without redundancy.
The tool surface covers watch management, availability checking, immediate reservation, approval/rejection, and status. Minor gaps exist—no update_reservation_watch and no explicit cancel_reservation—but these are workable for the core watcher workflow.
Maintenance
Related MCP Connectors
AI-native scheduler that lives in Claude. Describe meetings in plain English; Heldly does the rest.
LinkedIn outreach, commenting, scheduling, and data via Claude and human approval gates.
LinkedIn outreach, commenting, scheduling, and data via Claude and human approval gates.
Build agents to automate any background task. Works with your ChatGPT/Claude subscription.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables Claude to fully control a Windows desktop with native screen capture, low-level input injection, game-grade input, and play-testing capabilities.MIT
- AlicenseBqualityBmaintenanceEnables Claude Desktop to monitor and control your computer system with 90+ real-time tools covering CPU, RAM, GPU, disk, network, processes, and more, plus extensions for file management, code editing, and web research.84MIT
- AlicenseNot gradedqualityCmaintenanceControls KakaoTalk PC via Win32 API, enabling message sending, reading, and chat room management through MCP clients like Claude Desktop.5MIT
- AlicenseNot gradedqualityAmaintenanceShows your current Claude Desktop activity as Discord Rich Presence, including model, status, usage, and subscription info.MIT