Lever job boards

Pesquise quadros de vagas públicos da Lever: resolva uma empresa, leia suas vagas abertas, leia uma por completo.

Documentação

mcp-lever

npm CI license MCP Registry Glama M8ven LobeHub Install in Cursor Install in VS Code

O Lever é um software de recrutamento que milhares de empresas usam para conduzir suas contratações, e cada cliente recebe um quadro de vagas público que vem junto com ele. Cada quadro contém as posições em aberto daquela empresa, com seu título, sua localização, o time e o departamento aos quais pertencem, o regime de trabalho solicitado, o anúncio completo e a faixa salarial, quando a empresa opta por publicá-la. O Lever hospeda um quadro por empresa, seja em sua instância global ou europeia, e não publica um índice entre eles.

Este servidor conecta um cliente de chat a esses quadros. Você nomeia as empresas nas quais tem interesse, e ele transforma cada nome no nome de site que endereça o quadro daquela empresa, busca as vagas em aberto, filtra-as por localização, time, tipo de local de trabalho, país, salário ou por quão recentemente foram publicadas, lê uma vaga por completo e lista os termos pelos quais cada empresa filtra. Ele não exige chave de API nem conta.

Version française


Instalação

Instalação com um clique

Install in Cursor Install in VS Code

Claude Code

claude mcp add lever -- npx -y mcp-lever

Claude Desktop, Cursor e qualquer cliente que use o formato de configuração padrão

{
  "mcpServers": {
    "lever": {
      "command": "npx",
      "args": ["-y", "mcp-lever"]
    }
  }
}

Node 24 ou posterior é necessário, e nenhuma variável de ambiente precisa ser definida.

Com Docker

{
  "mcpServers": {
    "lever": {
      "command": "docker",
      "args": ["run", "-i", "--rm", "ghcr.io/smeet666/mcp-lever:2.0.1"]
    }
  }
}

-i mantém o stdin aberto, que é por onde o protocolo trafega, e -t é omitido porque um TTY reescreve o fluxo. O contêiner precisa de HTTPS de saída para api.lever.co e api.eu.lever.co, e nada mais: sem volume, sem porta, sem credencial.

Pacote, sem npm

Baixe mcp-lever-2.0.1.mcpb de o lançamento mais recente e abra-o. Um cliente que suporta pacotes MCP o instala por conta própria, sem npm e sem arquivo de configuração para editar. O pacote carrega suas dependências, então nada é baixado no momento da instalação.

O que você pode perguntar

  • "Quais das empresas Included Health, Netlify e Ramp estão contratando pelo Lever?"
  • "Encontre vagas remotas de engenharia nessas três empresas."
  • "Leia essa vaga por completo."
  • "Sob quais localizações a Included Health lista suas vagas?"
  • "Algo publicado nas últimas duas semanas na Netlify?"

Toda pergunta parte de uma empresa, já que o Lever não oferece busca entre quadros. search_jobs resolve os nomes que você fornece, então nenhuma preparação é necessária:

resolve_company(["Included Health"])  ->  includedhealth, global instance, publishing
search_jobs(["Included Health"], keyword: "therapist")
get_job("includedhealth", "6f97a19f-…")

Ferramentas

FerramentaO que ela faz
resolve_companyTransforma nomes de empresas nos nomes de site Lever de seus quadros.
search_jobsBusca as vagas em aberto das empresas que você nomeia.
get_jobLê uma vaga por completo, anúncio incluído.
list_filter_valuesLista os termos sob os quais uma empresa arquiva suas vagas.

Um nome de site Lever diferencia maiúsculas de minúsculas, então Flex responde onde flex retorna nada. Quatro grafias são tentadas por nome em cada uma das duas instâncias, e a resposta lista o que foi enviado, então nada encontrado nunca é prova de que uma empresa está ausente do Lever.

resolve_company

Transforma nomes de empresas em nomes de site Lever, relatando cada instância que respondeu. Ela recebe uma lista.

ArgumentoTipoObrigatórioO que faz
namesarray de 1 a 25 stringssimNomes de empresas, ou nomes de site Lever que você já conhece.

Em retorno: uma entrada por nome, carregando input; found, uma lista de { slug, instance, publishes } onde publishes é falso para um site que existe e não lista nada hoje; tried, as grafias enviadas em ordem; e cached, verdadeiro quando esta sessão já havia resolvido aquele nome. Um nome que responde em ambas as instâncias retorna com ambas, e nenhuma é eleita: passe a que você quer dizer para as outras ferramentas.

search_jobs

Busca as vagas em aberto das empresas nomeadas. O Lever aplica os filtros que suporta com base em sua própria grafia exata, e este servidor aplica o restante às vagas que leu.

ArgumentoTipoObrigatórioO que faz
companiesarray de 1 a 25 stringssimNomes de empresas ou nomes de site Lever. Cada um é resolvido aqui.
keywordstringnãoPalavras para procurar no título e no anúncio.
locationarray de 1 a 20 stringsnãoLocalizações, exatamente como o Lever as escreve.
teamarray de 1 a 20 stringsnãoTimes, exatamente como o Lever os escreve.
departmentarray de 1 a 20 stringsnãoDepartamentos, exatamente como o Lever os escreve.
commitmentarray de 1 a 20 stringsnãoRegimes de trabalho, exatamente como o Lever os escreve.
workplace_typearray de 1 a 4 stringsnãoremote, hybrid, onsite ou unspecified.
countryarray de 1 a 20 códigos de duas letrasnãoPaíses como códigos ISO, como em FR ou US.
salary_minnúmero, 0 ou maisnãoO menor limite superior de uma faixa salarial a manter.
salary_intervalstringnãoO período em que salary_min está escrito, como per-year-salary.
currencycódigo de três letrasnãoA moeda em que salary_min está escrita, como em EUR.
posted_within_daysinteiro, 1 a 3650nãoQuão recente uma vaga deve ser.
limitinteiro, 1 a 100, padrão 25nãoVagas a ler por empresa.
skipinteiro, 0 a 100000, padrão 0nãoVagas a pular por empresa.

O Lever aplica por conta própria location, team, department e commitment; este servidor aplica keyword, workplace_type, country, salary_min, salary_interval, currency e posted_within_days ao que leu. list_filter_values publica os termos que os quatro primeiros aceitam, e um termo que o Lever não conhece retorna como uma lista vazia.

Em retorno: jobs, cada um carregando id e company_slug, que get_job aceita, além de title, location, all_locations, country, workplace_type, team, posted_at, url e apply_url. commitment e department estão ausentes quando a empresa não registra nenhum dos dois. salary é null para uma vaga publicada sem um, o que nunca é o mesmo que zero, e carrega a interval em que o Lever a escreveu, nunca convertida ou anualizada. per_company fornece um resultado por empresa, com um status de read, unresolved, empty ou failed, que são quatro respostas diferentes, e as contagens de read e returned em torno dos filtros. total_available é sempre null: o Lever não publica contagem de resultados. As linhas não carregam texto de anúncio, já que o quadro de uma única empresa pode chegar a megabytes.

limit se aplica por empresa, e uma empresa cujas vagas o preenchem pode publicar mais: as notas dizem quando isso aconteceu, e que uma contagem feita dentro dessa janela mede a janela. posted_within_days percorre até cinco páginas por empresa, e o Lever pagina por título, então uma vaga publicada ontem pode estar em qualquer lugar de um quadro.

get_job

Lê uma vaga por completo: o anúncio, suas seções nomeadas e o salário como publicado.

ArgumentoTipoObrigatórioO que faz
company_slugstringsimO nome de site Lever, como resolve_company o retorna.
job_idstringsimO identificador de uma vaga, como uma busca o retorna.
instanceglobal ou eunãoA instância de onde a linha veio. A global por padrão.

Em retorno: job, contendo os campos que uma linha de busca carrega, além de description, sections como { heading, items }, salary_note para o que a empresa escreveu ao lado da faixa, e source com o endereço de onde foi recuperada.

list_filter_values

Lista os termos de time, localização e regime de trabalho que uma empresa usa. Leia-a antes de filtrar: o Lever corresponde à sua própria grafia, e o vocabulário pertence a cada empresa, uma escrevendo Full-time onde outra escreve EE Full-Time.

ArgumentoTipoObrigatórioO que faz
company_slugstringsimO nome de site Lever, como resolve_company o retorna.
instanceglobal ou eunãoA instância em que este site vive. A global por padrão.
fieldsarray de 1 a 3 de team, location, commitmentnãoQuais vocabulários ler. Cada um custa uma solicitação, e todos os três são lidos por padrão.

Em retorno: company_slug, instance e fields contendo uma lista de { value, count } para cada vocabulário solicitado. Um count é null onde o Lever não publicou nenhum valor ao lado da categoria.

Configuração

Nada precisa ser configurado. O servidor não lê nenhuma variável de ambiente, e o bloco mcpServers acima está completo como escrito.

O ritmo, o tempo limite e o cache são configurações da camada do cliente, que Como biblioteca mostra como passar. O intervalo entre duas solicitações pode ser ampliado ali e nunca reduzido.

Erros

Toda falha carrega um de seis códigos, uma mensagem e, onde ajuda, os valores que teriam sido aceitos.

CódigoO que aconteceuO que fazer
not_foundA Lever respondeu e não possui tal site ou vaga.Verifique o nome do site com resolve_company.
invalid_inputOs argumentos foram recusados antes de qualquer requisição ser enviada.Leia a mensagem, que indica o argumento e o que ele aceita.
rate_limitedA Lever pediu que este cliente diminuísse o ritmo.Aguarde e chame novamente com os mesmos argumentos. A vaga ainda está no quadro.
parse_failureA Lever respondeu em um formato que este cliente não consegue ler.Reporte em o rastreador de problemas.
network_errorA requisição não foi concluída.Tente novamente em breve.
timeoutA requisição passou do prazo.Peça menos empresas ou um limit menor.

Como biblioteca

A camada que lê a Lever é publicada separadamente, com seu ritmo, seu cache e seus erros, e sem nenhum protocolo anexado.

import { Client } from "mcp-lever/client";

const client = new Client({ minIntervalMs: 2000 });
const resolved = await client.resolveCompany("Included Health");
const jobs = await client.listPostings(resolved.found[0], { limit: 10 });
console.log(jobs.length);

ClientOptions aceita minIntervalMs, timeoutMs, cacheTtlMs e fetchImpl. Um intervalo abaixo do mínimo publicado é ignorado, então o mínimo vale aqui também.

Ritmo e atribuição

Ambos os hosts da API publicam Crawl-delay: 1, então as requisições saem uma de cada vez com pelo menos um segundo entre elas, e esse mínimo vale independentemente de como o cliente está configurado. O User-Agent carrega o projeto e um endereço onde uma pessoa pode ser contatada, e não imita nenhum navegador.

As leituras vão para api.lever.co e api.eu.lever.co, que são os hosts que a Lever documenta para seus dados de vagas. As páginas de carreiras jobs.lever.co são deixadas de lado.

Cada vaga carrega o endereço da sua página na Lever e sua URL de candidatura. Dê crédito à empresa e link para essa página ao mostrar uma vaga.

Este servidor MCP é um projeto não oficial, sem afiliação com a Lever ou com as empresas cujos quadros ele lê.

Privacidade

Este servidor não coleta nada sobre você e não envia nada ao seu autor. Ele roda na sua máquina, contata api.lever.co e api.eu.lever.co e nada mais, mantém as respostas na memória enquanto roda e não grava nada em disco. PRIVACY.md declara o que uma requisição carrega e quais configurações alteram qualquer parte disso.

Desenvolvimento

npm install
npm run build:fixtures
npm test
npm run check

Os testes rodam contra fixtures geradas e não fazem nenhuma requisição de rede. A suíte ao vivo, npm run test:live, faz uma requisição por rota e roda todas as noites contra o próprio serviço.

Contribuindo

Bugs, perguntas e ideias pertencem a o rastreador de problemas. Pull requests são bem-vindos; abrir uma issue primeiro ajuda a concordar sobre o formato da mudança. Veja CONTRIBUTING.md.

Licença

MIT, veja LICENSE. As vagas pertencem às empresas que as publicaram.


mcp-lever (francês)

Versão em inglês

Lever é um software de recrutamento usado por milhares de empresas para conduzir suas contratações, e cada cliente recebe com ele um site de vagas público. Cada site traz as vagas abertas dessa empresa com seu título, local, equipe e departamento aos quais pertencem, o tipo de contrato solicitado, o anúncio completo e a faixa salarial quando a empresa escolheu publicar uma. A Lever hospeda um site por empresa, em sua instância global ou em sua instância europeia, e não publica nenhum índice que os atravesse.

Este servidor conecta um cliente de conversa a esses sites. Você nomeia as empresas que lhe interessam, e ele traduz cada nome no identificador que endereça seu site, busca em suas vagas, filtra por local, equipe, modalidade de trabalho, país, salário ou novidade da publicação, lê uma vaga inteira e lista as formulações pelas quais cada empresa classifica as suas. Nenhuma chave de API, nenhuma conta.

Instalação

Instalação em um clique

Install in Cursor Install in VS Code

Claude Code

claude mcp add lever -- npx -y mcp-lever

Claude Desktop, Cursor e qualquer cliente no formato de configuração padrão

{
  "mcpServers": {
    "lever": {
      "command": "npx",
      "args": ["-y", "mcp-lever"]
    }
  }
}

Node 24 ou mais recente é necessário, e nenhuma variável de ambiente precisa ser preenchida.

Com Docker

{
  "mcpServers": {
    "lever": {
      "command": "docker",
      "args": ["run", "-i", "--rm", "ghcr.io/smeet666/mcp-lever:2.0.1"]
    }
  }
}

-i mantém a entrada padrão aberta, que é o canal do protocolo, e -t é omitido porque um TTY reescreve o fluxo. O contêiner precisa de acesso HTTPS de saída para api.lever.co e api.eu.lever.co, e nada mais: nenhum volume, nenhuma porta, nenhum identificador.

Bundle, sem npm

Baixe mcp-lever-2.0.1.mcpb de a última publicação e abra-o. Um cliente que gerencia bundles MCP o instala sozinho, sem npm e sem arquivo de configuração para modificar. O bundle carrega suas dependências, então nada é baixado na instalação.

O que se pode pedir

  • « Quais das Included Health, Netlify e Ramp recrutam na Lever? »
  • « Encontre-me vagas de engenharia em trabalho remoto nessas três. »
  • « Leia-me esta vaga inteira. »
  • « Sob quais locais a Included Health classifica suas vagas? »
  • « Algo publicado nos últimos quinze dias na Netlify? »

Cada pergunta parte de uma empresa, já que a Lever não oferece nenhuma busca atravessando os sites. search_jobs resolve sozinho os nomes que lhe são dados, então nada precisa ser preparado:

resolve_company(["Included Health"])  ->  includedhealth, instance mondiale, publie
search_jobs(["Included Health"], keyword: "therapist")
get_job("includedhealth", "6f97a19f-…")

As ferramentas

FerramentaO que faz
resolve_companyTraduz nomes de empresas em identificadores de sites da Lever.
search_jobsBusca nas vagas das empresas nomeadas.
get_jobLê uma vaga inteira, anúncio incluído.
list_filter_valuesLista as formulações sob as quais uma empresa classifica.

Um identificador de site da Lever diferencia maiúsculas de minúsculas, então Flex responde onde flex não retorna nada. Quatro grafias são tentadas por nome em cada uma das duas instâncias, e a resposta lista o que foi enviado: não encontrar nada nunca prova que uma empresa está ausente da Lever.

resolve_company

Traduz nomes de empresas em identificadores de sites da Lever, sinalizando cada instância que respondeu. Ele aceita uma lista.

ArgumentoTipoObrigatórioO que faz
namesmatriz de 1 a 25 stringssimNomes de empresas, ou identificadores já conhecidos.

Em retorno: uma entrada por nome, trazendo input ; found, uma lista de { slug, instance, publishes } onde publishes é falso para um site que existe e não lista nada hoje ; tried, as grafias enviadas na ordem ; e cached, verdadeiro quando a sessão já havia resolvido esse nome. Um nome que responde nas duas instâncias retorna com as duas, e nenhuma é eleita: passe aquela que você visa para as outras ferramentas.

search_jobs

Busca nas vagas das empresas nomeadas. A Lever aplica os filtros que ela gerencia na sua própria formulação exata, e este servidor aplica os outros às vagas que leu.

ArgumentoTipoObrigatórioO que faz
companiesmatriz de 1 a 25 stringssimNomes de empresas ou identificadores. Cada um é resolvido aqui.
keywordstringnãoPalavras para buscar no título e no anúncio.
locationmatriz de 1 a 20 stringsnãoLocais, exatamente como a Lever os escreve.
teammatriz de 1 a 20 stringsnãoEquipes, exatamente como a Lever as escreve.
departmentmatriz de 1 a 20 stringsnãoDepartamentos, exatamente como a Lever os escreve.
commitmentmatriz de 1 a 20 stringsnãoTipos de contrato, exatamente como a Lever os escreve.
workplace_typematriz de 1 a 4 stringsnãoremote, hybrid, onsite ou unspecified.
countrymatriz de 1 a 20 códigos de duas letrasnãoPaíses em código ISO, como FR ou US.
salary_minnúmero, 0 ou maisnãoO limite inferior mais baixo da faixa a manter.
salary_intervalstringnãoO período no qual salary_min está escrito, por exemplo per-year-salary.
currencycódigo de três letrasnãoA moeda na qual salary_min está escrito, como EUR.
posted_within_daysinteiro, 1 a 3650nãoA antiguidade máxima de uma vaga.
limitinteiro, 1 a 100, padrão 25nãoVagas a ler por empresa.
skipinteiro, 0 a 100000, padrão 0nãoVagas a pular por empresa.

A Lever aplica ela mesma location, team, department e commitment ; este servidor aplica keyword, workplace_type, country, salary_min, salary_interval, currency e posted_within_days ao que leu. list_filter_values publica as formulações que os quatro primeiros aceitam, e uma formulação que a Lever ignora retorna em lista vazia. Em retorno: jobs, cada uma carregando id e company_slug, que get_job retoma, além de title, location, all_locations, country, workplace_type, team, posted_at, url e apply_url. commitment e department estão ausentes quando a empresa não os informa. salary vale null para uma vaga publicada sem faixa salarial, o que nunca é zero, e carrega o interval no qual a Lever a escreveu, nunca convertido nem anualizado. per_company fornece um resultado por empresa, com um status valendo read, unresolved, empty ou failed, que são quatro respostas diferentes, e os totais read e returned de cada lado dos filtros. total_available vale sempre null: a Lever não publica nenhum total de resultados. As linhas não carregam o anúncio, pois um site de empresa pode pesar vários megabytes.

limit se aplica por empresa, e uma empresa cujas vagas o preenchem pode publicar mais: as notas sinalizam isso e dizem que um total obtido nessa janela mede a janela. posted_within_days percorre até cinco páginas por empresa, e a Lever pagina por título, portanto uma vaga publicada ontem pode estar em qualquer lugar de um site.

get_job

Lê uma vaga por completo: o anúncio, suas seções nomeadas e o salário tal como publicado.

ArgumentoTipoObrigatórioO que faz
company_slugstringsimO identificador do site, retornado por resolve_company.
job_idstringsimO identificador de uma vaga, retornado por uma busca.
instanceglobal ou eunãoA instância de onde vem a linha. A mundial por padrão.

Em retorno: job, que carrega os campos de uma linha de busca, além de description, sections em { heading, items }, salary_note para o que a empresa escreveu ao lado da faixa salarial, e source com o endereço de onde a vaga foi lida.

list_filter_values

Lista as formulações de equipe, local e contrato que uma empresa utiliza. Leia antes de filtrar: a Lever faz correspondência com sua própria formulação, e o vocabulário pertence a cada empresa, uma escrevendo Full-time onde outra escreve EE Full-Time.

ArgumentoTipoObrigatórioO que faz
company_slugstringsimO identificador do site, retornado por resolve_company.
instanceglobal ou eunãoA instância onde esse site vive. A mundial por padrão.
fieldsarray de 1 a 3 entre team, location, commitmentnãoOs vocabulários a ler. Cada um custa uma requisição, e os três são lidos por padrão.

Em retorno: company_slug, instance e fields, que carrega uma lista de { value, count } para cada vocabulário solicitado. Um count vale null onde a Lever não publicou nenhum número ao lado da categoria.

Configuração

Não há nada para configurar. O servidor não lê nenhuma variável de ambiente, e o bloco mcpServers acima está completo como está.

O ritmo, o tempo limite e o cache são ajustes da camada cliente, que Como biblioteca mostra como passar. O intervalo entre duas requisições pode ser ampliado ali, e nunca reduzido.

Erros

Cada falha carrega um dos seis códigos, uma mensagem e, quando ajuda, os valores que teriam sido aceitos.

CódigoO que aconteceuO que fazer
not_foundA Lever respondeu e não tem nem esse site nem essa vaga.Verifique o identificador com resolve_company.
invalid_inputOs argumentos foram recusados antes de qualquer requisição.Leia a mensagem, que nomeia o argumento e o que ele aceita.
rate_limitedA Lever pede que este cliente desacelere.Aguarde e chame novamente com os mesmos argumentos. A vaga continua no ar.
parse_failureA Lever respondeu em um formato que este cliente não lê.Reporte em o rastreador de incidentes.
network_errorA requisição não foi concluída.Tente novamente em breve.
timeoutA requisição excedeu seu tempo limite.Solicite menos empresas, ou um limit menor.

Como biblioteca

A camada que lê a Lever é publicada separadamente, com seu ritmo, seu cache e seus erros, sem protocolo anexado.

import { Client } from "mcp-lever/client";

const client = new Client({ minIntervalMs: 2000 });
const resolved = await client.resolveCompany("Included Health");
const jobs = await client.listPostings(resolved.found[0], { limit: 10 });
console.log(jobs.length);

ClientOptions aceita minIntervalMs, timeoutMs, cacheTtlMs e fetchImpl. Um intervalo abaixo do piso publicado é ignorado, portanto o piso também vale aqui.

Ritmo e atribuição

Os dois hosts de API publicam Crawl-delay: 1, portanto as requisições saem uma a uma com pelo menos um segundo entre elas, e esse piso vale independentemente da configuração do cliente. O User-Agent carrega o projeto e um endereço para contatar uma pessoa, e não imita nenhum navegador.

As leituras vão para api.lever.co e api.eu.lever.co, os hosts que a Lever documenta para seus dados de vagas. As páginas de carreiras jobs.lever.co são deixadas em paz.

Cada vaga carrega o endereço de sua página na Lever e seu endereço de candidatura. Credite a empresa e aponte para essa página ao exibir uma vaga.

Este MCP é um projeto não oficial, sem afiliação com a Lever nem com as empresas cujos sites ele lê.

Privacidade

Este servidor não coleta nada sobre você e não envia nada ao seu autor. Ele roda na sua máquina, anexa apenas api.lever.co e api.eu.lever.co, mantém suas respostas em memória enquanto roda e não grava nada no disco. PRIVACY.md diz o que uma requisição carrega e quais ajustes mudam isso.

Desenvolvimento

npm install
npm run build:fixtures
npm test
npm run check

Os testes são executados em fixtures geradas e não emitem nenhuma requisição. A suíte ao vivo, npm run test:live, emite uma requisição por rota e roda todas as noites contra o próprio serviço.

Contribuindo

Anomalias, perguntas e ideias têm seu lugar em o rastreador de incidentes. Propostas de modificação são bem-vindas; abrir um ticket primeiro ajuda a alinhar a forma da mudança. Veja CONTRIBUTING.md.

Licença

MIT, veja LICENSE. As vagas pertencem às empresas que as publicaram.