SkillAgentSearch skills...

JobSpy

Jobs scraper library for LinkedIn, Indeed, Glassdoor, ZipRecruiter, Bayt, Naukri, BDJobs & HelloWork

Install / Use

claude mcp add speedyapply -- npx -y github:speedyapply/JobSpy

If the server publishes to npm under a different name, use that package instead β€” check the repo README.

About this skill
πŸ”Œ

MCP Server

Model Context Protocol server

Quality Score

93/100

Supported Platforms

Claude Code
Claude Desktop

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.

Substance
30/30
Structure
20/20
Description
12/15
Adoption
16/20
Freshness
15/15

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.

SkillScoreStarsUpdatedFormat
JobSpy (this skill)by speedyapply934.5ktodayMCP Server
Agent-Reachby Panniantong10099.4k4d agoCLAUDE.md
headroomby headroomlabs-ai10076.0k2d agoCLAUDE.md
CowAgentby zhayujie10047.5ktodayCLAUDE.md
Scraplingby D4Vinci10088.6ktodayMCP 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.
<h1 align="center"> <a href="https://github.com/speedyapply/JobSpy"><img src="https://github.com/user-attachments/assets/dcb90340-9469-4808-bc51-868e59a000e0" alt="JobSpy" width="320"></a> </h1> <p align="center"> <a href="https://pypi.org/project/python-jobspy/"><img src="https://img.shields.io/pypi/v/python-jobspy" alt="PyPI version"></a> <a href="https://pypi.org/project/python-jobspy/"><img src="https://img.shields.io/pypi/pyversions/python-jobspy" alt="Python versions"></a> <a href="https://pepy.tech/projects/python-jobspy"><img src="https://static.pepy.tech/badge/python-jobspy/month" alt="Downloads per month"></a> <a href="https://github.com/speedyapply/JobSpy/actions/workflows/ci.yml"><img src="https://github.com/speedyapply/JobSpy/actions/workflows/ci.yml/badge.svg?branch=main" alt="CI"></a> <a href="https://github.com/speedyapply/JobSpy/blob/main/LICENSE"><img src="https://img.shields.io/pypi/l/python-jobspy" alt="License: MIT"></a> <a href="https://discord.gg/v7WdHnrNcN"><img src="https://img.shields.io/discord/1227411661221269565?label=discord&logo=discord&logoColor=white" alt="Discord"></a> </p>

JobSpy 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
<p align="center"> <a href="https://github.com/speedyapply/JobSpy"><img src="https://github.com/cullenwatson/JobSpy/assets/78247585/ec7ef355-05f6-4fd3-8161-a817e31c5c57" alt="JobSpy demo"></a> </p>

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

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_posted is the day a job was added to Indeed, the same date hours_old filters 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

View on GitHub
GitHub Stars4.5k
CategoryHuman
Updated4h ago
Forks894

Languages

Python

Trust signals

100/100

From repository metadata: license, adoption, age and documentation. Not a code audit β€” see the Safety scan above for what the skill file itself contains.

No cautions
JobSpy β€” MCP Server: Install & Safety Check | SkillAgent