Skip to main content
Glama
andrewaws26

Claude Works

by andrewaws26

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
JOBSEARCH_DATA_DIRNoDirectory holding the ledger, queue, and policy documents. Defaults to the package parent.
JOBSEARCH_COMP_FLOORNoBase compensation floor in USD per year.
JOBSEARCH_APPLY_EMAILNoContact email, read at submission time only.
JOBSEARCH_APPLY_PHONENoContact phone, read at submission time only.
JOBSEARCH_RESUMES_DIRNoDirectory holding the resume generator and render pipeline.
JOBSEARCH_APPLY_LOCATIONNoContact location, read at submission time only.
JOBSEARCH_APPLY_PASSWORDNoPortal credentials password, read from the environment only and never stored.
JOBSEARCH_APPLY_USERNAMENoPortal credentials username, read from the environment only and never stored.
JOBSEARCH_PURSUE_THRESHOLDNoThe 0 to 10 score at or above which a role is pursued.

Capabilities

Features and capabilities supported by this server

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

Tools

Functions exposed to the LLM to take actions

NameDescription
discover_jobsA

Find fresh roles from a discovery source, ranked by fit, de-duped by role.

Args: angle: a search lens from SEARCH_ANGLES.md (e.g. "FDE", "IoT") to bias ranking toward that lane. Empty = the default lane. source: which sweep to run. "boards" (default) queries the public Ashby/Greenhouse/Lever posting APIs over the seed_boards org list in policy.json and works from a bare install. "demo" returns canned fictional roles offline. "newsource"/"getro"/"anthropic"/ "board_harvest" wrap private harvest scripts in the data dir and fail loudly when absent. For a much wider net, pair this with the JobDataLake MCP (search_jobs) and feed its results to score_job. limit: max roles to return.

Returns a list of job dicts (title, company, url, source, location, remote, ats, role_key). Roles the rails hard-cap always rank below clean ones.

fetch_job_descriptionA

Fetch a posting's title, location, and plain-text JD from its ATS URL.

Supports Ashby, Greenhouse, and Lever job URLs via their public posting APIs (the same ones the boards sweep uses). Use the returned text as score_job's jd_text: titles under- and over-sell, so scoring on the JD is sharper, and the body is the only reliable place to catch in-office requirements hiding behind a remote flag. Returns {error} when the URL is unrecognized or the org disabled its public API (a board 404 does NOT mean the role closed; check the live page before recording it closed).

fetch_verification_codeA

Read the newest ATS email-verification code from the applicant's own inbox.

For the emailed-code gate some ATSes put in front of the final submit: this is email-OWNERSHIP verification of the applicant's own application, which the applicant has authorized, NOT a captcha. Scoped and read-only: only recent mail from known ATS sender domains is considered, via IMAP BODY.PEEK with a revocable app password from the environment. Returns {status, code?}. NO_CODE_FOUND right after submit usually means the mail is in transit; wait ~8s and retry (up to 3x) before parking. Never use this reasoning for captchas or no-AI attestations: those always park for the human.

curate_queueA

Triage the discovery queue into a fit-ranked active set and a parked set.

Runs the curation pass over up to limit queue entries with the given queue status: every job is either KEPT with a fit score (active, ranked best-match first, so the loop applies to the strongest open role next) or PARKED with an auditable reason (off-lane, over-level, non-US, onsite-hybrid, model-training, excluded, already-applied, hard-skill-gap, ...). Already-applied detection uses the ledger's company and ATS-org slugs. Nothing is discarded; parked roles keep their reason so a human can review or restore them. Returns {active, parked, counts}.

score_jobA

Score one role 0-10 against FIT_RUBRIC.md and return the pursue verdict.

Pass the JD text when available; titles under- and over-sell, so scoring on the JD is sharper. Returns value (0-10), pursue (bool, >= threshold and no hard cap), reasons (one line per signal), and hard_cap (set when a required-skill gap, over-level title, non-US-only, or excluded domain/company disqualifies it).

get_search_angleA

Look up one search angle (lens) by name or trigger from SEARCH_ANGLES.md.

Empty name returns the default (FDE / converting-profile) lane. Returns the angle's name, trigger phrase, definition, and target titles, or null if no angle matches.

list_search_anglesA

List every search angle defined in SEARCH_ANGLES.md (name, trigger, definition).

list_claim_fragmentsA

List the verified resume building blocks from _genlib.py (roles, bullets, projects).

Every fragment traces to CLAIMS_BANK.md. Build resumes only from these names (or text that traces to the claims bank); this is what keeps the output honest.

build_resumeA

Build a tailored one-page resume from verified fragments and run the static gates.

Args: name: output file stem (becomes ".html" in the resumes dir). tagline: the header tagline (mid-level; no over-level words). summary: the summary paragraph. experience: list of [role_key, [bullet, ...]] where role_key is one of bnb / twinspires / upwork / humana / tesla / dojo / lifespring, and each bullet is a fragment NAME (e.g. "BNB_AI") or text tracing to CLAIMS_BANK. projects: list of project fragment names (e.g. "P_CASEK") or verified HTML. skills: list of [label, text] rows for the Skills block.

Returns the resume with lint_ok / verify_ok and any findings. The 1-page render gate runs separately via render_resume (it needs Chrome).

render_resumeA

Render .html to PDF via _render.sh and report whether it is one page.

Returns the resume with one_page set and the pdf_path. Requires Google Chrome and qpdf. This is the first of the 4 gates.

verify_resumeA

Run the two static gates (lint + anti-fabrication verify) on a resume HTML.

Use this to check any resume on disk. Returns lint_ok, verify_ok, passed (their AND), and findings: every blocklist hit (C/C++, fabricated employer, model over-claim, ...) and style flag (banned words, em dashes, rule-of-three).

submit_applicationA

Build the fill-and-park submission plan for a role (no browser is driven here).

Returns a plan an agent executes with the Playwright MCP: the ATS, the action ("auto_submit" for Ashby/Greenhouse, "fill_and_park" for Lever/Workday/captcha walls, or "blocked" for a rail violation), the standard field values and honest screening answers, the single human_step left when parked, and ATS-specific gotcha notes. Identity PII and credentials are read from the environment, never stored. Report the real outcome afterward with record_application.

record_applicationA

Append one row to the application ledger (applications.json), de-duped by role.

Status mirrors the existing vocabulary ("submitted", "submitted-verified", "deferred-captcha", "skipped-overlevel", ...). Date defaults to today. Returns whether it was recorded (false if this company+role is already logged) and the new total.

list_queueA

List roles in the discovery queue (top300_jobs.json) by queue status.

Status is the queue's own field ("todo" by default). Returns up to limit job dicts. Use this to apply from the existing queue before running new discovery (the queue-first gate).

list_applicationsA

List ledger rows, optionally filtered by status. Empty status = all rows.

ledger_summaryA

Return a count of ledger rows by status (a one-glance system summary).

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/andrewaws26/claude-works'

If you have feedback or need assistance with the MCP directory API, please join our Discord server