Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

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

+3 this week 67 Trust /100

Last scanned (15 hours ago)

Scores higher than 57% of remote servers

Reachable. Last reached 18 Oct 2026.

Category Search and Retrieval

Trust breakdown (7 categories)

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
Transport & Reachability100
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
Changelog

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.

Diagnostics

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
MCP tools · 8 exposed · ~2,358 tokens

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 →

Tool Tokens
ack_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).

NameTypeReqDescription
client_tokenstring–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.
cursorintegeryesThe cursor value returned by get_changes.
watch_idstring–Limit the acknowledgement to one watch. Omit for all your watches.

No output schema declared.

No examples provided.

delete_watch ~74

Stop monitoring. Frees one of your watch slots. Delete watches you no longer need.

NameTypeReqDescription
client_tokenstring–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_idstringyes–

No output schema declared.

No examples provided.

get_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.

NameTypeReqDescription
client_tokenstring–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.
limitinteger–Max changes to return (default 50). If has_more is true, call again.
peekboolean–If true, do not mark returned changes as delivered.
sinceinteger–Replay changes after this cursor instead of your stored position.
watch_idstring–Limit to one watch. Omit for all your watches.

No output schema declared.

No examples provided.

get_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.

NameTypeReqDescription
client_tokenstring–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_idstringyes–

No output schema declared.

No examples provided.

list_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.

NameTypeReqDescription
client_tokenstring–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.
limitinteger–Companies per page (default 100, max 1000).
offsetinteger–Skip this many; pass next_offset from the previous page.
querystring–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 ~74

List all active watches for your client with their health, last check time and number of pending (undelivered) changes.

NameTypeReqDescription
client_tokenstring–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 ~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.

NameTypeReqDescription
all_keywordsarray–Only report jobs containing every one of these, e.g. ["data", "scientist"].
client_tokenstring–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_keywordsarray–Never report jobs mentioning one of these, e.g. ["manager", "clearance"].
include_unknownboolean–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.
keywordsarray–Only report jobs whose title/location/department/company contains one of these as a whole word, e.g. ["iOS", "Swift"].
limitinteger–Jobs per page (default 25, max 100).
locationsarray–Only report jobs with one of these in their location, e.g. ["Austin"], ["Berlin", "Remote"].
max_experience_yearsnumber–The most years of experience a job may ask for, e.g. 6.
min_salarynumber–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).
offsetinteger–Skip this many matches; pass next_offset from the previous page.
querystring–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_onlyboolean–Only report jobs whose title or location says remote (and not hybrid/on-site).
salary_currencystring–ISO currency of min_salary, e.g. "USD". Jobs that state pay in another currency are then left out.
seniorityarray–Only report these levels, derived from the title. "mid" means the title carries no level.

No output schema declared.

No examples provided.

watch_jobs ~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.

NameTypeReqDescription
all_keywordsarray–Only report jobs containing every one of these, e.g. ["data", "scientist"].
client_tokenstring–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_keywordsarray–Never report jobs mentioning one of these, e.g. ["manager", "clearance"].
include_unknownboolean–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_minutesinteger–How often to check, in minutes (min 5, default 60). Resources shared with other watchers use the shortest interval.
keywordsarray–Only report jobs whose title/location/department/company contains one of these as a whole word, e.g. ["iOS", "Swift"].
labelstring–A short note to yourself about why you are watching this.
locationsarray–Only report jobs with one of these in their location, e.g. ["Austin"], ["Berlin", "Remote"].
max_experience_yearsnumber–The most years of experience a job may ask for, e.g. 6.
min_salarynumber–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).
querystring–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_onlyboolean–Only report jobs whose title or location says remote (and not hybrid/on-site).
salary_currencystring–ISO currency of min_salary, e.g. "USD". Jobs that state pay in another currency are then left out.
seniorityarray–Only report these levels, derived from the title. "mid" means the title carries no level.
urlstring–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…
urlsarray–Optional. Several boards to watch with the same filters (max 25). Returns watches and per-URL errors.
webhook_urlstring–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.

Install

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

# add to Claude Code
claude mcp add --transport http lat-watchtower-watchtower 'https://watchtower.lat/mcp?ref=registry'
Common questions

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.