Radar for remote AI/Infra jobs from employer ATS; your résumé never transits the server.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent — or use 1-click editor setup below.
💡 Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
A job-search radar for your AI assistant — first-party listings, ghost jobs scored, and your résumé never touches our servers. 让 AI 助手替你盯岗的求职雷达 —— 一手职位、幽灵岗位打分,简历不经过我们的服务器。
Real terminal output — install from PyPI, download the public index, search. No account, no signup.
An MCP server that turns your AI assistant (Claude, Cursor, Windsurf) into a private radar for AI / Infra, autonomous-driving and embodied-AI jobs — pulled straight from 139 employers' own career sites and public ATS APIs (Greenhouse / Lever / Ashby / 北森 Beisen / Moka), across the US, Europe and China (Waymo, Figure, Zoox — and Unitree, XPeng, UBTECH, Mech-Mind…). No account. No signup. No résumé upload. Ever.
Three things a job board won't do for you:
ghost_score aged off the employer's
real posting date — the "2 days ago" a board shows you can be 300 days old in the ATS.This is the 「哨兵 / Sentinel」 reference implementation — see
design_handoff_openhire_v01/README.md for the full protocol spec.
Then point your MCP client at it — see Works with below.
All clients use the same MCP entry. If you ran pipx install openhire, use ohp; otherwise
uvx openhire serve fetches and runs it with no prior install (needs uv).
Claude Desktop — %APPDATA%\Claude\claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/); quit & reopen after editing:
Cursor — ~/.cursor/mcp.json (or a project .cursor/mcp.json):
Windsurf — ~/.codeium/windsurf/mcp_config.json:
Run
ohp bootstraponce first so the index has data. On Windows Claude Desktop from the Microsoft Store, the config is under…\Packages\<Claude package>\LocalCache\Roaming\Claude\.
| Tool | What it gives you |
|---|---|
search_jobs | Hard-filter the live index; every result carries verified_at, datePosted, days_open, ghost_score, remote_scope, eligible_regions, apply_channel. Filter by required_skills (AND), role_family, remote_scope, min_salary + currency. |
watch_intent | Register a standing intent once — new matching jobs are waiting next time you check, even after you close the terminal. Accepts required_skills / role_family so sales / solutions roles stay out. |
check_watches | Pull the matches that are new since your last check (client-pull; stdio has no push). |
authorize_application | One explicit confirmation per job. It records your authorization and returns the employer's own application URL — you apply as yourself. It cannot accept a résumé. |
get_company_info | Aggregate, anonymous trust signals for one employer (ghost_score_avg, active_jobs, index_built_at). Never any candidate data. |
Optional, entirely local: ohp init --scan <dir> derives a skill fingerprint from your
own repos. You never write a résumé; the code never leaves your machine — only an anonymous
vector does.
Every listing is valid schema.org/JobPosting, plus:
verified_at — last moment confirmed live on the employer's own sitesource — employer_site | ats_public_api (never a job board)ghost_score — 0–1 listing-activity signal, aged off the real posting date (lower =
fresher). A noise filter, not an accusation: long-open listings are often evergreen talent
pools or slow pipelines — the score simply lets agents down-rank low-activity noiseresponse_sla_days — employer's committed response window (v0.1: always null)apply_channel — always the employer's own application URL, deep-linked to the specific job| Résumé / PII upload | never — matching runs locally; a résumé never transits the server, and we never store one |
| What the server sees | one anonymous, client-generated fingerprint + hard filters |
| Repo scan | local-only · personal projects · explicit consent · opt-out anytime |
| Job sources | first-party only: employer career pages + public ATS APIs (Greenhouse / Lever / Ashby) |
ohp bootstrap (default) downloads a small public index snapshot (a GitHub Release
asset — companies + jobs only, zero user data) and then runs one incremental crawl to
refresh verified_at / delisting. --fresh skips the snapshot and crawls the public ATS from
scratch with the free offline heuristic extractor. Either way: no account, no PII.
f(match_quality, freshness), a locked pure function.These are enforced by CI (tests/test_privacy.py, tests/test_ranking.py,
tests/test_snapshot.py).
Set OPENHIRE_DATABASE_URL=postgresql+psycopg://… to run against Postgres instead of the
default local SQLite file (~/.openhire/openhire.db).
ghost_score public beta · 139 employers across US / EU / ChinaWhere does the job data come from?
Directly from 139 employers' own public ATS APIs (Greenhouse, Lever, Ashby, 北森 Beisen, Moka) — the
same endpoints that power their careers pages. No scraping, no third-party job boards. source is
always ats_public_api, and verified_at records the last time we confirmed each posting live.
The public index is auto-refreshed weekly, so a fresh ohp bootstrap starts from recent data.
Why should I trust ghost_score?
It's a pure, open, unpurchasable function — min(1, 0.15·relist_count + staleness) aged off the
real ATS posting date, not our crawl date. The formula lives in pipeline/ghost_score.py,
is unit-tested, and takes no money as input (red line #2). Long-open, repeatedly-relisted
postings score higher; you can always re-rank client-side. Read it as signal-to-noise, not
bad faith: plenty of high-scoring listings are legitimate evergreen talent pools. Employers
who want their listing activity represented accurately can claim their tenant (see Roadmap).
Does my résumé actually go through the server — really?
No. There is no résumé anywhere in the protocol. authorize_application has no résumé/file
parameter (it structurally cannot accept one), matching runs on your machine, and the only thing
that ever transits the server is a short anonymous fingerprint like #a3f9. This is enforced by
tests/test_privacy.py, and the published snapshot carries zero user data (tests/test_snapshot.py).
No reviews yet — be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/openhire)<a href="https://allmcps.com/mcp/openhire"><img src="https://allmcps.com/api/badge/openhire?style=directory" alt="OpenHire · 哨兵 on AllMCPs" /></a>