Skip to main content

Documentation 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.

Job portal skills are TypeScript CLI tools that let Claude search live job listings during /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.
The four Danish skills share the same CLI contract (commands, flags, output shape, error format) as the LinkedIn skill and any skills you generate with /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:
# Software engineer roles in Berlin
bun run .agents/skills/linkedin-search/cli/src/cli.ts search \
  -q "software engineer" -l "Berlin, Germany" --jobage 7 --format table

# Data roles in Mumbai
bun run .agents/skills/linkedin-search/cli/src/cli.ts search \
  -q "data engineer" -l "Mumbai, Maharashtra, India" --format table

# Fully remote paralegal roles
bun run .agents/skills/linkedin-search/cli/src/cli.ts search \
  -q "paralegal" -l "Remote" --format table

# Get full details for a specific posting
bun run .agents/skills/linkedin-search/cli/src/cli.ts detail 4426311357 --format plain
Automated access to LinkedIn is against LinkedIn’s Terms of Service. Use linkedin-search for personal job searching only. Keep request volume low and do not use it for commercial or bulk data collection.

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.
1

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.
2

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.txt to check whether search and detail paths are disallowed
If the portal requires login to view listings, the command stops and tells you. Auth-walled portals cannot be supported with this pattern.If 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.
3

The skill is scaffolded

The command generates .agents/skills/<name>/ with this layout:
<name>/
├── SKILL.md              # Skill definition with trigger phrases in English and the local language
├── url-reference.md      # Endpoint documentation from the investigation step
└── cli/
    ├── package.json
    ├── tsconfig.json
    ├── README.md
    ├── src/
    │   ├── cli.ts        # Arg parsing, help text, command dispatch
    │   ├── helpers.ts    # Fetch with backoff, parsers, error writer
    │   └── commands/
    │       ├── search.ts
    │       └── detail.ts
    └── tests/
        └── helpers.ts    # runCLI + parseJSON test utilities
The generated skill follows the same contract as the shipped skills: 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.
4

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.
5

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

/add-portal --list
This reads every .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:
AspectRequirement
Commandssearch 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
ErrorsWritten to stderr as { "error": "...", "code": "..." }, exit code 1
DependenciesZero runtime dependencies by default (plain bun + fetch); bun install only pulls dev types
FetchingBrowser User-Agent, exponential backoff with jitter on 429/5xx, null on 404
The zero-dependency default means a generated skill runs on a fresh clone with nothing but bun. Only add a parsing library if the portal’s markup genuinely defeats chunked regex parsing, and document the reason in the skill’s README.

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.

Build docs developers (and LLMs) love