Skip to main content
Glama

Watchtower

Server Details

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

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
connorlagana/watchtower
GitHub Stars
0
Server Listing
Watchtower

TDQS

A3.9/5.0

Scored across 6 tools

Disambiguation4/5

Each tool maps to a distinct action on the watch/change lifecycle (create, list, get, delete, get_changes, ack_changes). The main risk is ack_changes, which is only needed in the peek=true flow, so an agent could misuse it alongside a non-peek get_changes; the descriptions largely resolve this but the coupling introduces mild ambiguity.

Naming Consistency5/5

All tools use consistent snake_case with a clear verb_noun structure: watch_jobs, list_watches, get_watch, get_changes, ack_changes, delete_watch. Minor abbreviation (ack) does not break the pattern.

Tool Count5/5

Six tools is well-scoped for a job-watch and change-delivery server, with each tool earning its place across the watch lifecycle and the change-consumption flow.

Completeness4/5

The surface covers create (watch_jobs), read (list_watches, get_watch), delete (delete_watch), and both change retrieval and acknowledgment. The notable gap is an update operation for watch filters, though delete-and-recreate is a workable fallback.

Available Tools

6 tools
ack_changesAcknowledge changesA
Idempotent
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
cursorYesThe cursor value returned by get_changes.
watch_idNoLimit the acknowledgement to one watch. Omit for all your watches.
client_tokenNoYour Watchtower client token (wt_...). Optional if the MCP connection sends "Authorization: Bearer <token>".

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds real protocol semantics beyond that: the at-least-once delivery model and the auto-ack behavior of non-peek reads. It does not cover edge behavior such as acking a stale/unknown cursor or what happens on replay, which keeps it out of the top band.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, each earning its place: the action, the positive protocol, then the exclusion. The core operation is front-loaded before the usage detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 1-required-param cursor acknowledgement with no output schema, the description plus annotations plus full schema coverage give an agent enough to call it correctly. The only gap is error/edge behavior (invalid cursor, re-ack after failure), which is minor given idempotentHint=true.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so cursor, watch_id and client_token are all already documented in the schema, including the auth fallback for client_token. The description only echoes cursor provenance ('the cursor get_changes returned') without adding format or constraint detail, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Mark changes up to a cursor as processed') and explicitly positions itself against the sibling get_changes, naming the non-peek path. An agent can distinguish ack_changes from get_changes/delete_watch without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives the exact usage protocol: pair with get_changes(peek=true), act, then ack the returned cursor. It also states the negative case — ack is unnecessary when get_changes is called without peek, since that acknowledges automatically — so there is no ambiguity about when to invoke this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_watchDelete a watchB
DestructiveIdempotent
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
watch_idYes
client_tokenNoYour Watchtower client token (wt_...). Optional if the MCP connection sends "Authorization: Bearer <token>".

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered. The description adds a genuinely useful fact not in the annotations - that deletion frees a limited watch slot - but does not explain what happens to the watch's associated data or history.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short, front-loaded sentences with no filler; the core action leads. Slightly redundant between 'Stop monitoring' and 'Delete watches', but efficient overall.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive mutation tool, the annotations carry the safety burden, so the description is minimally sufficient. However, it leaves the required watch_id undocumented and does not clarify consequences of deletion, leaving gaps an agent would want filled.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 50%: watch_id (the required parameter) has no schema description, and the description says nothing about it. The description fails to compensate for the uncovered required parameter, adding no format or meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a clear verb+resource pairing ('Delete watches', 'Stop monitoring'), which an agent can readily distinguish from get_watch/list_watches siblings. It does not explicitly name the alternatives, so it stops short of the top score.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Delete watches you no longer need' implies when to use it but gives no explicit when-not conditions, prerequisites, or named alternatives. Usage is inferred rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_changesGet new changesAInspect

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= to replay.

ParametersJSON Schema
NameRequiredDescriptionDefault
peekNoIf true, do not mark returned changes as delivered.
limitNoMax changes to return (default 50). If has_more is true, call again.
sinceNoReplay changes after this cursor instead of your stored position.
watch_idNoLimit to one watch. Omit for all your watches.
client_tokenNoYour Watchtower client token (wt_...). Optional if the MCP connection sends "Authorization: Bearer <token>".

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations mark readOnlyHint=false and idempotentHint=false, which would otherwise be puzzling for a read-style tool; the description resolves this by disclosing that the cursor advances by default so each change is delivered once, and that peek/since override that. It also explains the empty-list semantics, adding genuine behavioral context beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the core purpose before qualifying behavior, and every clause carries load: scope, the re-browsing rationale, the empty-list signal, and the cursor modes. No filler or repetition of structured fields.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no output schema it covers a lot: what an empty result means and that results are delivered once. It still does not describe the shape of a change record or reference has_more/pagination outside the schema, so a small return-value gap remains.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description clears that bar by explaining the intent behind peek ('to look without advancing') and since ('to replay'), giving the agent the purpose of the two most non-obvious parameters. It does not add anything for limit, watch_id, or client_token.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource with explicit scope ('job changes detected since your last get_changes call, across all your watches or one watch'), so an agent immediately knows what it returns. It does not, however, name or contrast itself with sibling tools such as ack_changes, which shares cursor-advancing behavior, so the sibling-differentiation criterion for a 5 is unmet.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context for when this is the right call ('the cheap replacement for re-browsing careers pages') and explains the three operating modes: default advance, peek=true, and since=<cursor> replay. It stops short of naming an alternative tool or stating when not to use it, so it lands at a strong 4 rather than 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_watchGet one watchA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
watch_idYes
client_tokenNoYour Watchtower client token (wt_...). Optional if the MCP connection sends "Authorization: Bearer <token>".

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds real behavioral context beyond that: the result set is scoped to the watch's board, or to every monitored board when the watch was created without a url. It omits any note on freshness, pagination, or result size limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the resource and its payload, then the use case. The scoping clause is dense but earns its place by explaining an otherwise surprising result boundary. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description does the necessary work of describing what comes back (status plus open matching jobs) and the scope rule that governs the job list. For a read-only lookup with a one-required-param schema, that is close to sufficient; only result volume or error behavior is unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50%: client_token is documented in the schema, while watch_id (a uuid) is undocumented but largely self-evident from its name. The description adds no format or semantics for either parameter, though it does implicitly tie output scope to the watch's url configuration. Minimum viable, with the schema carrying the load.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get a watch') and goes further by naming the payload: the watch's status plus the jobs currently open that match its filters. That is well beyond a tautology of the title. It does not, however, explicitly differentiate itself from sibling tools like list_watches or watch_jobs, leaving the agent to infer the singular/plural distinction.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The second sentence gives a clear use case ('answer "what is open right now" without searching or fetching careers pages yourself'), which tells the agent when this is the right call. It stops short of naming an alternative tool or a when-not-to-use condition, so it is context without routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_watchesList your watchesA
Read-only
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
client_tokenNoYour Watchtower client token (wt_...). Optional if the MCP connection sends "Authorization: Bearer <token>".

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds meaningful scope beyond that: it lists only ACTIVE watches (implicitly excluding inactive ones) and enumerates the fields returned (health, last check time, pending changes), which is genuinely useful context for interpreting results.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single well-formed sentence with the verb, scope, and returned fields front-loaded. No filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description must carry return-value information, and it does list the key returned fields. It omits pagination/ordering behavior and the maximum number of watches returned, which are minor gaps for a read-only list tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and there is only one optional parameter, so the schema fully documents client_token and its Authorization-header fallback. The description adds nothing about the parameter, which is fine at baseline when the schema does the work.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List all active watches for your client') and clarifies the returned data (health, last check time, pending changes). It does not explicitly differentiate itself from get_watch, but the plural 'all' plus 'active' scope makes the distinction reasonably inferable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the plural listing scope, but there is no explicit when-to-use guidance, no mention of get_watch as the alternative for a single watch, and no stated prerequisites. The agent must infer routing from the sibling names alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

watch_jobsWatch for new job postingsAInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoOptional. 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.
urlsNoOptional. Several boards to watch with the same filters (max 25). Returns watches and per-URL errors.
labelNoA short note to yourself about why you are watching this.
queryNoWhat 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.
keywordsNoOnly report jobs whose title/location/department/company contains one of these as a whole word, e.g. ["iOS", "Swift"].
locationsNoOnly report jobs with one of these in their location, e.g. ["Austin"], ["Berlin", "Remote"].
seniorityNoOnly report these levels, derived from the title. "mid" means the title carries no level.
min_salaryNoYearly 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_onlyNoOnly report jobs whose title or location says remote (and not hybrid/on-site).
webhook_urlNoOptional public https URL that receives a signed POST whenever matching changes are detected. Polling get_changes keeps working either way.
all_keywordsNoOnly report jobs containing every one of these, e.g. ["data", "scientist"].
client_tokenNoYour Watchtower client token (wt_...). Optional if the MCP connection sends "Authorization: Bearer <token>".
include_unknownNoMany 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_currencyNoISO currency of min_salary, e.g. "USD". Jobs that state pay in another currency are then left out.
exclude_keywordsNoNever report jobs mentioning one of these, e.g. ["manager", "clearance"].
interval_minutesNoHow often to check, in minutes (min 5, default 60). Resources shared with other watchers use the shortest interval.
max_experience_yearsNoThe most years of experience a job may ask for, e.g. 6.

TDQS

A4.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false and openWorldHint=true but say nothing about lifecycle or failure modes, so the description correctly carries that burden: persistent watch, JOB_ADDED/JOB_REMOVED/JOB_UPDATED event model, NO_JOB_DATA rejection, resolved_from resolution, webhook signing, and that polling still works. This is genuinely rich disclosure well beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The paragraph is long but densely packed and front-loaded: purpose, then query-vs-url guidance, then response shape, then routing advice. Nearly every sentence carries unique information, though it could be broken into shorter units for scanability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 17-parameter tool with no output schema, the description compensates by describing the response fields (interpreted, current_jobs, coverage) and the job record shape (title, location, salary, experience_years, etc.). Combined with 100% schema coverage, an agent has enough to call it correctly and interpret the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real semantics the schema lacks: that omitting url covers every monitored board, the url/urls distinction, supported board platforms, and that explicit filters override the query. That is meaningfully more than restating the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a precise verb+resource ("Create a persistent watch for tech jobs") and immediately contrasts itself with the sibling set by pointing to get_changes for subsequent changes. An agent can distinguish this from list_watches/get_changes/delete_watch without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states the alternative to avoid ("Use this INSTEAD OF re-running job searches or re-checking careers pages yourself") and routes follow-up polling to get_changes. It also covers the url-vs-no-url decision and the multi-board case, leaving little to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 6 tool updates
    • First observedack_changes
    • First observeddelete_watch
    • First observedget_changes
    • First observedget_watch
    • First observedlist_watches
    • First observedwatch_jobs

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    Live tech-hiring intelligence for AI agents. Search 130K+ open jobs collected daily from ~500 tech companies' own career sites — plus company hiring profiles, tech stacks, salary benchmarks, and skill trends. Five tools work with no account.
    31
    144 npm
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI agents to search and explore a large database of tech job listings with filtering options.
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables AI agents to pull live job listings from major ATS platforms (Greenhouse, Lever, Ashby, Workable), Hacker News hiring threads, and detect hiring signals on company career pages.
    -
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables AI agents to discover, filter, and track job openings based on the user's local resume, without uploading data to the cloud.
    21
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.