Agent-native job search over employer ATS APIs (Greenhouse/Lever/Ashby/Beisen/Moka) — 139 employers across US/EU/China incl. robotics & autonomous-driving. Ghost-job scoring; your résumé never touches the server. MCP server for Claude/Cursor.
- ✓Open-source license (MIT)
- ✓Actively maintained (<30d)
- ✓Clear description
- ✓Topics declared
- ✓Documented (README)
claude mcp add openhire -- python -m -e{
"mcpServers": {
"openhire": {
"command": "python",
"args": ["-m", "venv"],
"env": {
"OPENHIRE_DATABASE_URL": "<openhire_database_url>"
}
}
}
}OPENHIRE_DATABASE_URLMCP Servers overview
<!-- mcp-name: io.github.gzchenhao/openhire -->
# OpenHire · 开聘
> **A job-search radar for your AI assistant — first-party listings, ghost jobs scored, and your résumé never touches our servers.**
> 让 AI 助手替你盯岗的求职雷达 —— 一手职位、幽灵岗位打分,简历不经过我们的服务器。
     [](https://glama.ai/mcp/servers/gzchenhao/openhire)
<p align="center"><img src="docs/quickstart.svg" alt="30-second quickstart: pipx install openhire, ohp bootstrap, ohp search" width="880"></p>
<p align="center"><sub>Real terminal output — install from PyPI, download the public index, search. No account, no signup.</sub></p>
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:
- **Kills ghost-job noise.** Every listing carries a `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.
- **Structural privacy, not a pinky-promise.** There is no résumé field in the protocol; a CI
test fails the build if anyone adds one. Matching runs on your machine — only an anonymous
fingerprint reaches the server.
- **Ranking you can't buy.** Order is a locked pure function of (match, freshness). No
sponsored slots, no bidding — the signature is frozen by a test.
This is the 「哨兵 / Sentinel」 reference implementation — see
`design_handoff_openhire_v01/README.md` for the full protocol spec.
---
## Quickstart — under a minute
```bash
# 1. Install (pipx keeps it isolated and puts `ohp` on your PATH)
pipx install openhire
# 2. Get a job index. Default: download the public snapshot, then refresh it live.
ohp bootstrap # 139 employers · ~16k live postings · no account
# 3. Use it directly…
ohp search --required-skills rust,k8s --remote --role-family engineering
ohp search --currency CNY --role-family engineering # e.g. CN autonomous-driving / robotics roles
# …or connect it to an MCP client:
ohp serve
```
Then point your MCP client at it — see **[Works with](#works-with)** below.
---
## Works with
All clients use the same MCP entry. The canonical, zero-install config (needs
[uv](https://docs.astral.sh/uv/)) works in every MCP client:
```json
{ "mcpServers": { "openhire": { "command": "uvx", "args": ["openhire@latest", "serve"] } } }
```
The server **auto-downloads the public job snapshot on first run** if the index is empty, so
`ohp bootstrap` is optional. If you ran `pipx install openhire`, `"command": "ohp"` works too.
**Claude Desktop** — `%APPDATA%\Claude\claude_desktop_config.json` (macOS: `~/Library/Application Support/Claude/`); quit & reopen after editing:
```json
{ "mcpServers": { "openhire": { "command": "ohp", "args": ["serve"] } } }
```
**Cursor** — `~/.cursor/mcp.json` (or a project `.cursor/mcp.json`):
```json
{ "mcpServers": { "openhire": { "command": "uvx", "args": ["openhire", "serve"] } } }
```
**Windsurf** — `~/.codeium/windsurf/mcp_config.json`:
```json
{ "mcpServers": { "openhire": { "command": "uvx", "args": ["openhire", "serve"] } } }
```
> First start downloads the ~25 MB public snapshot (jobs/companies only) — give it a moment.
> To refresh later run `ohp bootstrap --force` or `ohp ingest`. On Windows Claude Desktop from
> the Microsoft Store, the config is under `…\Packages\<Claude package>\LocalCache\Roaming\Claude\`.
>
> **Hosted / remote:** `ohp serve --transport streamable-http --host 0.0.0.0 --port 8000`
> exposes `http://host:8000/mcp` (also `--transport sse`). A `Dockerfile` is included.
---
## What it does
| 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.
## The five protocol fields
Every listing is valid `schema.org/JobPosting`, plus:
- `verified_at` — last moment confirmed live on the employer's own site
- `source` — `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 noise
- `response_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
## Privacy Policy
Short version: **there is no résumé field in the protocol**, matching runs on your machine, and
the only user-originated value the server ever stores is an anonymous client-generated
fingerprint. No analytics, no telemetry, no third-party sharing. Full policy:
[docs/PRIVACY.md](https://github.com/gzchenhao/openhire/blob/main/docs/PRIVACY.md).
## Privacy model
| | |
|---|---|
| **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) |
## First-run data — the snapshot vs. fresh
`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.
## Three rules this project will never break
1. Your résumé stays on your machine — it never transits the server, and we never store it.
2. Ranking is not for sale — it is only `f(match_quality, freshness)`, a locked pure function.
3. Employers pay only for authorized, delivered outcomes — never for exposure. (v0.1 has no
billing at all.)
These are enforced by CI (`tests/test_privacy.py`, `tests/test_ranking.py`,
`tests/test_snapshot.py`).
## Development
```bash
python -m venv .venv && . .venv/Scripts/activate # Windows
pip install -e ".[dev]"
pytest # privacy red lines + ranking + snapshot must be green
```
Set `OPENHIRE_DATABASE_URL=postgresql+psycopg://…` to run against Postgres instead of the
default local SQLite file (`~/.openhire/openhire.db`).
## Roadmap
- **v0.2 – v0.3 (shipped)** — CN ATS adapters (北森 Beisen + Moka) · weekly auto-refreshed
public snapshot · `ghost_score` public beta · 139 employers across US / EU / China
- **next** — Employer claim + verified badges — employers can [reserve their claim
today](https://github.com/gzchenhao/openhire/issues/new?template=employer_claim.yml) via a
corporate-identity GitHub issue (zero-cost now; badges + listing-status control ship next) ·
response-SLA enforcement (7-day auto-delist) · **redacted proof-of-fit** — an anonymous,
candidate-authorized match summary that travels with an application (skills overlap only;
identity never included, résumés still never transit the server)
- **v1.0** — Open, vendor-neutral schema extension for AI-readable job postings
## FAQ
**Where 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 RoadmWhat people ask about openhire
What is gzchenhao/openhire?
+
gzchenhao/openhire is mcp servers for the Claude AI ecosystem. Agent-native job search over employer ATS APIs (Greenhouse/Lever/Ashby/Beisen/Moka) — 139 employers across US/EU/China incl. robotics & autonomous-driving. Ghost-job scoring; your résumé never touches the server. MCP server for Claude/Cursor. It has 4 GitHub stars and its last recorded update is dated 2026-09-12.
How do I install openhire?
+
You can install openhire by cloning the repository (https://github.com/gzchenhao/openhire) or following the README instructions on GitHub. ClaudeWave also provides quick install blocks on this page.
Is gzchenhao/openhire safe to use?
+
Our security agent has analyzed gzchenhao/openhire and assigned a Trust Score of 95/100 (tier: Verified). See the full breakdown of passed checks and flags on this page.
Who maintains gzchenhao/openhire?
+
gzchenhao/openhire is maintained by gzchenhao. The last recorded GitHub activity is dated 2026-09-12, with 0 open issues.
Are there alternatives to openhire?
+
Yes. On ClaudeWave you can browse similar mcp servers at /categories/mcp, sorted by popularity or recent activity.
Deploy openhire to your cloud
Ship this repo to production in minutes. Each platform spins up its own environment with editable env vars.
Maintain this repo? Add a badge to your README
Drop the badge into your GitHub README to show it's tracked on ClaudeWave. Each badge links back to this page and reflects the live Trust Score.
[](https://claudewave.com/repo/gzchenhao-openhire)<a href="https://claudewave.com/repo/gzchenhao-openhire"><img src="https://claudewave.com/api/badge/gzchenhao-openhire" alt="Featured on ClaudeWave: gzchenhao/openhire" width="320" height="64" /></a>More MCP Servers
Fair-code workflow automation platform with native AI capabilities. Combine visual building with custom code, self-host or cloud, 400+ integrations.
User-friendly AI Interface (Supports Ollama, OpenAI API, ...)
An open-source AI agent that brings the power of Gemini directly into your terminal.
Real-time global intelligence dashboard. AI-powered news aggregation, geopolitical monitoring, and infrastructure tracking in a unified situational awareness interface
The fastest path to AI-powered full stack observability, even for lean teams.
🕷️ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl!