JobSpy
Jobs scraper library for LinkedIn, Indeed, Glassdoor, ZipRecruiter, Bayt, Naukri, BDJobs & HelloWork
Install / Use
claude mcp add speedyapply -- npx -y github:speedyapply/JobSpyIf the server publishes to npm under a different name, use that package instead β check the repo README.
MCP Server
Model Context Protocol server
Quality Score
Category
Human ResourcesSupported Platforms
Tags
Our assessment of JobSpy
JobSpy scores 93/100 on our quality scale, 7th of 62 Human Resources skills we index (top 12%).
Its MCP Server is 12 KB long, well organised into 17 sections with 9 code examples: a thorough specification that gives an agent plenty to work with.
With 4,509 GitHub stars, it is one of the more widely adopted skills in the catalogue.
Maintenance, license and trust
- The repository was last updated today, so JobSpy is actively maintained.
- It is released under the MIT license, a permissive license that allows use, modification and commercial use with attribution.
- Its trust signals score 100/100, with no cautions. These come from repository metadata, not a code audit β read the skill file before letting an agent act on it.
JobSpy compared with similar skills
All 4 of these similar skills score higher than JobSpy; compare them before choosing.
| Skill | Score | Stars | Updated | Format |
|---|---|---|---|---|
| JobSpy (this skill)by speedyapply | 93 | 4.5k | today | MCP Server |
| Agent-Reachby Panniantong | 100 | 99.4k | 4d ago | CLAUDE.md |
| headroomby headroomlabs-ai | 100 | 76.0k | 2d ago | CLAUDE.md |
| CowAgentby zhayujie | 100 | 47.5k | today | CLAUDE.md |
| Scraplingby D4Vinci | 100 | 88.6k | today | MCP Server |
Frequently asked questions
- How do I install JobSpy?
- Run
claude mcp add speedyapply -- npx -y github:speedyapply/JobSpy. The install tabs above show the steps for each supported agent. - Which AI agents does JobSpy work with?
- It is written for Claude Code and Claude Desktop, as a MCP Server file. Other agents that read the same format can often use it too.
- Is JobSpy safe to use?
- It is MIT-licensed and scores 100/100 on trust signals. Skills are instructions an agent will follow, so read the file before installing it and do not approve commands you do not understand.
- Is JobSpy still maintained?
- The repository was last updated today, so JobSpy is actively maintained.
Skill content
View source on GitHubJobSpy is a job scraping library that aggregates jobs from popular job boards with one tool:
- Scrapes job postings from LinkedIn, Indeed, Glassdoor, ZipRecruiter, Bayt, Naukri, BDJobs & HelloWork concurrently
- Aggregates the job postings in a dataframe
- Proxy support to bypass blocking
Installation
pip install -U python-jobspy
Python version >= 3.10 required
Usage
from jobspy import scrape_jobs
jobs = scrape_jobs(
site_name=["indeed", "linkedin", "zip_recruiter", "glassdoor"], # also "bayt", "naukri", "bdjobs", "hellowork"
search_term="software engineer",
location="San Francisco, CA",
results_wanted=20,
hours_old=72,
country_indeed="USA",
# fetch_description=True, # read each job's page on boards whose search results have no description (slower)
# proxies=["user:pass@host:port", "localhost"],
)
print(f"Found {len(jobs)} jobs")
print(jobs.head())
jobs.to_csv("jobs.csv", index=False)
Output
SITE TITLE COMPANY LOCATION JOB_TYPE INTERVAL MIN_AMOUNT MAX_AMOUNT JOB_URL DESCRIPTION
indeed Software Engineer AMERICAN SYSTEMS Arlington, VA, USA None yearly 150000 200000 https://www.indeed.com/viewjob?jk=5e409e577046... THIS POSITION COMES WITH A 10K SIGNING BONUS!...
indeed Senior Software Engineer TherapyNotes.com Philadelphia, PA, USA fulltime yearly 110000 135000 https://www.indeed.com/viewjob?jk=da39574a40cb... About Us TherapyNotes is the national leader i...
linkedin Software Engineer - Early Career Lockheed Martin Sunnyvale, CA, USA fulltime yearly None None https://www.linkedin.com/jobs/view/3693012711 Description:By bringing together people that u...
linkedin Full-Stack Software Engineer Rain New York, NY, USA fulltime yearly None None https://www.linkedin.com/jobs/view/3696158877 Rainβs mission is to create the fastest and ea...
zip_recruiter Software Engineer - New Grad ZipRecruiter Santa Monica, CA, USA fulltime yearly 130000 150000 https://www.ziprecruiter.com/jobs/ziprecruiter... We offer a hybrid work environment. Most US-ba...
zip_recruiter Software Developer TEKsystems Phoenix, AZ, USA fulltime hourly 65 75 https://www.ziprecruiter.com/jobs/teksystems-0... Top Skills' Detailsβ’ 6 years of Java developme...
Command line
The package installs a jobspy command whose options mirror the scrape_jobs() parameters below; jobspy -h lists them, the output fields and exit codes.
jobspy "software engineer" --site indeed,linkedin --location Chicago -n 20
jobspy nurse --site indeed,linkedin --hours-old 24 -o jobs.jsonl
jobspy "data analyst" --remote --fields title,company,job_url
Each job is one line of JSON on stdout; errors and warnings go to stderr. --proxies takes a proxy, a comma list or a file with one per line.
MCP server
mcp-jobspy is an MCP server with two tools: search_jobs returns a preview of each job, get_job_details the full records of chosen ones. It installs with pip install "python-jobspy[mcp]" or runs through uvx as below.
For proxies, give them to the agent, or set HTTPS_PROXY in the server's env.
Standard config works for most clients:
{
"mcpServers": {
"jobspy": {
"command": "uvx",
"args": ["--from", "python-jobspy[mcp]", "mcp-jobspy"]
}
}
}
Parameters for scrape_jobs()
Optional
βββ site_name (list|str):
| linkedin, zip_recruiter, indeed, glassdoor, google, bayt, bdjobs, naukri, hellowork
| (default is all)
β
βββ search_term (str)
|
βββ google_search_term (str)
| search term for google jobs. This is the only param for filtering google jobs.
β
βββ location (str)
β
βββ distance (int):
| in miles, default 50
β
βββ job_type (str):
| fulltime, parttime, contract, temporary, internship, perdiem, other, volunteer
β
βββ proxies (list|str):
| in format ['user:pass@host:port', 'localhost'], or a single proxy as a string
| each job board scraper will round robin through the proxies
| socks proxies on LinkedIn, Indeed and BDJobs need pip install "requests[socks]"
|
βββ is_remote (bool)
β
βββ results_wanted (int):
| number of job results to retrieve for each site specified in 'site_name'
β
βββ easy_apply (bool):
| filters for jobs that are hosted on the job board site
|
βββ user_agent (str):
| override the default user agent which may be outdated
β
βββ description_format (str):
| markdown, html, plain (Format type of the job descriptions. Default is markdown.)
β
βββ offset (int):
| skips that many results (e.g. 25 skips the first 25 and starts from the 26th)
β
βββ hours_old (int):
| filters jobs by the number of hours since the job was posted
| (Glassdoor filters by whole days, so it rounds up to the next day.)
β
βββ verbose (int) {0, 1, 2}:
| Controls the verbosity of the runtime printouts
| (0 prints only errors, 1 is errors+warnings, 2 is all logs. Default is 1.)
β
βββ fetch_description (bool):
| for boards whose search results don't include the job description: fetches each job's
| page for the description and other details (e.g. job type). Without it these are empty
| for those boards. Adds one request per job, so use proxies for larger searches
β
βββ linkedin_fetch_description (bool):
| deprecated, use fetch_description (still works; removed in 2.0)
β
βββ linkedin_company_ids (list[int]):
| searches for linkedin jobs with specific company ids
|
βββ country_indeed (str):
| filters the country on Indeed & Glassdoor (default is usa; see below for the names)
|
βββ enforce_annual_salary (bool):
| converts wages to annual salary
|
βββ ca_cert (str)
| path to CA Certificate file for proxies
Supported Countries for Job Searching
LinkedIn searches globally & uses only the location parameter.
ZipRecruiter
ZipRecruiter searches for jobs in US/Canada & uses only the location parameter.
Indeed / Glassdoor
Indeed & Glassdoor support most countries, chosen with the country_indeed parameter (default usa). Additionally, use the location
parameter to narrow down the location, e.g. city & state if necessary.
You can specify the following countries when searching on Indeed (use the exact name, * indicates support for Glassdoor):
| | | | | |----------------------|--------------|------------|----------------| | Argentina* | Australia* | Austria* | Bahrain | | Belgium* | Brazil* | Canada* | Chile | | China | Colombia | Costa Rica | Czech Republic | | Denmark | Ecuador | Egypt | Finland | | France* | Germany* | Greece | Hong Kong* | | Hungary | India* | Indonesia | Ireland* | | Israel | Italy* | Japan | Kuwait | | Luxembourg | Malaysia* | Mexico* | Morocco | | Netherlands* | New Zealand* | Nigeria | Norway | | Oman | Pakistan | Panama | Peru | | Philippines | Poland | Portugal | Qatar | | Romania | Saudi Arabia | Singapore* | South Africa | | South Korea | Spain* | Sweden | Switzerland* | | Taiwan | Thailand | Turkey | Ukraine | | United Arab Emirates | UK* | USA* | Uruguay | | Venezuela | Vietnam* | | |
Bayt
Bayt searches all countries unless location names one it covers, e.g. "Dubai, UAE" or "Saudi Arabia".
BDJobs
BDJobs searches Bangladesh. location takes a division or district, e.g. "Dhaka" or "Chattogram Division".
Naukri
Naukri searches India. location takes a city, e.g. "Pune".
HelloWork
HelloWork searches France. location takes a French city, postcode or region, e.g. "Lyon". Most jobs are posted in French, so French search terms find more.
Notes
- Indeed is the best scraper currently with no rate limiting.
- Indeed's
date_postedis the day a job was added to Indeed, the same datehours_oldfilters on. - Most job board endpoints are capped at around 1000 jobs on a given search.
- LinkedIn rate limits bursts of requests with a 429, which clears within about a minute. Use proxies for larger searches.
- Glassdoor rate limits above about 2 requests a second.
Frequently Asked Questions
Q: How do I tell a blocked board from one with no jobs?
A: Failures and ignored options are logged as they happen, and the result's attrs carry the same messages so your code can read them:
jobs.attrs["errors"] # {"linkedin": "response status code 429 (blocked: use a proxy)"}
jobs.attrs["warnings"] # {"bdjobs": ["job_type internship isn't supported, ignoring it"]}
Q: Why is Indeed giving unrelated roles?
A: Indeed searches the description too.
- use - to remove words
- "" for exact match
Example of a good Indeed query
search_term='"engineering intern" software summer (java OR python OR c++) 2025 -tax -marketing'
This searches the description/title and must include software, summer, 2025, one of the languages, engineering intern exactly, no tax, no marketing.
Q: No results when using "google"?
A: Google Jobs is currently unavailable.
Q: Received a response code 429?
A: The board blocked you for sending too many requests. All of the job board sites are aggressive with blocking. We recommend:
- Wait some time between scrapes (site-dependent).
- Try using the proxies param to change your IP address.
JobPost Schema
JobPost
βββ id
βββ site
βββ job_url
βββ job_url_direct
βββ title
βββ company
βββ location
βββ date_posted
βββ job_type: fulltime, parttime, internship, contract, temporary, ...
βββ salary_source: direct_data, description (parsed from posting)
βββ interval: yearly, monthly, weekly, daily, hourly
βββ min_amount
βββ max_amount
βββ currency
βββ is_remote
βββ job_level
βββ job_function
βββ listing_type
βββ emails
βββ description
βββ company_industry
βββ company_url
βββ
Truncated for display β read the full file on GitHub.
Related Skills
Agent-Reach
99.4kGive your AI agent eyes to see the entire internet. Read & search Twitter, Reddit, YouTube, GitHub, Bilibili, XiaoHongShu β one CLI, zero API fees.
headroom
76.0kCompress tool outputs, logs, files, and RAG chunks before they reach the LLM. 20% fewer tokens for coding agents, 60-95% fewer tokens for JSON, same answers. Library, proxy, MCP server.
CowAgent
47.5kOpen-source personal AI assistant & Agent Harness. Plans tasks, runs tools and skills, self-evolves with memory and knowledge. Multi-agent, multi-model, multi-channel. Lightweight, extensible, one-line install.
Scrapling
88.6kπ·οΈ A Web Scraping framework that handles everything from a single request to a full-scale crawl! Don't be shy, join here: https://discord.gg/EMgGbDceNQ and follow here for daily tips and tricks: https://x.com/Scrapling_dev
Languages
Trust signals
From repository metadata: license, adoption, age and documentation. Not a code audit β see the Safety scan above for what the skill file itself contains.
