OpenHire
Busca ofertas de empleo en vivo extraídas directamente de las APIs ATS de 139 empleadores (Greenhouse, Lever, Ashby, Beisen, Moka) en EE. UU., la UE y China, con un fuerte enfoque en infraestructura de IA, conducción autónoma e IA incorporada. Cada oferta incluye la fecha real de publicación del empleador, días_abierto y un ghost_score, para que un agente pueda distinguir una solicitud nueva de una que ha estado abierta durante 300 días. Sin cuenta, sin registro y ningún currículum llega al servidor: la coincidencia se ejecuta en el cliente y solo se envía una huella anónima. Licencia MIT.
Documentación
OpenHire · 开聘
Un radar de búsqueda de empleo para tu asistente de IA: ofertas de primera mano, puntuación de empleos fantasma, y tu currículum nunca toca nuestros servidores. 让 AI 助手替你盯岗的求职雷达 —— 一手职位、幽灵岗位打分,简历不经过我们的服务器。
Salida real de terminal: instala desde PyPI, descarga el índice público, busca. Sin cuenta, sin registro.
Lo que tu agente realmente ve
Le haces una pregunta a tu asistente en lenguaje natural. Llama a search_jobs, y cada fila regresa
con la fecha de publicación real del empleador, para que el agente pueda razonar sobre la antigüedad
en lugar de adivinar.
Tú: ¿Hay algún rol senior de Python que realmente siga abierto? Omite los obsoletos.
// one row from search_jobs — trimmed to the fields that matter here
{
"title": "Senior Python Engineer",
"company": "MongoDB",
"datePosted": "2026-03-31", // from the employer's ATS, not a board's refreshed label
"days_open": 166,
"ghost_score": 0.61, // pure f(relist_count, first_seen_at) — frozen by a test
"apply_channel":"https://boards.greenhouse.io/…", // straight to the employer
"verified_at": "2026-09-02T09:47:10Z"
}
Asistente: Este lleva 166 días abierto con un ghost_score de 0.61 — lo despriorizaría. Aquí tienes cuatro publicados en las últimas tres semanas…
ghost_score mide cuánto tiempo lleva abierta una oferta, no si el empleador todavía tiene la intención
de contratar. Un rol abierto durante mucho tiempo puede significar igualmente "difícil de cubrir". Trátalo como una razón para preguntar, no como un veredicto.
Un servidor MCP que convierte a tu asistente de IA (Claude, Cursor, Windsurf) en un radar privado para empleos de IA / Infraestructura, conducción autónoma e IA incorporada — extraídos directamente de los sitios de carrera propios de 139 empleadores y APIs públicas de ATS (Greenhouse / Lever / Ashby / 北森 Beisen / Moka), en EE. UU., Europa y China (Waymo, Figure, Zoox — y Unitree, XPeng, UBTECH, Mech-Mind…). Sin cuenta. Sin registro. Sin subida de currículum. Nunca.
Tres cosas que un portal de empleo no hará por ti:
- Elimina el ruido de empleos fantasma. Cada oferta lleva un
ghost_scorecalculado a partir de la fecha de publicación real del empleador — el "hace 2 días" que muestra un portal puede tener 300 días en el ATS. - Privacidad estructural, no una promesa vacía. No hay campo de currículum en el protocolo; una prueba de CI falla la compilación si alguien añade uno. La coincidencia se ejecuta en tu máquina — solo una huella anónima llega al servidor.
- Clasificación que no se puede comprar. El orden es una función pura bloqueada de (coincidencia, frescura). Sin espacios patrocinados, sin pujas — la firma está congelada por una prueba.
Esta es la implementación de referencia 「哨兵 / Sentinel」 — consulta
design_handoff_openhire_v01/README.md para la especificación completa del protocolo.
Inicio rápido — en menos de un minuto
# 1. Install (pipx keeps it isolated and puts `ohp` on your PATH)
pipx install openhire
# 2. Get a job index. Downloads the public snapshot (~25 MB), then runs one incremental
# crawl to refresh verified_at / delisting. The crawl is the slow part: it can run for
# 20+ minutes on a cold index and prints nothing while it works.
# Only needed for the CLI — `ohp serve` fetches the snapshot by itself on first start.
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
Luego apunta tu cliente MCP hacia él — consulta Funciona con a continuación.
Funciona con
Todos los clientes usan la misma entrada MCP. La configuración canónica, sin instalación (requiere uv) funciona en todos los clientes MCP:
{ "mcpServers": { "openhire": { "command": "uvx", "args": ["openhire@latest", "serve"] } } }
El servidor descarga automáticamente la instantánea pública de empleos en el primer inicio si el índice está vacío, por lo que
ohp bootstrap es opcional. Si ejecutaste pipx install openhire, "command": "ohp" también funciona.
Claude Desktop — %APPDATA%\Claude\claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/); cierra y vuelve a abrir después de editar:
{ "mcpServers": { "openhire": { "command": "ohp", "args": ["serve"] } } }
Cursor — ~/.cursor/mcp.json (o un .cursor/mcp.json de proyecto):
{ "mcpServers": { "openhire": { "command": "uvx", "args": ["openhire", "serve"] } } }
Windsurf — ~/.codeium/windsurf/mcp_config.json:
{ "mcpServers": { "openhire": { "command": "uvx", "args": ["openhire", "serve"] } } }
El primer inicio descarga la instantánea pública de ~25 MB (solo empleos/empresas) — dale un momento. Para actualizar más tarde, ejecuta
ohp bootstrap --forceoohp ingest. En Windows, Claude Desktop desde Microsoft Store, la configuración está en…\Packages\<Claude package>\LocalCache\Roaming\Claude\.Alojado / remoto:
ohp serve --transport streamable-http --host 0.0.0.0 --port 8000exponehttp://host:8000/mcp(también--transport sse). Se incluye unDockerfile.
Qué hace
| Herramienta | Qué te ofrece |
|---|---|
search_jobs | Filtra estrictamente el índice en vivo; cada resultado lleva verified_at, datePosted, days_open, ghost_score, remote_scope, eligible_regions, apply_channel. Filtra por required_skills (Y), role_family, remote_scope, min_salary + currency. |
watch_intent | Registra una intención permanente una sola vez — los nuevos empleos coincidentes te esperan la próxima vez que consultes, incluso después de cerrar la terminal. Acepta required_skills / role_family para que los roles de ventas / soluciones queden fuera. |
check_watches | Obtén las coincidencias que son nuevas desde tu última consulta (extracción por cliente; stdio no tiene push). |
authorize_application | Una confirmación explícita por empleo. Registra tu autorización y devuelve la URL de solicitud propia del empleador — te postulas como tú mismo. No puede aceptar un currículum. |
get_company_info | Señales de confianza agregadas y anónimas para un empleador (ghost_score_avg, active_jobs, index_built_at). Nunca datos de candidatos. |
Opcional, completamente local: ohp init --scan <dir> deriva una huella de habilidades de tus
propios repositorios. Nunca escribes un currículum; el código nunca sale de tu máquina — solo un
vector anónimo lo hace.
Los cinco campos del protocolo
Cada oferta es un schema.org/JobPosting válido, más:
verified_at— último momento confirmado como activo en el sitio propio del empleadorsource—employer_site | ats_public_api(nunca un portal de empleo)ghost_score— señal de actividad de la oferta de 0 a 1, calculada a partir de la fecha de publicación real (menor = más fresca). Un filtro de ruido, no una acusación: las ofertas abiertas durante mucho tiempo suelen ser grupos de talento permanentes o procesos lentos — la puntuación simplemente permite a los agentes degradar el ruido de baja actividadresponse_sla_days— ventana de respuesta comprometida del empleador (v0.1: siempre nula)apply_channel— siempre la URL de solicitud propia del empleador, con enlace profundo al empleo específico
Política de privacidad
Versión corta: no hay campo de currículum en el protocolo, la coincidencia se ejecuta en tu máquina, y el único valor originado por el usuario que el servidor almacena es una huella anónima generada por el cliente. Sin análisis, sin telemetría, sin compartir con terceros. Política completa: docs/PRIVACY.md.
Modelo de privacidad
| Subida de currículum / PII | nunca — la coincidencia se ejecuta localmente; un currículum nunca transita el servidor, y nunca almacenamos uno |
| Lo que ve el servidor | una huella anónima generada por el cliente + filtros estrictos |
| Escaneo de repositorios | solo local · proyectos personales · consentimiento explícito · exclusión voluntaria en cualquier momento |
| Fuentes de empleo | solo de primera mano: páginas de carrera del empleador + APIs públicas de ATS (Greenhouse / Lever / Ashby) |
Datos del primer inicio — la instantánea vs. lo nuevo
ohp bootstrap (predeterminado) descarga una instantánea pública pequeña del índice (un recurso de GitHub Release
— solo companies + jobs, cero datos de usuario) y luego ejecuta un rastreo incremental para
actualizar verified_at / eliminar ofertas. --fresh omite la instantánea y rastrea el ATS público desde
cero con el extractor heurístico gratuito sin conexión. En cualquier caso: sin cuenta, sin PII.
Dos cosas que sorprenden a la gente:
- El rastreo incremental es lento y silencioso. En un índice frío puede ejecutarse durante 20+ minutos
sin salida. Está funcionando, no está colgado. Si solo quieres los datos,
ohp servelo omite por completo — el servidor descarga la instantánea en el primer inicio y responde en segundos. - La URL de la instantánea está fijada a la etiqueta
v0.1.0a propósito. Parece obsoleta; no lo está. Ese recurso se sobrescribe en el lugar cada lunes mediante un flujo de trabajo programado, por lo que la URL es una dirección estable para datos siempre actuales. Fijarla a la etiqueta más reciente rompería cada cliente en el momento en que se publique una versión.
Tres reglas que este proyecto nunca romperá
- Tu currículum permanece en tu máquina — nunca transita el servidor, y nunca lo almacenamos.
- La clasificación no está en venta — es solo
f(match_quality, freshness), una función pura bloqueada. - Los empleadores pagan solo por resultados autorizados y entregados — nunca por exposición. (v0.1 no tiene facturación en absoluto.)
Estas están aplicadas por CI (tests/test_privacy.py, tests/test_ranking.py,
tests/test_snapshot.py).
Desarrollo
python -m venv .venv && . .venv/Scripts/activate # Windows
pip install -e ".[dev]"
pytest # privacy red lines + ranking + snapshot must be green
Establece OPENHIRE_DATABASE_URL=postgresql+psycopg://… para ejecutar contra Postgres en lugar del
archivo SQLite local predeterminado (~/.openhire/openhire.db).
Hoja de ruta
- v0.2 – v0.3 (publicado) — Adaptadores ATS de China (北森 Beisen + Moka) · instantánea pública
actualizada automáticamente cada semana ·
ghost_scorebeta pública · 139 empleadores en EE. UU. / UE / China - siguiente — Reclamación de empleador + insignias verificadas — los empleadores pueden reservar su reclamación hoy mediante un issue de GitHub con identidad corporativa (sin costo ahora; las insignias + el control de estado de las ofertas se publican a continuación) · aplicación de SLA de respuesta (eliminación automática en 7 días) · prueba de idoneidad redactada — un resumen de coincidencia anónimo y autorizado por el candidato que viaja con una solicitud (solo superposición de habilidades; la identidad nunca se incluye, los currículums siguen sin transitar el servidor)
- v1.0 — Extensión de esquema abierta y neutral al proveedor para ofertas de empleo legibles por IA
Preguntas frecuentes
¿De dónde vienen los datos de empleo?
Directamente de las APIs públicas de ATS de 139 empleadores (Greenhouse, Lever, Ashby, 北森 Beisen, Moka) — los
mismos endpoints que alimentan sus páginas de carrera. Sin scraping, sin portales de empleo de terceros. source es
siempre ats_public_api, y verified_at registra la última vez que confirmamos cada oferta como activa.
El índice público se actualiza automáticamente cada semana, por lo que un ohp bootstrap nuevo comienza desde datos recientes.
¿Por qué debería confiar en ghost_score?
Es una función pura, abierta e incomparable — min(1, 0.15·relist_count + staleness) calculada a partir de la
fecha de publicación real del ATS, no de nuestra fecha de rastreo. La fórmula vive en pipeline/ghost_score.py,
está probada por unidades, y no acepta dinero como entrada (línea roja #2). Las ofertas abiertas durante mucho tiempo y
republicadas repetidamente puntúan más alto; siempre puedes reordenar del lado del cliente. Léelo como señal frente a ruido, no
mala fe: muchas ofertas con puntuación alta son grupos de talento permanentes legítimos. Los empleadores
que quieran que su actividad de ofertas se represente con precisión pueden reclamar su tenant (consulta la Hoja de ruta).
¿Mi currículum realmente pasa por el servidor — de verdad?
No. No hay currículum en ninguna parte del protocolo. authorize_application no tiene parámetro de currículum/archivo
(estructuralmente no puede aceptar uno), la coincidencia se ejecuta en tu máquina, y lo único que
transita el servidor es una huella anónima corta como #a3f9. Esto está aplicado por
tests/test_privacy.py, y la instantánea publicada lleva cero datos de usuario (tests/test_snapshot.py).
¿Soporta China (中国区)?
Sí — esto es lo que distingue a OpenHire. Los empleadores en 北森 Beisen (<tenant>.zhiye.com) y
Moka (app.mokahr.com) están indexados: más de 20 empresas de conducción autónoma / robótica / IA incorporada,
incluyendo 宇树 Unitree, 小鹏 XPeng, 优必选 UBTECH, 梅卡曼德 Mech-Mind, 速腾聚创 RoboSense,
元戎启行 DeepRoute, 星海图 Galaxea, 傅利叶 Fourier, 普渡 Pudu. El salario publicado como 月薪 conserva su período
real (salary_period), por lo que un salario mínimo ya no elimina silenciosamente los roles chinos.
飞书招聘 (Feishu Hire) no está soportado y no lo estará: firma sus solicitudes de listado de empleos con un
_signature de ByteDance y las protege detrás de un SDK de captcha, por lo que sus ofertas no son
legibles públicamente. No rompemos medidas anti-bot.
¿Cómo hago para que añadan una empresa?
Abre un issue de Solicitud de inclusión de empresa (titúlalo con la empresa + su URL de ATS) — esta es
la mejor manera de contribuir. Si programas, añádela a src/openhire/seed/candidates.py (slug de la
empresa + proveedor/tenant de ATS) y abre un PR; el sembrador valida los tenants contra la API en vivo.
Licencia
MIT © OpenHire Protocol · Se aceptan PRs.
Construido por un no programador gestionando Claude Code — informes de aceptación completos en reports/.