MCP server for open job postings, read first-hand from the applicant-tracking system behind a company's careers page: Greenhouse, Ashby, Lever, Workable.
Three well-named tools with strong, detailed descriptions (194 - 280 chars each). All parameters have types and descriptions. Input schemas are complete with proper constraints (ge/le bounds). Output schemas are documented in descriptions but not formally declared in code. Error handling is present but generic. Tool composition is sound, each does one thing. Naming follows verb_noun pattern (find_, list_, compare_). No security issues detected (read-only operations, no secrets in params). Main gaps: output schemas not formally specified in tool definitions, error messages lack recovery guidance, no tool annotations (readOnlyHint).
Open jobs across several companies at once, in one schema. This is the thing no single applicant-tracking system can do: each vendor only knows about its own customers. Companies on different systems come back with the same field names, so they can be compared directly. One company failing does not lose the others; each failure is reported besides the results that did work.
Find which applicant-tracking system a company's careers page runs on. Greenhouse, Ashby, Lever and Workable all publish open job board APIs, and all of them are unusable unless you already know the company's board name. None of them publishes a directory of its customers, and none could, since no vendor knows about the others. Use this first when you have a company name rather than a careers URL.
Every open job at one company, read from its own careers system. Returns title, department, location, employment type, workplace type, posted date, a parsed salary range where the employer publishes one, and a verify_url pointing at the employer's own advert. Salaries are refused rather than guessed: an hourly rate, an ambiguous currency, or bands in two currencies all yield no figure, and salary_text keeps whatever the employer actually wrote.
Output schemas not formally declared in tool definitions. Descriptions mention returned fields but code lacks explicit return type annotations or JSON Schema output specs.
Error messages are generic and lack recovery guidance. ValueError exceptions do not suggest next steps (e.g., 'Try find_company_board first' is in description, not error).
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). All three tools are read-only and idempotent but this is not declared in the tool definition.
list_open_jobs accepts 'include_description' boolean but does not document what fields are stripped (email, phone) or the impact on response size.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 65 | 2026-07-28+ | v2 |
compare_companies accepts up to 20 companies but does not document per-company timeout behavior or partial failure handling in the tool description.