Watchtower
REMOTE · WATCHTOWER.LAT
Job alerts for AI agents: describe a role once, get only new postings from 1,500+ tech job boards.
Available components
Last scanned (15 hours ago)
Scores higher than 57% of remote servers
Reachable. Last reached 18 Oct 2026.
Category Search and Retrieval
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →
Endpoint Security57
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- Authorisation check failed: no authorisation is required to call this server, and it exposes a tool marked destructive (delete_watch). See how to fix → View diagnostics → Fail
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- HSTS check failed: the Strict-Transport-Security header is absent. See how to fix → View diagnostics → Fail
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability61
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 2980 tokens (~372/item across 8 items; 8 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management50
- Stability observed for 15 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage99
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 96% of tool parameters carry a description.Partial
Tool Safety75
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- All 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- Manipulation not yet verified: none of the 9 captured unit(s) of tool text has been judged yet, so we will not certify text no model has read as clean.Unverified
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 17 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 43 to 47. That category is still filling its 30-day observation window: 13 days of observed history at the previous scan, 14 at this one. The score rises as the window fills, whether or not the server changes.
- 15 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 37 to 40. That category is still filling its 30-day observation window: 11 days of observed history at the previous scan, 12 at this one. The score rises as the window fills, whether or not the server changes.
- 13 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 30 to 33. That category is still filling its 30-day observation window: 9 days of observed history at the previous scan, 10 at this one. The score rises as the window fills, whether or not the server changes.
- 11 Oct 26 +2
No change was recorded against any check on this day. Stability & Change Management went from 13 to 27. That category is still filling its 30-day observation window: 4 days of observed history at the previous scan, 8 at this one. The score rises as the window fills, whether or not the server changes.
- 7 Oct 26 0
- Judged manipulation: pass → unverified ▼ security
- Schema quality: 323 → 356 ▼ functional
- 4 Oct 26 0
- Stability: unverified → 0.03 ▲ functional
- 3 Oct 26 62
First indexed and scored.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 18 Oct 2026 · Probed https://watchtower.lat/mcp?ref=registry
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=watchtower.lat | CN=YR2,O=Let's Encrypt,C=US | 30 Sept 2026 | 29 Dec 2026 | RSA 2048 | SHA256-RSA | 54b15a043512b94d141fc49d2d6e04eed43 |
| SANs: watchtower.lat | ||||||
| CN=YR2,O=Let's Encrypt,C=US (CA) | CN=Root YR,O=ISRG,C=US | 3 Sept 2025 | 2 Sept 2028 | RSA 2048 | SHA256-RSA | 4ebd24947e24d394802d84a52fd5b319 |
| CN=Root YR,O=ISRG,C=US (CA) | CN=ISRG Root X1,O=Internet Security Research Group,C=US | 13 May 2026 | 2 Sept 2032 | RSA 4096 | SHA256-RSA | f24b6d17f9d9ad7cb1c9fea78782699f |
Background: What to check on a remote MCP endpoint →
DNSSEC insecure
Validation of watchtower.lat. — Not signed
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| lat. | present | 25789, 42520 | 8, 8 | Verified |
| watchtower.lat. | absent | Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation |
Authentication No authorisation required
The endpoint answered without asking for a token. Anyone who knows the URL can reach it.
| Result | No authorisation required |
|---|---|
| HTTP status | 200 |
Background: How OAuth 2.1 works in the 2026 MCP spec →
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://watchtower.lat/mcp?ref=registry | Verified | 200 | |
| http (plaintext) | http://watchtower.lat/mcp?ref=registry | HTTPS enforced | 301 | https://watchtower.lat/mcp?ref=registry |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
ack_changes Acknowledge changes ~137
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).
| Name | Type | Req | Description |
|---|---|---|---|
| client_token | string | – | Only if this conversation already uses a Watchtower token (wt_...) from before the app was connected. Otherwise leave it out; never ask the user for one. |
| cursor | integer | yes | The cursor value returned by get_changes. |
| watch_id | string | – | Limit the acknowledgement to one watch. Omit for all your watches. |
No output schema declared.
No examples provided.
delete_watch Delete a watch ~74
Stop monitoring. Frees one of your watch slots. Delete watches you no longer need.
| Name | Type | Req | Description |
|---|---|---|---|
| client_token | string | – | Only if this conversation already uses a Watchtower token (wt_...) from before the app was connected. Otherwise leave it out; never ask the user for one. |
| watch_id | string | yes | – |
No output schema declared.
No examples provided.
get_changes Get new changes ~199
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.
| Name | Type | Req | Description |
|---|---|---|---|
| client_token | string | – | Only if this conversation already uses a Watchtower token (wt_...) from before the app was connected. Otherwise leave it out; never ask the user for one. |
| limit | integer | – | Max changes to return (default 50). If has_more is true, call again. |
| peek | boolean | – | If true, do not mark returned changes as delivered. |
| since | integer | – | Replay changes after this cursor instead of your stored position. |
| watch_id | string | – | Limit to one watch. Omit for all your watches. |
No output schema declared.
No examples provided.
get_watch Get one watch ~108
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.
| Name | Type | Req | Description |
|---|---|---|---|
| client_token | string | – | Only if this conversation already uses a Watchtower token (wt_...) from before the app was connected. Otherwise leave it out; never ask the user for one. |
| watch_id | string | yes | – |
No output schema declared.
No examples provided.
list_companies List covered companies ~203
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.
| Name | Type | Req | Description |
|---|---|---|---|
| client_token | string | – | Only if this conversation already uses a Watchtower token (wt_...) from before the app was connected. Otherwise leave it out; never ask the user for one. |
| limit | integer | – | Companies per page (default 100, max 1000). |
| offset | integer | – | Skip this many; pass next_offset from the previous page. |
| query | string | – | Part of a company name or board URL, case-insensitive, e.g. "stripe". Omit to list all. |
No output schema declared.
No examples provided.
list_watches List your watches ~74
List all active watches for your client with their health, last check time and number of pending (undelivered) changes.
| Name | Type | Req | Description |
|---|---|---|---|
| client_token | string | – | Only if this conversation already uses a Watchtower token (wt_...) from before the app was connected. Otherwise leave it out; never ask the user for one. |
No output schema declared.
No examples provided.
search_jobs Search open jobs ~625
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.
| Name | Type | Req | Description |
|---|---|---|---|
| all_keywords | array | – | Only report jobs containing every one of these, e.g. ["data", "scientist"]. |
| client_token | string | – | Only if this conversation already uses a Watchtower token (wt_...) from before the app was connected. Otherwise leave it out; never ask the user for one. |
| exclude_keywords | array | – | Never report jobs mentioning one of these, e.g. ["manager", "clearance"]. |
| include_unknown | boolean | – | Many postings state no pay or no years of experience. true (default) still reports them, without a salary / experience_years field; false reports only postings that state a qualifying value. |
| keywords | array | – | Only report jobs whose title/location/department/company contains one of these as a whole word, e.g. ["iOS", "Swift"]. |
| limit | integer | – | Jobs per page (default 25, max 100). |
| locations | array | – | Only report jobs with one of these in their location, e.g. ["Austin"], ["Berlin", "Remote"]. |
| max_experience_years | number | – | The most years of experience a job may ask for, e.g. 6. |
| min_salary | number | – | Yearly pay the job must be able to reach, e.g. 150000. Compared with the top of the posted range (hourly and monthly pay are converted). |
| offset | integer | – | Skip this many matches; pass next_offset from the previous page. |
| query | string | – | What to look for, in plain language: role, place, pay, experience, level, remote. E.g. "iOS jobs in Austin with a maximum of 6 years of experience", "senior backend roles in New York or remote paying… |
| remote_only | boolean | – | Only report jobs whose title or location says remote (and not hybrid/on-site). |
| salary_currency | string | – | ISO currency of min_salary, e.g. "USD". Jobs that state pay in another currency are then left out. |
| seniority | array | – | Only report these levels, derived from the title. "mid" means the title carries no level. |
No output schema declared.
No examples provided.
watch_jobs Watch for new job postings ~938
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.
| Name | Type | Req | Description |
|---|---|---|---|
| all_keywords | array | – | Only report jobs containing every one of these, e.g. ["data", "scientist"]. |
| client_token | string | – | Only if this conversation already uses a Watchtower token (wt_...) from before the app was connected. Otherwise leave it out; never ask the user for one. |
| exclude_keywords | array | – | Never report jobs mentioning one of these, e.g. ["manager", "clearance"]. |
| include_unknown | boolean | – | Many postings state no pay or no years of experience. true (default) still reports them, without a salary / experience_years field; false reports only postings that state a qualifying value. |
| interval_minutes | integer | – | How often to check, in minutes (min 5, default 60). Resources shared with other watchers use the shortest interval. |
| keywords | array | – | Only report jobs whose title/location/department/company contains one of these as a whole word, e.g. ["iOS", "Swift"]. |
| label | string | – | A short note to yourself about why you are watching this. |
| locations | array | – | Only report jobs with one of these in their location, e.g. ["Austin"], ["Berlin", "Remote"]. |
| max_experience_years | number | – | The most years of experience a job may ask for, e.g. 6. |
| min_salary | number | – | Yearly pay the job must be able to reach, e.g. 150000. Compared with the top of the posted range (hourly and monthly pay are converted). |
| query | string | – | What to watch for, in plain language: role, place, pay, experience, level, remote. E.g. "iOS jobs in Austin making at least 150k a year with a maximum of 6 years of experience", "senior backend roles… |
| remote_only | boolean | – | Only report jobs whose title or location says remote (and not hybrid/on-site). |
| salary_currency | string | – | ISO currency of min_salary, e.g. "USD". Jobs that state pay in another currency are then left out. |
| seniority | array | – | Only report these levels, derived from the title. "mid" means the title carries no level. |
| url | string | – | Optional. Limit the watch to one job board or careers page, e.g. https://boards.greenhouse.io/acme, https://jobs.lever.co/acme, https://acme.wd5.myworkdayjobs.com/Careers. Omit to watch every monitor… |
| urls | array | – | Optional. Several boards to watch with the same filters (max 25). Returns watches and per-URL errors. |
| webhook_url | string | – | Optional public https URL that receives a signed POST whenever matching changes are detected. Polling get_changes keeps working either way. |
No output schema declared.
No examples provided.
How do I install the Watchtower MCP server?
Watchtower is a hosted endpoint at https://watchtower.lat/mcp?ref=registry, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
remote · watchtower.lat
claude mcp add --transport http lat-watchtower-watchtower 'https://watchtower.lat/mcp?ref=registry'
What is the Watchtower MCP server?
Watchtower is an MCP server listed in the public MCP registry as lat.watchtower/watchtower. Job alerts for AI agents: describe a role once, get only new postings from 1,500+ tech job boards. This page covers its hosted endpoint (https://watchtower.lat/mcp?ref=registry).
Is the Watchtower MCP server safe to use?
Watchtower scores 67 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the Watchtower MCP server expose?
Watchtower exposes 8 tools: watch_jobs, search_jobs, list_companies, get_changes, list_watches, and 3 more. Their descriptions and schemas cost roughly 2,358 tokens of context every time the server is loaded.
Does the Watchtower MCP server require authentication?
No. We connected to Watchtower without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.
Is the Watchtower MCP server still maintained?
Watchtower is still listed as active in the MCP registry. We last reached this channel on 18 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.