mcp-job-search
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| CHROME_PATH | No | Path to Chrome executable. Used by render_pdf. Default: auto-detected (macOS app bundle, Linux $PATH, common Windows install dirs). | |
| ADZUNA_APP_ID | No | Adzuna app ID. Used by search_jobs. Default: unset — Adzuna skipped. | |
| ADZUNA_APP_KEY | No | Adzuna app key. Used by search_jobs. Default: unset — Adzuna skipped. | |
| ADZUNA_COUNTRY | No | Adzuna country. Used by search_jobs. | pl |
| JSEARCH_COUNTRY | No | JSearch country. Used by search_jobs. | us |
| LINT_RULES_PATH | No | Path to lint rules YAML file. Used by lint_cv. Default: bundled config/lint_rules.example.yaml. | |
| SEARCH_CACHE_DIR | No | Directory for search cache. Used by search_jobs. | ~/.cache/mcp-job-search/search |
| RAPIDAPI_JSEARCH_KEY | No | RapidAPI JSearch key. Used by search_jobs. Default: unset — JSearch skipped. | |
| REGISTRY_CONFIG_PATH | No | Path to registry config YAML file. Used by log_application. Default: bundled config/registry.example.yaml. | |
| SEARCH_CACHE_TTL_SECONDS | No | Search cache TTL in seconds. Used by search_jobs. | 21600 |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| search_jobsA | Searches real job-board APIs (Arbeitnow — free, always on; Adzuna and JSearch — only if their API keys are configured via environment variables). Returns normalized jobs plus a list of source errors (e.g. a source skipped because its key isn't set) — never raises on a single source's failure. Results are cached by query for SEARCH_CACHE_TTL_SECONDS (default 6h) to protect JSearch's free quota; pass use_cache=False to force a fresh query. This does NOT scrape or search sites without a public API (e.g. NoFluffJobs, JustJoin.it, Pracuj.pl) — use fetch_job_posting for a specific URL on those instead. |
| fetch_job_postingA | Fetches ONE job-posting URL you already found (any job board, including ones with no public API) and extracts its readable text generically. This is for a single posting a human found manually — never call it in a loop to enumerate a site's listings. |
| render_pdfA | Renders one CV/cover-letter HTML file to PDF via headless Chrome, using the exact flags known not to hang or silently drop output. Checks both the exit code and the actual PDF page count — call this once per file, never in a batch loop on the same Chrome profile. |
| lint_cvA | Read-only — never modifies html_path, pdf_path, or any other file. Lints a CV/cover-letter HTML file against YOUR OWN configurable rule set (banned phrases, skills-section bans, achievement-weight overclaims, title/GDPR/link checks, page-count limits), read from LINT_RULES_PATH (an env var, not a parameter here; defaults to a bundled generic example). Mechanical matching only — cannot catch semantic fabrication (two true facts combined into a false-sounding one), which still needs a human or independent review. Call before render_pdf while iterating on a draft (cheap, no Chrome, HTML-only checks); call again after render_pdf with pdf_path to also check page count and staleness — render_pdf itself runs none of this. |
| log_applicationA | Mutates the registry file — appends one new row, it does not check for an existing one first. Call list_applications(company=...) beforehand if you need to avoid logging a duplicate. Target file and column layout come from REGISTRY_CONFIG_PATH (default: the bundled generic example). Never invents text for free-text fields — only places exactly what you pass. Use dry_run to preview the row and insertion point without writing. To change an existing row's status later, use update_application_status instead of calling this again. |
| list_applicationsA | Read-only — never modifies the registry file. Returns rows from your application registry, optionally filtered by portal (exact, case-insensitive section heading) and/or company (case-insensitive substring match). Call this before log_application to check whether you've already applied to a company — the registry's own '## ' structure and column layout are returned as-is via each entry's |
| update_application_statusA | Mutates the registry file — rewrites one row's status cell in place, leaving every other cell and the file's row order untouched. Finds the row by portal (exact) + company (case- insensitive substring); if more than one row matches, nothing is written and the error lists the matching line numbers — pass role to disambiguate instead of guessing which one was meant. Use dry_run to preview old_row/new_row without writing. Call list_applications first if you're not sure a row exists. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 7 tools
Each tool has a clearly distinct action: search_jobs queries APIs while fetch_job_posting grabs one known URL, the three registry tools map cleanly to create/read/update, and lint_cv vs render_pdf are separate phases. The only mild overlap is search_jobs vs fetch_job_posting (both job-finding), but the descriptions explicitly draw the boundary.
All seven tools follow a consistent snake_case verb_noun pattern (fetch_job_posting, lint_cv, log_application, list_applications, update_application_status, render_pdf, search_jobs). No camelCase or stylistic drift.
Seven tools is well-scoped for a job-search assistant covering search, capture, CV lint/render, and an application registry. Each tool earns its place with no redundant entries.
The workflow is largely covered: find jobs, fetch postings, lint and render a CV, and log/list/update applications. Gaps remain in registry lifecycle — no delete/remove row and no way to edit free-text fields beyond status — but these are minor workarounds.