# Watchtower [Health: Active]

**Category:** 💻 Developer Tools  
**Repository:** https://github.com/connorlagana/watchtower  
**GitHub Stars:** 0  
**Views:** 0  
**Installs:** 0  
**Upvotes:** 0  
**Directory Page:** https://allmcps.com/mcp/watchtower

## Description
Job alerts for AI agents: describe a role once, get only new postings from 1,500+ tech job boards.

## Tools
Capabilities this server exposes over MCP:

- **watch_jobs** — Create a persistent watch for tech jobs. Describe what you want in query ("iOS jobs in Austin making at least 150k a year with a maximum of 6 years of experience") and leave url out: the watch then covers every job board Watchtower monitors (tech companies and startups, whatever platform they use) and reports each new matching posting (JOB_ADDED). The response shows how the query was read (interpreted), the jobs open right now that match (current_jobs) and how many boards are covered (coverage); later call get_changes for new ones. Use this INSTEAD OF re-running job searches or re-checking careers pages yourself. To follow one company, or to cover a company the directory is missing, pass url (or urls for several): Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee, Workday, iCIMS, Oracle Recruiting, Eightfold and SuccessFactors boards, and the Apple, Google, Amazon and Microsoft careers sites, are read through their own endpoints; other careers pages are parsed via schema.org JobPosting JSON-LD. A careers page that only links to a supported board is watched through that board (resolved_from says so); a page with neither is rejected with NO_JOB_DATA. A board you watch stays covered for every search watch. A board watch emits JOB_ADDED / JOB_REMOVED / JOB_UPDATED. Jobs carry title, location, other_locations, department, company, url, posted_at, remote, seniority, and salary / experience_years when the posting states them. Explicit filters override what the query says.
- **search_jobs** — Find the tech jobs open right now that match a request, across every job board Watchtower monitors (tech companies and startups). Describe what you want in query ("iOS jobs in Austin with a maximum of 6 years of experience"). Read-only: nothing is saved and no watch is created, and no token is needed. The response shows how the query was read (interpreted), the matching jobs newest first, the total, and next_offset for the next page. Use this for "what is open right now"; to be told about new postings later, use watch_jobs instead. Jobs carry title, location, other_locations, department, company, url, posted_at, remote, seniority, and salary / experience_years when the posting states them. Explicit filters override what the query says.
- **list_companies** — List the companies whose job boards Watchtower monitors, i.e. what search_jobs and watch_jobs without a url cover. Pass query to check whether a company is covered ("stripe"). Each entry has name, board_url (pass it to watch_jobs as url to follow only that company), platform and open_jobs. Read-only, no token needed. If a company is missing, watch its board URL or careers page to add it.
- **get_changes** — Return job changes detected since your last get_changes call, across all your watches or one watch. This is the cheap replacement for re-browsing careers pages: if it returns an empty list, nothing you care about has changed. By default the cursor advances so each change is delivered once; pass peek=true to look without advancing, or since=<cursor> to replay.
- **list_watches** — List all active watches for your client with their health, last check time and number of pending (undelivered) changes.
- **get_watch** — Get a watch with its status and the jobs currently open that match its filters: on its board, or across every monitored board for a watch created without a url. Use this to answer "what is open right now" without searching or fetching careers pages yourself.
- **ack_changes** — Mark changes up to a cursor as processed. Use with get_changes(peek=true) for at-least-once delivery: peek, act on the changes, then ack the cursor get_changes returned. Not needed if you call get_changes without peek (that acknowledges automatically).
- **delete_watch** — Stop monitoring. Frees one of your watch slots. Delete watches you no longer need.

## Claude Desktop Quick Installation
No confirmed install details yet, so no config is published. Follow the setup steps in the repository above.

## Documentation

## What Watchtower MCP server does

Watchtower MCP server gives agents a way to search and monitor technology jobs across a directory of more than 1,500 job boards and company career sites. A plain-language request such as a role, location, salary threshold, or experience limit is converted into filters and returned in the `interpreted` result so the caller can inspect how the request was understood.

Use `search_jobs` for a one-time view of currently open roles. It returns matching jobs in newest-first order, along with the total and a pagination offset. Use `watch_jobs` when the requirement is ongoing monitoring. A watch without a URL covers the monitored directory; a watch with a URL follows a specific board or career page. Multiple URLs can be supplied for several companies.

Each job can include its title, location, alternate locations, department, company, source URL, posting date, remote status, seniority, salary, and stated experience requirements. Salary and experience fields are present only when the source posting provides them.

## How it works

Watchtower MCP server takes an initial snapshot when a watch is created and checks its sources on a schedule. `get_changes` then returns detected additions, removals, or updates, depending on the watch type. Search watches emit new matching postings; board watches can emit `JOB_ADDED`, `JOB_REMOVED`, and `JOB_UPDATED` events.

The normal `get_changes` cursor advances as changes are delivered. Use `peek=true` when an agent needs to process changes before acknowledging them, then call `ack_changes` after successful handling. A `since` cursor can replay earlier changes. An optional webhook URL can be attached to a watch for push delivery.

Searches and watches support keyword inclusion and exclusion, locations, seniority, remote-only matching, minimum salary, salary currency, maximum experience, and whether unknown values should be included. Explicit filter parameters take precedence over values inferred from the query. Query interpretation uses rules rather than an LLM, so no model or third-party API key is required.

## Setup and configuration

A hosted MCP endpoint is available at `https://watchtower.lat/mcp` without sign-up. The README documents connections for Claude Code, Claude Desktop or Claude.ai, Cursor, and VS Code, as well as a generic HTTP MCP configuration.

For local operation, the project uses Node.js 22 and PostgreSQL. Copy `.env.example` to `.env`, provide `DATABASE_URL`, run the database migrations, and start the development or production build. Docker Compose can start the application and PostgreSQL together. The local MCP endpoint is shown as `http://localhost:3000/mcp`.

The same service layer also exposes REST endpoints. The repository describes the implementation as TypeScript using Fastify, PostgreSQL, and the official MCP TypeScript SDK.

## Tools and capabilities

The Watchtower MCP server exposes these tools:

- `watch_jobs`: Create a search watch or one or more URL-based board watches.
- `search_jobs`: Search current openings without saving a watch or requiring a token.
- `list_companies`: Inspect covered companies, board URLs, platforms, and open-job counts.
- `get_changes`: Retrieve new or changed jobs for all watches or one watch.
- `list_watches`: Show active watches, health, last checks, expiry, and pending changes.
- `get_watch`: Return a watch and its currently matching open jobs.
- `ack_changes`: Confirm processing after a peek-based delivery.
- `delete_watch`: Stop a watch and release its watch slot.

Supported sources include several recruiting platforms, including Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee, Workday, iCIMS, Oracle Recruiting, Eightfold, and SuccessFactors. Apple, Google, Amazon, and Microsoft career sites have dedicated handling. Other pages must expose schema.org `JobPosting` JSON-LD; pages without usable job data are rejected.

_Full upstream README: https://allmcps.com/mcp/watchtower/readme_

