job-search-mcp

Asistente de búsqueda de empleo para Claude Desktop: busca en LinkedIn y 8 plata

Documentación

job-search-mcp

Un asistente personal de búsqueda de empleo para Claude Desktop. Le pides a Claude que encuentre empleos; busca en los portales de empleo reales, califica cada uno de 0 a 100 según qué tan bien se ajusta a ti, y los muestra en un tablero clasificado que puedes priorizar con un clic. Todo se ejecuta localmente: sin claves API, sin cuentas requeridas.

Es una aplicación MCP: un pequeño servidor con el que Claude Desktop se comunica, más un tablero integrado que se renderiza directamente en el chat.

Alcance: está ajustado para roles de ingeniería de software en EE. UU. (las fuentes integradas y los filtros de rol apuntan a empleadores tecnológicos de EE. UU.). Otros campos o regiones devolverán resultados escasos.

Funciona en: construido y probado para Claude Desktop. También debería funcionar en otros clientes MCP que ejecuten un servidor local (stdio) y rendericen interfaces de aplicaciones MCP, como VS Code (Copilot), Cursor o Goose (sin probar). Los clientes solo remotos (ChatGPT, Claude en web/móvil) no pueden iniciar un servidor local, por lo que no funcionarán.

The ranked job board inside Claude Desktop — each job scored 0–100 for fit, with Applied/Skip buttons


Qué hace

  • Busca en portales de empleo reales — LinkedIn más 8 fuentes de ATS/empleo (Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Hacker News, RemoteOK, Remotive), usando tus roles y ubicación objetivo.
  • Califica cada empleo para ti — Claude lee la descripción completa y le da una puntuación de ajuste de 0 a 100 con una razón de una línea, ponderando tus habilidades, años de experiencia, ajuste de nivel y el rol.
  • Te permite priorizar rápido — Aplicar / Omitir en cada tarjeta, o en masa ("descartar todo lo menor a 60").
  • Recuerda — mantiene una lista corta continua, un rastreador de lo que has solicitado, y no te mostrará el mismo empleo dos veces (durante 6 meses).

Configuración

1. Informa a Claude Desktop sobre ello. Abre tu archivo de configuración:

  • Windows: %APPDATA%\Claude\claude_desktop_config.json
  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

Agrega esto bajo "mcpServers" — npx obtiene el paquete publicado por ti, sin necesidad de clonar ni compilar:

{
  "mcpServers": {
    "job-search": {
      "command": "npx",
      "args": ["-y", "@servation/job-search-mcp"]
    }
  }
}

2. Cierra y vuelve a abrir completamente Claude Desktop (en Windows, ciérralo desde la bandeja del sistema — cerrar la ventana no es suficiente). Eso es todo.

Ejecutar desde el código fuente en su lugar
npm install
npm run build

Luego apunta la configuración al dist/main.js de esta carpeta en su lugar:

{
  "mcpServers": {
    "job-search": {
      "command": "node",
      "args": ["D:\\job-search-mcp\\dist\\main.js"]
    }
  }
}

Cómo usarlo

Solo habla con Claude. Por ejemplo:

  • "Guarda mi perfil" — pega tu currículum primero; Claude extrae tus habilidades, roles, años y ubicación para que las búsquedas y la calificación se adapten a ti.
  • "Encuentra empleos de ingeniero backend en California, nivel senior, publicados esta semana."
  • "Encuentra empleos con pocos solicitantes" — agrega el filtro de solicitantes tempranos de LinkedIn.
  • "Descarta todo lo menor a 60."
  • "Muestra a lo que he aplicado."
  • "Vuelve a calificar el tablero."

Un primer uso típico: guarda tu perfil → "encuentra empleos" → Claude los califica y muestra el tablero clasificado → tú aplicas/omites.


El tablero

El tablero es una lista corta continua. Un empleo permanece en él hasta que Aplicas (se mueve a tu rastreador) o Omites (oculto para siempre). Las nuevas búsquedas omiten automáticamente los empleos ya en el tablero, en tu rastreador, descartados o mostrados en los últimos 6 meses — para que nunca veas la misma oferta dos veces seguidas.

Haz clic en Aplicado u Omitir en una tarjeta, o pídele a Claude que lo haga. Una vez priorizado en el widget, se mantiene.


Herramientas (para referencia)

Rara vez las llamas por su nombre — Claude elige la correcta — pero esto es lo que hay bajo el capó:

HerramientaQué hace
find_jobsBusca en los portales tus roles/ubicación (con filtros opcionales: nivel, tipo, actualidad, remoto, salario, solicitantes, fuente).
evaluate_jobsClaude califica los empleos encontrados de 0 a 100 según ajuste (se ejecuta automáticamente después de una búsqueda).
show_boardMuestra el tablero clasificado (o tu rastreador saved).
set_statusAplicar / Omitir / guardar un solo empleo (también los botones de la tarjeta).
bulk_statusPrioriza muchos a la vez por puntuación o fuente, p. ej., descarta todo lo menor a 60.
whats_promisingLista el tablero actual como texto (todos los empleos calificados + cualquier cosa sin calificar).
review_savedTu rastreador — empleos que has guardado o solicitado.
rescore_boardVuelve a calificar cada empleo en el tablero desde cero.
clear_jobsOrdena: limpia sobrantes sin calificar o todo el tablero (nunca toca aplicados/omitidos).
save_profileGuarda tu perfil de currículum (impulsa búsqueda + calificación).

Dónde viven tus datos

Un archivo JSON en tu máquina — sin nube, nada se envía a ningún lugar excepto a los portales de empleo que buscas:

  • Instalado: ~/.job-search-mcp/jobs.json
  • Ejecutando desde el código fuente: ./data/jobs.json
  • Anula con la variable de entorno JOB_SEARCH_MCP_DATA.

Opcional: Modo Premium de LinkedIn

Por defecto, LinkedIn usa sus endpoints públicos de invitado: sin inicio de sesión y sin riesgo de cuenta, y ya obtienes descripciones completas de empleo. Ten en cuenta que el acceso automatizado aún se ejecuta desde tu propia IP y va en contra del Acuerdo de Usuario de LinkedIn incluso en modo invitado, así que úsalo a tu discreción. Si quieres datos más ricos/Premium, puedes usar tu cuenta con sesión iniciada agregando un bloque env a la configuración del servidor:

"job-search": {
  "command": "npx",
  "args": ["-y", "@servation/job-search-mcp"],
  "env": {
    "LINKEDIN_LI_AT": "<your li_at cookie>",
    "LINKEDIN_JSESSIONID": "ajax:1234567890123456789"
  }
}

Obtén ambas cookies desde una pestaña de linkedin.com con sesión iniciada → DevTools → Application → Cookies.

⚠️ Aviso: esto va en contra de los Términos de Servicio de LinkedIn y puede hacer que tu cuenta sea marcada o restringida. Las cookies también expiran aproximadamente cada mes y los endpoints internos de LinkedIn cambian sin aviso. Si algo falla, vuelve al modo invitado automáticamente. Deja el bloque env fuera para mantenerte completamente seguro (solo invitado).


Cómo funciona la calificación

Claude (el modelo anfitrión) hace la calificación directamente — lee cada descripción y juzga el ajuste, lo cual está bien calibrado. Una fórmula determinista (computeMatchScore en scoring.ts) se mantiene como respaldo para cualquiera que ejecute un modelo local más débil que tiende a sobrecalificar todo; no está activa por defecto.

Desarrollo

npm run typecheck    # type-check UI + server + harness
npm run build        # build the UI bundle (vite single-file) + compile the server (tsc)
npm run serve:stdio  # run the server from source (tsx) for local testing
npm run harness      # work on the review UI without Claude Desktop (see harness/)
npm run canary       # check every job source is still returning postings

El servidor es solo stdio (main.ts → server.ts); la interfaz es una aplicación React empaquetada en un único archivo HTML en línea (src/mcp-app.tsx → dist/mcp-app.html) que el servidor sirve como un recurso ui://.

Trabajando en la interfaz, usa harness/. Es un sustituto local de Claude Desktop que renderiza el widget contra un almacén de empleos sintético y un puente real de ui/*. Abrir dist/mcp-app.html en una pestaña del navegador solo te da "Conectando…", y las cosas que más probablemente se rompan (apertura de enlaces, temas, la actualización posterior al montaje) están todas mediadas por el anfitrión, por lo que solo aparecen con un anfitrión al otro lado.

Si una fuente de empleo se apaga, npm run canary te dice cuál. Los slugs de empresas se pudren a menudo, por lo que la solución generalmente pertenece al registro remoto de slugs que updateCompanyDirectoriesFromRegistry() vuelve a leer en tiempo de ejecución, en lugar de en una nueva versión.