Skip to main content
Glama
job-search-mcp

job-search-mcp

by Servation

job-search-mcp

Ein persönlicher Jobsuch-Assistent für Claude Desktop. Du bittest Claude, Jobs zu finden; es durchsucht die echten Jobbörsen, bewertet jeden Job mit 0–100 Punkten, wie gut er zu dir passt, und zeigt sie auf einem sortierten Board, das du mit einem Klick durchgehen kannst. Alles läuft lokal — keine API-Schlüssel, keine Konten erforderlich.

Es ist eine MCP-App: ein kleiner Server, mit dem Claude Desktop spricht, plus ein Inline-Board, das direkt im Chat gerendert wird.

Umfang: Es ist auf US-Softwareentwicklungsrollen abgestimmt (die eingebauten Quellen und Rollenfilter zielen auf US-Tech-Arbeitgeber). Andere Bereiche oder Regionen liefern spärliche Ergebnisse.

Funktioniert in: Gebaut und getestet für Claude Desktop. Es sollte auch in anderen MCP-Clients funktionieren, die sowohl einen lokalen (stdio) Server ausführen als auch MCP-App-Oberflächen rendern, wie z. B. VS Code (Copilot), Cursor oder Goose (ungtestet). Nur-remote-Clients (ChatGPT, Claude im Web/Mobil) können keinen lokalen Server starten, daher funktionieren sie nicht.

Das sortierte Job-Board in Claude Desktop – jeder Job mit 0–100 Punkten für Passung, mit Applied/Skip-Buttons


Was es tut

  • Durchsucht echte Jobbörsen — LinkedIn plus 8 ATS/Jobquellen (Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Hacker News, RemoteOK, Remotive), mit deinen Zielrollen und deinem Standort.

  • Bewertet jeden Job für dich — Claude liest die vollständige Beschreibung und gibt eine Passungsbewertung von 0–100 mit einer einzeiligen Begründung, unter Berücksichtigung deiner Fähigkeiten, Berufsjahre, Senioritäts-Passung und der Rolle.

  • Ermöglicht schnelles Durchgehen — Apply / Skip auf jeder Karte oder in großen Mengen („alles unter 60 verwerfen“).

  • Merkt sich Dinge — führt eine laufende Shortlist, einen Tracker für Bewerbungen und zeigt dir denselben Job nicht zweimal (für 6 Monate).


Related MCP server: Jobless MCP

Einrichtung

1. Erzähle Claude Desktop davon. Öffne deine Konfigurationsdatei:

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

Füge dies unter "mcpServers" hinzu — npx holt das veröffentlichte Paket für dich, kein Klonen oder Bauen erforderlich:

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

2. Beende Claude Desktop vollständig und starte es neu (unter Windows beende es über das System-Tray — das Schließen des Fensters reicht nicht). Das war's.

npm install
npm run build

Dann weise die Konfiguration stattdessen auf dist/main.js in diesem Ordner:

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

So verwendest du es

Sprich einfach mit Claude. Zum Beispiel:

  • „Profil speichern“ — füge zuerst deinen Lebenslauf ein; Claude extrahiert deine Fähigkeiten, Rollen, Jahre und deinen Standort, damit Suchen und Bewertungen auf dich zugeschnitten sind.

  • „Finde Backend-Engineer-Jobs in Kalifornien, Senior-Level, diese Woche gepostet.“

  • „Finde Jobs mit wenigen Bewerbern“ — fügt den LinkedIn-Filter für frühe Bewerber hinzu.

  • „Alles unter 60 verwerfen.“

  • „Zeig, worauf ich mich beworben habe.“

  • „Bewerte das Board neu.“

Ein typischer erster Durchlauf: Profil speichern → „Jobs finden“ → Claude bewertet sie und zeigt das sortierte Board → du wendest dich an oder überspringst.


Das Board

Das Board ist eine laufende Shortlist. Ein Job bleibt darauf, bis du Apply (verschiebt ihn in deinen Tracker) oder Skip (für immer ausgeblendet) wählst. Neue Suchen überspringen automatisch Jobs, die bereits auf dem Board, in deinem Tracker, verworfen oder in den letzten 6 Monaten angezeigt wurden — so siehst du nie dieselbe Auflistung zweimal hintereinander.

Klicke Applied oder Skip auf einer Karte oder bitte Claude darum. Im Widget durchgegangen, bleibt es erhalten.


Tools (zur Referenz)

Du rufst sie selten beim Namen auf — Claude wählt das richtige aus — aber hier ist, was unter der Haube steckt:

Tool

Was es tut

find_jobs

Durchsucht die Börsen nach deinen Rollen/Standort (mit optionalen Filtern: Seniorität, Typ, Aktualität, Remote, Gehalt, Bewerber, Quelle).

evaluate_jobs

Claude bewertet die gefundenen Jobs mit 0–100 für Passung (läuft automatisch nach einer Suche).

show_board

Zeigt das sortierte Board (oder deinen saved-Tracker).

set_status

Apply / Skip / einen einzelnen Job speichern (auch die Karten-Buttons).

bulk_status

Viele auf einmal nach Punktzahl oder Quelle durchgehen, z. B. alles unter 60 verwerfen.

whats_promising

Listet das aktuelle Board als Text auf (alle bewerteten Jobs + alles noch Unbewertete).

review_saved

Dein Tracker — Jobs, die du gespeichert oder auf die du dich beworben hast.

rescore_board

Bewertet jeden Job auf dem Board von Grund auf neu.

clear_jobs

Aufräumen: unbewertete Reste oder das gesamte Board löschen (berührt nie Applied/Dismissed).

save_profile

Speichert dein Lebenslaufprofil (steuert Suche + Bewertung).


Wo deine Daten leben

Eine JSON-Datei auf deinem Rechner — keine Cloud, nichts wird irgendwohin gesendet außer an die Jobbörsen, die du durchsuchst:

  • Installiert: ~/.job-search-mcp/jobs.json

  • Aus dem Quellcode ausgeführt: ./data/jobs.json

  • Überschreiben mit der Umgebungsvariable JOB_SEARCH_MCP_DATA.


Optional: LinkedIn Premium-Modus

Standardmäßig verwendet LinkedIn seine öffentlichen Gast-Endpunkte: kein Login und kein Konto-Login-Risiko, und du erhältst bereits vollständige Stellenbeschreibungen. Beachte, dass automatisierter Zugriff weiterhin von deiner eigenen IP aus läuft und gegen die Nutzungsvereinbarung von LinkedIn verstößt, selbst im Gastmodus, also verwende es nach eigenem Ermessen. Wenn du reichhaltigere/Premium-Daten möchtest, kannst du dein angemeldetes Konto verwenden, indem du einen env-Block zur Serverkonfiguration hinzufügst:

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

Hole beide Cookies aus einem angemeldeten linkedin.com-Tab → DevTools → Application → Cookies.

⚠️ Achtung: Dies verstößt gegen die Nutzungsbedingungen von LinkedIn und kann dazu führen, dass dein Konto markiert oder eingeschränkt wird. Die Cookies laufen außerdem etwa monatlich ab, und die internen Endpunkte von LinkedIn ändern sich ohne Vorankündigung. Wenn etwas fehlschlägt, fällt es automatisch in den Gastmodus zurück. Lasse den env-Block weg, um vollständig sicher zu bleiben (nur Gast).


So funktioniert die Bewertung

Claude (das Host-Modell) führt die Bewertung direkt durch — es liest jede Beschreibung und beurteilt die Passung, was gut kalibriert ist. Eine deterministische Formel (computeMatchScore in scoring.ts) wird als Fallback für alle bereitgehalten, die ein schwächeres lokales Modell verwenden, das dazu neigt, alles zu überbewerten; sie ist standardmäßig nicht aktiv.

Entwicklung

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

Der Server ist nur stdio (main.ts → server.ts); die UI ist eine React-App, die zu einer einzigen eingebetteten HTML-Datei gebündelt wird (src/mcp-app.tsx → dist/mcp-app.html), die der Server als ui://-Ressource bereitstellt.

Wenn du an der UI arbeitest, verwende harness/. Es ist ein lokaler Ersatz für Claude Desktop, der das Widget gegen einen synthetischen Job-Store und eine echte ui/*-Brücke rendert. Das Öffnen von dist/mcp-app.html in einem Browser-Tab bringt dir nur „Connecting…“, und die Dinge, die am wahrscheinlichsten kaputtgehen (Link-Öffnung, Theming, das Post-Mount-Refresh), sind alle host-vermittelt, sodass sie nur mit einem Host am anderen Ende auftauchen.

Wenn eine Jobquelle ausfällt, sagt dir npm run canary, welche. Firmen-Slugs verrotten oft, daher gehört die Lösung normalerweise in das entfernte Slug-Register, das updateCompanyDirectoriesFromRegistry() zur Laufzeit neu liest, und nicht in ein neues Release.

Available Tools

10 tools
bulk_statusBulk TriageA

Triage MANY board jobs at once by score and/or source — e.g. dismiss every scored job under 60. Applies status to all scanned (board) jobs matching the filters; the server selects them, so you do NOT need the individual job ids. below_score/above_score match SCORED jobs only (use clear_jobs for un-evaluated ones). Provide at least one filter. Returns text; call show_board afterward to display.

Inputs: status (required), notes, source, above_score, +1 more.

clear_jobsClear JobsA

Clear jobs from the review board. which='unscored' (default) removes only the not-yet-evaluated leftovers; which='all' clears the whole board. Saved/applied jobs (the tracker) and dismissed jobs are NOT affected — dismissed jobs still won't be re-sourced. Returns text; call show_board to display.

Inputs: which.

evaluate_jobsEvaluate JobsA

Score one or more sourced jobs for THIS candidate (holistic). YOU assign each job a 0-100 fit score directly, using the candidate summary (shown in find_jobs / whats_promising) and the job description. Weigh the must-have requirements, the candidate's actual skills and years of experience (a role demanding far more seniority/years than the candidate has should score LOWER), domain fit, and standout strengths. Calibrate and use the FULL range — do not bunch everything at 80+: 80-100 = strong fit and realistic; 60-79 = good with real gaps; 40-59 = partial/stretch (e.g. wrong level); below 40 = poor or wrong field. Pass { job_id, score, reason } per job. Use the EXACT bracketed ids; do not invent them. Score every job in one call. Returns text; call show_board afterward to display the ranked board.

Inputs: evaluations (required).

find_jobsFind JobsA

Source live jobs (LinkedIn + Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Hacker News, RemoteOK, Remotive), dedup them, and return them as text with full descriptions. Uses the saved profile's roles/location by default; pass query/location/filters to override. This returns UNSCORED jobs and does NOT show a card UI — immediately score all of them with evaluate_jobs (a 0-100 fit score + reason each), then show_board once, to present the single ranked board. Do not just list them back.

Inputs: limit, query, remote, sort_by, +9 more.

rescore_boardRe-score BoardA

Re-score the WHOLE board from scratch — every job, INCLUDING ones that already have a score. Use this when the user asks to 'rescore'/'re-evaluate' the board or after the scoring approach changed. Returns all board jobs with their ids + descriptions; call evaluate_jobs with a FRESH { job_id, score, reason } for EACH (do not skip already-scored ones), then call show_board. Set include_saved=true to also re-score the saved/applied tracker.

Inputs: include_saved.

review_savedReview Saved JobsA

List the tracker as text: jobs marked saved (interested) or applied, with their status, score, and notes. Use this to see what you're tracking or have applied to. To DISPLAY the tracker widget, call show_board with view='saved'.

Inputs: no named parameters.

save_profileSave Resume ProfileA

Extract the candidate's profile from their resume text (which the user pastes in chat) and save it. Pull: full name; core technical skills; suggested target roles; preferred/search location; total years of professional experience (integer); and pass the resume text as rawText. The profile is used by find_jobs (target roles + location) and by scoring (years of experience drives the experience penalty), so set yearsOfExperience accurately. Merges with any existing profile.

Inputs: name, skills, rawText, targetRoles, +4 more.

set_statusSet Job StatusA

Triage a job by id: 'saved' (interested/tracking), 'applied' (also stamps the date), 'dismissed' (skip), or 'discovered' (undo back to the board). Moves it between the scanned/saved/dismissed lists and persists. Optionally attach notes. Called by the review UI; also usable directly.

Inputs: job_id (required), status (required), notes. Returns: jobs, view, count, scored, +1 more

show_boardShow BoardA

Display the job board (or the saved/applied tracker) as an interactive widget. Call this ONCE, at the end of a request, after doing the work (find_jobs/evaluate_jobs/bulk_status/clear_jobs/whats_promising are text-only and do NOT render). view='board' (default) shows the ranked board; view='saved' shows the tracker.

Inputs: view. Returns: jobs, view, count, scored, +1 more

whats_promisingWhat's PromisingA

List the current job board as text: every scored job (with its id) and any UNSCORED jobs with their ids + descriptions so you can evaluate them. To score the unscored ones, call evaluate_jobs with the EXACT bracketed ids shown. Use this to review jobs already found (find_jobs only returns brand-new ones). To re-score jobs that ALREADY have a score, use rescore_board instead. To DISPLAY the board widget to the user, call show_board (this returns text for you to act on).

Inputs: limit.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 10 tool updatesv0.1.1
    • First observedbulk_status
    • First observedclear_jobs
    • First observedevaluate_jobs
    • First observedfind_jobs
    • First observedrescore_board
    • First observedreview_saved
    • First observedsave_profile
    • First observedset_status
    • First observedshow_board
    • First observedwhats_promising

TDQS

A4.5/5.0

Scored across 10 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: bulk_status for bulk triage, clear_jobs for clearing, evaluate_jobs for scoring single jobs, find_jobs for sourcing, rescore_board for re-evaluating all, review_saved for tracker text, save_profile for profile, set_status for individual triage, show_board for display, and whats_promising for listing. No overlap.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern in snake_case (e.g., bulk_status, evaluate_jobs, save_profile). The only minor deviation is 'whats_promising' using a contraction, but it still follows the pattern and is easily readable.

Tool Count5/5

10 tools is well within the ideal 3-15 range for a focused job search server. Each tool addresses a necessary function without bloat, and the count feels natural for the domain.

Completeness4/5

The tool set covers the core workflow: sourcing (find_jobs), scoring (evaluate_jobs, rescore_board), triaging (bulk_status, set_status, clear_jobs), tracking (review_saved), display (show_board), and profile management (save_profile). Minor gaps like no explicit profile update tool exist, but save_profile merges, so it's almost complete.

Maintenance

ActivityInactive
ResponsivenessNo recent community issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables job search and scraping across multiple job boards (LinkedIn, Indeed, Glassdoor, etc.) with advanced filtering, directly from Claude Desktop or other MCP clients.
    6
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Personalized job search inside Claude. Get ranked job matches based on your actual skills, not keywords.
    2
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Transforms Claude into an AI job-hunting assistant that searches remote job boards, scores roles against your CV, generates tailored cover letters, and logs everything to a Notion tracker.
    11
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables 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