MCP 서버

Ned Watch

watch.ned/ned-watch
클라우드 및 인프라 보안 공개 · 연결 가능 MCP 2025-11-25

이 MCP로 할 수 있는 일

Monitors HTTP endpoints, TLS certificates and agent deadman check-ins, sending signed callbacks when conditions fail.

balance
Your balance in cents, free allowance used, burn per day, days left, and the top-up routes.
입력 스키마
{'type': 'object', 'title': 'balanceArguments', 'properties': {}}
content_watch
Fire when a URL answers but says the wrong thing. expect has 1 to 5 conditions: status (int), contains / not_contains (a string or list of strings), json_path (dotted, e.g. "data.items.0.state") with equals (a JSON scalar) or exists (true/false). No regex. Pages over 256 KB fail as 'size'. The callback names the condition that failed, never the page's content. 2c/day at >= 60s, 7c at >= 30s; free within the first 5 at >= 300s. Example: expect={"status": 200, "json_path": "status", "equals": "ok"}
입력 스키마
{'type': 'object', 'title': 'content_watchArguments', 'required': ['target', 'callback_url', 'expect'], 'properties': {'expect': {'type': 'object', 'title': 'Expect', 'additionalProperties': True}, 'target': {'type': 'string', 'title': 'Target'}, 'interval_s': {'type': 'integer', 'title': 'Interval S', 'default': 300}, 'callback_url': {'type': 'string', 'title': 'Callback Url'}}}
deadman_checkin
Check in on a deadman watch to keep it from firing. Proves you hold the watch's signing_secret (returned at registration): it is sent as Authorization: Bearer <signing_secret> for this one call. No agent key needed.
입력 스키마
{'type': 'object', 'title': 'deadman_checkinArguments', 'required': ['watch_id', 'signing_secret'], 'properties': {'watch_id': {'type': 'string', 'title': 'Watch Id'}, 'signing_secret': {'type': 'string', 'title': 'Signing Secret'}}}
overrun_finish
The run ended. Returns runtime_s and late. If Ned already fired for this run, your callback gets 'clear' with late: true. Finishing with no run open is an error (409).
입력 스키마
{'type': 'object', 'title': 'overrun_finishArguments', 'required': ['watch_id', 'signing_secret'], 'properties': {'run_id': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Run Id', 'default': None}, 'watch_id': {'type': 'string', 'title': 'Watch Id'}, 'signing_secret': {'type': 'string', 'title': 'Signing Secret'}}}
overrun_start
A run began on an overrun watch. Returns run_id and deadline. Sends the watch's signing_secret as Authorization: Bearer for this one call; no agent key needed. run_id is optional (your own id, 1-64 chars); pass one and a retried start is safe (it returns the open run instead of superseding it).
입력 스키마
{'type': 'object', 'title': 'overrun_startArguments', 'required': ['watch_id', 'signing_secret'], 'properties': {'run_id': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Run Id', 'default': None}, 'watch_id': {'type': 'string', 'title': 'Watch Id'}, 'signing_secret': {'type': 'string', 'title': 'Signing Secret'}}}
overrun_watch
Fire when something is STILL running past its deadline (the other side of a deadman). Register once, then call overrun_start when a run begins and overrun_finish when it ends. If a run isn't finished within max_runtime_s (60 to 86400), Ned POSTs one signed 'fire' (run_id, started_at, deadline); a finish after that sends 'clear' with late: true and the runtime. A start while a run is open closes the old one as superseded (no callback). label: give each job its own watch (the same registration twice returns the same watch). 1c/day; counts toward the free 5.
입력 스키마
{'type': 'object', 'title': 'overrun_watchArguments', 'required': ['callback_url', 'max_runtime_s'], 'properties': {'label': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Label', 'default': None}, 'callback_url': {'type': 'string', 'title': 'Callback Url'}, 'max_runtime_s': {'type': 'integer', 'title': 'Max Runtime S'}}}
pricing
Ned Watch pricing: 5 free watches at >=300s, then per-day rates (http/tls/content 2c, fast 7c, deadman 1c, overrun 1c) from a prepaid balance topped up over x402 (USDC on Base). Public, no key needed. Paying is done against POST /v1/topup/{5,20,50}, not here.
입력 스키마
{'type': 'object', 'title': 'pricingArguments', 'properties': {}}
quickstart
The fastest way to be watched, in one call. Makes you an agent (if you have no key yet) and a deadman watch that expects a check-in every `every_minutes` (5 to 1440). Miss one and Ned POSTs a signed message to callback_url; check in again and he says it's clear. Returns agent_key (shown once), signing_secret, and the exact check-in line to run on your schedule. The first 5 watches are free.
입력 스키마
{'type': 'object', 'title': 'quickstartArguments', 'required': ['callback_url'], 'properties': {'callback_url': {'type': 'string', 'title': 'Callback Url'}, 'every_minutes': {'type': 'integer', 'title': 'Every Minutes', 'default': 60}}}
watch_cancel
Cancel a watch you registered. Frees a free-tier slot.
입력 스키마
{'type': 'object', 'title': 'watch_cancelArguments', 'required': ['watch_id'], 'properties': {'watch_id': {'type': 'string', 'title': 'Watch Id'}}}
watch_get
Current state of one of your watches: status, fired, fire_count, next_check, last_state.
입력 스키마
{'type': 'object', 'title': 'watch_getArguments', 'required': ['watch_id'], 'properties': {'watch_id': {'type': 'string', 'title': 'Watch Id'}}}
watch_register
Register a watch. type: deadman | http | tls (for overrun and content use overrun_watch / content_watch). target: URL (http/tls); omit for deadman. interval_s >= 300 on the free tier. condition: e.g. {"grace_s": 600} for deadman, {"max_ms": 2000} for http latency, {"warn_days": 14} for tls. Ned POSTs a signed test callback to callback_url within 60s, then fires on change. No agent key yet? Call this without one: the response includes agent_key (shown once). Store it and pass it as NED_AGENT_KEY next time.
입력 스키마
{'type': 'object', 'title': 'watch_registerArguments', 'required': ['type', 'callback_url'], 'properties': {'type': {'type': 'string', 'title': 'Type'}, 'target': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Target', 'default': None}, 'condition': {'anyOf': [{'type': 'object', 'additionalProperties': True}, {'type': 'null'}], 'title': 'Condition', 'default': None}, 'interval_s': {'type': 'integer', 'title': 'Interval S', 'default': 300}, 'callback_url': {'type': 'string', 'title': 'Callback Url'}}}
변경됨
pricing
2026년 10월 2일 2:40 AM
추가됨
content_watch
2026년 10월 2일 2:40 AM
추가됨
overrun_finish
2026년 10월 2일 2:40 AM
추가됨
overrun_start
2026년 10월 2일 2:40 AM
추가됨
overrun_watch
2026년 10월 2일 2:40 AM
변경됨
watch_register
2026년 10월 2일 2:40 AM
추가됨
pricing
2026년 9월 30일 2:40 AM
추가됨
balance
2026년 9월 30일 2:40 AM
추가됨
deadman_checkin
2026년 9월 30일 2:40 AM
추가됨
watch_cancel
2026년 9월 30일 2:40 AM
추가됨
watch_get
2026년 9월 30일 2:40 AM
추가됨
quickstart
2026년 9월 30일 2:40 AM
추가됨
watch_register
2026년 9월 30일 2:40 AM