tarunlnmiit/autopilot-jobhunt
š š š šŖ š§ - AI job-hunting agent that scans 130+ company careers pages nightly, scores every role 0ā100 against your resume with an LLM, sends top matches to Telegram, and drafts tailored cover letters + resume bullets on command. Pluggable free LLM backends (OpenRouter free tier, Claude Code CLI, or Anthropic API). Exposes scanjobs, draftapplication, and exportjobs. Runs locally; does not auto-submit applications.
Quick Install
{
"mcpServers": {
"tarunlnmiit-autopilot-jobhunt": {
"command": "npx",
"args": [
"-y",
"tarunlnmiit-autopilot-jobhunt"
]
}
}
}Using an AI coding agent (Claude Code, Cursor, etc.)? Copy a ready-made prompt that tells it to fetch the setup instructions and install this server for you.
Documentation Overview
autopilot-jobhunt
Your AI job agent. Finds, scores, and drafts applications ā while you sleep.
Scans 130+ company careers pages nightly ā scores every role against your resume with an LLM ā sends you the top matches on Telegram ā drafts a tailored resume + cover letter on demand.
š Drafts only ā never applies. You review every draft and submit applications yourself. See PRIVACY.md for exactly what data leaves your machine.
Published on PyPI and listed on the Official MCP Registry (io.github.tarunlnmiit/autopilot-jobhunt), Glama (Quality A), and Smithery (MCPB bundle).
š Full setup guide with Claude Code MCP integration ā SETUP.md
ā Star this repo if it helps you land a job
This tool is free, open source, and runs entirely on your machine ā no subscription, no credit card. The only "payment" I ask: if it surfaces a role you apply to (or land), drop a star. It takes one click, costs you nothing, and it's the single thing that pushes the project in front of the next person grinding through 130 careers pages by hand. ā Star it here ā
How it works
flowchart LR
A["š 130+ Careers Pages"] -->|TinyFish API| B["Job Discovery"]
B --> C["LLM Batch Scorer\n(0ā100 fit score)"]
C -->|score ā„ min| D["š± Telegram Alert\nTop N matches"]
C -->|on demand| E["āļø Cover Letter\n+ Resume Bullets"]
C --> F["š CSV Export"]
The scoring prompt uses your actual resume ā not keywords. The LLM reads your full work history and the job description, then explains in one sentence why you fit or don't. No more guessing.
What a scan result looks like
Scanning Mistral AI...
3 new job URLs. Fetching details...
Scoring jobs...
Saved 2 jobs from Mistral AI
Scanning HuggingFace...
5 new job URLs. Fetching details...
Scoring jobs...
Saved 3 jobs from HuggingFace
Scanning Stripe...
No new jobs found
...
Scan complete.
Top 5 sent to Telegram.
What the Telegram notification looks like
Job Hunt ā 06 Jun 2026
5 matches found
#1 | Mistral AI | Applied AI Engineer, ML Infrastructure
š Paris/London/Marseille, On-site
š§ Python, LLMs, RAG, AWS, MLOps, DevOps
ā
Role combines applied AI + ML infrastructure in EU, aligns with MLOps/RAG expertise and relocation goal
Score: 85/100 ā https://jobs.lever.co/mistral/...
#2 | HuggingFace | Staff ML Engineer
š Remote (EU)
š§ Python, PyTorch, Transformers, CUDA, MLOps
ā
Open-source ML role matches deep learning and distributed training background
Score: 80/100 ā https://apply.workable.com/huggingface/...
...
Reply "apply to #N" to draft a tailored application.
What it does
Every night at 2:30 AM:
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā Scans careers pages ā Scores with LLM ā Notifies ā
ā (130+ cos) (0ā100 fit) (Telegram) ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
On demand:
autopilot draft 1 ā tailored resume + cover letter in 60s
Usage modes
Mode 1: Standalone CLI (no Claude Code required)
pip install autopilot-jobhunt
autopilot scan / autopilot draft 1 / autopilot export
Mode 2: Claude Code MCP (control via natural language)
pip install 'autopilot-jobhunt[mcp]'
claude mcp add autopilot-jobhunt ...
ā "Scan for ML jobs" / "Draft application for job #2"
Both modes use the same config and produce the same output.
Quick start
Option A ā pip install
pip install autopilot-jobhunt # or: pip install 'autopilot-jobhunt[mcp]' for Claude Code
mkdir my-job-hunt && cd my-job-hunt
autopilot init # creates config.json, companies.json, resume/, .env
# Fill in config.json (API keys + your profile) and resume/YOUR_RESUME.md, then:
autopilot scan
Option B ā clone (recommended if you want to customize companies or contribute)
git clone https://github.com/tarunlnmiit/autopilot-jobhunt.git
cd autopilot-jobhunt
pip install -e '.' # standalone CLI
# pip install -e '.[mcp]' # + Claude Code MCP integration
cp config.example.json config.json && cp .env.example .env
# Fill in your API keys and candidate profile, then:
autopilot scan
For the full walkthrough ā API key setup, Claude Code MCP registration, rate limit details, and troubleshooting ā see SETUP.md.
š Documentation
Step-by-step guides live in docs/:
| Guide | Covers |
|---|---|
| Install | pip / from source / autopilot init scaffolding |
| LLM providers | OpenRouter fallback chain, Claude CLI (keyless), Anthropic API |
| API keys | TinyFish + OpenRouter keys, where each goes |
| Companies & scanning | companies.json, discovery + scoring, scan pacing |
| Integrations | Telegram notifications |
| MCP server & Skill | Drive the hunt from Claude Code |
| Config & scoring | Candidate profile, min_score, top_n |
| Troubleshooting | Every error we've hit, and the fix |
| Testing checklist | Reproducible independent verification |
API keys needed
| Service | Cost | Required | Where to get it |
|---|---|---|---|
| TinyFish | Free ā no credit card | Always | agent.tinyfish.ai |
| OpenRouter | Free ā 4-model fallback chain | Unless using Claude CLI / Anthropic | openrouter.ai |
| Telegram | Free | Optional | @BotFather on Telegram |
Claude Code / MCP integration
Use autopilot-jobhunt as an MCP server inside Claude Code (CLI) or Claude Desktop.
Step 1: Install with MCP support
git clone https://github.com/tarunlnmiit/autopilot-jobhunt.git
cd autopilot-jobhunt
pip install -e '.[mcp]'
Step 2: Register with Claude Code
Option A ā one command:
claude mcp add autopilot-jobhunt \
--env TINYFISH_API_KEY=your_key \
--env OPENROUTER_API_KEY=your_key \
--env TELEGRAM_TOKEN=your_token \
--env TELEGRAM_CHAT_ID=your_chat_id \
-- python -m job_hunt.mcp_server
Option B ā edit ~/.claude.json manually:
{
"mcpServers": {
"autopilot-jobhunt": {
"command": "python",
"args": ["-m", "job_hunt.mcp_server"],
"cwd": "/absolute/path/to/autopilot-jobhunt",
"env": {
"TINYFISH_API_KEY": "your_key",
"OPENROUTER_API_KEY": "your_key",
"TELEGRAM_TOKEN": "your_token",
"TELEGRAM_CHAT_ID": "your_chat_id"
}
}
}
}
Note:
cwdmust point to the cloned repo ā the server readsconfig.jsonandcompanies.jsonfrom there.
Step 3: Use it
In any Claude Code session:
"Scan for ML jobs"
"Draft an application for job #2"
"Export jobs from the last 7 days with score above 70"
Claude Desktop
Same JSON block ā add it under mcpServers in Claude Desktop ā Settings ā Developer.
Customize your target companies
Edit companies.json. Each entry needs:
{
"name": "Stripe",
"careers_url": "https://stripe.com/jobs",
"search_domain": "stripe.com",
"location": "Remote / San Francisco, CA",
"region": "Remote"
}
The repo ships with 130+ pre-configured EU, NZ, and remote-friendly tech companies. Add or remove as you like.
How scoring works
The LLM reads your full resume + the full job description and assigns a score 0ā100:
| Score | Meaning |
|---|---|
| 80ā100 | Near-perfect fit ā apply immediately |
| 60ā79 | Good fit ā worth applying |
| 40ā59 | Partial fit ā apply if pipeline is thin |
| < 40 | Poor fit ā skipped |
Set min_score in config to filter. Default: 60.
Project structure
autopilot-jobhunt/
āāā job_hunt/
ā āāā main.py # CLI entry point
ā āāā scanner.py # Job discovery + LLM scoring
ā āāā drafter.py # Resume tailoring + cover letter
ā āāā notifier.py # Telegram notifications
ā āāā llm_utils.py # OpenRouter wrapper with fallback
ā āāā tools.py # Protocol-agnostic tool layer
ā āāā mcp_server.py # MCP server (Claude/AI assistant integration)
āāā demo/ # Demo scripts for recording GIF
āāā resume/ # Put your resume here (gitignored)
āāā state/ # Scan state (gitignored)
āāā output/ # Generated applications (gitignored)
āāā companies.json # 130+ target companies
āāā config.example.json # Config template (copy to config.json ā gitignored)
āāā config.json # Your config (gitignored ā never committed)
LLM options
Default: OpenRouter (free)
Uses a 4-model fallback chain ā all free, no credit card needed:
| Model | Role |
|---|---|
meta-llama/llama-3.3-70b-instruct:free | Primary ā best quality |
nvidia/nemotron-3-super-120b-a12b:free | Fallback 1 ā 120B |
google/gemma-4-31b-it:free | Fallback 2 |
qwen/qwen3-coder:free | Fallback 3 |
If one model hits its daily free-tier quota, the tool automatically tries the next. Zero LLM cost by default.
Alternative A: Claude Code CLI (no API key needed)
If you have Claude Code installed and authenticated, you can use it as the LLM backend ā no separate API key required:
In config.json:
"llm_provider": "claude_cli"
Or via environment variable: LLM_PROVIDER=claude_cli autopilot scan
Optionally set a model: "claude_cli_model": "sonnet" (or "opus", "haiku", empty = Claude's default).
Note: Requires the
claudebinary in your PATH. Verify withclaude --print "hi"first. The MCP server and cron jobs must run in an environment where yourclaudeauth session is active.Rate-limit note: Each call loads your global Claude Code context (~25ā30k tokens). A nightly scan (5ā15 LLM calls) burns significantly against your subscription's 7-day rate limit. Prefer OpenRouter for nightly automation; use Claude CLI for occasional on-demand drafts.
Alternative B: Anthropic API
If you have an Anthropic API key:
pip install 'autopilot-jobhunt[claude]'
In config.json:
"llm_provider": "anthropic",
"anthropic_api_key": "sk-ant-...",
"anthropic_model": "claude-haiku-4-5-20251001"
claude-haiku-4-5-20251001 is fast and cheap; claude-sonnet-4-6 gives higher quality scores. A nightly scan uses ~5ā15 LLM calls total (jobs scored in batches of 10).
Contributing
See CONTRIBUTING.md. PRs welcome for:
- Adding companies to
companies.json - New ATS platform support (Rippling, Lever variants, Workday)
- OpenAI / Gemini MCP adapters
- Better scoring prompts
License
MIT ā see LICENSE.
Built by @tarunlnmiit. If this saved you hours of job searching, a ā means a lot.