Autopilot Jobhunt

io.github.tarunlnmiitPublished by GitHub account tarunlnmiitv0.4.3Updated Oct 24, 2026

Agentic job hunt: scan careers pages, score against your resume, draft applications. Never applies.

Overview

AI-generated overview

Local MCP server for an agentic job hunt: scans company careers pages, scores roles against your resume, and drafts applications.

What you can do
  • Scan configured company careers pages for new job postings
  • Score each role 0-100 against your resume and explain the fit
  • Draft a tailored resume and cover letter for a chosen job
  • Export scored jobs to CSV, filtered by date or score
  • Send top matches as Telegram notifications
When to use it
Useful if you are job hunting across many company careers pages and want an assistant to surface and rank new roles against your resume, then draft applications you submit yourself. It drafts only and never applies on your behalf.
Requirements
Runs locally as a Python package (pip install, with the mcp extra for MCP mode) and is started with python -m job_hunt.mcp_server. Needs a config.json, companies.json and your resume file in the working directory. API keys are passed as environment variables: TINYFISH_API_KEY for job discovery, OPENROUTER_API_KEY for scoring unless using Claude CLI or an Anthropic key, and optional TELEGRAM_TOKEN and TELEGRAM_CHAT_ID for alerts.
Before you install
Your resume, profile and job data are sent to third-party services: TinyFish for discovery and an LLM provider (OpenRouter, Anthropic, or your local Claude CLI session) for scoring and drafting. Keys such as TINYFISH_API_KEY, OPENROUTER_API_KEY, TELEGRAM_TOKEN and TELEGRAM_CHAT_ID are stored in config or environment variables. Using Claude CLI as the backend consumes your subscription rate limit. Drafts are generated text, so review every application before submitting.

Installation

In SourceWeft

  1. Open Autopilot Jobhunt in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

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.

[autopilot-jobhunt demo — nightly scan, LLM scoring, Telegram alert, drafted application]

[CI] [codecov] [PyPI version] [PyPI downloads] [Python 3.11+] [License: MIT] [GitHub Stars] [autopilot-jobhunt MCP server] [Listed on CodeGuilds] [MCPVault: claimed]

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 →


How it works

mermaid
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 20265 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 goalScore: 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 backgroundScore: 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

bash
pip install autopilot-jobhunt        # or: pip install 'autopilot-jobhunt[mcp]' for Claude Codemkdir my-job-hunt && cd my-job-huntautopilot 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)

bash
git clone https://github.com/tarunlnmiit/autopilot-jobhunt.gitcd autopilot-jobhuntpip install -e '.'               # standalone CLI# pip install -e '.[mcp]'       # + Claude Code MCP integrationcp 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/:

GuideCovers
Installpip / from source / autopilot init scaffolding
LLM providersOpenRouter fallback chain, Claude CLI (keyless), Anthropic API
API keysTinyFish + OpenRouter keys, where each goes
Companies & scanningcompanies.json, discovery + scoring, scan pacing
IntegrationsTelegram notifications
MCP server & SkillDrive the hunt from Claude Code
Config & scoringCandidate profile, min_score, top_n
TroubleshootingEvery error we've hit, and the fix
Testing checklistReproducible independent verification

API keys needed

ServiceCostRequiredWhere to get it
TinyFishFree — no credit cardAlwaysagent.tinyfish.ai
OpenRouterFree — 4-model fallback chainUnless using Claude CLI / Anthropicopenrouter.ai
TelegramFreeOptional@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

bash
git clone https://github.com/tarunlnmiit/autopilot-jobhunt.gitcd autopilot-jobhuntpip install -e '.[mcp]'

Step 2: Register with Claude Code

Option A — one command:

bash
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:

json
{  "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: cwd must point to the cloned repo — the server reads config.json and companies.json from 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:

json
{  "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:

ScoreMeaning
80–100Near-perfect fit — apply immediately
60–79Good fit — worth applying
40–59Partial fit — apply if pipeline is thin
< 40Poor 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:

ModelRole
meta-llama/llama-3.3-70b-instruct:freePrimary — best quality
nvidia/nemotron-3-super-120b-a12b:freeFallback 1 — 120B
google/gemma-4-31b-it:freeFallback 2
qwen/qwen3-coder:freeFallback 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:

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 claude binary in your PATH. Verify with claude --print "hi" first. The MCP server and cron jobs must run in an environment where your claude auth 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:

bash
pip install 'autopilot-jobhunt[claude]'

In config.json:

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.

Source: README.md at commit 3b59877

Tools

0
SourceWeft has not started this package in its sandbox yet, so its tools are not known.

Version history

1
  1. v0.4.3LatestSep 16, 2026

Score

50% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts

    Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.

  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listed15 pts

    Answer tools/list without a credential, or ship a package that starts in a sandbox without one.

  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts