JobLens MCP
# JobLens MCP




A Model Context Protocol (MCP) server that gives Claude (or any
MCP-compatible AI assistant) structured, live context about jobs and
careers: search real job postings, parse a resume locally, and score how
well a resume matches a given job ā all through **official, ToS-compliant
APIs and local file parsing**. No scraping. No stored platform passwords.
No automated browser logins.
---
## Table of Contents
- [Why This Exists](#why-this-exists)
- [Features](#features)
- [Architecture](#architecture)
- [Installation](#installation)
- [Configure Claude Desktop](#configure-claude-desktop)
- [Example Prompts](#example-prompts)
- [Roadmap](#roadmap)
---
## Why This Exists
Most "LinkedIn scraper" MCP servers automate a real login through Selenium
and scrape profile/job pages ā which **violates LinkedIn's Terms of
Service** and puts a user's account at risk of a ban.
JobLens solves the same underlying problem ā giving an AI assistant rich
job-market context ā using a free, official job-search API and local
resume parsing instead. Same outcome, zero ToS risk.
## Features
| Feature | Description |
|---|---|
| š **Live Job Search** | Query real job postings (title, company, location, salary, description) via the [Adzuna Jobs API](https://developer.adzuna.com/) |
| š **Resume Parsing** | Extract skills, email, and phone from a local PDF/text resume ā entirely on-device |
| šÆ **Resume-to-Job Match Scoring** | Transparent skill-overlap score (0ā100) between a parsed resume and any job description, with matched/missing skills listed |
| ā” **Search + Match** | One call searches jobs *and* ranks them by fit to your resume |
## Architecture
```
joblens-mcp/
āāā src/joblens_mcp/
ā āāā server.py # MCP server + tool definitions (FastMCP)
ā āāā jobsource.py # Adzuna API client (swap for any job-board API)
ā āāā resume.py # Local resume parsing + match scoring
āāā main.py # Entry point
āāā pyproject.toml
āāā requirements.txt
```
`jobsource.py` is intentionally isolated from `server.py` ā swapping
Adzuna for USAJobs, Indeed's Publisher API, RemoteOK, or Jooble means
editing **one file**, not the MCP tool layer.
## Installation
**Prerequisites**
- Python 3.10+
- A free [Adzuna API](https://developer.adzuna.com/) `app_id` and `app_key` (instant signup, no scraping involved)
**1. Clone the repository**
```bash
git clone https://github.com/rohith-jpg/joblens-mcp
cd joblens-mcp
```
**2. Set up environment & install dependencies**
Using `uv` (recommended):
```bash
curl -LsSf https://astral.sh/uv/install.sh | sh
uv venv
source .venv/bin/activate # macOS/Linux
uv pip install -e .
```
Or with plain `pip`:
```bash
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
```
**3. Add your API credentials**
```bash
cp .env.example .env
# then edit .env with your ADZUNA_APP_ID and ADZUNA_APP_KEY
```
**4. Run the server**
```bash
uv run main.py
# or
python main.py
```
## Configure Claude Desktop
Add this to your Claude Desktop config (Settings ā Developer ā Edit Config):
```json
{
"mcpServers": {
"joblens": {
"command": "/path/to/uv",
"args": ["--directory", "/path/to/joblens-mcp", "run", "main.py"],
"env": {
"ADZUNA_APP_ID": "your_app_id",
"ADZUNA_APP_KEY": "your_app_key"
}
}
}
}
```
Restart Claude Desktop, then look for the tools (hammer) icon to confirm
JobLens is connected.
## Example Prompts
- *"Search for remote data engineer jobs and tell me which ones best match my resume at `/Users/me/resume.pdf`."*
- *"Parse my resume and tell me what skills I'm missing for a Senior Backend Engineer role."*
- *"What job categories does the search API support for the UK?"*
## Roadmap
- [ ] Additional job-board sources (USAJobs, RemoteOK, Greenhouse public job boards)
- [ ] `cover_letter_draft` tool using match results to draft a tailored cover letter
- [ ] Caching/rate-limit handling for high-volume searches
## License
MIT ā see [`LICENSE`](./LICENSE).
## Acknowledgements
Built using the [Model Context Protocol](https://modelcontextprotocol.io)
Python SDK and the [Adzuna Jobs API](https://developer.adzuna.com/).
---
**Note:** This project deliberately avoids any LinkedIn scraping or
automated login. All data sources used are official, public APIs or files
the user provides locally.
<p align="center">Built by <a href="https://github.com/rohith-jpg">Rohith Singhu</a></p>
TDQS
Scored across 5 tools
Each tool has a distinct purpose: listing categories, parsing resumes, matching a resume to a job, searching jobs, and a convenience combiner. The descriptions clearly differentiate them, even the combined search_and_match is clearly a hybrid of search_jobs and match_resume_to_job.
All tool names follow a consistent verb_noun pattern in snake_case, e.g., list_job_categories, parse_resume, search_jobs. The naming is predictable and easy to interpret.
With 5 tools, the server is well-scoped for its purpose: listing categories, parsing, matching, searching, and a combined tool. Each tool earns its place without redundancy or bloat.
The tool set covers the core workflow of parsing, matching, and searching jobs. A minor gap is the lack of a tool to list supported countries or retrieve job details by ID, but the existing tools handle primary use cases effectively.