A multi-agent job search system using OpenAI Agents SDK to find and prioritize job opportunities from LinkedIn.
- 4 Specialized Agents: Discovery, Enricher, Ranker, and Manager (orchestrator)
- Smart Scoring: Relevance (title + skills + keywords) and Priority (recency + competition + referral opportunities)
- Metadata Extraction: Recruiter contact info, post engagement, company connections
- Scheduled Runs: APScheduler for automated daily/weekly searches
- Markdown Reports: Human-readable output with job details and apply links
+------------------------+
| Job Search Manager |
| (Orchestrator) |
+------------------------+
|
+-------------------+-------------------+
| | |
v v v
+---------------+ +---------------+ +---------------+
| Job Discovery | | Job Enricher | | Job Ranker |
| Agent | | Agent | | Agent |
+---------------+ +---------------+ +---------------+
| | |
v v v
[LinkedIn MCP] [LinkedIn MCP] [Custom Tools]
- Python 3.11+
- uv (recommended) or pip
- Node.js 18+ (for LinkedIn MCP server)
- HarvestAPI Key (for LinkedIn data access)
- OpenAI API Key (for agents)
git clone https://github.com/yourusername/JobSearchAgent.git
cd JobSearchAgent# macOS/Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
# Or with Homebrew
brew install uv# Create virtual environment
uv venv .venv
# Activate it
source .venv/bin/activate # macOS/Linux
# or
.venv\Scripts\activate # Windows
# Install dependencies
uv pip install -e ".[dev]"# Clone the LinkedIn MCP server
git clone https://github.com/Jing-yilin/linkedin-mcp-server.git
cd linkedin-mcp-server
# Install dependencies and build
npm install
npm run build
# Note the path to the build output
# e.g., /path/to/linkedin-mcp-server/build/index.js- Go to HarvestAPI
- Sign up and get your API key
- This provides access to LinkedIn job listings, posts, profiles, and company data
- Go to OpenAI Platform
- Create an API key with access to GPT-4
# Copy the example env file
cp .env.example .env
# Edit .env with your API keysRequired variables in .env:
# API Keys (required)
HARVESTAPI_API_KEY=your_harvestapi_key_here
OPENAI_API_KEY=your_openai_api_key_here
# LinkedIn MCP Server path (required)
LINKEDIN_MCP_PATH=/path/to/linkedin-mcp-server/build/index.js
# Optional
PROXY_URL= # HTTP/HTTPS proxy if neededEdit data/user_profile.json with your information:
- Name, email, location
- Education and graduation date
- Skills (primary and secondary)
- Work experience
- Target roles and levels
uv run python -m job_search_agentOr with custom profile:
uv run python -m job_search_agent --profile /path/to/your_profile.jsonuv run python -m job_search_agent --schedule daily --time 09:00uv run python -m job_search_agent --schedule weekly --time 09:00 --day monusage: python -m job_search_agent [-h] [--profile PATH] [--output PATH]
[--schedule {daily,weekly}] [--time HH:MM]
[--day {mon,tue,wed,thu,fri,sat,sun}] [-v]
options:
--profile PATH Path to user profile JSON file (default: data/user_profile.json)
--output PATH Output directory for reports (default: ./output)
--schedule {daily,weekly}
Run on a schedule instead of once
--time HH:MM Time to run scheduled searches (default: 09:00)
--day DAY Day of week for weekly schedule (default: mon)
-v, --verbose Enable verbose logging
Reports are saved to the output/ directory as Markdown files:
# Job Search Results
**Generated:** 2026-01-17 14:30
## Summary
| Metric | Value |
|--------|-------|
| Total Jobs Found | 127 |
| After Filtering | 34 |
| High Priority (score > 100) | 12 |
| With Referral Opportunity | 5 |
## Top Opportunities
### 1. AI Engineer at OpenAI
**OpenAI** | San Francisco, CA
| Relevance | Priority | Competition | Posted |
|-----------|----------|-------------|--------|
| 95% | 142.5 | low | 2d ago |
**Recruiter:** [Jane Smith](https://linkedin.com/in/janesmith) - [email protected] | *actively recruiting*
[Apply Here](https://linkedin.com/jobs/view/123456)- Title match (40%): Job title contains target role keywords
- Skill match (40%): Overlap between required skills and user skills
- Description keywords (20%): AI/ML keywords in job description
Base: relevance_score * 100
+ Recency bonus: max(0, 30 - post_age_days * 5)
+ Low competition: +20 if <5 comments, +10 if <15, +5 if <30
+ Active recruiter: +10
+ Has connection: +15
uv run pytest tests/ -vJobSearchAgent/
├── pyproject.toml # Dependencies & project config
├── .env.example # Environment template
├── data/
│ └── user_profile.json # Your profile
├── output/ # Generated reports
├── src/job_search_agent/
│ ├── main.py # CLI entry point
│ ├── scheduler.py # APScheduler for scheduled runs
│ ├── config.py # Settings management
│ ├── agents/
│ │ ├── manager.py # Orchestrator agent
│ │ ├── discovery.py # Job search agent
│ │ ├── enricher.py # Metadata extraction agent
│ │ └── ranker.py # Scoring and ranking agent
│ ├── tools/
│ │ └── scoring.py # Relevance & priority algorithms
│ ├── models/
│ │ ├── job.py # Job, Recruiter, Company models
│ │ └── user_profile.py # User profile model
│ ├── mcp/
│ │ └── linkedin_server.py # LinkedIn MCP integration
│ └── output/
│ └── formatter.py # Report generation
└── tests/
└── test_scoring.py # Scoring function tests
Make sure you've created .env file with your API key:
cp .env.example .env
# Edit .env with your actual API key- Verify the
LINKEDIN_MCP_PATHpoints to the correctbuild/index.js - Make sure Node.js is installed:
node --version - Rebuild the MCP server:
cd linkedin-mcp-server && npm run build
The LinkedIn API has rate limits. If you encounter them:
- Wait a few minutes before retrying
- Consider using a proxy (
PROXY_URLin.env) - Reduce search frequency
MIT