MCP Job Toolkit
by afrozk
README.md
# MCP Job Toolkit
An MCP (Model Context Protocol) server that searches for jobs across Australian job platforms from inside Claude or any MCP-compatible client.
## Platforms
| Platform | Notes |
| --- | --- |
| **Seek** | Parses Apollo SSR cache from `au.seek.com` |
| **LinkedIn** | Guest jobs API, includes applicant count where available |
## Installation
**Prerequisites:** Node.js 18+
```bash
git clone https://github.com/afrozk/mcp-job-toolkit.git
cd mcp-job-toolkit
npm install
npm run build
```
## Claude Desktop Setup
Add to `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) or `%APPDATA%\Claude\claude_desktop_config.json` (Windows):
```json
{
"mcpServers": {
"mcp-job-toolkit": {
"command": "node",
"args": ["/absolute/path/to/mcp-job-toolkit/dist/index.js"]
}
}
}
```
Restart Claude Desktop. The `search_jobs` tool will appear automatically.
## Usage
Once connected, ask Claude naturally:
> *"Find contract backend engineer roles in Melbourne posted in the last 7 days"*
> *"Search for full-time data analyst jobs in Sydney with salary above $100k/year on Seek"*
> *"Show me software engineer roles in Brisbane with fewer than 20 applicants"*
## Tool: `search_jobs`
### Parameters
| Parameter | Type | Default | Description |
| --- | --- | --- | --- |
| `keyword` | string | **required** | Job title, role, or skill (e.g. `"software engineer"`) |
| `location` | string | **required** | Australian city or suburb (e.g. `"Melbourne VIC"`, `"Sydney"`) |
| `radius` | number | `50` | Search radius in km |
| `employment_type` | array | all | `"fulltime"`, `"parttime"`, `"contract"`, `"casual"` |
| `salary_type` | string | — | `"hourly"`, `"monthly"`, `"yearly"` |
| `salary_min` | number | — | Minimum salary in the unit matching `salary_type` |
| `salary_max` | number | — | Maximum salary |
| `date_posted` | string | — | `"24h"`, `"2d"`, `"3d"`, `"7d"`, `"30d"` |
| `max_applications` | number | — | Exclude jobs with more applicants than this (where exposed) |
| `platforms` | array | all | `"seek"`, `"linkedin"` |
| `page` | number | `1` | Page number |
| `per_page` | number | `10` | Results per page per platform (max 25) |
### Example tool call
```json
{
"keyword": "senior backend engineer",
"location": "Melbourne VIC",
"radius": 30,
"employment_type": ["contract", "fulltime"],
"salary_type": "yearly",
"salary_min": 120000,
"date_posted": "7d",
"max_applications": 25,
"platforms": ["seek", "linkedin"],
"per_page": 10
}
```
### Response shape
```json
{
"results": [
{
"platform": "seek",
"jobs": [
{
"id": "seek-91878509",
"title": "Senior Backend Engineer",
"company": "Acme Corp",
"location": "Melbourne VIC",
"salary": "$140,000 – $160,000 per year",
"description": "We are looking for...",
"url": "https://au.seek.com/job/91878509",
"posted_at": "2026-05-04T01:54:46.000Z",
"applications_count": null,
"platform": "seek"
}
],
"total": 41,
"page": 1
},
{
"platform": "linkedin",
"jobs": [],
"page": 1
}
],
"summary": [
{ "platform": "seek", "count": 10, "total": 41 },
{ "platform": "linkedin", "count": 8 }
],
"fetched_at": "2026-05-05T00:00:00.000Z"
}
```
## Development
```bash
# Run without building (uses tsx)
npm run dev
# Rebuild after changes
npm run build
# Run built server
npm start
```
## License
MIT
TDQS
A3.7/5.0
Scored across 1 tool
Disambiguation5/5
Only one tool exists, so there is no potential for confusion with other tools. The tool's purpose is clearly defined.
Naming Consistency5/5
With a single tool, the naming follows a consistent verb_noun pattern ('search_jobs'), which is clear and predictable.
Tool Count3/5
One tool is on the low end for a 'toolkit,' feeling thin but acceptable for a focused search-only server. It borders the threshold of being too few.
Completeness2/5
The server only provides search functionality, lacking other expected operations like retrieving job details, saving jobs, or managing applications. The surface is incomplete for a comprehensive job toolkit.
Maintenance
ActivityInactive
ResponsivenessNo issues