protogrid

Search / lat.watchtower/watchtower

Watchtower

R0· no sign-in

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

v0.1.1 · active · repository · website · descriptor JSON · versions

An agent can connect right now, no human step.Remote endpoint, no authentication, reachable on the last probe.
Quality80good
Trust96of 100
Uptime, 30 days100%
Latency p50651 ms

Connect

8 clients · secrets stay placeholders
{
  "mcpServers": {
    "watchtower": {
      "type": "http",
      "url": "https://watchtower.lat/mcp?ref=registry"
    }
  }
}
claude mcp add --transport http watchtower https://watchtower.lat/mcp?ref=registry
[mcp_servers.watchtower]
url = "https://watchtower.lat/mcp?ref=registry"
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "watchtower": {
      "type": "remote",
      "url": "https://watchtower.lat/mcp?ref=registry",
      "enabled": true
    }
  }
}
{
  "mcpServers": {
    "watchtower": {
      "type": "http",
      "url": "https://watchtower.lat/mcp?ref=registry"
    }
  },
  "deeplink": "cursor://anysphere.cursor-deeplink/mcp/install?name=watchtower&config=eyJ0eXBlIjoiaHR0cCIsInVybCI6Imh0dHBzOi8vd2F0Y2h0b3dlci5sYXQvbWNwP3JlZj1yZWdpc3RyeSJ9"
}
{
  "servers": {
    "watchtower": {
      "type": "http",
      "url": "https://watchtower.lat/mcp?ref=registry"
    }
  }
}
{
  "mcpServers": {
    "watchtower": {
      "httpUrl": "https://watchtower.lat/mcp?ref=registry"
    }
  }
}
extensions:
  "watchtower":
    enabled: true
    name: "watchtower"
    type: streamable_http
    uri: "https://watchtower.lat/mcp?ref=registry"
    timeout: 300

Quality 80 / 100good

protocol75 · weight 25
  • warn
    protocol.modernnewest supported version is 2025-11-25; 2026-07-28 not supported, older versions are deprecated until 2027-07-28
  • n/a
    protocol.statelessonly applies to 2026-07-28 servers
  • pass
    protocol.transportstreamable HTTP
  • n/a
    protocol.list_ttlonly applies to 2026-07-28 servers
authorizationn/a · weight 15
  • n/a
    auth.prm, auth.as_metadata, auth.cimdno remote uses OAuth
  • n/a
    auth.secret_in_urlno templated URL
tool hygiene86 · weight 30
  • pass
    tools.descriptionsevery tool has a description
  • warn
    tools.description_length1 tools have descriptions over 1,024 characters, which crowds the context
  • pass
    tools.schemasevery tool has an object input schema
  • pass
    tools.annotations8 of 8 tools declare readOnlyHint or destructiveHint
  • warn
    tools.directory_hints3 of 8 tools declare all four hints; missing: get_watch (idempotentHint); watch_jobs (idempotentHint); list_companies (idempotentHint); …
  • pass
    tools.token_costabout 3,514 tokens to load every tool
  • pass
    tools.api_dumptools are not a one-to-one API dump
stability75 · weight 15
  • warn
    stability.changes15 tool changes in 30 days
  • pass
    stability.rug_pullno tool changed its meaning under the same name
dependenciesn/a · weight 15
  • n/a
    deps.known_vulns, deps.mcp_sdk_version, deps.resolvableno npm or PyPI package

8 tools, about 3,514 tokens to load them all · tool set 326bb0a8525e · tools last changed 2026-10-08 · checked 2026-10-20 13:49 UTC

Tool changes

  • delete_watchchangedinput schema
  • ack_changeschangedinput schema
  • get_watchchangedinput schema
  • list_watcheschangedinput schema
  • get_changeschangedinput schema
  • list_companieschangedinput schema
  • search_jobschangedinput schema
  • watch_jobschangeddescription, input schema
    before

    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 and iCIMS 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.

    after · 97% of words in common

    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.

  • get_watchchangedannotations
  • list_watcheschangedannotations

Showing the latest 10. Full history: list_changes · trend: quality JSON.

Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed. How it is computed.

Trust 96 / 100

provenance85
liveness100
freshness100
hygiene100

+repository +dns-namespace +website +reachable +uptime-100% +updated-11d-ago

Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed. How it is computed.

Endpoints

remoteauthreachableuptime 30dp50protocollast ok
https://watchtower.lat/mcp?ref=registry streamable-httpnoneyes100%651 ms2025-11-252026-10-20

Tools (8)

ack_changesMark 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_watchdestructiveStop monitoring. Frees one of your watch slots. Delete watches you no longer need.
get_changesReturn 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.
get_watchread-onlyGet 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.
list_companiesread-onlyList 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.
list_watchesread-onlyList all active watches for your client with their health, last check time and number of pending (undelivered) changes.
search_jobsread-onlyFind 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.
watch_jobsCreate 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.

Schemas: list_tools.

Official server.json
{
  "name": "lat.watchtower/watchtower",
  "title": "Watchtower",
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
  "remotes": [
    {
      "url": "https://watchtower.lat/mcp?ref=registry",
      "type": "streamable-http"
    }
  ],
  "version": "0.1.1",
  "repository": {
    "url": "https://github.com/connorlagana/watchtower",
    "source": "github"
  },
  "websiteUrl": "https://watchtower.lat/",
  "description": "Job alerts for AI agents: describe a role once, get only new postings from 1,500+ tech job boards."
}