OpenHire

Pesquise vagas de emprego ao vivo extraídas diretamente das APIs de ATS de 139 empregadores (Greenhouse, Lever, Ashby, Beisen, Moka) nos EUA, UE e China — com forte foco em infraestrutura de IA, direção autônoma e IA incorporada. Cada vaga traz a data real de publicação do empregador, days_open e um ghost_score, para que um agente possa distinguir uma requisição nova de uma que está aberta há 300 dias. Sem conta, sem cadastro, e nenhum currículo chega ao servidor: a correspondência é feita no cliente e apenas uma impressão digital anônima é enviada. Licenciado sob MIT.

Documentação

OpenHire · 开聘

Um radar de vagas de emprego para seu assistente de IA — vagas de primeira mão, vagas fantasmas pontuadas, e seu currículo nunca toca nossos 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

Saída real do terminal — instale via PyPI, baixe o índice público, pesquise. Sem conta, sem cadastro.

O que seu agente realmente vê

Você faz uma pergunta ao seu assistente em linguagem natural. Ele chama search_jobs, e cada linha retorna carregando a data de publicação real do empregador — para que o agente possa raciocinar sobre a obsolescência em vez de adivinhar.

Você: Alguma vaga sênior de Python que ainda esteja realmente aberta? Pule as desatualizadas.

// 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"
}

Assistente: Esta está aberta há 166 dias com um ghost_score de 0,61 — eu a despriorizaria. Aqui estão quatro publicadas nas últimas três semanas…

ghost_score mede há quanto tempo uma vaga está aberta, não se o empregador ainda pretende contratar. Uma vaga aberta há muito tempo pode significar igualmente "difícil de preencher". Trate isso como um motivo para perguntar, não como um veredito.


Um servidor MCP que transforma seu assistente de IA (Claude, Cursor, Windsurf) em um radar privado para vagas de IA / Infraestrutura, direção autônoma e IA incorporada — extraídas diretamente dos sites de carreira de 139 empregadores e APIs públicas de ATS (Greenhouse / Lever / Ashby / 北森 Beisen / Moka), nos EUA, Europa e China (Waymo, Figure, Zoox — e Unitree, XPeng, UBTECH, Mech-Mind…). Sem conta. Sem cadastro. Sem upload de currículo. Nunca.

Três coisas que um site de vagas não fará por você:

  • Elimina o ruído de vagas fantasmas. Cada listagem carrega um ghost_score calculado a partir da data de publicação real do empregador — o "há 2 dias" que um site mostra pode ter 300 dias no ATS.
  • Privacidade estrutural, não uma promessa vazia. Não há campo de currículo no protocolo; um teste de CI falha a compilação se alguém adicionar um. A correspondência é executada na sua máquina — apenas uma impressão digital anônima chega ao servidor.
  • Classificação que você não pode comprar. A ordem é uma função pura e bloqueada de (correspondência, atualidade). Sem espaços patrocinados, sem lances — a assinatura é congelada por um teste.

Esta é a implementação de referência 「哨兵 / Sentinel」 — veja design_handoff_openhire_v01/README.md para a especificação completa do protocolo.


Início rápido — em menos de um 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

Em seguida, aponte seu cliente MCP para ele — veja Funciona com abaixo.


Funciona com

Todos os clientes usam a mesma entrada MCP. A configuração canônica, sem instalação (requer uv) funciona em todos os clientes MCP:

{ "mcpServers": { "openhire": { "command": "uvx", "args": ["openhire@latest", "serve"] } } }

O servidor baixa automaticamente o snapshot público de vagas na primeira execução se o índice estiver vazio, então ohp bootstrap é opcional. Se você executou pipx install openhire, "command": "ohp" também funciona.

Claude Desktop%APPDATA%\Claude\claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/); saia e reabra após editar:

{ "mcpServers": { "openhire": { "command": "ohp", "args": ["serve"] } } }

Cursor~/.cursor/mcp.json (ou um projeto .cursor/mcp.json):

{ "mcpServers": { "openhire": { "command": "uvx", "args": ["openhire", "serve"] } } }

Windsurf~/.codeium/windsurf/mcp_config.json:

{ "mcpServers": { "openhire": { "command": "uvx", "args": ["openhire", "serve"] } } }

Na primeira inicialização, baixa o snapshot público de ~25 MB (apenas vagas/empresas) — dê um momento. Para atualizar depois, execute ohp bootstrap --force ou ohp ingest. No Windows, Claude Desktop da Microsoft Store, a configuração está em …\Packages\<Claude package>\LocalCache\Roaming\Claude\.

Hospedado / remoto: ohp serve --transport streamable-http --host 0.0.0.0 --port 8000 expõe http://host:8000/mcp (também --transport sse). Um Dockerfile está incluído.


O que faz

FerramentaO que ela oferece
search_jobsFiltro rígido do índice ativo; cada resultado carrega verified_at, datePosted, days_open, ghost_score, remote_scope, eligible_regions, apply_channel. Filtre por required_skills (E), role_family, remote_scope, min_salary + currency.
watch_intentRegistre uma intenção permanente uma vez — novas vagas correspondentes estarão aguardando na próxima verificação, mesmo após fechar o terminal. Aceita required_skills / role_family para que vagas de vendas / soluções fiquem de fora.
check_watchesBusque as correspondências que são novas desde sua última verificação (pull do cliente; stdio não tem push).
authorize_applicationUma confirmação explícita por vaga. Registra sua autorização e retorna a URL de candidatura própria do empregador — você se candidata como você mesmo. Não pode aceitar um currículo.
get_company_infoSinais de confiança agregados e anônimos para um empregador (ghost_score_avg, active_jobs, index_built_at). Nunca dados de candidatos.

Opcional, totalmente local: ohp init --scan <dir> deriva uma impressão digital de habilidades dos seus próprios repositórios. Você nunca escreve um currículo; o código nunca sai da sua máquina — apenas um vetor anônimo o faz.

Os cinco campos do protocolo

Cada listagem é um schema.org/JobPosting válido, mais:

  • verified_at — último momento confirmado como ativo no site próprio do empregador
  • sourceemployer_site | ats_public_api (nunca um site de vagas)
  • ghost_score — sinal de atividade de listagem de 0 a 1, calculado a partir da data de publicação real (menor = mais recente). Um filtro de ruído, não uma acusação: listagens abertas há muito tempo são frequentemente pools de talentos perenes ou pipelines lentos — a pontuação simplesmente permite que agentes rebaixem ruído de baixa atividade
  • response_sla_days — janela de resposta comprometida do empregador (v0.1: sempre nula)
  • apply_channel — sempre a URL de candidatura própria do empregador, com link direto para a vaga específica

Política de Privacidade

Versão curta: não há campo de currículo no protocolo, a correspondência é executada na sua máquina, e o único valor originado pelo usuário que o servidor armazena é uma impressão digital anônima gerada pelo cliente. Sem analytics, sem telemetria, sem compartilhamento com terceiros. Política completa: docs/PRIVACY.md.

Modelo de privacidade

Upload de currículo / PIInunca — a correspondência é executada localmente; um currículo nunca transita pelo servidor, e nunca armazenamos um
O que o servidor vêuma impressão digital anônima gerada pelo cliente + filtros rígidos
Varredura de repositóriosapenas local · projetos pessoais · consentimento explícito · opt-out a qualquer momento
Fontes de vagasapenas de primeira mão: páginas de carreira do empregador + APIs públicas de ATS (Greenhouse / Lever / Ashby)

Dados na primeira execução — o snapshot vs. novo

ohp bootstrap (padrão) baixa um pequeno snapshot de índice público (um asset de GitHub Release — companies + jobs apenas, zero dados do usuário) e então executa um crawl incremental para atualizar verified_at / remoção de listagens. --fresh pula o snapshot e rastreia o ATS público do zero com o extrator heurístico offline gratuito. De qualquer forma: sem conta, sem PII.

Duas coisas que surpreendem as pessoas:

  • O crawl incremental é lento e silencioso. Em um índice frio, pode rodar por 20+ minutos sem saída. Está funcionando, não travado. Se você só quer os dados, ohp serve o pula completamente — o servidor baixa o snapshot na primeira inicialização e responde em segundos.
  • A URL do snapshot é fixada na tag v0.1.0 de propósito. Parece desatualizada; não está. Esse asset é sobrescrito no local toda segunda-feira por um workflow agendado, então a URL é um endereço estável para dados sempre atuais. Fixá-la na tag mais recente quebraria todos os clientes no momento em que um release fosse cortado.

Três regras que este projeto nunca quebrará

  1. Seu currículo permanece na sua máquina — ele nunca transita pelo servidor, e nunca o armazenamos.
  2. A classificação não está à venda — é apenas f(match_quality, freshness), uma função pura bloqueada.
  3. Empregadores pagam apenas por resultados autorizados e entregues — nunca por exposição. (v0.1 não tem cobrança alguma.)

Isso é aplicado por CI (tests/test_privacy.py, tests/test_ranking.py, tests/test_snapshot.py).

Desenvolvimento

python -m venv .venv && . .venv/Scripts/activate   # Windows
pip install -e ".[dev]"
pytest        # privacy red lines + ranking + snapshot must be green

Defina OPENHIRE_DATABASE_URL=postgresql+psycopg://… para executar contra Postgres em vez do arquivo SQLite local padrão (~/.openhire/openhire.db).

Roadmap

  • v0.2 – v0.3 (lançado) — adaptadores de ATS para China (北森 Beisen + Moka) · snapshot público atualizado automaticamente toda semana · ghost_score beta público · 139 empregadores nos EUA / Europa / China
  • próximo — Reivindicação de empregador + selos verificados — empregadores podem reservar sua reivindicação hoje via um issue de identidade corporativa no GitHub (sem custo agora; selos + controle de status de listagem chegam em seguida) · aplicação de SLA de resposta (remoção automática em 7 dias) · prova de adequação editada — um resumo de correspondência anônimo, autorizado pelo candidato, que viaja com uma candidatura (apenas sobreposição de habilidades; identidade nunca incluída, currículos ainda nunca transitam pelo servidor)
  • v1.0 — Extensão de esquema aberta e neutra de fornecedor para postagens de vagas legíveis por IA

FAQ

De onde vêm os dados das vagas? Diretamente das APIs públicas de ATS de 139 empregadores (Greenhouse, Lever, Ashby, 北森 Beisen, Moka) — os mesmos endpoints que alimentam suas páginas de carreira. Sem scraping, sem sites de vagas de terceiros. source é sempre ats_public_api, e verified_at registra a última vez que confirmamos cada postagem como ativa. O índice público é atualizado automaticamente toda semana, então um ohp bootstrap novo começa com dados recentes.

Por que devo confiar em ghost_score? É uma função pura, aberta e incomprável — min(1, 0.15·relist_count + staleness) calculada a partir da data de publicação real do ATS, não da nossa data de rastreamento. A fórmula vive em pipeline/ghost_score.py, é testada por unidade e não aceita dinheiro como entrada (linha vermelha #2). Postagens abertas há muito tempo e republicadas repetidamente pontuam mais alto; você sempre pode reclassificar no lado do cliente. Leia como sinal-ruído, não má-fé: muitas listagens de alta pontuação são pools de talentos perenes legítimos. Empregadores que querem que sua atividade de listagem seja representada com precisão podem reivindicar seu tenant (veja Roadmap).

Meu currículo realmente passa pelo servidor — de verdade? Não. Não há currículo em nenhum lugar do protocolo. authorize_application não tem parâmetro de currículo/arquivo (estruturalmente não pode aceitar um), a correspondência é executada na sua máquina, e a única coisa que transita pelo servidor é uma impressão digital anônima curta como #a3f9. Isso é aplicado por tests/test_privacy.py, e o snapshot publicado carrega zero dados do usuário (tests/test_snapshot.py).

Suporta a China (中国区)? Sim — é isso que diferencia o OpenHire. Empregadores em 北森 Beisen (<tenant>.zhiye.com) e Moka (app.mokahr.com) são indexados: 20+ empresas de direção autônoma / robótica / IA incorporada incluindo 宇树 Unitree, 小鹏 XPeng, 优必选 UBTECH, 梅卡曼德 Mech-Mind, 速腾聚创 RoboSense, 元戎启行 DeepRoute, 星海图 Galaxea, 傅利叶 Fourier, 普渡 Pudu. Salário publicado como 月薪 mantém seu período real (salary_period), então um piso salarial não descarta mais silenciosamente vagas chinesas.

飞书招聘 (Feishu Hire) não é suportado e não será: ele assina suas solicitações de listagem de vagas com um _signature da ByteDance e as protege atrás de um SDK de captcha, então suas listagens não são publicamente legíveis. Não quebramos medidas anti-bot.

Como faço para uma empresa ser adicionada? Abra um issue de Solicitação de inclusão de empresa (intitule com a empresa + sua URL de ATS) — esta é a melhor forma de contribuir. Se você programa, adicione-a a src/openhire/seed/candidates.py (slug da empresa + fornecedor/tenant de ATS) e abra um PR; o seeder valida tenants contra a API ativa.

Licença

MIT © OpenHire Protocol · PRs são bem-vindos.


Construído por um não-programador gerenciando Claude Code — relatórios de aceitação completos em reports/.