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 助手替你盯岗的求职雷达 —— 一手职位、幽灵岗位打分,简历不经过我们的服务器。

MCP 1.0 privacy: local-first python ≥ 3.11 license: MIT 139 employers OpenHire on Glama

30-second quickstart: pipx install openhire, ohp bootstrap, ohp search

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_score calculado 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 --force o ohp 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 8000 expone http://host:8000/mcp (también --transport sse). Se incluye un Dockerfile.


Qué hace

HerramientaQué te ofrece
search_jobsFiltra 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_intentRegistra 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_watchesObtén las coincidencias que son nuevas desde tu última consulta (extracción por cliente; stdio no tiene push).
authorize_applicationUna 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_infoSeñ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 empleador
  • sourceemployer_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 actividad
  • response_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 / PIInunca — la coincidencia se ejecuta localmente; un currículum nunca transita el servidor, y nunca almacenamos uno
Lo que ve el servidoruna huella anónima generada por el cliente + filtros estrictos
Escaneo de repositoriossolo local · proyectos personales · consentimiento explícito · exclusión voluntaria en cualquier momento
Fuentes de empleosolo 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 serve lo 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.0 a 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á

  1. Tu currículum permanece en tu máquina — nunca transita el servidor, y nunca lo almacenamos.
  2. La clasificación no está en venta — es solo f(match_quality, freshness), una función pura bloqueada.
  3. 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_score beta 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/.