OpenHire · 哨兵 — MCP server for Claude Code: job search with real dates
Searches jobs on employers' own ATS and returns the true posting date and days open to your agent. Your résumé stays on your machine.
claude mcp add --env OPENHIRE_DATABASE_URL=<OPENHIRE_DATABASE_URL> --transport stdio openhire -- uvx openhireWhat OpenHire · 哨兵 does
The server gives your assistant a job search over listings that employers published themselves on career pages and public ATS platforms such as Greenhouse, Lever, Ashby, Beisen and Moka. Each row from search_jobs carries the company, location, the posting date reported by the employer's system, how many days the role has been open, and a link to the employer's apply form. That is the point: the agent reasons about the age of a listing instead of trusting a board's refreshed “2 days ago” label.
The index sits on your own machine. On first start the server fetches it in the background; only an anonymous fingerprint and a job id travel to the server. There is no field for a résumé in the protocol. Applications are never submitted — the server stops at the employer's own page. Result order is a pure function of match and freshness, so nobody can buy a slot.
You need uv on the machine, since the config launches the server through uvx openhire; some setups also pass OPENHIRE_DATABASE_URL. What ghost_score measures is time on the market. A role open for months may simply be hard to fill, and that is a question to put to the employer, not a verdict.
What it helps with
- drop listings that have sat open for months
- get the employer's real posting date instead of a board's label
- find roles in AI, infrastructure, autonomous driving and robotics
- reach the employer's own apply form in one hop
- search jobs without handing a résumé to a third party
Example prompts for the agent
- Use OpenHire to find senior Python roles that are still open and skip anything on the market for more than three months
- Search openhire for robotics jobs in Shanghai with company, posting date, days open and the apply link
How to install OpenHire · 哨兵
Platform CLI
claude mcp add --env OPENHIRE_DATABASE_URL=<OPENHIRE_DATABASE_URL> --transport stdio openhire -- uvx openhireReplace <…> with your own values. uvx runs the command named after the package; if the README names another one, use uvx --from openhire <command>
Platform CLI
codex mcp add openhire --env OPENHIRE_DATABASE_URL=<OPENHIRE_DATABASE_URL> -- uvx openhireReplace <…> with your own values. uvx runs the command named after the package; if the README names another one, use uvx --from openhire <command>
Config file
{
"mcpServers": {
"openhire": {
"command": "uvx",
"args": [
"openhire"
],
"env": {
"OPENHIRE_DATABASE_URL": "<OPENHIRE_DATABASE_URL>"
}
}
}
}Replace <…> with your own values. uvx runs the command named after the package; if the README names another one, use uvx --from openhire <command>
Config file
{
"servers": {
"openhire": {
"type": "stdio",
"command": "uvx",
"args": [
"openhire"
],
"env": {
"OPENHIRE_DATABASE_URL": "<OPENHIRE_DATABASE_URL>"
}
}
}
}Replace <…> with your own values. uvx runs the command named after the package; if the README names another one, use uvx --from openhire <command>
Platform CLI
gemini mcp add -e OPENHIRE_DATABASE_URL=<OPENHIRE_DATABASE_URL> openhire uvx openhireReplace <…> with your own values. uvx runs the command named after the package; if the README names another one, use uvx --from openhire <command>
Step by step, with commands for each platform: How to add an MCP server to Claude Code, Codex, Cursor, VS Code, Gemini CLI and more
Questions about OpenHire · 哨兵
How do I install OpenHire · 哨兵 in Claude Code?
Run claude mcp add openhire -- uvx openhire. With a database: claude mcp add --env OPENHIRE_DATABASE_URL=<OPENHIRE_DATABASE_URL> --transport stdio openhire -- uvx openhire.
What does OpenHire · 哨兵 do?
It exposes a search_jobs tool over vacancies taken from employer ATS platforms. Rows include the posting date, days the role has been open and the apply link.
Do I have to upload a résumé?
No. The protocol has no résumé field and an extra résumé argument is refused. Matching happens on your machine.