Job portal skills are TypeScript CLI tools that let Claude search live job listings duringDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/SudharakaA/ai-job-search/llms.txt
Use this file to discover all available pages before exploring further.
/scrape. The repo ships five of them: four targeting the Danish market and one country-agnostic LinkedIn skill that works for any location worldwide. If your local job board is not among them, the /add-portal command scaffolds a new skill from the same structure, tests it against live data, and registers it before anything goes into your repo.
Built-in portal skills
jobbank-search
Searches Akademikernes Jobbank, the Danish portal for university-educated professionals. Denmark-specific.
jobdanmark-search
Searches Jobdanmark.dk, a broad Danish job board covering all sectors. Denmark-specific.
jobindex-search
Searches Jobindex.dk, one of the largest Danish job boards. Denmark-specific.
jobnet-search
Searches Jobnet.dk, the Danish government’s official public job portal. Denmark-specific.
linkedin-search
Searches LinkedIn’s public job listings for any country or region. Country-agnostic, zero runtime dependencies.
/add-portal. They are interchangeable from /scrape’s perspective.
The linkedin-search skill
linkedin-search is the country-agnostic starting point for users outside Denmark. It hits LinkedIn’s public jobs-guest endpoints, which require no authentication and no API key. The skill has zero runtime dependencies: it runs with just bun, and bun install only pulls TypeScript dev types.
Location is always passed explicitly with the --location flag, so the same skill works for any market without modification:
Adding a custom portal with /add-portal
Run/add-portal inside Claude Code to generate a search skill for any public job board. You can pass the portal URL directly as an argument or let the command start an interview.
Provide portal details
Supply the job board’s public URL (for example
https://www.seek.com.au or https://www.stepstone.de), a kebab-case skill name suffixed with -search, the market and language the portal covers, and a realistic test query to use for the live verification run.The command investigates the portal
Before writing any code, the command fetches the portal and records:
- The search URL pattern, query parameter, and any parameters for location, posting age, and pagination
- The per-result fields available: id, title, company, location, posting date, and URL
- The detail-page URL pattern and where the description, deadline, employment type, and apply link live
- The contents of
robots.txtto check whether search and detail paths are disallowed
robots.txt disallows the relevant paths or the portal’s terms prohibit automated access, the command reports this plainly and lets you decide whether to proceed for personal use. If you proceed, the generated SKILL.md includes a prominent personal-use-only warning.The skill is scaffolded
The command generates The generated skill follows the same contract as the shipped skills:
.agents/skills/<name>/ with this layout:search and detail commands, the same flags (--query, --jobage, --page, --limit, --format), the same JSON output shape, and errors written to stderr with exit code 1.Mandatory live test
The command installs dev types, typechecks, and runs a live search with your test query. It verifies that titles, companies, and URLs are populated and not HTML fragments, then runs
detail on one result to confirm the description is readable. The test suite runs last.Registration does not proceed until search, detail, and tests all pass cleanly.Register and optionally add to /scrape
The command asks whether to add the new portal to your
/scrape search strategy. If yes, it adds site-specific queries to .claude/skills/job-scraper/search-queries.md so /scrape includes the new portal automatically. No other wiring is needed: the skill auto-triggers from its SKILL.md description.Listing installed portal skills
.agents/skills/*/SKILL.md and prints a table of installed skills with their name, market, and data source.
The portal-skill contract
Every generated skill follows the same interface as the shipped ones, making them interchangeable for/scrape:
| Aspect | Requirement |
|---|---|
| Commands | search and detail <id|url> |
| Search flags | --query/-q, --jobage <days>, --page <n>, --limit <n>, --format json|table|plain |
| JSON output | { "meta": { "count": ..., "page": ... }, "results": [...] } with id, title, company, location, date, url per result |
| Errors | Written to stderr as { "error": "...", "code": "..." }, exit code 1 |
| Dependencies | Zero runtime dependencies by default (plain bun + fetch); bun install only pulls dev types |
| Fetching | Browser User-Agent, exponential backoff with jitter on 429/5xx, null on 404 |
Where generated skills live
Generated skills are market-specific and live in your fork. Per the upstream repository policy, country-specific portal skills are not merged upstream. The/add-portal generator itself is the upstream feature; the skills it produces are yours. If the portal changes its markup later, url-reference.md records the parsing anchors you will need to update.