cv-job-assistant
Enables Claude to parse CVs, search job boards (Remotive, Arbeitnow, Adzuna, Greenhouse/Lever), tailor resumes and cover letters, and prepare application packages with direct apply links—without ever auto-submitting. It runs 100% locally and free, storing jobs and applications as JSON files.
README
CV & Job Application MCP Server
A local MCP server that lets Claude search jobs, pull job descriptions, and help you tailor your CV — with you always doing the final "submit" click.
100% free to run. No paid API keys required. No hosting cost (runs on your own machine). No separate LLM billing (Claude does the reasoning; this server only fetches/stores data).
What it does
- Parses your CV (PDF/DOCX/TXT/MD) into text Claude can read.
- Searches free job APIs: Remotive and Arbeitnow (no signup needed), plus Adzuna (free tier, optional signup) and any company's Greenhouse/Lever job board.
- Stores jobs, tailored CVs, and application status locally as JSON files in
./data/. - Assembles a ready-to-review application package with the real apply link — it never submits anything for you.
1. Install
cd cv-job-mcp
python3 -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt
2. (Optional) Set up Adzuna
Remotive and Arbeitnow work immediately with zero configuration. If you also want Adzuna:
- Sign up free at https://developer.adzuna.com/ (free tier: 250 calls/month).
- Copy
.env.exampleto.envand fill inADZUNA_APP_IDandADZUNA_APP_KEY. - Set
ADZUNA_COUNTRYto your target country code (gb, us, in, etc).
If you skip this, search_jobs still works fine — it just quietly skips Adzuna.
3. Connect it to Claude Desktop
Open (or create) your Claude Desktop MCP config file:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
Add this server:
{
"mcpServers": {
"cv-job-assistant": {
"command": "/absolute/path/to/cv-job-mcp/venv/bin/python",
"args": ["/absolute/path/to/cv-job-mcp/server.py"]
}
}
}
Restart Claude Desktop. You should see the tools appear when you start a new chat.
4. Typical usage in Claude
"Upload my CV from ~/Documents/resume.pdf"
"Search for backend engineer jobs, remote"
"Analyze job [job_id] against my CV and give me a fit score"
"Tailor my CV for job [job_id] and write a cover letter"
"Prepare the application package for job [job_id]"
Claude will do the parsing/analysis/tailoring reasoning itself (using the tools
for data), then call save_tailored_application and prepare_application to
package everything. You get a package with the direct apply URL — you open it
and click submit yourself.
Available tools
| Tool | What it does |
|---|---|
upload_cv |
Extract text from a CV file, store it, return a cv_id |
list_cvs |
List stored CVs |
search_jobs |
Search Remotive + Arbeitnow + Adzuna by keyword |
search_company_jobs |
List jobs at one company via Greenhouse/Lever |
get_job |
Get full details of a saved job |
list_saved_jobs |
List all jobs saved from past searches |
save_tailored_application |
Save Claude-generated tailored CV + cover letter |
prepare_application |
Assemble final review package with apply URL |
update_application_status |
Track status (Submitted, Interview, Offer, etc.) |
list_applications |
See all tracked applications |
Notes on cost & compliance
- No paid services used. Adzuna's free tier (250 calls/month) is the only optional signup, and everything works without it.
- LinkedIn is intentionally excluded — LinkedIn's job data API requires a paid partner agreement (~$900+/month), and scraping violates its Terms of Service. If you find a LinkedIn job manually, you can still ask Claude to analyze/tailor for it — just paste the job description in chat.
- Nothing auto-submits.
prepare_applicationonly assembles a package and returns the real apply URL. You always do the final click.
Automatic overnight search (no Claude, no LLM cost)
daily_job_check.py is a standalone script — it doesn't use Claude or any
MCP tooling. It just calls the same free job-source modules directly, saves
results to the shared ./data/ storage (so Claude can look them up later in
chat), and logs anything new since the last run to ./logs/.
1. Configure your search terms
In your .env file, set:
SEARCH_QUERIES=backend developer,python engineer
SEARCH_LOCATION=
SEARCH_LIMIT_PER_SOURCE=15
SEARCH_QUERIES is comma-separated — add as many terms as you want checked
each run.
2. Test it manually first
cd /path/to/cv-job-mcp
./venv/bin/python daily_job_check.py
You should see a summary printed, and a new file appear under ./logs/
(e.g. logs/2026-08-08.log). Run it a second time immediately — it should
report 0 new jobs, since it remembers what it's already seen
(data/seen_job_ids.json).
3. Schedule it with cron
Open your crontab:
crontab -e
Add a line to run it every night at 2 AM (adjust the path and time as needed):
0 2 * * * /home/jahid/Downloads/cv-job-mcp/venv/bin/python /home/jahid/Downloads/cv-job-mcp/daily_job_check.py >> /home/jahid/Downloads/cv-job-mcp/logs/cron.log 2>&1
Save and exit. Cron will now run the search every night, log new postings to
./logs/, and (if your desktop is on and notify-send is available) pop up
a desktop notification when new jobs are found.
4. Review results the next day
Either:
- Open the day's log file directly:
cat logs/2026-08-08.log, or - Open Claude Desktop and ask: "List all jobs saved so far" or "Show me the newest saved jobs and check them against my CV" — since the script saves everything to the same storage the MCP server reads from, Claude can pick up right where the overnight run left off.
This path costs nothing extra — no LLM calls happen until you actually open a chat and ask Claude to look at the results.
Extending it
- Add more free sources (e.g. RemoteOK, USAJobs, other companies' Greenhouse/Lever
boards) by adding a new file under
job_sources/following the same pattern asremotive.py. - A2A (agent-to-agent) support was intentionally left out of this version per the SRS — add it later only if you split this into multiple independent agents.
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.