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
$ npx -y skills add tarunlnmiit/autopilot-jobhunt --agent claude-code
Run the curl in your terminal, the rest in Claude Code.
What's inside
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.
Seen by 90K+ people — the Instagram reel that launched it.
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 →
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.
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.
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.
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
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.
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
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.
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 |
| 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 |
Use autopilot-jobhunt as an MCP server inside Claude Code (CLI) or Claude Desktop.
git clone https://github.com/tarunlnmiit/autopilot-jobhunt.git
cd autopilot-jobhunt
pip install -e '.[mcp]'
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.
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"
Same JSON block — add it under mcpServers in Claude Desktop → Settings → Developer.
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.
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.
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)
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.
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.
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).
See CONTRIBUTING.md. PRs welcome for:
companies.jsonMIT — see LICENSE.
Built by @tarunlnmiit. If this saved you hours of job searching, a ⭐ means a lot.
.env.example
.github/
dependabot.yml
ISSUE_TEMPLATE/
bug_report.md
feature_request.md
PULL_REQUEST_TEMPLATE.md
workflows/
ci.yml
.gitignore
assets/
mcp-icon.png
CHANGELOG.md
CLAUDE.md
CODE_OF_CONDUCT.md
companies.json
config.example.json
conftest.py
CONTRIBUTING.md
demo/
autopilot-reel.gif
demo_run.py
fixtures/
demo_companies.json
demo_jobs.json
demo_resume.md
run_demo.sh
Dockerfile
docs/
01-install.md
02-providers.md
03-api-keys.md
04-companies-and-scanning.md
05-integrations.md
06-mcp-and-skill.md
07-config-and-scoring.md
08-troubleshooting.md
09-testing-checklist.md
README.md
glama.json
job_hunt/
__init__.py
data/
__init__.py
companies.json
config.example.json
env_example
resume_template.md
drafter.py
llm_utils.py
log.py
main.py
mcp_server.py
notifier.py
py.typed
scanner.py
tools.py
LICENSE
output/
.gitkeep
PRIVACY.md
pyproject.toml
pytest.ini
README.md
requirements.txt
resume/
YOUR_RESUME.md
SECURITY.md
server.json
setup_cron.sh
SETUP.md
skills/
autopilot-jobhunt/
SKILL.md
smithery.yaml
state/
.gitkeep
tests/
test_config_precedence.py
test_drafter.py
test_export_smoke.py
test_llm_utils.py
test_main_cli.py
test_mcp_command.py
test_notifier.py
test_scan_output.py
test_scanner.py
test_tools_and_mcp.pyFAQ
autopilot-jobhunt is a Claude Code plugin with 1 hand-picked skill for automation work, indexed on Flowy. Install it with the command on its page. It includes autopilot-jobhunt. Its skills do not fire on their own yet. Request auto-invocation to have Flowy route them as you prompt. Free and open source.