job-hunting-organizer
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| JHO_DATA | No | Override the data root directory (default `~/job-hunting-organizer-data/`) | |
| LLM_TAGS | No | Comma-separated `key=value` tags sent on every LLM call (e.g. `user=jho`). Some providers (notably Nous Research's inference gateway) require a `user=<value>` tag or return `400 missing tags`. `jho` ships with a default `user=jho` tag so this is handled automatically for Nous; override it here if you need a different value. | |
| NO_COLOR | No | Set to disable ANSI colour output in terminal output | |
| LLM_MODEL | No | Override the model from `config.json` | |
| JHO_CV_PATH | No | Pre-fill the CV path during `jho init` | |
| LLM_API_KEY | No | Override the API key from `config.json` | |
| JHO_LOG_FILE | No | Override the log file path (default `<config-home>/jho.log`); set to any falsy value via `logging.disableFileLogging` in `config.json` to suppress file logging | |
| LLM_BASE_URL | No | Override the LLM endpoint base URL from `config.json` | |
| JHO_LOG_LEVEL | No | Override the minimum log level written to file | |
| JHO_CONFIG_HOME | No | Override the config home directory (default `~/.job-hunting-organizer/`) | |
| JHO_LINKEDIN_URL | No | Pre-fill the LinkedIn profile URL during `jho init` | |
| JHO_URL_PATTERNS | No | JSON array of `{ name, pattern, group }` URL-pattern objects used to extract job IDs from job ad URLs; tried before the built-in Seek/LinkedIn/Indeed patterns | |
| JHO_DEFAULT_CAMPAIGN | No | Default campaign name when `--campaign` is omitted (default `default`) |
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": true
} |
| prompts | {
"listChanged": true
} |
| resources | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_applicationsC | List applications with optional status, tags, role, employment type, and text filters |
| show_applicationB | Show a single application: metadata (meta.md) and job description (jd.md) |
| list_interviewsB | List all interviews for an application |
| read_profileB | Read the candidate profile for a campaign |
| get_statsA | Compute campaign statistics: counts by status, role, site, employment type, funnel, interview entries, and this-month delta |
| get_rootB | Resolve the campaign root directory path |
| get_campaignC | Get campaign configuration (secrets redacted) |
| list_campaignsB | List all campaigns under the data root |
| ownershipA | Show file ownership rules (which files the tool writes, which you can edit). Returns a human-readable markdown table, not JSON. |
| doctorA | Diagnose campaign or application issues (missing files, invalid frontmatter, toolhash mismatches) |
| repairC | Repair application toolhash sidecars, rebuild index and counters |
| track_applicationB | Track a job application — create from URL or update by slug |
| add_interviewC | Add a new interview entry for an application |
| mark_interviewC | Change the status of an existing interview |
| update_profileB | Overwrite the campaign profile.md with new markdown content |
| update_configC | Update global configuration settings |
| initB | Initialize a new campaign with optional CV, GitHub, and LinkedIn. Pass |
| post_mortemC | Generate a post-mortem learning plan for an application |
| append_retroC | Append additional weak topics and notes to an existing retro |
| cover_letterC | Generate a tailored cover letter for an application |
| read_cover_letterB | Read an existing saved cover letter for an application |
| answer_questionB | Answer a question for an application and append it to qa.md |
| extract_jdC | Extract structured job description from a URL or raw text |
| prepareA | Generate or add topics to a pre-interview prep plan. Provide topics to append to an existing plan (steer/days ignored in this mode). |
| aggregate_retrosC | Aggregate weak topics across all application retro files for a campaign |
| read_configA | Read global configuration (secrets redacted) |
| read_logsB | Read the log file with optional filtering (tail, level, JSON format) |
| read_retroC | Read an existing retro/learning plan for an application |
| read_prepC | Read an existing pre-interview prep plan for an application |
| read_qaC | Read existing Q&A entries for an application |
| remove_applicationB | Permanently remove an application folder — cleans metadata, index, and sidecars |
| rename_applicationC | Rename an application folder |
| remove_campaignB | Permanently remove a campaign folder — destructive, cannot be undone |
| rename_campaignC | Rename a campaign folder |
| read_campaign_configB | Read campaign configuration (redacted) |
| kb_addB | Copy knowledge-base docs (PDF, DOCX, MD, TXT) into the campaign |
| kb_updateC | Re-sync the knowledge base from sources recorded at init |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| cover_letter | Generate a tailored cover letter for an application |
| interview | Generate a pre-interview prep plan for an application |
| answer | Answer a question for an application |
| extract_jd | Extract structured job description from a URL or raw text |
| retro | Generate a post-mortem learning plan for an application |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| config | Global configuration |
TDQS
Scored across 37 tools
Most tools target distinct resources and actions, but a few pairs overlap significantly: get_campaign and read_campaign_config both appear to read campaign configuration, and track_application's update mode can be confused with update_profile. Descriptions help clarify most boundaries, but the large surface still creates some ambiguity.
Naming is mostly snake_case and readable, but conventions are mixed: retrieval uses get_, read_, and show_ inconsistently (get_campaign vs read_campaign_config, show_application vs read_profile), and several tools use bare nouns or verbs (ownership, doctor, repair, prepare, init).
37 tools is excessive for a job-hunting organizer, far beyond the well-scoped 3–15 range. Many tools are granular read/generate pairs, and the count suggests feature sprawl rather than a tightly scoped interface.
The surface covers a wide lifecycle: campaigns, applications, profiles, interviews, prep, retros, cover letters, Q&A, stats, knowledge base, config, logs, and diagnostics. Minor gaps exist (e.g., no interview deletion or explicit campaign config update), but core workflows are well supported.