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
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.
Instalação
Instalação em um clique
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
| Ferramenta | O que faz |
|---|---|
resolve_board | Transforma um nome de empresa no token do quadro Ashby. |
search_jobs | Pesquisa as vagas das empresas que você nomeia. |
get_job | Lê uma vaga completa, incluindo o anúncio. |
list_filter_values | Lista as palavras que um quadro usa, com quantas vagas carregam cada uma. |
compare_compensation | Coloca 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.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
name | string | sim | Um 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.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
companies | array de 1 a 10 strings | sim | Nomes de empresas ou tokens de quadro. |
query | string | não | Palavras para procurar. |
search_in | title ou title_and_description, padrão title | não | Onde query é procurado. |
department | uma string ou uma lista de até 10 | não | Departamentos como o quadro os escreve. |
team | uma string ou uma lista de até 10 | não | Equipes como o quadro as escreve. |
employment_type | uma string ou uma lista de até 6 | não | Tipos de contratação. |
workplace_type | uma string ou uma lista de até 4 | não | Tipos de local de trabalho. |
is_remote | booleano | não | Manter as vagas marcadas como remotas. |
country | um país ou uma lista de até 10 | não | Países como o quadro os escreve. |
location_contains | string | não | Parte de uma linha de local. |
published_after | uma data ISO 8601 | não | Quão recente uma vaga precisa ser. |
has_compensation | booleano | não | Manter as vagas cuja empresa publica uma faixa salarial. |
salary_min | número, 0 ou mais | não | Um piso para o componente salarial. |
currency | código de três letras | não | A moeda em que o piso está escrito. |
salary_interval | string, padrão 1 YEAR | não | O período ao qual o piso pertence. |
sort | published_desc, published_asc ou title, padrão published_desc | não | Como as linhas são ordenadas. |
limit | inteiro, 1 a 100, padrão 20 | não | Vagas a servir. |
offset | inteiro, 0 a 10000, padrão 0 | não | Vagas 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.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
board | string | sim | Um nome de empresa, ou um token de quadro Ashby. |
job_id | string | sim | O identificador que uma linha de pesquisa carrega. |
description | plain, html ou none, padrão plain | não | Como servir o anúncio. |
include_compensation | booleano, padrão true | não | Carregar 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.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
board | string | sim | Um nome de empresa, ou um token de quadro. |
facet | departments, teams, locations, countries, employment_types, workplace_types ou all, padrão all | não | Qual 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.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
board | string | sim | Um nome de empresa ou um token de board. |
job_ids | array de até 50 strings | não | As vagas a comparar. |
department | uma string ou uma lista de até 10 | não | Comparar um departamento em vez disso. |
team | uma string ou uma lista de até 10 | não | Comparar um time em vez disso. |
query | string | não | Palavras para procurar nos títulos. |
component | Salary, EquityCashValue, EquityPercentage, Commission ou Bonus, padrão Salary | não | Qual componente comparar. |
interval | string, padrão 1 YEAR | não | O período comparado. |
limit | inteiro, de 1 a 100, padrão 25 | não | Vagas 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ódigo | O que aconteceu | O que fazer |
|---|---|---|
not_found | A Ashby respondeu e não possui tal board ou vaga. | Verifique o token com resolve_board. |
invalid_input | Os argumentos foram recusados antes de qualquer requisição sair. | Leia a mensagem, que nomeia o argumento e o que ele aceita. |
rate_limited | A Ashby pediu que este cliente diminuísse o ritmo. | Aguarde e chame novamente com os mesmos argumentos. A vaga ainda está no board. |
parse_failure | A Ashby 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 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)
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
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
| Outil | Ce qu'il fait |
|---|---|
resolve_board | Traduit un nom d'entreprise en jeton de site Ashby. |
search_jobs | Cherche dans les offres des entreprises nommées. |
get_job | Lit une offre en entier, annonce comprise. |
list_filter_values | Liste les mots qu'un site emploie, et combien d'offres les portent. |
compare_compensation | Met 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.
| Argument | Type | Requis | Ce qu'il fait |
|---|---|---|---|
name | chaîne | oui | Un 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.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
companies | matriz de 1 a 10 strings | sim | Nomes de empresas ou tokens. |
query | string | não | As palavras a pesquisar. |
search_in | title ou title_and_description, padrão title | não | Onde query é pesquisado. |
department | uma string ou uma lista de até 10 | não | Departamentos como o site os escreve. |
team | uma string ou uma lista de até 10 | não | Equipes como o site as escreve. |
employment_type | uma string ou uma lista de até 6 | não | Tipos de contrato. |
workplace_type | uma string ou uma lista de até 4 | não | Modalidades de trabalho. |
is_remote | booleano | não | Manter apenas as vagas em teletrabalho. |
country | um país ou uma lista de até 10 | não | Países como o site os escreve. |
location_contains | string | não | Uma parte de uma linha de local. |
published_after | uma data ISO 8601 | não | A antiguidade máxima de uma vaga. |
has_compensation | booleano | não | Manter apenas as vagas cuja empresa publica uma faixa. |
salary_min | número, 0 ou mais | não | Um piso para o componente salário. |
currency | código de três letras | não | A moeda do piso. |
salary_interval | string, padrão 1 YEAR | não | O período ao qual o piso se refere. |
sort | published_desc, published_asc ou title, padrão published_desc | não | A ordem das linhas. |
limit | inteiro, 1 a 100, padrão 20 | não | Vagas a servir. |
offset | inteiro, 0 a 10000, padrão 0 | não | Vagas 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.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
board | string | sim | Um nome de empresa, ou um token Ashby. |
job_id | string | sim | O identificador que uma linha carrega. |
description | plain, html ou none, padrão plain | não | Como servir o anúncio. |
include_compensation | booleano, padrão true | não | Trazer 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.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
board | string | sim | Um nome de empresa, ou um token. |
facet | departments, teams, locations, countries, employment_types, workplace_types ou all, padrão all | não | O 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.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
board | string | sim | Um nome de empresa, ou um token. |
job_ids | matriz de até 50 strings | não | As vagas a comparar. |
department | uma string ou uma lista de até 10 | não | Comparar um departamento. |
team | uma string ou uma lista de até 10 | não | Comparar uma equipe. |
query | string | não | As palavras a pesquisar nos títulos. |
component | Salary, EquityCashValue, EquityPercentage, Commission ou Bonus, padrão Salary | não | O componente comparado. |
interval | string, padrão 1 YEAR | não | O período comparado. |
limit | inteiro, 1 a 100, padrão 25 | não | Vagas 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ódigo | O que aconteceu | O que fazer |
|---|---|---|
not_found | A Ashby respondeu e não tem esse site nem essa vaga. | Verifique o token com resolve_board. |
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 Ashby pede que este cliente desacelere. | Aguarde e chame novamente com os mesmos argumentos. A vaga ainda está online. |
parse_failure | A Ashby respondeu em um formato que este cliente não lê. | Reporte em o rastreamento de incidentes. |
network_error | A requisição não foi concluída. | Tente novamente em breve. |
timeout | A 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.