skills/capabilities/linkedin-job-scraper/SKILL.md
Scrapes LinkedIn job postings using the JobSpy library (python-jobspy). Use this skill whenever the user wants to find jobs on LinkedIn, search for open roles, pull job listings, build a job pipeline, source job targets for GTM research, or monitor hiring signals. Even if the user just says "find me some jobs" or "what roles is [company] hiring for", use this skill. It runs a local Python script that outputs a CSV of job postings with title, company, location, salary, job type, description, and direct URLs.
npx skillsauth add gooseworks-ai/goose-skills linkedin-job-scraperInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
This skill finds LinkedIn job postings by running tools/jobspy_scraper.py, a thin wrapper
around the JobSpy library. It handles installation,
parameter construction, execution, and result interpretation.
Install the dependency once (requires Python 3.10+):
python3.12 -m pip install -U python-jobspy --break-system-packages
Run the scraper:
python3.12 tools/jobspy_scraper.py \
--search "software engineer" \
--location "San Francisco, CA" \
--results 25 \
--output .tmp/jobs.csv
Results are saved as CSV and printed as a summary table.
Identify from the user's message:
hours_old filter if user wants recent posts (e.g. "last 48 hours")linkedin_company_ids if targeting a specific company--fetch-descriptions if user needs job description textIf anything is ambiguous (e.g. "find AI jobs"), pick reasonable defaults and tell the user what you used.
Build the tools/jobspy_scraper.py command using the parameters below.
Always save output to .tmp/ so it's disposable and easy to find.
python tools/jobspy_scraper.py \
--search "<term>" \
--location "<location>" \
--results <N> \
[--hours-old <N>] \
[--fetch-descriptions] \
[--company-ids <id1,id2>] \
[--job-type fulltime|parttime|contract|internship] \
[--remote] \
--output .tmp/<descriptive_filename>.csv
Note: --hours-old and --easy-apply cannot be used together (LinkedIn API constraint).
Execute the command. The script will print a progress message and a summary of results found.
If the script is not found at tools/jobspy_scraper.py, check whether the file needs to be created
by reading skills/linkedin-job-scraper/scripts/jobspy_scraper.py and copying it to tools/.
After the run:
| Flag | Description | Default |
|------|-------------|---------|
| --search | Job title / keywords | required |
| --location | City, state, or country | none |
| --results | Number of results to fetch | 25 |
| --hours-old | Only jobs posted within N hours | none |
| --fetch-descriptions | Fetch full job descriptions (slower) | false |
| --company-ids | Comma-separated LinkedIn company IDs | none |
| --job-type | fulltime, parttime, contract, internship | any |
| --remote | Filter for remote jobs only | false |
| --output | Path for CSV output | .tmp/jobs.csv |
The CSV output includes:
| Column | Description |
|--------|-------------|
| TITLE | Job title |
| COMPANY | Employer name |
| LOCATION | City / State / Country |
| IS_REMOTE | True/False |
| JOB_TYPE | fulltime, contract, etc. |
| DATE_POSTED | When the listing was posted |
| MIN_AMOUNT | Minimum salary |
| MAX_AMOUNT | Maximum salary |
| CURRENCY | Currency code |
| JOB_URL | Direct link to the LinkedIn posting |
| DESCRIPTION | Full job description (if --fetch-descriptions used) |
| JOB_LEVEL | Seniority level (LinkedIn-specific) |
| COMPANY_INDUSTRY | Industry classification |
Find recent engineering roles at a startup:
python tools/jobspy_scraper.py --search "growth engineer" --location "New York" \
--results 50 --hours-old 72 --output .tmp/growth_eng_nyc.csv
Monitor what a specific company is hiring for:
# First find the LinkedIn company ID from the company's LinkedIn URL
python tools/jobspy_scraper.py --search "engineer" --company-ids 1234567 \
--results 100 --fetch-descriptions --output .tmp/company_hiring.csv
Find remote contract roles:
python tools/jobspy_scraper.py --search "data analyst" --remote \
--job-type contract --results 30 --output .tmp/remote_contracts.csv
| Error | Fix |
|-------|-----|
| ModuleNotFoundError: jobspy | Run pip install -U python-jobspy |
| 0 results returned | Broaden search term, remove location, increase --results |
| Rate limited / blocked | Wait a few minutes; avoid running back-to-back large scrapes |
| hours_old and easy_apply cannot both be set | Remove one of those flags |
The scraper script lives at tools/jobspy_scraper.py.
If it doesn't exist, copy it from skills/linkedin-scraper/scripts/jobspy_scraper.py to tools/:
cp skills/linkedin-job-scraper/scripts/jobspy_scraper.py tools/
development
End-to-end skill that turns a single reference image into a fully-installed, example-rendered style preset for the goose-graphics composite. Analyzes the image, writes the slim style spec, registers it in styles/index.json, generates all 7 format examples using the standard brief, renders PNGs via Playwright, and updates examples/manifest.json. Invoke with /goose-graphics-create-style.
development
Evaluate YC batch companies for investment — scrapes the YC directory, researches each company and its founders (work history, LinkedIn, website), assesses founder-company fit, and exports to Google Sheets with priority rankings. Use when asked to evaluate YC companies, research a YC batch, screen startups, or do due diligence on YC companies.
tools
Take screenshots of any website using Notte browser automation. Use when asked to screenshot, capture, or snap a webpage.
development
Search the web, platforms, and datasets. Use when asked to search, find, look up, research, or discover information from the web, YouTube, Amazon, eBay, news, academic sources, or any online platform.