Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
CHROME_PATHNoPath to Chrome executable. Used by render_pdf. Default: auto-detected (macOS app bundle, Linux $PATH, common Windows install dirs).
ADZUNA_APP_IDNoAdzuna app ID. Used by search_jobs. Default: unset — Adzuna skipped.
ADZUNA_APP_KEYNoAdzuna app key. Used by search_jobs. Default: unset — Adzuna skipped.
ADZUNA_COUNTRYNoAdzuna country. Used by search_jobs.pl
JSEARCH_COUNTRYNoJSearch country. Used by search_jobs.us
LINT_RULES_PATHNoPath to lint rules YAML file. Used by lint_cv. Default: bundled config/lint_rules.example.yaml.
SEARCH_CACHE_DIRNoDirectory for search cache. Used by search_jobs.~/.cache/mcp-job-search/search
RAPIDAPI_JSEARCH_KEYNoRapidAPI JSearch key. Used by search_jobs. Default: unset — JSearch skipped.
REGISTRY_CONFIG_PATHNoPath to registry config YAML file. Used by log_application. Default: bundled config/registry.example.yaml.
SEARCH_CACHE_TTL_SECONDSNoSearch 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

CapabilityDetails
tools
{
  "listChanged": false
}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}

Tools

Functions exposed to the LLM to take actions

NameDescription
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 fields dict, so this also works against registries with custom/non-English column names.

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

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

A4.5/5.0

Scored across 7 tools

Disambiguation4/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness4/5

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.

Maintenance

ActivityMaintained
ResponsivenessNo issues