Watchtower
Stop repeatedly browsing the same pages. Watchtower monitors public internet resources for AI agents and returns structured changes.
Create a watch once. Watchtower checks on a schedule, remembers what it saw, and get_changes hands back only what changed: a new job, a new event date, the lines added to a page.
Connect an agent (MCP)
{
"mcpServers": {
"watchtower": { "type": "http", "url": "https://watchtower.lat/mcp" }
}
}
No token yet? The first watch_* call creates an anonymous client and returns its token. Send it back as Authorization: Bearer <token> or as client_token.
Tools
watch_url | Watch a public page or RSS/Atom feed; get CONTENT_CHANGED (with word-level diffs) or ITEM_ADDED. |
watch_jobs | Watch a job board (Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee, or schema.org JobPosting pages); get JOB_ADDED/JOB_REMOVED/JOB_UPDATED. |
watch_events | Watch an event page (schema.org Event, or future dates in text); get EVENT_ADDED/EVENT_REMOVED/EVENT_UPDATED/EVENT_RESCHEDULED. |
get_changes | Fetch only what changed since your last call. Empty list = nothing new. |
ack_changes | Acknowledge a cursor after get_changes(peek=true), for at-least-once processing. |
list_watches | List your watches with health and pending change counts. |
get_watch | One watch plus the resource's current jobs/events/text excerpt. |
delete_watch | Stop monitoring and free a slot (10 per client). |
REST in three calls
TOKEN=$(curl -s -X POST https://watchtower.lat/v1/clients | jq -r .token)
curl -s -X POST https://watchtower.lat/v1/watches \
-H "Authorization: Bearer $TOKEN" -H "content-type: application/json" \
-d '{"type":"jobs","url":"https://boards.greenhouse.io/acme","keywords":["iOS"]}'
curl -s https://watchtower.lat/v1/changes -H "Authorization: Bearer $TOKEN"
Example change:
{
"id": 1842,
"type": "JOB_ADDED",
"summary": "New job: Senior iOS Engineer (Remote - US)",
"url": "https://boards.greenhouse.io/acme",
"data": { "job": { "title": "Senior iOS Engineer", "location": "Remote - US", "url": "https://..." } }
}
What it understands
- Any public page: only the main content is compared; navigation, cookie banners, scripts and markup are dropped, and lines that change on nearly every load (counters, clocks, rotating widgets) are learned and ignored. Changes come with word-level diffs. Optional CSS selector and keyword filters.
- Feeds: RSS and Atom report each new entry as
ITEM_ADDED. - Job boards: Greenhouse, Lever, Ashby, Workable, SmartRecruiters and Recruitee via their public job-board APIs; other career pages via schema.org
JobPosting. - Event pages: schema.org
EventJSON-LD (including reschedules), falling back to future calendar dates in the page text. - Delivery: poll
get_changes, or add a signedwebhook_url. - Shared fetching: many agents watching the same URL cost one request. ETag / Last-Modified are honored.
Limits and policy
- Free and anonymous. Up to 10 watches per client; checks at most every 5 minutes. Watches nobody reads for 30 days expire.
- Polite: at most one request at a time per website, spaced out, with ETag/Last-Modified.
- Public resources only. Watchtower respects robots.txt and does not bypass CAPTCHAs, logins, paywalls or anti-bot systems.
- Private and internal network addresses are refused.