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
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.
Instalação
Instalação com um clique
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
| Ferramenta | O que ela faz |
|---|---|
resolve_company | Transforma nomes de empresas nos nomes de site Lever de seus quadros. |
search_jobs | Busca as vagas em aberto das empresas que você nomeia. |
get_job | Lê uma vaga por completo, anúncio incluído. |
list_filter_values | Lista 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.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
names | array de 1 a 25 strings | sim | Nomes 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.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
companies | array de 1 a 25 strings | sim | Nomes de empresas ou nomes de site Lever. Cada um é resolvido aqui. |
keyword | string | não | Palavras para procurar no título e no anúncio. |
location | array de 1 a 20 strings | não | Localizações, exatamente como o Lever as escreve. |
team | array de 1 a 20 strings | não | Times, exatamente como o Lever os escreve. |
department | array de 1 a 20 strings | não | Departamentos, exatamente como o Lever os escreve. |
commitment | array de 1 a 20 strings | não | Regimes de trabalho, exatamente como o Lever os escreve. |
workplace_type | array de 1 a 4 strings | não | remote, hybrid, onsite ou unspecified. |
country | array de 1 a 20 códigos de duas letras | não | Países como códigos ISO, como em FR ou US. |
salary_min | número, 0 ou mais | não | O menor limite superior de uma faixa salarial a manter. |
salary_interval | string | não | O período em que salary_min está escrito, como per-year-salary. |
currency | código de três letras | não | A moeda em que salary_min está escrita, como em EUR. |
posted_within_days | inteiro, 1 a 3650 | não | Quão recente uma vaga deve ser. |
limit | inteiro, 1 a 100, padrão 25 | não | Vagas a ler por empresa. |
skip | inteiro, 0 a 100000, padrão 0 | não | Vagas 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.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
company_slug | string | sim | O nome de site Lever, como resolve_company o retorna. |
job_id | string | sim | O identificador de uma vaga, como uma busca o retorna. |
instance | global ou eu | não | A 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.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
company_slug | string | sim | O nome de site Lever, como resolve_company o retorna. |
instance | global ou eu | não | A instância em que este site vive. A global por padrão. |
fields | array de 1 a 3 de team, location, commitment | não | Quais 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ódigo | O que aconteceu | O que fazer |
|---|---|---|
not_found | A Lever respondeu e não possui tal site ou vaga. | Verifique o nome do site com resolve_company. |
invalid_input | Os argumentos foram recusados antes de qualquer requisição ser enviada. | Leia a mensagem, que indica o argumento e o que ele aceita. |
rate_limited | A Lever pediu que este cliente diminuísse o ritmo. | Aguarde e chame novamente com os mesmos argumentos. A vaga ainda está no quadro. |
parse_failure | A Lever respondeu em um formato que este cliente não consegue ler. | Reporte em o rastreador de problemas. |
network_error | A requisição não foi concluída. | Tente novamente em breve. |
timeout | A 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)
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
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
| Ferramenta | O que faz |
|---|---|
resolve_company | Traduz nomes de empresas em identificadores de sites da Lever. |
search_jobs | Busca nas vagas das empresas nomeadas. |
get_job | Lê uma vaga inteira, anúncio incluído. |
list_filter_values | Lista 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.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
names | matriz de 1 a 25 strings | sim | Nomes 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.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
companies | matriz de 1 a 25 strings | sim | Nomes de empresas ou identificadores. Cada um é resolvido aqui. |
keyword | string | não | Palavras para buscar no título e no anúncio. |
location | matriz de 1 a 20 strings | não | Locais, exatamente como a Lever os escreve. |
team | matriz de 1 a 20 strings | não | Equipes, exatamente como a Lever as escreve. |
department | matriz de 1 a 20 strings | não | Departamentos, exatamente como a Lever os escreve. |
commitment | matriz de 1 a 20 strings | não | Tipos de contrato, exatamente como a Lever os escreve. |
workplace_type | matriz de 1 a 4 strings | não | remote, hybrid, onsite ou unspecified. |
country | matriz de 1 a 20 códigos de duas letras | não | Países em código ISO, como FR ou US. |
salary_min | número, 0 ou mais | não | O limite inferior mais baixo da faixa a manter. |
salary_interval | string | não | O período no qual salary_min está escrito, por exemplo per-year-salary. |
currency | código de três letras | não | A moeda na qual salary_min está escrito, como EUR. |
posted_within_days | inteiro, 1 a 3650 | não | A antiguidade máxima de uma vaga. |
limit | inteiro, 1 a 100, padrão 25 | não | Vagas a ler por empresa. |
skip | inteiro, 0 a 100000, padrão 0 | não | Vagas 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.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
company_slug | string | sim | O identificador do site, retornado por resolve_company. |
job_id | string | sim | O identificador de uma vaga, retornado por uma busca. |
instance | global ou eu | não | A 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.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
company_slug | string | sim | O identificador do site, retornado por resolve_company. |
instance | global ou eu | não | A instância onde esse site vive. A mundial por padrão. |
fields | array de 1 a 3 entre team, location, commitment | não | Os 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ódigo | O que aconteceu | O que fazer |
|---|---|---|
not_found | A Lever respondeu e não tem nem esse site nem essa vaga. | Verifique o identificador com resolve_company. |
invalid_input | Os argumentos foram recusados antes de qualquer requisição. | Leia a mensagem, que nomeia o argumento e o que ele aceita. |
rate_limited | A Lever pede que este cliente desacelere. | Aguarde e chame novamente com os mesmos argumentos. A vaga continua no ar. |
parse_failure | A Lever respondeu em um formato que este cliente não lê. | Reporte em o rastreador de incidentes. |
network_error | A requisição não foi concluída. | Tente novamente em breve. |
timeout | A 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.