career-agent
Career Agent
Agente de carreira integrado ao Claude Desktop via MCP. Encontra vagas, calcula compatibilidade com o seu perfil, personaliza seu curriculo de forma legitima, gera mensagens e respostas, e mantem o historico de candidaturas.
A acao externa final e sempre sua. O agente prepara; voce clica.
Novidades da v1.1
Recurso | Como usar |
Catálogo persistente de vagas |
|
5 provedores de ATS | Greenhouse, Lever, Ashby, Workable, SmartRecruiters |
Adzuna (índice nacional BR) | preencha |
Pesos configuráveis | edite |
11 dimensões de score | inclui .NET, SAP, fiscal, arquitetura e foco backend |
Busca agendada |
|
Dashboard local |
|
Retry com backoff | automático em todas as fontes HTTP |
Detalhes de cada fonte, com o que foi medido: docs/FONTES.md.
Related MCP server: job-search-mcp
Indice
1. Arquitetura
Visao geral
Claude Desktop
|
+---------------+---------------+
| | |
career-agent job-search career-files
(MCP stdio) (MCP stdio) (MCP stdio)
| | |
+---------------+---------------+
|
career_core
(dominio puro - nao conhece MCP)
|
+--------+-----------+-----------+--------+
| | | | |
profile scoring applications resume job_sources
(.md) (7 dim.) (SQLite+JSON) (tailor) (IJobSource)Decisoes arquiteturais
Dominio separado dos adapters. Toda a regra de negocio vive em
src/career_core/, que nao importa nada de MCP. Os tres server.py sao
adapters finos: traduzem argumentos, chamam o dominio, formatam a resposta.
Isso permite testar 100% da logica sem subir servidor nenhum.
SQLite como fonte de verdade, JSON como espelho. SQLite da escrita
transacional (o historico nao corrompe se o processo morrer no meio) e
consultas de duplicidade baratas, com zero configuracao — ao contrario do
PostgreSQL, que exigiria servidor e credenciais sem ganho nenhum na escala de
uma pessoa. O applications.json continua existindo, reescrito de forma
atomica a cada mudanca, para inspecao a olho nu e versionamento no Git. Ele e
somente escrita: nunca e lido de volta, entao nao existe risco de duas
fontes divergirem.
Score como dimensoes plugaveis. Cada uma das 7 dimensoes e uma classe que
implementa IScoreDimension e sabe pontuar e explicar um unico aspecto. O
JobScorer so soma e classifica. Adicionar uma dimensao nova nao altera o
somador (Open/Closed).
Fontes de vagas atras de uma interface. IJobSource tem quatro
implementacoes: MockJobSource (offline), RemotiveJobSource e
ArbeitnowJobSource (APIs publicas reais, sem autenticacao) e
UnavailableJobSource (LinkedIn/Indeed/Gupy — declaradas, porem em modo
manual). Adicionar uma fonte e escrever uma classe e registra-la; nada mais
muda.
Composition root unico. CareerServices monta o grafo de objetos. Os
servidores nao instanciam dependencias a mao, e os testes injetam dublês.
Estrutura de diretorios
career-agent/
├── pyproject.toml # deps + config do pytest (fonte unica)
├── .env.example # modelo de configuracao (versionado)
├── .env # sua configuracao real (NAO versionado)
│
├── src/career_core/ # DOMINIO - nao conhece MCP
│ ├── config.py # Settings por ambiente
│ ├── models.py # Job, CandidateProfile, Application, JobScore
│ ├── text.py # normalizacao (aliases de stack, URL, empresa)
│ ├── security.py # politica + maquina de estados (ApprovalGate)
│ ├── paths.py # SandboxedFileSystem (jail em data/)
│ ├── errors.py # hierarquia de erros de dominio
│ ├── logging_setup.py # logging para stderr + arquivo
│ ├── services.py # composition root
│ ├── job_input.py # vaga colada -> Job normalizado
│ ├── profile/repository.py # perfil .md -> CandidateProfile
│ ├── scoring/ # dimensions.py (7 dimensoes) + scorer.py
│ ├── applications/ # repository.py, dedupe.py, builder.py
│ ├── resume/tailor.py # personalizacao + FactGuard
│ └── job_sources/ # base.py, mock.py, http_sources.py,
│ # unavailable.py, registry.py
│
├── mcp-career/ # MCP 1 - logica de carreira
├── mcp-job-search/ # MCP 2 - obtencao de vagas
├── mcp-career-files/ # MCP 3 - leitura de arquivos (sandbox)
│
├── data/ # UNICO diretorio visivel ao career-files
│ ├── profile/ # profile.md, skills.md, preferences.md
│ ├── resumes/ # curriculo-principal.md (+ variantes)
│ └── applications/ # applications.db (verdade) + .json (espelho)
│
├── agent/career-agent.md # instrucoes de comportamento do agente
├── scripts/ # install.ps1, start.ps1, test.ps1, configure-*
├── tests/ # pytest
└── docs/ # SECURITY.md, SCORING.md, ARCHITECTURE.md2. Pre-requisitos
Requisito | Versao | Observacao |
Windows | 10/11 | testado no Windows 11 |
Python | >= 3.11 |
|
uv | qualquer | o |
Claude Desktop | atual | necessario para usar os MCPs |
Git | opcional | para versionar o projeto |
3. Instalacao
cd C:\career-agent
powershell -ExecutionPolicy Bypass -File .\scripts\install.ps1O script verifica Python, instala uv se faltar, cria o .venv, instala as
dependencias, cria a arvore de data/, gera o .env a partir do
.env.example e valida que os tres MCPs sobem.
Para tambem gravar a configuracao do Claude Desktop no mesmo passo:
powershell -ExecutionPolicy Bypass -File .\scripts\install.ps1 -ConfigureClaude4. Configuracao
4.1 Preencha seu perfil
Estes arquivos sao a fonte de verdade. O agente nunca afirma nada que nao esteja neles.
Arquivo | O que colocar |
| nome, contatos, resumo, formacao, empresas bloqueadas |
| tecnologias, arquitetura, dominios |
| cargos-alvo, senioridade, modalidade, cidades, salario |
| seu curriculo completo |
Procure por [PREENCHER] — sao os campos que o agente nao pode inventar.
Dois deles mudam o score na hora:
Anos de experienciaemprofile.md: enquanto estivernao informado, a parte de "anos" da dimensao Experiencia fica neutra. O agente nao deduz esse numero.Minimo/Alvoempreferences.md: enquanto estiverem[PREENCHER], a dimensao Salario fica neutra para vagas com faixa divulgada.
4.2 Ajuste o .env
CAREER_DATA_ROOT=C:\career-agent\data
CAREER_MIN_SCORE=70
JOB_SEARCH_ENABLE_NETWORK=true
JOB_SEARCH_SOURCES=ats
JOB_SEARCH_ATS_COMPANIES=greenhouse:stone,ashby:nubank,greenhouse:vtex,...
JOB_SEARCH_USER_AGENT=career-agent/1.0 (personal job search; contact: SEU-EMAIL)Ponha seu e-mail no User-Agent — identificar-se e a forma educada de consumir uma API publica.
Adicionar empresas a busca
A fonte ats so encontra vagas das empresas que voce listar. Para adicionar
uma, abra a pagina de carreiras dela e olhe a URL:
URL da pagina de carreiras | Adicione |
|
|
|
|
|
|
Empresas cuja pagina de carreiras esta na Gupy nao podem ser adicionadas — a Gupy nao expoe busca publica. Para essas, use o modo manual.
Nao existe variavel de credencial do LinkedIn neste projeto. Isso e deliberado.
5. Configuracao do Claude Desktop
Automatico (recomendado)
powershell -ExecutionPolicy Bypass -File .\scripts\configure-claude-desktop.ps1O script faz backup do arquivo existente (.backup-AAAAMMDD-HHMMSS), preserva
todas as suas configuracoes e MCPs atuais, e so adiciona/atualiza as tres
entradas do Career Agent.
Manual
Arquivo: %APPDATA%\Claude\claude_desktop_config.json
(no seu caso: C:\Users\Roger\AppData\Roaming\Claude\claude_desktop_config.json)
{
"mcpServers": {
"career-agent": {
"command": "C:\\career-agent\\.venv\\Scripts\\python.exe",
"args": ["C:\\career-agent\\mcp-career\\server.py"]
},
"job-search": {
"command": "C:\\career-agent\\.venv\\Scripts\\python.exe",
"args": ["C:\\career-agent\\mcp-job-search\\server.py"]
},
"career-files": {
"command": "C:\\career-agent\\.venv\\Scripts\\python.exe",
"args": ["C:\\career-agent\\mcp-career-files\\server.py"]
}
}
}Caminhos absolutos. Se voce instalou o projeto em outro lugar, troque
C:\\career-agentpelo seu caminho real, em todas as ocorrencias. As barras invertidas precisam ser duplicadas — e JSON.
Por que o python do
.venve nao ouv? O Claude Desktop inicia os servidores sem carregar seu PATH de usuario. Apontar direto para o interpretador do ambiente virtual elimina a dependencia de PATH e torna a inicializacao mais rapida e previsivel. Ouvcontinua sendo a ferramenta de instalacao e de execucao dos testes.
Depois de salvar: feche o Claude Desktop completamente (inclusive o icone na bandeja do sistema, ao lado do relogio — fechar a janela nao encerra o processo) e abra de novo.
Para confirmar, pergunte no chat: "Quais ferramentas de career voce tem?"
6. Como iniciar
Os servidores sao iniciados pelo proprio Claude Desktop — voce nao precisa deixar nada rodando.
Para verificar manualmente que os tres sobem:
powershell -ExecutionPolicy Bypass -File .\scripts\start.ps1Logs: C:\career-agent\logs\ (mcp-career.log, mcp-job-search.log,
mcp-career-files.log).
7. Como testar
powershell -ExecutionPolicy Bypass -File .\scripts\test.ps1O script roda a suite pytest e, em seguida, uma validacao ponta a ponta: importacao dos modulos, inicializacao dos tres MCPs, leitura do perfil, calculo de score, registro de candidatura, consulta de historico e deteccao de duplicidade.
Apenas os testes unitarios:
C:\career-agent\.venv\Scripts\python.exe -m pytest tests -v8. Como adicionar uma nova fonte de vagas
Antes de tudo: verifique se a fonte tem API publica documentada. Se exigir
login, cookie ou scraping, ela nao entra — use UnavailableJobSource e o modo
manual.
Crie a classe em
src/career_core/job_sources/:
from .base import IJobSource, JobQuery, SourceResult, detect_seniority
class MinhaFonteJobSource(IJobSource):
name = "minhafonte"
provenance = "API JSON publica de X, sem autenticacao."
usable = True
def search(self, query: JobQuery) -> SourceResult:
# ... chamar a API e converter cada item em `Job`
return SourceResult(source=self.name, jobs=jobs, ok=True, message="...")Registre em
src/career_core/job_sources/registry.py:
_FACTORIES = {
...,
"minhafonte": (lambda s: MinhaFonteJobSource(...), True), # True = precisa de rede
}Ative no
.env:JOB_SEARCH_SOURCES=mock,minhafonteAdicione um teste em
tests/test_job_sources.py.
Nenhum outro arquivo do sistema muda. Score, deduplicacao e candidatura
funcionam automaticamente porque a fonte devolve Job normalizado.
9. Como adicionar um novo curriculo
Coloque um .md em C:\career-agent\data\resumes\. O nome do arquivo importa:
o agente escolhe automaticamente o curriculo cujo nome tem mais palavras em
comum com a vaga.
data/resumes/
├── curriculo-principal.md # padrao / fallback
├── curriculo-backend-dotnet.md # vence em vagas .NET/backend
├── curriculo-fullstack.md # vence em vagas fullstack/React
└── curriculo-sap.md # vence em vagas SAPPara forcar um especifico: "Prepare a candidatura usando curriculo-sap.md".
10. Como registrar uma candidatura
Ciclo de vida:
generate_application register_application
(mostra o pacote) --> (grava o historico)
|
v
pending_approval
|
voce aprova |
v
approved
|
VOCE se candidata no site
v
applied
|
+-------------+-----------+-----------+
v v v v
interview technical_test offer rejectedrejected e withdrawn sao estados finais.
Nao existe caminho de pending_approval direto para applied. A tentativa
e recusada pela maquina de estados. Essa e a garantia, em codigo, de que nada
avanca sem voce ter visto.
11. Exemplos de comandos no Claude Desktop
Buscar
Procure vagas Backend .NET compativeis com meu perfil.
Priorize remoto e hibrido em Goiania.
Mostre somente vagas com score >= 80.Analisar uma vaga colada
Analise esta vaga:
[cole aqui a URL e a descricao completa]Preparar candidatura
Prepare minha candidatura para a vaga da Nexatech.Acompanhar
Mostre minhas candidaturas pendentes.
Quais candidaturas estao aguardando minha aprovacao?
Atualize a candidatura app-xxxx para entrevista.Aprovar
Aprovo a candidatura app-xxxx.Diagnostico
Esta tudo configurado no Career Agent?
De onde vem as vagas que voce busca?
Voce consegue se candidatar por mim no LinkedIn?12. Limitacoes atuais
LinkedIn, Indeed e Gupy funcionam em modo manual. Nenhum deles oferece API publica de busca para candidatos. Voce copia a vaga; o agente faz o resto. Isso e uma escolha de seguranca, nao uma pendencia.
A cobertura automatica depende de quais empresas voce configura. A fonte
atsvarre os quadros publicos das empresas emJOB_SEARCH_ATS_COMPANIES. A lista padrao tem 10 empresas verificadas (~1.160 vagas), mas o mercado brasileiro tem muito mais — adicione as empresas que te interessam.Nem todo ATS e coberto. Greenhouse, Lever e Ashby tem endpoint publico. Gupy, Solides e Kenoby nao expoem busca publica para candidatos.
Remotive e Arbeitnow servem para pouca coisa (medido em agosto/2026): a Remotive devolve um feed de amostra de 14 vagas que ignora o parametro
search; o Arbeitnow tem 175 vagas quase todas europeias e presenciais, zero com .NET/C#. Ficam disponiveis, mas fora do padrao.LinkedIn, Indeed e Gupy continuam em modo manual — nao tem API publica de busca para candidatos, e este projeto nao automatiza login nem scraping.
A extracao de requisitos e heuristica. Funciona bem com descricoes em bullets; com texto corrido, os requisitos saem menos estruturados.
A deteccao de senioridade e por palavra-chave no titulo e na descricao. Titulos ambiguos podem sair como
nao_informado— informe manualmente quando importar.Salario so e comparado quando a vaga divulga a faixa. A maioria das vagas brasileiras nao divulga; nesse caso a dimensao fica neutra.
O curriculo personalizado sai em Markdown. Nao ha exportacao para PDF ou DOCX na V1.
Instalacao mono-usuario, local. Sem multi-perfil, sem sincronizacao.
13. Proximos passos
Ordenados por relacao valor/esforco:
Exportar curriculo para PDF/DOCX — hoje o material sai em Markdown e voce converte a mao.
Ler descricao de vaga a partir de uma URL publica (paginas de carreira abertas, sem login), reduzindo o copiar-e-colar.
Fontes brasileiras — mapear ATSs que expoem endpoint publico de vagas por empresa e implementar como
IJobSource.Lembretes de follow-up — sinalizar candidaturas paradas em
appliedha mais de N dias.Metricas do funil — taxa de resposta por score, por stack e por modalidade, para calibrar os pesos com dados reais.
Calibracao dos pesos — hoje sao os pesos definidos na especificacao; com historico suficiente, ajustar com base no que realmente converte.
Deteccao de duplicidade semantica — hoje e por similaridade textual; embeddings pegariam "Dev Backend .NET" vs "Engenheiro de Software C#".
Seguranca
Resumo do que este projeto nao faz, por design:
Nao faz | Por que |
Login automatico no LinkedIn | viola os ToS; risco de bloqueio da conta |
Guardar senha/cookie/token | superficie de ataque desnecessaria |
Automatizar cliques | viola os ToS |
Enviar candidatura sozinho | a decisao final e sua |
Enviar mensagem sozinho | a decisao final e sua |
Burlar anti-bot / CAPTCHA | ilegitimo |
Scraping agressivo | ilegitimo e desrespeitoso |
Inventar experiencia | mentira em curriculo prejudica voce |
Detalhes em docs/SECURITY.md.
O acesso a arquivos do Claude fica restrito a C:\career-agent\data. Ele nao
enxerga C:\, nem sua pasta de usuario, nem o codigo do proprio projeto.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseNot gradedqualityFmaintenanceEnables users to search for jobs, prefill applications using AI, and automate submissions across major platforms like Lever and Ashby directly from Claude or Cursor. It provides a full suite of tools for managing job queues, profile data, and resumes within a chat interface.34MIT
- AlicenseAqualityBmaintenanceA personal job-search assistant for Claude Desktop that searches real job boards, scores each job 0–100 for fit, and displays a ranked board for fast triage.10791MIT
- FlicenseNot gradedqualityCmaintenanceEnables running a job search with Claude Code: parses CV, discovers roles, fetches exact application fields, drafts non-trivial applications (positioning, not autofill), and renders an offline dashboard for review.
- AlicenseNot gradedqualityCmaintenanceEnables searching and evaluating job postings from LinkedIn and freehire.me directly through Claude Desktop. Provides tools to search jobs, fetch full posting details, and assess candidate fit using eligibility scans and a scoring rubric.MIT
Related MCP Connectors
AI job search MCP — fact-checked jobs, application tracker, alerts. ChatGPT, Claude, Cursor.
Search AI-native jobs, inspect application forms, and fetch free interview-prep resources.
AI job search for Claude, ChatGPT, Cursor. 170K+ jobs, 3,800+ companies. OAuth or stdio.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/maraMoreir/career-agent'
If you have feedback or need assistance with the MCP directory API, please join our Discord server