# Job Search MCP (npm · @servation/job-search-mcp)

Claude searches real job boards, scores each job 0-100 for fit, and shows a ranked board.

- Trust score: 64/100 (medium)
- Change this week: +36
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-07

## Components

- npm · `@servation/job-search-mcp`: 64/100 (this document), [markdown](https://verifymcp.io/servers/servation-job-search-mcp/servation-job-search-mcp.md), [page](https://verifymcp.io/servers/servation-job-search-mcp/servation-job-search-mcp)

## Channel facts

- Registry: `npm`
- Package: `@servation/job-search-mcp`
- Version: `0.1.2`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-07.

- **Supply Chain Security**: 87/100
  - No malware found by supply-chain analysis.
  - Known CVEs were checked across the 96 of 100 dependencies we could resolve, so this covers what we could see, not the whole tree.
  - No install/post-install scripts declared.
  - Dependency health was assessed across the 96 of 100 dependencies we could resolve, so this covers what we could see, not the whole tree.
- **Provenance & Transparency**: 45/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 29 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 40/100
  - 0% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 1681 tokens (~152/item across 11 items; 10 tools + 1 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 40/100
  - Stability observed for 12 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
  - Structured output schemas are declared (20% of tools); any adoption earns full credit.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.
  - Supports UI / widget rendering.

## Install

### Claude

```bash
claude mcp add servation-job-search-mcp -- npx -y @servation/job-search-mcp
```

### Codex

```bash
codex mcp add servation-job-search-mcp -- npx -y @servation/job-search-mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "servation-job-search-mcp": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "@servation/job-search-mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add servation-job-search-mcp --command npx --arg -y --arg @servation/job-search-mcp
```

### Hermes

```yaml
mcp_servers:
  servation-job-search-mcp:
    command: "npx"
    args: ["-y", "@servation/job-search-mcp"]
```

### Other

```json
{
  "mcpServers": {
    "servation-job-search-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@servation/job-search-mcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-06 (score 64, +1)

No change was recorded against any check on this day. Stability & Change Management went from 33 to 37. That category is still filling its 30-day observation window: 10 days of observed history at the previous scan, 11 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-08-04 (score 63, +5)

- [functional improvement] Stability: unverified → 0.30

### 2026-08-03 (score 58, +15)

- [security regression] Provenance: unverified → fail
- [security improvement] Known CVEs: unverified → partial
- [security improvement] Install scripts: unverified → pass
- [functional improvement] Maintenance: unverified → pass
- [functional improvement] Dependency health: unverified → partial
- [functional improvement] License: unverified → pass
- [functional] Licence: MIT

### 2026-08-02 (score 43, +15)

- [security improvement] Malware scan: unverified → pass

### 2026-07-31 (score 28, −3)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-30 (score 31, −40)

- [security regression] Install scripts: pass → unverified
- [security regression] Provenance: fail → unverified
- [security regression] Known CVEs: partial → unverified
- [security regression] Malware scan: pass → unverified
- [functional regression] Maintenance: pass → unverified
- [functional regression] Dependency health: partial → unverified
- [functional regression] License: pass → unverified
- [functional] Licence: MIT

### 2026-07-27 (score 71, +28)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-26 (score 43)

First indexed and scored.

## MCP tools (10)

### `find_jobs` (~397 tokens)

Find Jobs

Source live jobs (LinkedIn + Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Hacker News, RemoteOK, Remotive), dedup them, and return them as text with full descriptions. Uses the saved profile's roles/location by default; pass query/location/filters to override. This returns UNSCORED jobs and does NOT show a card UI — immediately score all of them with evaluate_jobs (a 0-100 fit score + reason each), then show_board once, to present the single ranked board. Do not just list them back.

Input parameters:

- `date_posted` (string): Recency filter (LinkedIn).
- `experience_level` (string): Seniority filter (LinkedIn).
- `job_type` (string): Employment type (LinkedIn).
- `limit` (number): Max jobs to return/persist this run (default 15).
- `location` (string): Location filter, e.g. 'California' or 'Remote'. Overrides the profile's search location.
- `max_applicants` (number): Surface low-applicant LinkedIn jobs (uses LinkedIn's early-applicant filter, ~under 25). Exact applicant-count filtering requires the LinkedIn cookie.
- `max_years` (number): Candidate's years of experience for this search (overrides the saved profile); also defaults the seniority filter.
- `query` (string): Role/keyword filter, e.g. 'backend java spring'. Overrides the profile's target roles.
- `remote` (string): Workplace type (LinkedIn); also sets remote preference.
- `salary_min` (number): Minimum annual salary filter (LinkedIn), e.g. 100000.
- `sort_by` (string): LinkedIn result ordering.
- `sources` (array): Restrict to these sources (default: all).
- `verify_urls` (boolean): If true, network-verify each job URL (slower). Default false.

### `evaluate_jobs` (~210 tokens)

Evaluate Jobs

Score one or more sourced jobs for THIS candidate (holistic). YOU assign each job a 0-100 fit score directly, using the candidate summary (shown in find_jobs / whats_promising) and the job description. Weigh the must-have requirements, the candidate's actual skills and years of experience (a role demanding far more seniority/years than the candidate has should score LOWER), domain fit, and standout strengths. Calibrate and use the FULL range — do not bunch everything at 80+: 80-100 = strong fit and realistic; 60-79 = good with real gaps; 40-59 = partial/stretch (e.g. wrong level); below 40 = poor or wrong field. Pass { job_id, score, reason } per job. Use the EXACT bracketed ids; do not invent them. Score every job in one call. Returns text; call show_board afterward to display the ranked board.

Input parameters:

- `evaluations` (array, required): One entry per job to score.

### `set_status` (~128 tokens)

Set Job Status

Triage a job by id: 'saved' (interested/tracking), 'applied' (also stamps the date), 'interviewing', 'offered', 'dismissed' (skip), or 'discovered' (undo back to the board). Moves it between the scanned/saved/dismissed lists and persists. Optionally attach notes. Called by the review UI; also usable directly.

Input parameters:

- `job_id` (string, required): The job's id.
- `notes` (string): Optional notes to attach to the job.
- `status` (string, required): New triage status.

Output parameters:

- `count` (number)
- `jobs` (array)
- `profile`
- `scored` (boolean)
- `view` (string)

### `bulk_status` (~183 tokens)

Bulk Triage

Triage MANY board jobs at once by score and/or source — e.g. dismiss every scored job under 60. Applies `status` to all scanned (board) jobs matching the filters; the server selects them, so you do NOT need the individual job ids. `below_score`/`above_score` match SCORED jobs only (use clear_jobs for un-evaluated ones). Provide at least one filter. Returns text; call show_board afterward to display.

Input parameters:

- `above_score` (number): Match scored jobs with matchScore AT OR ABOVE this.
- `below_score` (number): Match scored jobs with matchScore BELOW this (e.g. 60).
- `notes` (string): Optional note to attach to every matched job.
- `source` (string): Restrict to one source.
- `status` (string, required): Status to apply to every match.

### `whats_promising` (~136 tokens)

What's Promising

List the current job board as text: every scored job (with its id) and any UNSCORED jobs with their ids + descriptions so you can evaluate them. To score the unscored ones, call evaluate_jobs with the EXACT bracketed ids shown. Use this to review jobs already found (find_jobs only returns brand-new ones). To re-score jobs that ALREADY have a score, use rescore_board instead. To DISPLAY the board widget to the user, call show_board (this returns text for you to act on).

Input parameters:

- `limit` (number): Max unscored jobs to surface for evaluation (default 15).

### `rescore_board` (~129 tokens)

Re-score Board

Re-score the WHOLE board from scratch — every job, INCLUDING ones that already have a score. Use this when the user asks to 'rescore'/'re-evaluate' the board or after the scoring approach changed. Returns all board jobs with their ids + descriptions; call evaluate_jobs with a FRESH { job_id, score, reason } for EACH (do not skip already-scored ones), then call show_board. Set include_saved=true to also re-score the saved/applied tracker.

Input parameters:

- `include_saved` (boolean): Also re-score the saved/applied tracker jobs (default false).

### `save_profile` (~214 tokens)

Save Resume Profile

Extract the candidate's profile from their resume text (which the user pastes in chat) and save it. Pull: full name; core technical skills; suggested target roles; preferred/search location; total years of professional experience (integer); and pass the resume text as rawText. The profile is used by find_jobs (target roles + location) and by scoring (years of experience drives the experience penalty), so set yearsOfExperience accurately. Merges with any existing profile.

Input parameters:

- `blockedCompanies` (array): Companies to exclude from sourcing.
- `name` (string): Candidate's full name.
- `prefersRemote` (boolean): Whether the candidate prefers remote.
- `rawText` (string): The full resume text, stored for reference.
- `searchLocation` (string): Preferred location, e.g. 'California' or 'Remote'.
- `skills` (array): Core technical skills.
- `targetRoles` (array): Suggested target job titles.
- `yearsOfExperience` (number): Total years of professional experience (integer).

### `review_saved` (~59 tokens)

Review Saved Jobs

List the tracker as text: jobs marked saved (interested) or applied, with their status, score, and notes. Use this to see what you're tracking or have applied to. To DISPLAY the tracker widget, call show_board with view='saved'.

### `clear_jobs` (~106 tokens)

Clear Jobs

Clear jobs from the review board. which='unscored' (default) removes only the not-yet-evaluated leftovers; which='all' clears the whole board. Saved/applied jobs (the tracker) and dismissed jobs are NOT affected — dismissed jobs still won't be re-sourced. Returns text; call show_board to display.

Input parameters:

- `which` (string): 'unscored' (default) clears un-evaluated jobs; 'all' clears the whole board.

### `show_board` (~113 tokens)

Show Board

Display the job board (or the saved/applied tracker) as an interactive widget. Call this ONCE, at the end of a request, after doing the work (find_jobs/evaluate_jobs/bulk_status/clear_jobs/whats_promising are text-only and do NOT render). view='board' (default) shows the ranked board; view='saved' shows the tracker.

Input parameters:

- `view` (string): 'board' (default) = the ranked board; 'saved' = the applied/saved tracker.

Output parameters:

- `count` (number)
- `jobs` (array)
- `profile`
- `scored` (boolean)
- `view` (string)

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/servation-job-search-mcp/servation-job-search-mcp#diagnostics

## Score history

- 2026-08-07: 64
- 2026-08-06: 64
- 2026-08-05: 63
- 2026-08-04: 63
- 2026-08-03: 58
- 2026-08-02: 43
- 2026-08-01: 28
- 2026-07-31: 28
- 2026-07-30: 31
- 2026-07-28: 71
- 2026-07-27: 71
- 2026-07-26: 43

## Links

- npm package: https://www.npmjs.com/package/@servation/job-search-mcp
- Socket report: https://socket.dev/npm/package/@servation/job-search-mcp
- Repository: https://github.com/Servation/job-search-mcp
- Changelog RSS feed: https://verifymcp.io/servers/servation-job-search-mcp/servation-job-search-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/servation-job-search-mcp/servation-job-search-mcp.json
- HTML version of this page: https://verifymcp.io/servers/servation-job-search-mcp/servation-job-search-mcp
