MCP server that searches Berlin job listings across Arbeitnow, Stepstone, LinkedIn, Indeed, and Glassdoor; filters for English-friendly roles; and builds assisted-apply packets — cover letters, outreach emails, and LinkedIn referrer messages.
Project description
mcp-job-search
An MCP server that searches Berlin job listings across Arbeitnow, Stepstone, LinkedIn, Indeed, and Glassdoor, filters for English-friendly roles, and builds assisted-apply packets — cover letter, outreach email, LinkedIn referrer message, and apply URL — for each role.
It does not auto-submit applications. You stay the human pressing send.
Install
The fastest path uses uv (one command, no virtualenv juggling):
curl -LsSf https://astral.sh/uv/install.sh | sh # if you don't have uv
Then add this block to your Claude Desktop config:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"job-search": {
"command": "uvx",
"args": ["--from", "mcp-job-search", "mcp-job-search"]
}
}
}
Restart Claude Desktop. uvx downloads and caches the package on first call.
Tools
| Tool | What it does |
|---|---|
search_jobs |
Search Arbeitnow + Stepstone + JobSpy (LinkedIn/Indeed/Glassdoor). Honors a min_results floor — tops up with German listings if the English filter starves it. |
get_job_details |
Pull the full description for a single job. |
filter_english_jobs |
Keep only listings whose description is English-friendly. |
build_application_packet |
Per-job: cover letter, outreach email (if a contact email was found), LinkedIn referrer message, and a search URL to find a referrer. |
list_referral_targets |
For jobs without contact emails, return ready-to-paste LinkedIn DMs and a search URL for each. |
set_resume |
Point the server at a resume (PDF, DOCX, TXT) for the rest of the session. |
set_candidate |
Capture name/email/phone/LinkedIn/pitch at runtime so cover letters render properly. |
Slash-command prompts
| Prompt | What it does |
|---|---|
/start_job_search |
Guided intake: CV → email → job category (Warehouse / Mini-job / DevOps / Professional) → location, then searches and triages. |
/rewrite_cv_bullets |
Generates up to 10 tailored CV bullet points blending your real experience with a specific job description. No fabricated metrics, no JD keyword stuffing. |
How to use it
The fastest path is the slash command:
/start_job_search
Claude walks you through CV path, email, category, and location, then searches and surfaces the top 5 results grouped by company. You pick which to expand into an application packet.
Or just talk in plain English:
"Find me senior Python backend roles in Berlin, English-only."
"Build an application packet for job arbeitnow:backend-engineer-acme."
"Rewrite my CV bullets for the role at N26."
Configuration
The server reads ~/.config/mcp-job-search/config.yaml if present, else the bundled defaults (Berlin, English-only). For per-session overrides — your resume, your email, your name — use the set_resume and set_candidate tools (Claude calls them automatically during the guided flow).
If you want defaults to persist across sessions, drop a config file at the path above:
location: "Berlin"
english_only: true
resume_path: "/Users/you/Documents/resume.pdf"
candidate:
name: "Your Name"
email: "you@example.com"
linkedin_url: "https://linkedin.com/in/yourhandle"
pitch: "Backend engineer with 5+ years building Python services"
Limits + honest caveats
- Arbeitnow: free public API, no key. Coverage skews toward Berlin/EU tech and remote roles. The API has no server-side search, so the client paginates a few pages and filters locally.
- Stepstone: HTML scrape. Brittle when they redesign — open an issue if results start returning empty.
- JobSpy (LinkedIn / Indeed / Glassdoor): also scrape-based, via the
python-jobspypackage. LinkedIn rate-limits aggressively and Glassdoor's location parser sometimes errors on German city strings — Indeed is the most reliable of the three. - English filter: heuristic. A few German-language postings that mention "Englisch" will slip through, and a few English-friendly ones with mostly German boilerplate will get cut. The
min_resultstop-up will fill the gap with German jobs (taggedlanguage='de') so you always get a list. - Cover letters / referral messages: deterministic templates. Claude refines per job — you copy out.
Dev install (contributing)
git clone https://github.com/heykay/mcp-job-search
cd mcp-job-search
uv sync
uv run pytest
Local Claude Desktop entry pointing at your clone:
"job-search": {
"command": "uv",
"args": ["--directory", "/absolute/path/to/mcp-job-search", "run", "mcp-job-search"]
}
License
MIT — see LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mcp_job_search-0.1.0.tar.gz.
File metadata
- Download URL: mcp_job_search-0.1.0.tar.gz
- Upload date:
- Size: 24.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.15 {"installer":{"name":"uv","version":"0.11.15","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9bad41fe8e78b4f5b7f3d6c5d9f7f2af1c57244dee0b216993bff79db49d2fae
|
|
| MD5 |
42e216fe19fe5c219033c8477883e01a
|
|
| BLAKE2b-256 |
d6ed36c556685b3c671cac84fba44717b6985e5575009368c7837b0f17fc8370
|
File details
Details for the file mcp_job_search-0.1.0-py3-none-any.whl.
File metadata
- Download URL: mcp_job_search-0.1.0-py3-none-any.whl
- Upload date:
- Size: 30.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.15 {"installer":{"name":"uv","version":"0.11.15","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
305c37a4c7ef992b763d5aba96f5acd591c522949c64e73e710c822052d4e579
|
|
| MD5 |
c2481a0e230873fb99c280e72506b06e
|
|
| BLAKE2b-256 |
a4f12117e1753984c03be4c65d035299644bf0de9e7dfef3d5413a8dfacf4f29
|