AI-powered resume analysis & job discovery — Streamlit UI + MCP server
Upload a PDF resume, get instant AI insights, and pull live listings from LinkedIn and Naukri — all in one place.
Features · Quick Start · Usage · MCP Server · Project Structure
| Capability | Description |
|---|---|
| 📄 Resume parsing | Extracts text from uploaded PDF resumes via PyMuPDF |
| 🧠 AI analysis | GPT-4o summarizes skills, experience, and education |
| 🔍 Skill gap detection | Identifies missing skills and suggests improvements |
| 🗺️ Career roadmap | Generates a personalized preparation strategy |
| 🎯 Smart job search | Derives search keywords from your resume automatically |
| 💼 LinkedIn jobs | Fetches live listings through Apify actors |
| 🇮🇳 Naukri jobs | Pulls India-focused roles from Naukri.com |
| 🔌 MCP integration | Exposes job-fetch tools for AI agents (Cursor, Claude Desktop, etc.) |
flowchart TB
subgraph UI["Streamlit App (app.py)"]
A[Upload PDF Resume] --> B[Extract Text]
B --> C[GPT-4o Analysis]
C --> D[Summary · Skill Gaps · Roadmap]
D --> E[Generate Search Keywords]
E --> F[Fetch Jobs]
end
subgraph MCP["MCP Server (mcp_server.py)"]
G[get_linkedin_jobs]
H[get_naukri_jobs]
end
subgraph External["External Services"]
I[(OpenAI API)]
J[(Apify — LinkedIn Actor)]
K[(Apify — Naukri Actor)]
end
B --> I
C --> I
D --> I
E --> I
F --> J
F --> K
G --> J
H --> K
style UI fill:#1E1E2E,stroke:#FF4B4B,color:#fff
style MCP fill:#1E1E2E,stroke:#FFD700,color:#fff
style External fill:#1E1E2E,stroke:#97D700,color:#fff
Before you begin, make sure you have:
- Python 3.13+ (
.python-versionis set to3.13) - An OpenAI API key — used for resume analysis
- An Apify API token — used for LinkedIn & Naukri job scraping
- uv (recommended) or
pipfor dependency management
git clone <your-repo-url>
cd job-matchingOption A — uv (recommended)
uv syncOption B — pip
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txtCreate a .env file in the project root:
OPENAI_API_KEY=sk-your-openai-key-here
APIFY_API_KEY=apify_api_your-token-here
⚠️ Never commit.envto version control. It is already listed in.gitignore.
uv run streamlit run app.py
# or
streamlit run app.pyOpen http://localhost:8501 in your browser, upload a PDF resume, and follow the on-screen flow.
- Upload your resume (PDF only)
- Wait for AI processing:
- Resume summary
- Skill gaps & missing areas
- Future roadmap & preparation strategy
- Click Get Job Recommendations to:
- Auto-extract search keywords from your profile
- Fetch up to 60 jobs each from LinkedIn and Naukri
- Browse results with direct links to apply
| Section | Prompt focus |
|---|---|
| Resume Summary | Skills, experience, and education highlights |
| Skill Gaps | Missing skills and improvement suggestions |
| Future Roadmap | Career preparation strategy tailored to your profile |
| Job Keywords | Comma-separated titles/keywords for job board search |
The project includes an MCP (Model Context Protocol) server so AI assistants can fetch jobs programmatically.
| Tool | Parameters | Returns |
|---|---|---|
get_linkedin_jobs |
search_query, location (default: "india"), rows (default: 60) |
List of LinkedIn job dicts |
get_naukri_jobs |
search_query, location (default: "india"), rows (default: 60) |
List of Naukri job dicts |
uv run python mcp_server.py
# or
python mcp_server.pyThe server uses stdio transport by default.
Add this to your Cursor MCP settings (.cursor/mcp.json or Settings → MCP):
{
"mcpServers": {
"job-matching": {
"command": "uv",
"args": ["run", "python", "mcp_server.py"],
"cwd": "/absolute/path/to/job-matching",
"env": {
"APIFY_API_KEY": "your-apify-key"
}
}
}
}Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS):
{
"mcpServers": {
"job-matching": {
"command": "uv",
"args": ["run", "python", "mcp_server.py"],
"cwd": "/absolute/path/to/job-matching"
}
}
}job-matching/
├── app.py # Streamlit web application
├── mcp_server.py # MCP server (stdio transport)
├── pyproject.toml # Project metadata & dependencies (uv)
├── requirements.txt # Pip-compatible dependency list
├── uv.lock # Locked dependency versions
├── .env # API keys (local only — not committed)
├── .python-version # Python version pin (3.13)
└── src/
├── helper.py # PDF extraction & OpenAI chat helper
└── job_api.py # Apify-powered LinkedIn & Naukri fetchers
| Layer | Technology |
|---|---|
| UI | Streamlit |
| LLM | OpenAI GPT-4o |
| PDF parsing | PyMuPDF |
| Job scraping | Apify Client |
| Agent protocol | MCP / FastMCP |
| Config | python-dotenv |
| Package manager | uv |
| Platform | Actor ID | Purpose |
|---|---|---|
hKByXkMQaC5Qt9UMN |
Scrape LinkedIn job listings by title & location | |
| Naukri | alpcnRV9YI9lYVPWk |
Scrape Naukri.com jobs by keyword |
| Variable | Required | Description |
|---|---|---|
OPENAI_API_KEY |
✅ | OpenAI API key for GPT-4o resume analysis |
APIFY_API_KEY |
✅ | Apify token for LinkedIn & Naukri job actors |
# Install deps
uv sync
# Run Streamlit with auto-reload
uv run streamlit run app.py
# Run MCP server locally
uv run python mcp_server.py- Job scraping relies on Apify residential proxies for LinkedIn — usage is billed through your Apify account.
- Default job search location is
india; pass a differentlocationwhen calling the API or MCP tools. - Resume uploads are processed in-memory; nothing is persisted to disk.
- The Streamlit app uses GPT-4o with
temperature=0.5for balanced, consistent outputs.
This project is part of the MCP Bootcamp — Next-Gen AI Agents course. Use and modify freely for learning purposes.
Built with ❤️ for smarter job hunting
⭐ Star this repo if it helped you land your next role!