MCP 服务器

Watchtower

lat.watchtower/watchtower
生产力 搜索与研究 公开且可连接 MCP 2025-11-25

此 MCP 可以做什么

Creates persistent watches for matching technology job postings and reports newly added or currently open roles across monitored job boards.

ack_changes
Acknowledge 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).
幂等
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['cursor'], 'properties': {'cursor': {'type': 'integer', 'minimum': 0, 'description': 'The cursor value returned by get_changes.'}, 'watch_id': {'type': 'string', 'format': 'uuid', 'description': 'Limit the acknowledgement to one watch. Omit for all your watches.'}, 'client_token': {'type': 'string', 'description': 'Your Watchtower client token (wt_...). Optional if the MCP connection sends "Authorization: Bearer <token>".'}}, 'additionalProperties': False}
delete_watch
Delete a watch
Stop monitoring. Frees one of your watch slots. Delete watches you no longer need.
可能执行破坏性操作 幂等
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['watch_id'], 'properties': {'watch_id': {'type': 'string', 'format': 'uuid'}, 'client_token': {'type': 'string', 'description': 'Your Watchtower client token (wt_...). Optional if the MCP connection sends "Authorization: Bearer <token>".'}}, 'additionalProperties': False}
get_changes
Get new 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.
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'peek': {'type': 'boolean', 'description': 'If true, do not mark returned changes as delivered.'}, 'limit': {'type': 'integer', 'maximum': 200, 'minimum': 1, 'description': 'Max changes to return (default 50). If has_more is true, call again.'}, 'since': {'type': 'integer', 'minimum': 0, 'description': 'Replay changes after this cursor instead of your stored position.'}, 'watch_id': {'type': 'string', 'format': 'uuid', 'description': 'Limit to one watch. Omit for all your watches.'}, 'client_token': {'type': 'string', 'description': 'Your Watchtower client token (wt_...). Optional if the MCP connection sends "Authorization: Bearer <token>".'}}, 'additionalProperties': False}
get_watch
Get one 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.
只读
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['watch_id'], 'properties': {'watch_id': {'type': 'string', 'format': 'uuid'}, 'client_token': {'type': 'string', 'description': 'Your Watchtower client token (wt_...). Optional if the MCP connection sends "Authorization: Bearer <token>".'}}, 'additionalProperties': False}
list_watches
List your watches
List all active watches for your client with their health, last check time and number of pending (undelivered) changes.
只读
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'client_token': {'type': 'string', 'description': 'Your Watchtower client token (wt_...). Optional if the MCP connection sends "Authorization: Bearer <token>".'}}, 'additionalProperties': False}
watch_jobs
Watch for new job postings
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 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.
可访问外部资源
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'url': {'type': 'string', 'format': 'uri', 'description': '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 monitored board.'}, 'urls': {'type': 'array', 'items': {'type': 'string', 'format': 'uri'}, 'maxItems': 25, 'minItems': 1, 'description': 'Optional. Several boards to watch with the same filters (max 25). Returns watches and per-URL errors.'}, 'label': {'type': 'string', 'maxLength': 200, 'description': 'A short note to yourself about why you are watching this.'}, 'query': {'type': 'string', 'maxLength': 500, 'minLength': 1, 'description': '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 in New York or remote paying $180k+". Check interpreted in the response.'}, 'keywords': {'type': 'array', 'items': {'type': 'string', 'maxLength': 100, 'minLength': 1}, 'maxItems': 20, 'description': 'Only report jobs whose title/location/department/company contains one of these as a whole word, e.g. ["iOS", "Swift"].'}, 'locations': {'type': 'array', 'items': {'type': 'string', 'maxLength': 100, 'minLength': 1}, 'maxItems': 20, 'description': 'Only report jobs with one of these in their location, e.g. ["Austin"], ["Berlin", "Remote"].'}, 'seniority': {'type': 'array', 'items': {'enum': ['intern', 'entry', 'mid', 'senior', 'staff', 'principal', 'manager', 'director'], 'type': 'string'}, 'description': 'Only report these levels, derived from the title. "mid" means the title carries no level.'}, 'min_salary': {'type': 'number', 'maximum': 100000000, 'minimum': 0, 'description': '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).'}, 'remote_only': {'type': 'boolean', 'description': 'Only report jobs whose title or location says remote (and not hybrid/on-site).'}, 'webhook_url': {'type': 'string', 'format': 'uri', 'description': 'Optional public https URL that receives a signed POST whenever matching changes are detected. Polling get_changes keeps working either way.'}, 'all_keywords': {'type': 'array', 'items': {'type': 'string', 'maxLength': 100, 'minLength': 1}, 'maxItems': 20, 'description': 'Only report jobs containing every one of these, e.g. ["data", "scientist"].'}, 'client_token': {'type': 'string', 'description': 'Your Watchtower client token (wt_...). Optional if the MCP connection sends "Authorization: Bearer <token>".'}, 'include_unknown': {'type': 'boolean', 'description': '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.'}, 'salary_currency': {'type': 'string', 'pattern': '^[A-Za-z]{3}$', 'description': 'ISO currency of min_salary, e.g. "USD". Jobs that state pay in another currency are then left out.'}, 'exclude_keywords': {'type': 'array', 'items': {'type': 'string', 'maxLength': 100, 'minLength': 1}, 'maxItems': 20, 'description': 'Never report jobs mentioning one of these, e.g. ["manager", "clearance"].'}, 'interval_minutes': {'type': 'integer', 'maximum': 10080, 'minimum': 5, 'description': 'How often to check, in minutes (min 5, default 60). Resources shared with other watchers use the shortest interval.'}, 'max_experience_years': {'type': 'number', 'maximum': 60, 'minimum': 0, 'description': 'The most years of experience a job may ask for, e.g. 6.'}}, 'additionalProperties': False}
已添加
delete_watch
2026年10月4日 02:40
已添加
ack_changes
2026年10月4日 02:40
已添加
get_watch
2026年10月4日 02:40
已添加
list_watches
2026年10月4日 02:40
已添加
get_changes
2026年10月4日 02:40
已添加
watch_jobs
2026年10月4日 02:40