{
  "markdown": "# autopilot-jobhunt\n\n<!-- mcp-name: io.github.tarunlnmiit/autopilot-jobhunt -->\n\n**Your AI job agent. Finds, scores, and drafts applications — while you sleep.**\n\n> 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.\n>\n> 🔒 **Drafts only — never applies.** You review every draft and submit applications yourself. See [PRIVACY.md](PRIVACY.md) for exactly what data leaves your machine.\n\n<p align=\"center\">\n  <img src=\"demo/autopilot-reel.gif?v=3\" alt=\"autopilot-jobhunt demo — nightly scan, LLM scoring, Telegram alert, drafted application\" width=\"300\">\n</p>\n\n[![CI](https://github.com/tarunlnmiit/autopilot-jobhunt/actions/workflows/ci.yml/badge.svg)](https://github.com/tarunlnmiit/autopilot-jobhunt/actions/workflows/ci.yml)\n[![codecov](https://codecov.io/gh/tarunlnmiit/autopilot-jobhunt/branch/main/graph/badge.svg)](https://codecov.io/gh/tarunlnmiit/autopilot-jobhunt)\n[![PyPI version](https://img.shields.io/pypi/v/autopilot-jobhunt)](https://pypi.org/project/autopilot-jobhunt/)\n[![PyPI downloads](https://img.shields.io/pypi/dm/autopilot-jobhunt)](https://pypi.org/project/autopilot-jobhunt/)\n[![Python 3.11+](https://img.shields.io/badge/python-3.11+-blue)](https://www.python.org/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)\n[![GitHub Stars](https://img.shields.io/github/stars/tarunlnmiit/autopilot-jobhunt?style=social)](https://github.com/tarunlnmiit/autopilot-jobhunt/stargazers)\n[![autopilot-jobhunt MCP server](https://glama.ai/mcp/servers/tarunlnmiit/autopilot-jobhunt/badges/score.svg)](https://glama.ai/mcp/servers/tarunlnmiit/autopilot-jobhunt)\n[![Listed on CodeGuilds](https://codeguilds.dev/badge/autopilot-jobhunt)](https://codeguilds.dev/packages/autopilot-jobhunt)\n\n**Seen by 90K+ people** — [the Instagram reel that launched it](https://www.instagram.com/p/DZhkDvoxtt2/).\n\nPublished on [PyPI](https://pypi.org/project/autopilot-jobhunt/) and listed on the [Official MCP Registry](https://registry.modelcontextprotocol.io) (`io.github.tarunlnmiit/autopilot-jobhunt`), [Glama](https://glama.ai/mcp/servers/tarunlnmiit/autopilot-jobhunt) (Quality A), and [Smithery](https://smithery.ai/servers/tarungupta-y12/autopilot-jobhunt) (MCPB bundle).\n\n**[📖 Full setup guide with Claude Code MCP integration → SETUP.md](SETUP.md)**\n\n> ### ⭐ Star this repo if it helps you land a job\n> 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 →](https://github.com/tarunlnmiit/autopilot-jobhunt/stargazers)**\n\n---\n\n## How it works\n\n```mermaid\nflowchart LR\n    A[\"🌐 130+ Careers Pages\"] -->|TinyFish API| B[\"Job Discovery\"]\n    B --> C[\"LLM Batch Scorer\\n(0–100 fit score)\"]\n    C -->|score ≥ min| D[\"📱 Telegram Alert\\nTop N matches\"]\n    C -->|on demand| E[\"✉️ Cover Letter\\n+ Resume Bullets\"]\n    C --> F[\"📊 CSV Export\"]\n```\n\n**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.\n\n### What a scan result looks like\n\n```\nScanning Mistral AI...\n  3 new job URLs. Fetching details...\n  Scoring jobs...\n  Saved 2 jobs from Mistral AI\n\nScanning HuggingFace...\n  5 new job URLs. Fetching details...\n  Scoring jobs...\n  Saved 3 jobs from HuggingFace\n\nScanning Stripe...\n  No new jobs found\n...\nScan complete.\nTop 5 sent to Telegram.\n```\n\n### What the Telegram notification looks like\n\n```\nJob Hunt — 06 Jun 2026\n5 matches found\n\n#1 | Mistral AI | Applied AI Engineer, ML Infrastructure\n📍 Paris/London/Marseille, On-site\n🔧 Python, LLMs, RAG, AWS, MLOps, DevOps\n✅ Role combines applied AI + ML infrastructure in EU, aligns with MLOps/RAG expertise and relocation goal\nScore: 85/100  →  https://jobs.lever.co/mistral/...\n\n#2 | HuggingFace | Staff ML Engineer\n📍 Remote (EU)\n🔧 Python, PyTorch, Transformers, CUDA, MLOps\n✅ Open-source ML role matches deep learning and distributed training background\nScore: 80/100  →  https://apply.workable.com/huggingface/...\n\n...\n\nReply \"apply to #N\" to draft a tailored application.\n```\n\n---\n\n## What it does\n\n```\nEvery night at 2:30 AM:\n  ┌─────────────────────────────────────────────────────────┐\n  │  Scans careers pages  →  Scores with LLM  →  Notifies  │\n  │       (130+ cos)           (0–100 fit)       (Telegram) │\n  └─────────────────────────────────────────────────────────┘\n\nOn demand:\n  autopilot draft 1  →  tailored resume + cover letter in 60s\n```\n\n---\n\n## Usage modes\n\n```\nMode 1: Standalone CLI (no Claude Code required)\n  pip install autopilot-jobhunt\n  autopilot scan / autopilot draft 1 / autopilot export\n\nMode 2: Claude Code MCP (control via natural language)\n  pip install 'autopilot-jobhunt[mcp]'\n  claude mcp add autopilot-jobhunt ...\n  → \"Scan for ML jobs\" / \"Draft application for job #2\"\n```\n\nBoth modes use the same config and produce the same output.\n\n## Quick start\n\n### Option A — pip install\n\n```bash\npip install autopilot-jobhunt        # or: pip install 'autopilot-jobhunt[mcp]' for Claude Code\nmkdir my-job-hunt && cd my-job-hunt\nautopilot init                       # creates config.json, companies.json, resume/, .env\n# Fill in config.json (API keys + your profile) and resume/YOUR_RESUME.md, then:\nautopilot scan\n```\n\n### Option B — clone (recommended if you want to customize companies or contribute)\n\n```bash\ngit clone https://github.com/tarunlnmiit/autopilot-jobhunt.git\ncd autopilot-jobhunt\npip install -e '.'               # standalone CLI\n# pip install -e '.[mcp]'       # + Claude Code MCP integration\ncp config.example.json config.json && cp .env.example .env\n# Fill in your API keys and candidate profile, then:\nautopilot scan\n```\n\n**For the full walkthrough** — API key setup, Claude Code MCP registration, rate limit details, and troubleshooting — see **[SETUP.md](SETUP.md)**.\n\n### 📚 Documentation\n\nStep-by-step guides live in [`docs/`](docs/README.md):\n\n| Guide | Covers |\n|---|---|\n| [Install](docs/01-install.md) | pip / from source / `autopilot init` scaffolding |\n| [LLM providers](docs/02-providers.md) | OpenRouter fallback chain, Claude CLI (keyless), Anthropic API |\n| [API keys](docs/03-api-keys.md) | TinyFish + OpenRouter keys, where each goes |\n| [Companies & scanning](docs/04-companies-and-scanning.md) | `companies.json`, discovery + scoring, scan pacing |\n| [Integrations](docs/05-integrations.md) | Telegram notifications |\n| [MCP server & Skill](docs/06-mcp-and-skill.md) | Drive the hunt from Claude Code |\n| [Config & scoring](docs/07-config-and-scoring.md) | Candidate profile, `min_score`, `top_n` |\n| [Troubleshooting](docs/08-troubleshooting.md) | Every error we've hit, and the fix |\n| [Testing checklist](docs/09-testing-checklist.md) | Reproducible independent verification |\n\n### API keys needed\n\n| Service | Cost | Required | Where to get it |\n|---|---|---|---|\n| **TinyFish** | **Free** — no credit card | Always | [agent.tinyfish.ai](https://agent.tinyfish.ai) |\n| **OpenRouter** | **Free** — 4-model fallback chain | Unless using Claude CLI / Anthropic | [openrouter.ai](https://openrouter.ai) |\n| **Telegram** | Free | Optional | [@BotFather](https://t.me/BotFather) on Telegram |\n\n---\n\n## Claude Code / MCP integration\n\nUse autopilot-jobhunt as an MCP server inside **Claude Code** (CLI) or **Claude Desktop**.\n\n### Step 1: Install with MCP support\n\n```bash\ngit clone https://github.com/tarunlnmiit/autopilot-jobhunt.git\ncd autopilot-jobhunt\npip install -e '.[mcp]'\n```\n\n### Step 2: Register with Claude Code\n\n**Option A — one command:**\n\n```bash\nclaude mcp add autopilot-jobhunt \\\n  --env TINYFISH_API_KEY=your_key \\\n  --env OPENROUTER_API_KEY=your_key \\\n  --env TELEGRAM_TOKEN=your_token \\\n  --env TELEGRAM_CHAT_ID=your_chat_id \\\n  -- python -m job_hunt.mcp_server\n```\n\n**Option B — edit `~/.claude.json` manually:**\n\n```json\n{\n  \"mcpServers\": {\n    \"autopilot-jobhunt\": {\n      \"command\": \"python\",\n      \"args\": [\"-m\", \"job_hunt.mcp_server\"],\n      \"cwd\": \"/absolute/path/to/autopilot-jobhunt\",\n      \"env\": {\n        \"TINYFISH_API_KEY\": \"your_key\",\n        \"OPENROUTER_API_KEY\": \"your_key\",\n        \"TELEGRAM_TOKEN\": \"your_token\",\n        \"TELEGRAM_CHAT_ID\": \"your_chat_id\"\n      }\n    }\n  }\n}\n```\n\n> **Note:** `cwd` must point to the cloned repo — the server reads `config.json` and `companies.json` from there.\n\n### Step 3: Use it\n\nIn any Claude Code session:\n\n```\n\"Scan for ML jobs\"\n\"Draft an application for job #2\"\n\"Export jobs from the last 7 days with score above 70\"\n```\n\n### Claude Desktop\n\nSame JSON block — add it under `mcpServers` in Claude Desktop → Settings → Developer.\n\n---\n\n## Customize your target companies\n\nEdit `companies.json`. Each entry needs:\n\n```json\n{\n  \"name\": \"Stripe\",\n  \"careers_url\": \"https://stripe.com/jobs\",\n  \"search_domain\": \"stripe.com\",\n  \"location\": \"Remote / San Francisco, CA\",\n  \"region\": \"Remote\"\n}\n```\n\nThe repo ships with 130+ pre-configured EU, NZ, and remote-friendly tech companies. Add or remove as you like.\n\n---\n\n## How scoring works\n\nThe LLM reads your full resume + the full job description and assigns a score 0–100:\n\n| Score | Meaning |\n|---|---|\n| 80–100 | Near-perfect fit — apply immediately |\n| 60–79 | Good fit — worth applying |\n| 40–59 | Partial fit — apply if pipeline is thin |\n| < 40 | Poor fit — skipped |\n\nSet `min_score` in config to filter. Default: 60.\n\n---\n\n## Project structure\n\n```\nautopilot-jobhunt/\n├── job_hunt/\n│   ├── main.py          # CLI entry point\n│   ├── scanner.py       # Job discovery + LLM scoring\n│   ├── drafter.py       # Resume tailoring + cover letter\n│   ├── notifier.py      # Telegram notifications\n│   ├── llm_utils.py     # OpenRouter wrapper with fallback\n│   ├── tools.py         # Protocol-agnostic tool layer\n│   └── mcp_server.py    # MCP server (Claude/AI assistant integration)\n├── demo/                # Demo scripts for recording GIF\n├── resume/              # Put your resume here (gitignored)\n├── state/               # Scan state (gitignored)\n├── output/              # Generated applications (gitignored)\n├── companies.json       # 130+ target companies\n├── config.example.json  # Config template (copy to config.json — gitignored)\n└── config.json          # Your config (gitignored — never committed)\n```\n\n---\n\n## LLM options\n\n### Default: OpenRouter (free)\n\nUses a 4-model fallback chain — all free, no credit card needed:\n\n| Model | Role |\n|---|---|\n| `meta-llama/llama-3.3-70b-instruct:free` | Primary — best quality |\n| `nvidia/nemotron-3-super-120b-a12b:free` | Fallback 1 — 120B |\n| `google/gemma-4-31b-it:free` | Fallback 2 |\n| `qwen/qwen3-coder:free` | Fallback 3 |\n\nIf one model hits its daily free-tier quota, the tool automatically tries the next. **Zero LLM cost by default.**\n\n### Alternative A: Claude Code CLI (no API key needed)\n\nIf you have [Claude Code](https://claude.ai/code) installed and authenticated, you can use it as the LLM backend — no separate API key required:\n\nIn `config.json`:\n\n```json\n\"llm_provider\": \"claude_cli\"\n```\n\nOr via environment variable: `LLM_PROVIDER=claude_cli autopilot scan`\n\nOptionally set a model: `\"claude_cli_model\": \"sonnet\"` (or `\"opus\"`, `\"haiku\"`, empty = Claude's default).\n\n> **Note:** Requires the `claude` binary in your PATH. Verify with `claude --print \"hi\"` first.\n> The MCP server and cron jobs must run in an environment where your `claude` auth session is active.\n>\n> **Rate-limit note:** Each call loads your global Claude Code context (~25–30k tokens). A nightly scan\n> (5–15 LLM calls) burns significantly against your subscription's 7-day rate limit. Prefer OpenRouter\n> for nightly automation; use Claude CLI for occasional on-demand drafts.\n\n### Alternative B: Anthropic API\n\nIf you have an Anthropic API key:\n\n```bash\npip install 'autopilot-jobhunt[claude]'\n```\n\nIn `config.json`:\n\n```json\n\"llm_provider\": \"anthropic\",\n\"anthropic_api_key\": \"sk-ant-...\",\n\"anthropic_model\": \"claude-haiku-4-5-20251001\"\n```\n\n`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).\n\n---\n\n## Contributing\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md). PRs welcome for:\n- Adding companies to `companies.json`\n- New ATS platform support (Rippling, Lever variants, Workday)\n- OpenAI / Gemini MCP adapters\n- Better scoring prompts\n\n---\n\n## License\n\nMIT — see [LICENSE](LICENSE).\n\n---\n\n*Built by [@tarunlnmiit](https://github.com/tarunlnmiit). If this saved you hours of job searching, a ⭐ means a lot.*\n",
  "bytes": 12836,
  "sha": "63459e80406ab2e8473071b6bb9aefcdb0a5aa5bafe51b8e567e25c8fc3c8634",
  "repo_slug": "tarunlnmiit/autopilot-jobhunt",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_tarunlnmiit_autopilot_jobhunt_007f57a8/readme"
}