job-search-mcp
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.

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.jsonmacOS:
~/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 buildDann 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 |
| Durchsucht die Börsen nach deinen Rollen/Standort (mit optionalen Filtern: Seniorität, Typ, Aktualität, Remote, Gehalt, Bewerber, Quelle). |
| Claude bewertet die gefundenen Jobs mit 0–100 für Passung (läuft automatisch nach einer Suche). |
| Zeigt das sortierte Board (oder deinen |
| Apply / Skip / einen einzelnen Job speichern (auch die Karten-Buttons). |
| Viele auf einmal nach Punktzahl oder Quelle durchgehen, z. B. alles unter 60 verwerfen. |
| Listet das aktuelle Board als Text auf (alle bewerteten Jobs + alles noch Unbewertete). |
| Dein Tracker — Jobs, die du gespeichert oder auf die du dich beworben hast. |
| Bewertet jeden Job auf dem Board von Grund auf neu. |
| Aufräumen: unbewertete Reste oder das gesamte Board löschen (berührt nie Applied/Dismissed). |
| 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.jsonAus 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 postingsDer 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 toolsbulk_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.
10 tool updates
v0.1.1- First observed
bulk_status - First observed
clear_jobs - First observed
evaluate_jobs - First observed
find_jobs - First observed
rescore_board - First observed
review_saved - First observed
save_profile - First observed
set_status - First observed
show_board - First observed
whats_promising
TDQS
Scored across 10 tools
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.
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.
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.
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
Related MCP Connectors
AI job matching in your assistant: ranked offers, tailored resumes, application tracking.
Tailor resumes, score ATS fit, find hiring leads, and send cold outreach, from your agent.
Job search for your AI: save jobs, research companies, keep stories, track applications.
Your personal career coach. Scanning jobs for you, daily.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables job search and scraping across multiple job boards (LinkedIn, Indeed, Glassdoor, etc.) with advanced filtering, directly from Claude Desktop or other MCP clients.6MIT
- AlicenseNot gradedqualityBmaintenancePersonalized job search inside Claude. Get ranked job matches based on your actual skills, not keywords.2MIT
- AlicenseAqualityDmaintenanceTransforms 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.11MIT
- AlicenseNot gradedqualityDmaintenanceEnables 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