Ashby job boards

Pesquise quadros de vagas públicos da Ashby: localize uma empresa, leia suas vagas abertas e os salários que ela publica.

Documentação

mcp-ashby

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

Ashby é um software de recrutamento, e toda empresa que o utiliza ganha um quadro de vagas público que o acompanha. Cada quadro traz as vagas abertas daquela empresa com seu título, departamento e equipe, o tipo de contratação, os locais e se o trabalho é remoto, o anúncio completo e, quando a empresa opta por publicar, a remuneração: uma faixa salarial, uma participação acionária, uma comissão ou um bônus, cada um com o período ao qual se refere. A Ashby mantém um quadro por empresa e não publica um índice entre eles.

Este servidor conecta um cliente de chat a esses quadros. Você nomeia as empresas de seu interesse, e ele transforma cada nome no token que acessa o quadro correspondente, pesquisa as vagas, filtra por departamento, equipe, local, país, tipo de contratação, modalidade remota, recência ou remuneração, lê uma vaga completa, lista as palavras que cada quadro realmente usa e coloca a remuneração de várias vagas lado a lado. Ele não exige chave de API nem conta.

Versão em francês


Instalação

Instalação em um clique

Install in Cursor Install in VS Code

Claude Code

claude mcp add ashby -- npx -y mcp-ashby

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

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

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

Com Docker

{
  "mcpServers": {
    "ashby": {
      "command": "docker",
      "args": ["run", "-i", "--rm", "ghcr.io/smeet666/mcp-ashby: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.ashbyhq.com, e nada mais: sem volume, sem porta, sem credencial.

Pacote, sem npm

Baixe mcp-ashby-2.0.1.mcpb de a versão 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

  • "A Ramp está contratando na Ashby?"
  • "Encontre vagas remotas de design na Ramp e na Linear."
  • "Leia essa vaga completa para mim."
  • "Em quais departamentos esse quadro classifica suas vagas?"
  • "Coloque os salários dessas vagas de engenharia lado a lado."

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

resolve_board(["Ramp"])          ->  ramp, publishing
search_jobs(["Ramp"], query: "designer", is_remote: true)
get_job("ramp", "b0c8…")

Ferramentas

FerramentaO que faz
resolve_boardTransforma um nome de empresa no token do quadro Ashby.
search_jobsPesquisa as vagas das empresas que você nomeia.
get_jobLê uma vaga completa, incluindo o anúncio.
list_filter_valuesLista as palavras que um quadro usa, com quantas vagas carregam cada uma.
compare_compensationColoca um componente de remuneração de várias vagas lado a lado.

Cada quadro mantém seus próprios departamentos e equipes, então um filtro escrito com o vocabulário de outro quadro se reduz a nada. list_filter_values publica as palavras que um quadro realmente usa.

resolve_board

Transforma um nome de empresa no token que acessa seu quadro Ashby.

ArgumentoTipoObrigatórioO que faz
namestringsimUm nome de empresa, ou um token de quadro Ashby que você já conhece.

Em retorno: found, os quadros que responderam, e tried, os formatos realmente enviados em ordem. Quatro formatos são tentados por nome, então nada encontrado nunca é prova de que uma empresa está ausente da Ashby.

search_jobs

Pesquisa as vagas das empresas nomeadas. A Ashby serve um quadro inteiro de uma vez, e toda restrição abaixo é aplicada ao que foi lido.

ArgumentoTipoObrigatórioO que faz
companiesarray de 1 a 10 stringssimNomes de empresas ou tokens de quadro.
querystringnãoPalavras para procurar.
search_intitle ou title_and_description, padrão titlenãoOnde query é procurado.
departmentuma string ou uma lista de até 10nãoDepartamentos como o quadro os escreve.
teamuma string ou uma lista de até 10nãoEquipes como o quadro as escreve.
employment_typeuma string ou uma lista de até 6nãoTipos de contratação.
workplace_typeuma string ou uma lista de até 4nãoTipos de local de trabalho.
is_remotebooleanonãoManter as vagas marcadas como remotas.
countryum país ou uma lista de até 10nãoPaíses como o quadro os escreve.
location_containsstringnãoParte de uma linha de local.
published_afteruma data ISO 8601nãoQuão recente uma vaga precisa ser.
has_compensationbooleanonãoManter as vagas cuja empresa publica uma faixa salarial.
salary_minnúmero, 0 ou maisnãoUm piso para o componente salarial.
currencycódigo de três letrasnãoA moeda em que o piso está escrito.
salary_intervalstring, padrão 1 YEARnãoO período ao qual o piso pertence.
sortpublished_desc, published_asc ou title, padrão published_descnãoComo as linhas são ordenadas.
limitinteiro, 1 a 100, padrão 20nãoVagas a servir.
offsetinteiro, 0 a 10000, padrão 0nãoVagas a pular.

Em retorno: jobs, cada uma carregando board e id, que get_job recebe juntos, além de title, department, team, employment_type, location, country, secondary_location_count, workplace_type, is_remote, published_at com o deslocamento que a Ashby publica, compensation_summary, job_url e apply_url. As linhas não carregam texto de anúncio, em nenhum limite. total_on_board conta as vagas que os quadros lidos contêm, total_matched aquelas que os critérios mantiveram, e returned aquelas nesta resposta: três números diferentes. per_company dá um resultado por empresa com seu status, filters_applied ecoa o que foi aplicado, e undeclared conta as vagas que não declaram nada em um campo sendo filtrado, para que uma restrição nunca as engula silenciosamente.

get_job

Lê uma vaga completa.

ArgumentoTipoObrigatórioO que faz
boardstringsimUm nome de empresa, ou um token de quadro Ashby.
job_idstringsimO identificador que uma linha de pesquisa carrega.
descriptionplain, html ou none, padrão plainnãoComo servir o anúncio.
include_compensationbooleano, padrão truenãoCarregar a remuneração que a empresa publicou.

O anúncio chega a milhares de caracteres, e html é a marcação da própria empresa, sem reescrita.

Em retorno: a vaga que uma linha de pesquisa carrega, com sua descrição, seus locais e os componentes de remuneração que a empresa publicou.

list_filter_values

Lista as palavras que um quadro realmente usa, com quantas vagas carregam cada uma.

ArgumentoTipoObrigatórioO que faz
boardstringsimUm nome de empresa, ou um token de quadro.
facetdepartments, teams, locations, countries, employment_types, workplace_types ou all, padrão allnãoQual vocabulário ler.

Em retorno: facets, cada valor com o número de vagas que o carregam, e undeclared, as vagas que não declaram nada nesse aspecto. sibling_spellings nomeia as grafias que diferem apenas em maiúsculas ou espaçamento, que um filtro trataria de outra forma como duas coisas diferentes.

compare_compensation

Coloca um componente de remuneração de várias vagas lado a lado.

ArgumentoTipoObrigatórioO que faz
boardstringsimUm nome de empresa ou um token de board.
job_idsarray de até 50 stringsnãoAs vagas a comparar.
departmentuma string ou uma lista de até 10nãoComparar um departamento em vez disso.
teamuma string ou uma lista de até 10nãoComparar um time em vez disso.
querystringnãoPalavras para procurar nos títulos.
componentSalary, EquityCashValue, EquityPercentage, Commission ou Bonus, padrão SalarynãoQual componente comparar.
intervalstring, padrão 1 YEARnãoO período comparado.
limitinteiro, de 1 a 100, padrão 25nãoVagas a comparar.

Um componente por vez: uma participação no capital e um salário não se somam. Vagas cotadas em outro período são listadas separadamente, sem conversão.

Em retorno: rows, uma por vaga, com o component e o interval em que foram comparadas, currencies_present nomeando cada moeda na resposta, e not_published listando as vagas cuja empresa não publicou nada, o que nunca é o mesmo que zero.

O que um valor de remuneração significa

Uma empresa publica o que escolhe. Uma vaga sem faixa retorna sem nenhum valor, nunca com zero. Uma faixa é informada na moeda e no período em que a Ashby a carrega, e nunca é convertida ou anualizada: comparar duas vagas cotadas em períodos diferentes fica a cargo de quem sabe para que serve a comparação.

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 As a library mostra como passar. O intervalo entre duas requisições pode ser ampliado ali e nunca reduzido.

Erros

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

CódigoO que aconteceuO que fazer
not_foundA Ashby respondeu e não possui tal board ou vaga.Verifique o token com resolve_board.
invalid_inputOs argumentos foram recusados antes de qualquer requisição sair.Leia a mensagem, que nomeia o argumento e o que ele aceita.
rate_limitedA Ashby pediu que este cliente diminuísse o ritmo.Aguarde e chame novamente com os mesmos argumentos. A vaga ainda está no board.
parse_failureA Ashby 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 Ashby é publicada separadamente, com seu ritmo, seu cache e seus erros, e sem nenhum protocolo anexado.

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

const client = new Client({ minIntervalMs: 2000 });
const resolved = await client.resolveBoard("Ramp");
console.log(resolved.found);

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

Ritmo e atribuição

As requisições saem uma de cada vez com pelo menos um segundo entre elas, e esse piso se mantém independentemente de como o cliente está configurado. A Ashby serve um board inteiro em uma resposta, que pode pesar megabytes, então uma única pergunta sobre uma empresa custa uma requisição e este servidor guarda a resposta brevemente em vez de perguntar novamente. O User-Agent carrega o projeto e um endereço onde uma pessoa pode ser contatada, e não imita nenhum navegador.

Cada vaga carrega o endereço de sua página na Ashby e sua URL de candidatura. Dê crédito à empresa e vincule essa página ao exibir uma vaga.

Este servidor MCP é um projeto não oficial, sem afiliação com a Ashby ou com as empresas cujos boards 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.ashbyhq.com e nada mais, mantém suas 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 diariamente contra o próprio serviço.

Contribuindo

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

Licença

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


mcp-ashby (français)

English version

Ashby est un logiciel de recrutement, et chaque entreprise qui l'utilise reçoit avec lui un site d'offres public. Chaque site porte les postes ouverts de cette entreprise avec leur intitulé, leur département et leur équipe, le type de contrat, les lieux et le caractère distant du travail, l'annonce complète, et, quand l'entreprise a choisi de le publier, la rémunération : une fourchette de salaire, une part de capital, une commission ou une prime, chacune avec la période sur laquelle elle est exprimée. Ashby héberge un site par entreprise et ne publie aucun index les traversant.

Ce serveur relie un client de conversation à ces sites. Vous nommez les entreprises qui vous intéressent, et il traduit chaque nom en le jeton qui adresse son site, cherche dans leurs offres, les filtre par département, équipe, lieu, pays, type de contrat, télétravail, fraîcheur ou rémunération, lit une offre en entier, liste les mots que chaque site emploie réellement, et met les rémunérations de plusieurs offres côte à côte. Aucune clé d'API, aucun compte.

Installation

Installation en un clic

Install in Cursor Install in VS Code

Claude Code

claude mcp add ashby -- npx -y mcp-ashby

Claude Desktop, Cursor, et tout client au format de configuration standard

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

Node 24 ou plus récent est nécessaire, et aucune variable d'environnement n'est à renseigner.

Avec Docker

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

-i garde l'entrée standard ouverte, qui est le canal du protocole, et -t est omis parce qu'un TTY réécrit le flux. Le conteneur a besoin d'un accès HTTPS sortant vers api.ashbyhq.com, et de rien d'autre : aucun volume, aucun port, aucun identifiant.

Bundle, sans npm

Téléchargez mcp-ashby-2.0.1.mcpb depuis la dernière publication et ouvrez-le. Un client qui gère les bundles MCP l'installe seul, sans npm et sans fichier de configuration à modifier. Le bundle emporte ses dépendances, donc rien n'est téléchargé à l'installation.

Ce qu'on peut demander

  • « Est-ce que Ramp recrute sur Ashby ? »
  • « Trouve-moi des postes de design en télétravail chez Ramp et Linear. »
  • « Lis-moi cette offre en entier. »
  • « Sous quels départements ce site classe-t-il ses offres ? »
  • « Mets côte à côte les salaires de ces offres d'ingénierie. »

Chaque question part d'une entreprise, puisque Ashby n'offre aucune recherche traversant les sites. search_jobs résout lui-même les noms qu'on lui donne, donc rien n'est à préparer :

resolve_board(["Ramp"])          ->  ramp, publie
search_jobs(["Ramp"], query: "designer", is_remote: true)
get_job("ramp", "b0c8…")

Les outils

OutilCe qu'il fait
resolve_boardTraduit un nom d'entreprise en jeton de site Ashby.
search_jobsCherche dans les offres des entreprises nommées.
get_jobLit une offre en entier, annonce comprise.
list_filter_valuesListe les mots qu'un site emploie, et combien d'offres les portent.
compare_compensationMet une composante de rémunération de plusieurs offres côte à côte.

Chaque site garde ses propres départements et équipes, donc un filtre écrit dans le vocabulaire d'un autre site ne retient rien. list_filter_values publie les mots qu'un site emploie réellement.

resolve_board

Traduit un nom d'entreprise en le jeton qui adresse son site Ashby.

ArgumentTypeRequisCe qu'il fait
namechaîneouiUn nom d'entreprise, ou un jeton Ashby déjà connu.

En retour : found, les sites qui ont répondu, et tried, les formes réellement envoyées dans l'ordre. Quatre formes sont essayées par nom, donc ne rien trouver ne prouve jamais qu'une entreprise est absente d'Ashby.

search_jobs

Cherche dans les offres des entreprises nommées. Ashby sert un site entier d'un coup, et chaque restriction ci-dessous s'applique à ce qui a été lu.

ArgumentoTipoObrigatórioO que faz
companiesmatriz de 1 a 10 stringssimNomes de empresas ou tokens.
querystringnãoAs palavras a pesquisar.
search_intitle ou title_and_description, padrão titlenãoOnde query é pesquisado.
departmentuma string ou uma lista de até 10nãoDepartamentos como o site os escreve.
teamuma string ou uma lista de até 10nãoEquipes como o site as escreve.
employment_typeuma string ou uma lista de até 6nãoTipos de contrato.
workplace_typeuma string ou uma lista de até 4nãoModalidades de trabalho.
is_remotebooleanonãoManter apenas as vagas em teletrabalho.
countryum país ou uma lista de até 10nãoPaíses como o site os escreve.
location_containsstringnãoUma parte de uma linha de local.
published_afteruma data ISO 8601nãoA antiguidade máxima de uma vaga.
has_compensationbooleanonãoManter apenas as vagas cuja empresa publica uma faixa.
salary_minnúmero, 0 ou maisnãoUm piso para o componente salário.
currencycódigo de três letrasnãoA moeda do piso.
salary_intervalstring, padrão 1 YEARnãoO período ao qual o piso se refere.
sortpublished_desc, published_asc ou title, padrão published_descnãoA ordem das linhas.
limitinteiro, 1 a 100, padrão 20nãoVagas a servir.
offsetinteiro, 0 a 10000, padrão 0nãoVagas a pular.

Em retorno: jobs, cada uma portando board e id, que get_job retoma juntos, mais title, department, team, employment_type, location, country, secondary_location_count, workplace_type, is_remote, published_at com o fuso horário que a Ashby publica, compensation_summary, job_url e apply_url. As linhas não trazem o anúncio, independentemente do limite. total_on_board conta as vagas que os sites lidos contêm, total_matched aquelas que os critérios selecionaram, e returned aquelas desta resposta: três números diferentes. per_company dá um resultado por empresa com seu status, filters_applied reafirma o que foi aplicado, e undeclared conta as vagas que não declaram nada sobre um campo filtrado, para que uma restrição nunca as engula silenciosamente.

get_job

Lê uma vaga por completo.

ArgumentoTipoObrigatórioO que faz
boardstringsimUm nome de empresa, ou um token Ashby.
job_idstringsimO identificador que uma linha carrega.
descriptionplain, html ou none, padrão plainnãoComo servir o anúncio.
include_compensationbooleano, padrão truenãoTrazer a remuneração publicada.

O anúncio tem milhares de caracteres, e html é a marcação da empresa, não reescrita.

Em retorno: a vaga que uma linha de pesquisa carrega, com sua descrição, seus locais e os componentes de remuneração que a empresa publicou.

list_filter_values

Lista as palavras que um site realmente usa e quantas vagas carregam cada uma.

ArgumentoTipoObrigatórioO que faz
boardstringsimUm nome de empresa, ou um token.
facetdepartments, teams, locations, countries, employment_types, workplace_types ou all, padrão allnãoO vocabulário a ler.

Em retorno: facets, cada valor com o número de vagas que o carregam, e undeclared, as vagas que não declaram nada sobre essa faceta. sibling_spellings nomeia as formulações que diferem apenas por maiúsculas/minúsculas ou espaços, que um filtro trataria de outra forma como duas coisas distintas.

compare_compensation

Coloca um componente de remuneração de várias vagas lado a lado.

ArgumentoTipoObrigatórioO que faz
boardstringsimUm nome de empresa, ou um token.
job_idsmatriz de até 50 stringsnãoAs vagas a comparar.
departmentuma string ou uma lista de até 10nãoComparar um departamento.
teamuma string ou uma lista de até 10nãoComparar uma equipe.
querystringnãoAs palavras a pesquisar nos títulos.
componentSalary, EquityCashValue, EquityPercentage, Commission ou Bonus, padrão SalarynãoO componente comparado.
intervalstring, padrão 1 YEARnãoO período comparado.
limitinteiro, 1 a 100, padrão 25nãoVagas a comparar.

Um componente por vez: uma parte de capital e um salário não se somam. As vagas expressas em outro período são listadas à parte, sem conversão.

Em retorno: rows, uma por vaga, com o component e o interval sobre os quais foram comparadas, currencies_present que nomeia cada moeda presente na resposta, e not_published que lista as vagas cuja empresa não publicou nada, o que nunca vale zero.

O que diz um número de remuneração

Uma empresa publica o que quiser. Uma vaga sem faixa retorna sem nada, nunca com um zero. Uma faixa é retornada na moeda e no período em que a Ashby a carrega, e nunca é convertida nem anualizada: comparar duas vagas expressas em períodos diferentes fica a cargo de quem sabe para que a comparação deve servir.

Configuração

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

O ritmo, o atraso e o cache são ajustes da camada cliente, que Como biblioteca mostra como passar. A diferença entre duas requisições pode ser ampliada e nunca reduzida.

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 Ashby respondeu e não tem esse site nem essa vaga.Verifique o token com resolve_board.
invalid_inputOs argumentos foram recusados antes de qualquer requisição.Leia a mensagem, que nomeia o argumento e o que ele aceita.
rate_limitedA Ashby pede que este cliente desacelere.Aguarde e chame novamente com os mesmos argumentos. A vaga ainda está online.
parse_failureA Ashby respondeu em um formato que este cliente não lê.Reporte em o rastreamento de incidentes.
network_errorA requisição não foi concluída.Tente novamente em breve.
timeoutA requisição excedeu seu tempo limite.Peça menos empresas, ou um limit menor.

Como biblioteca

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

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

const client = new Client({ minIntervalMs: 2000 });
const resolved = await client.resolveBoard("Ramp");
console.log(resolved.found);

ClientOptions aceita minIntervalMs, timeoutMs, cacheTtlMs e fetchImpl. Uma diferença abaixo do piso publicado é ignorada, então o piso também vale aqui.

Ritmo e atribuição

As requisições são enviadas uma a uma, com pelo menos um segundo de intervalo entre elas, e esse limite mínimo se mantém independentemente da configuração do cliente. A Ashby entrega um site inteiro em uma única resposta, que pode pesar vários megabytes, então uma pergunta sobre uma empresa custa uma requisição, e este servidor guarda brevemente a resposta em vez de solicitar novamente. O User-Agent carrega o projeto e um endereço para contatar uma pessoa, e não imita nenhum navegador.

Cada vaga traz o endereço da sua página na Ashby e o endereço de candidatura. Dê crédito à empresa e aponte para essa página ao exibir uma vaga.

Este MCP é um projeto não oficial, sem afiliação com a Ashby 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, acessa apenas api.ashbyhq.com, mantém as respostas em memória enquanto está em execução e não grava nada no disco. O PRIVACY.md informa o que uma requisição carrega e quais configurações alteram 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.

Contribuição

Bugs, dúvidas e ideias têm seu lugar no rastreador de problemas. Propostas de alteraçã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.