Skip to main content
Glama
andrewaws26

Claude Works

by andrewaws26

Claude Works

CI

An MCP server that turns a perpetual, fit-first job-application pipeline into typed, honest tools an LLM agent can call.

What it is

Claude Works is a Model Context Protocol server built on FastMCP. It exposes a working, autonomous job-application loop (discovery sweeps, fit scoring, a verified resume builder, a fill-and-park submission planner, and an application ledger) as a small set of typed tools.

The point is not to wrap a chatbot around a job board. The point is to put the policy where it cannot drift: in code. An agent calling these tools cannot quietly inflate a fit score, claim a resume passed gates it never ran, or report a submission that did not happen. The honesty lives in the modules, not in a system prompt that the next conversation might forget.

The core (everything except the FastMCP wiring) imports with the standard library only. That keeps the domain logic fast to test, easy to read, and reusable outside the MCP runtime.

Related MCP server: job-search-mcp

Try it in two minutes

The repo ships a demo mode: sanitized sample data for a fictional persona, shaped exactly like the private production files, so every tool works from a fresh clone with zero network access.

git clone https://github.com/andrewaws26/claude-works.git
cd claude-works
pip install -e .

claude mcp add claude-works \
  -e JOBSEARCH_DATA_DIR="$PWD/examples" \
  -e JOBSEARCH_RESUMES_DIR="$PWD/examples/resumes" \
  -- python -m claude_works

Then ask Claude to score a role. This is what "honesty in the modules" looks like on the wire; the agent cannot argue with it:

// score_job(title="Principal Engineer, ML Infrastructure", company="Massive Scale Co", ...)
{
  "value": 5.0,
  "pursue": false,
  "reasons": ["hard cap: over-level title ('principal')"],
  "hard_cap": "over-level title ('principal')"
}

// score_job(title="Forward Deployed Engineer", ..., jd_text="...agentic workflows on
//           Claude with MCP tools, own evals, ... first technical hire.")
{
  "value": 8.5,
  "pursue": true,
  "reasons": [
    "core-stack overlap: agent, agentic, claude, eval, mcp (+4.0)",
    "rare-edge match: forward deployed (+1.0)",
    "level fit: mid / IC / first-hire (+2.0)",
    "clean channel: Ashby/Greenhouse autonomous-submit (+1.0)",
    "remote (+0.5)"
  ],
  "hard_cap": null
}

The examples README walks through the rest: the offline demo discovery source, queue curation with auditable park reasons, and the resume gates (try sneaking "Holds a PhD" into the demo persona's summary and watch verify_ok flip to false).

Architecture

The application loop: 1 sweep the public ATS posting APIs, 2 score fresh jobs 0-10 under the policy.json rails and hard caps, 3 triage the queue (fit-rank or park), 4 take the best match, 5 build a resume from verified claims through 4 fail-closed gates, 6 execute the fill-and-park submit plan (Playwright drives the browser; IMAP handles email codes, never captchas), 7 record to the append-only ledger. The agent only makes typed tool calls; JobDataLake is the optional wide net.

The system is a five-stage pipeline. Each stage is a frozen or plain @dataclass defined in models.py, and each crosses the MCP boundary as a JSON-serializable dict:

SearchAngle  ->  Job  ->  Score  ->  Resume  ->  Application
  • SearchAngle is one reusable search lens (FDE, IoT, and so on). It biases discovery and scoring toward a lane without changing the rules.

  • Job is a single discovered role, normalized across every source. Its role_key (ATS plus org slug plus job id, parsed from the apply URL) is the canonical identity used for de-duplication. De-dup is by role, never by company, so the same company with a different role is allowed.

  • Score is the fit-rubric verdict for a job: a value from 0 to 10, a pursue boolean, one reason line per signal, and a hard_cap field set when a disqualifying signal applies.

  • Resume is a built artifact plus the verdicts of a four-gate verification pipeline (one-page render, style lint, anti-fabrication verify, and an agent claim-trace check).

  • Application is one row in the durable ledger.

Module layout:

Module

Responsibility

models.py

The five dataclasses, the de-dup role_key, and the slug normalizer. Standard library only.

config.py

Paths, the comp floor, the rails (exclusions, over-level terms, hard-gap skills), and environment-only credential reads.

discovery.py

Source sweeps, search-angle parsing, and the scoring function with its hard caps.

curation.py

Queue triage: park poor-fit roles (off-lane, over-level, non-US, excluded, hard-skill-gap, already-applied) with an auditable reason, and fit-rank the rest so the loop applies to the strongest open match first instead of whatever is next in line.

resume.py

The resume builder and the static verification gates.

submission.py

ATS classification and the deterministic fill-and-park plan builder.

tracker.py

Reading and appending the ledger and the discovery queue, de-duped by role.

server.py

The FastMCP wiring. The only module that imports mcp.

Because __init__.py imports only models, import claude_works never requires the MCP runtime, and the unit tests run against the pure core with no network and no third-party dependencies.

Tools

Every tool returns JSON-serializable structures so results flow straight back into the model.

Tool

Contract

discover_jobs

Find fresh roles, ranked by fit and de-duped by role. The default boards source queries the public Ashby/Greenhouse/Lever posting APIs over your seed_boards list and works from a bare install. Hard-capped roles always rank below clean ones.

fetch_job_description

Pull a posting's title, location, and plain-text JD from its ATS URL (headless, via the public posting APIs), so score_job scores on substance.

curate_queue

Triage the discovery queue: keep and fit-rank the genuine fits, park the rest with an auditable reason. Nothing is discarded.

score_job

Score one role 0 to 10 against the fit rubric and return the pursue verdict (with any hard cap).

fetch_verification_code

Read the newest ATS emailed-verification code from the applicant's own inbox (scoped, read-only IMAP): email-ownership verification, never captchas.

get_search_angle

Look up one search lens by name or trigger, or the default lane when the name is empty.

list_search_angles

List every defined search lens (name, trigger, definition).

list_claim_fragments

List the verified resume building blocks (roles, bullets, projects) that trace to the claims bank.

build_resume

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

render_resume

Render a resume to PDF and report whether it is exactly one page.

verify_resume

Run the two static gates (style lint plus anti-fabrication verify) on any resume HTML.

submit_application

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

record_application

Append one row to the ledger, de-duped by company and role.

list_queue

List roles in the discovery queue by queue status (the queue-first gate).

list_applications

List ledger rows, optionally filtered by status.

ledger_summary

Return a count of ledger rows by status.

Install

git clone https://github.com/andrewaws26/claude-works.git
cd claude-works
pip install -e ".[dev]"

Run the checks CI runs (no network needed):

ruff check . && mypy && pytest

Quickstart

Start the server over stdio:

python -m claude_works

Register it with Claude Desktop or Claude Code by adding it to your MCP server config:

{
  "mcpServers": {
    "claude-works": {
      "command": "python",
      "args": ["-m", "claude_works"],
      "env": {
        "JOBSEARCH_APPLY_NAME": "Your Name",
        "JOBSEARCH_APPLY_EMAIL": "you@example.com",
        "JOBSEARCH_APPLY_LOCATION": "City, ST",
        "JOBSEARCH_COMP_FLOOR": "120000",
        "JOBSEARCH_PURSUE_THRESHOLD": "7.0"
      }
    }
  }
}

Configuration

All configuration is environment driven. Nothing sensitive is stored in the repo.

Variable

Purpose

JOBSEARCH_DATA_DIR

Directory holding the ledger, queue, and policy documents. Defaults to the package parent. Readers degrade gracefully when files are absent.

JOBSEARCH_RESUMES_DIR

Directory holding the resume generator and render pipeline.

JOBSEARCH_COMP_FLOOR

Base compensation floor in USD per year.

JOBSEARCH_PURSUE_THRESHOLD

The 0 to 10 score at or above which a role is pursued.

JOBSEARCH_APPLY_NAME, JOBSEARCH_APPLY_EMAIL, JOBSEARCH_APPLY_PHONE, JOBSEARCH_APPLY_LOCATION

Identity and contact fields, read at submission time only. No PII of any kind is hard-coded in the repo; an unset field is omitted from the plan.

JOBSEARCH_APPLY_WEBSITE, JOBSEARCH_APPLY_LINKEDIN, JOBSEARCH_APPLY_GITHUB

Profile links for application forms, read the same way.

JOBSEARCH_APPLY_USERNAME, JOBSEARCH_APPLY_PASSWORD

Portal credentials, read from the environment only and never stored. A missing credential fails loudly instead of silently mis-filling a form.

JOBSEARCH_GMAIL_APP_PASSWORD, JOBSEARCH_IMAP_HOST

Optional, for fetch_verification_code: a revocable app password (never the account password) and the IMAP host (defaults to Gmail). Missing credentials return a status; those submits simply park.

The defaults encode one candidate's policy: his excluded companies (active interview tracks), his skill gaps, his scoring vocabulary. None of that transfers, so none of it requires editing code to change. Drop a policy.json next to your trackers (in JOBSEARCH_DATA_DIR) and any key you define replaces the corresponding default wholesale; examples/policy.sample.json shows every supported key:

Key

Controls

comp_floor, pursue_threshold

The comp floor and the 0-10 pursue gate (env vars still win).

hard_gap_skills

Skills you lack that, when hard-required, disqualify a role.

overlevel_terms, level_ok_signals

What counts as over-level vs level-fit for you.

excluded_domains, excluded_companies

Rails: domains you refuse and companies you must not (re-)apply to.

core_signals, edge_signals

Your scoring vocabulary: daily-stack terms and rare-differentiator terms.

lane_points, off_lane_titles

Curation's title lanes and what gets parked as off-lane.

A policy file that exists but does not parse fails loudly at import; running silently on someone else's exclusion list is exactly the kind of quiet wrongness this codebase refuses.

The fastest path: clone the repo, open Claude Code, type /setup. The bundled command interviews you for example jobs you want and your resume, then derives all of the below from those examples (policy, search angles, seed boards, resume fragments), registers the MCP stack, and smoke-tests the pipeline before handing it over.

What the personalization consists of (all derivable by /setup, all editable by hand):

  • Identity: the JOBSEARCH_APPLY_* environment variables (name, contact, profile links, portal credentials). Nothing personal is in the repo.

  • A queue and ledger: start with empty files; record_application creates the ledger on first append.

  • Search angles: your own SEARCH_ANGLES.md (the demo one shows the format).

  • Resume fragments: the resume tools drive a claims-bank generator; copy examples/resumes/_genlib.py and replace the fragments with claims that are true of you. The gates then hold you to them.

  • Discovery: the built-in boards source works out of the box over your seed_boards orgs. The newsource/board_harvest sources wrap private harvest scripts not in this repo and fail loudly without them.

The full agent stack

This package is the policy brain. A complete, working system is three MCP servers plus the playbooks in this repo:

claude mcp add claude-works -e JOBSEARCH_DATA_DIR=... -- claude-works   # scoring, curation, plans, gates, ledger
claude mcp add playwright -- npx @playwright/mcp@latest                 # executes the submission plans in a real browser
claude mcp add --transport http jobdatalake https://mcp.jobdatalake.com # optional: 1M+ indexed roles, free tier, wide-net discovery

The division of labor: discovery comes from the built-in boards source and/or JobDataLake's search_jobs; every candidate role goes through fetch_job_description and score_job; curate_queue picks the strongest open fit; build_resume/render_resume/verify_resume produce a gated one-pager; submit_application emits the deterministic plan; the agent executes that plan with Playwright following PLAYBOOK.md (every hard-won per-ATS lesson, sanitized); the real outcome lands in the ledger via record_application. OPERATING.md is the loop's operating model: queue-first, honest walls, de-dup semantics, and the standing self-improvement mandate.

Design principles

Honesty is enforced in the modules, not the prompt. Three concrete mechanisms:

  1. Score hard caps. An over-level title (Director, Principal, Staff, and the like), a required-skill gap, a non-US-only role, an excluded domain (defense, surveillance, and so on), or an active interview track caps the score and forces pursue=False. The agent cannot score its way past a disqualifier.

  2. Gate findings, not claims. The resume tools return the actual results of the lint and anti-fabrication gates with the specific findings attached. A resume is reported as passing only when every automated gate ran and passed.

  3. Fill-and-park plans, not faked submits. submit_application returns a deterministic plan (the ATS, the action, the field values, the honest screening answers, and the one human step left when parked). It never drives a browser and never reports a submission that did not happen. The real outcome is recorded afterward through record_application.

A self-improving ATS playbook. submission.py carries an ATS_GOTCHAS table: hard-won, per-ATS form-handling tactics (Ashby labeled-radio focus-plus-Space, Lever's hidden resume input behind an hCaptcha, Workable masked-date sequential typing, Hirebridge's ASP.NET postback cascade and FormValidation-gated submit, and so on). Every plan carries the relevant tactics so the browsing agent does not relearn them each run. When a better way to fill or submit a form is found, it is appended here and committed, so the knowledge persists across instances the way a person remembers a shortcut.

Typed dataclass boundaries. Every value that crosses a tool boundary is one of the five core dataclasses with an explicit to_dict. The schema is the contract, and the contract is the same whether a record was written by this server or by the underlying loop. The package ships a py.typed marker, and CI type-checks it with mypy.

A ledger that survives concurrency. Parallel loop instances share one applications.json. Every append holds an exclusive lock for the whole read-modify-write and lands via an atomic temp-file replace, so concurrent writers cannot drop each other's rows and a crash mid-write cannot corrupt the file. De-dup runs on the (company, role) pair and on the canonical role_key parsed from the apply URL, which catches the same role re-entering under a differently spelled company name.

Zero-dependency, testable core. The domain logic depends on nothing but the standard library. The tests cover the slug and role-key normalization, the dataclass round-trips, the de-dup-by-role behavior, the scoring hard caps, the curation park reasons, the submission planner, the demo fixtures, and the server's tool registry, all without touching the network. CI runs ruff, mypy, and pytest on Python 3.10 through 3.13.

License

MIT. See LICENSE.

Available Tools

16 tools
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).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
skillsYes
summaryYes
taglineYes
projectsYes
experienceYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It describes that static gates run and returns lint_ok/verify_ok and findings, but doesn't elaborate on failure modes or what happens with invalid fragments. Adequate but not comprehensive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Reasonably concise with a clear front-loaded purpose sentence and a bullet list for parameters. Could be slightly more structured, but no wasteful sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers all 6 input parameters and mentions return values (lint_ok/verify_ok and findings). Notes that rendering is separate. Missing some context on static gates and error handling, but overall sufficient for a complex tool with output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description's Args section explains each parameter in detail, including constraints like valid role_keys and bullet formats. This adds significant meaning beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the tool builds a tailored one-page resume from verified fragments and runs static gates. Distinguishes from siblings like render_resume by noting that the 1-page render is separate.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implicitly mentions that render_resume handles the 1-page render separately, but does not explicitly state when to use this tool versus verify_resume or other siblings. Lacks explicit when-to-use or when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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}.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
statusNotodo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It explains the curation process, outcomes (KEPT/PARKED), reasons for parking, that nothing is discarded, and the return shape. It could be more explicit about side effects (e.g., whether it modifies the database).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured into two paragraphs. Every sentence adds value, though it could be slightly more concise. It is front-loaded with the main purpose and then details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is thorough for a complex tool, covering process, outcomes, reasons, and return values. It compensates for lack of annotations and schema descriptions. With an output schema present, the description need not explain return format fully.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so description must explain parameters. It does: 'up to `limit` queue entries with the given queue status' clearly defines both parameters. It also mentions default values. However, it does not enumerate possible status values.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Triage the discovery queue into a fit-ranked active set and a parked set.' It uses specific verbs ('curate', 'triage') and identifies the resource ('discovery queue'). It distinguishes from sibling tool 'list_queue' which only lists without curation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies that this tool is used after discovery to perform curation, but it does not explicitly state when to use it versus alternatives like 'discover_jobs' or 'list_queue'. No when-not-to-use guidance is provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
angleNo
limitNo
sourceNoboards

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden of behavioral disclosure. It explains that the tool queries public APIs or private scripts, returns ranked de-duped results, and mentions failure modes for private sources. This provides sufficient transparency about the tool's behavior and side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with a clear one-liner summarizing the tool's purpose, then uses a structured bullet-like format for parameter explanations. Every sentence adds value, and there is no fluff. It is concise yet comprehensive.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of an output schema (context signals indicate yes), the description doesn't need to detail return values, but it still lists the fields. It covers all parameters, usage context (pairing with other tools), and behavior. For a tool with 3 optional parameters, this is complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does excellently. It explains the 'angle' parameter as a search lens, 'source' as which sweep (with detailed options and behaviors), and 'limit' as max roles. This adds significant meaning beyond the schema's default values.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Find fresh roles from a discovery source, ranked by fit, de-duped by role.' This is a specific verb+resource with additional details (ranked, de-duped) that distinguishes it from siblings like fetch_job_description and search_jobs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit context for when to use this tool versus alternatives, such as 'For a much wider net, pair this with the JobDataLake MCP (search_jobs) and feed its results to score_job.' It also explains the different source options and their behaviors. While it doesn't explicitly state when not to use, the guidance is clear and helpful.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses behavioral traits such as reliance on public posting APIs and possible error returns for unsupported URLs or disabled APIs. Without annotations, the description covers failure modes well but lacks an explicit statement that the operation is read-only.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences that are front-loaded with purpose, followed by supported platforms, a rationale for usage, and error handling. Every sentence adds value with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has an output schema, the description sufficiently covers purpose, supported inputs, error conditions, and usage rationale. No additional information is needed for an agent to correctly invoke this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single 'url' parameter is described in context: expects an ATS URL from supported platforms. This adds substantial meaning beyond the schema's type definition, compensating for 0% schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it fetches a posting's title, location, and plain-text JD from ATS URLs. Specifies supported platforms (Ashby, Greenhouse, Lever) and explains why the JD is preferred over title for scoring, distinguishing it from sibling 'score_job'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit context on when to use (to get JD text for scoring) and includes important caveats about error handling and not assuming a role is closed based on board 404. However, it does not explicitly list alternatives among sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
minutesNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries full burden. It discloses read-only nature, uses IMAP BODY.PEEK with revocable app password, scoped to known ATS domains, return format {status, code?}, and retry logic. This is thorough behavioral disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with a clear summary statement, followed by context and usage notes. It is moderately long but every sentence adds value. Could be slightly tighter but overall well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has only one optional parameter and an output schema, the description covers behavior, safety, and retry logic comprehensively. The only gap is the undocumented 'minutes' parameter, but overall it is quite complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has one parameter 'minutes' with default 15 and 0% description coverage. The description does not mention this parameter at all, failing to add meaning beyond the schema despite the need to compensate for low coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool reads the newest ATS email-verification code from the applicant's own inbox, using a specific verb and resource. This distinguishes it from sibling tools like submit_application or fetch_job_description.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use (for the emailed-code gate) and when not to use (for captchas or no-AI attestations), and provides retry guidance (wait ~8s, retry up to 3x). This is excellent usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully discloses that the tool returns the angle's details or null. It implies a read-only operation and covers the edge case of empty input.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise—two sentences that front-load the purpose and then explain the default behavior. No extraneous words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simple input (one optional parameter) and the existence of an output schema, the description sufficiently covers the tool's behavior: it returns angle details or null. It leaves no ambiguity about the return value.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage, but the description adds meaning by explaining the effect of an empty 'name' parameter (returns default lane). This goes beyond the schema's default value declaration.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly specifies the verb 'look up' and the resource 'search angle (lens)'. It distinguishes itself from sibling tools like list_search_angles by focusing on a single angle retrieval via name or trigger.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains that an empty name returns the default lane, providing implicit guidance on when to omit the argument. However, it does not explicitly state when not to use the tool or suggest alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ledger_summaryA

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

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It describes a read-like operation but does not disclose details such as whether data is cached, real-time, or requires any permissions. The behavioral scope is too vague.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence that immediately conveys the tool's purpose without any superfluous text. It is well-structured and front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has no parameters and an output schema exists (as indicated by context), the description adequately covers the tool's purpose and expected output. No additional context is necessary for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the schema is fully covered. The description reinforces that no inputs are needed, which is sufficient. A score of 4 reflects the baseline for parameterless tools where the description adds no extra burden.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns a count of ledger rows by status and calls it a one-glance system summary, which is specific and distinct from sibling tools that list items or perform actions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies this tool is for quick system overviews but provides no explicit guidance on when to use it versus alternative tools like list_applications or list_queue. No exclusions or conditions are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_applicationsA

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

ParametersJSON Schema
NameRequiredDescriptionDefault
statusNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It states the tool lists rows but does not disclose whether it is read-only, has pagination, or any ordering. The presence of an output schema reduces the need to describe return values, but behavioral traits beyond the schema are missing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loads the action, and contains no unnecessary words. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (one optional parameter) and the existence of an output schema, the description is mostly complete. It could mention that it is a read-only operation, but it covers the essential usage. The name 'applications' versus 'ledger rows' might cause minor confusion, but overall it is adequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must add meaning. It effectively explains that the 'status' parameter is a filter and that an empty value returns all rows, adding semantic context beyond the schema's type and default.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states 'List ledger rows' which is a verb+resource, but the tool name is 'list_applications', creating a slight mismatch. However, it is clear that the tool lists items, and the sibling tools confirm it is a list operation. The purpose is mostly clear but could be more aligned with the name.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains the optional filter parameter 'status' and that empty status returns all rows. However, it does not provide guidance on when to use this tool versus its siblings like 'list_queue' or 'list_claim_fragments'. The usage context is limited to parameter usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses that fragments are verified and trace to CLAIMS_BANK.md, implying a safe, read-only operation. However, it does not explicitly state read-only or performance characteristics, which is acceptable for a zero-parameter list tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loaded with the action, and every sentence adds value. It is concise with no unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that the tool has zero parameters and an output schema exists, the description sufficiently explains purpose and usage. It covers the source of fragments and their role, making it complete for a list tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has zero parameters, and schema description coverage is 100%. According to the rubric, zero parameters baseline is 4. The description adds no parameter info, which is appropriate because there are none.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'list', the resource 'verified resume building blocks from _genlib.py (roles, bullets, projects)', and specifies the domain. This distinguishes it from sibling tools like build_resume and verify_resume.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains when to use this tool: to obtain resume fragments that trace to CLAIMS_BANK.md, and advises building resumes only from these names for output honesty. While it does not explicitly compare to alternatives, the context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
statusNotodo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided; description covers list behavior, file source, and return limit. Sufficient for a read-only tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three concise sentences: purpose, parameter details, usage guidance. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With output schema present, description adequately covers purpose, parameters, and when to use. Lacks mention of ordering but not critical.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has 0% coverage; description clarifies 'status' is the queue field defaulting to 'todo' and 'limit' controls count. Adds meaning beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States 'List roles in the discovery queue... by queue status' – specific verb and resource, distinct from siblings like discover_jobs or list_applications.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly advises using this tool 'before running new discovery' (queue-first gate). Lacks explicit when-not-to-use but provides clear context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_search_anglesA

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

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, and the description only states what the tool does, not how it works or any behavioral traits. It doesn't disclose if reading a file involves blocking calls or caching.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise sentence that conveys all necessary information without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple with no parameters and an output schema. The description is complete for basic usage, but lacks details like whether it reads a file each time or if it's cached.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters exist, so the description adds value by specifying the source file and output fields. Schema coverage is 100%, and the description provides context beyond the empty schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: to list search angles from a specific file, enumerating the fields. It distinguishes itself from sibling get_search_angle by implying a list vs single retrieval.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this tool versus alternatives, but the simplicity makes it obvious. No exclusions or context provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
atsNo
noteNo
roleYes
tierNo
statusNosubmitted
companyYes
apply_urlNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, description carries full burden. It discloses de-duplication behavior, default date, and return value (bool and total). However, it does not mention side effects, auth requirements, or idempotency. The description is largely transparent but could detail whether existing entries are updated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with key actions front-loaded. Concise without extraneous details. Could be more structured with bullet points, but effectively communicates main points.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema exists but description already covers return values. Missing context on how record_application differs from submit_application or ledger_summary. For a tool with 7 parameters and many siblings, more completeness is needed to guide correct use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so description must compensate but barely does. Only status and date are vaguely mentioned (but no date parameter exists). No explanation for company, role, ats, note, tier, apply_url. Defaults are not explained. This severely hinders correct parameter usage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the tool appends a row to the application ledger, deduplicated by role. It uses specific verbs and resources ('append one row', 'application ledger'), and distinguishes from siblings like submit_application and list_applications by focusing on logging rather than submitting or listing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Does not explicitly state when to use vs. alternatives, but implies usage for logging not submitting. Provides context on de-duplication and status vocabulary, helping the agent understand constraints. Lacks direct comparison with submit_application or ledger_summary.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Without annotations, the description must convey behavior. It mentions external dependencies (Google Chrome, qpdf) and the return format (one_page field, pdf_path), but omits error cases or side effects like file creation. This is adequate but not thorough.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three terse sentences, each packed with distinct information: action, return value, and prerequisites/pipeline role. No redundancy, perfectly front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simplicity of the tool (1 param, output schema exists), the description covers the main behavioral aspects: rendering, return fields, dependencies, and pipeline position. It is slightly incomplete on parameter constraints but overall sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage for the single 'name' parameter. The description adds meaning by indicating it is used as '<name>.html', implying it's a base filename. This is helpful but minimal, leaving ambiguity about path or format.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it renders an HTML file named '<name>.html' to PDF and reports page count, which distinguishes it from siblings like 'build_resume' and 'verify_resume'. The verb 'render' and resource 'HTML to PDF' are specific.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description positions the tool as 'the first of the 4 gates', implying it should be used early in a pipeline. However, it does not explicitly state when not to use it or mention alternatives, limiting guidance for selection among siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNo
angleNo
titleYes
companyNo
jd_textNo
locationNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description must disclose behavior. It explains return values (value, pursue, reasons, hard_cap) and hard_cap conditions. However, it does not explicitly state that the tool is read-only or has no side effects, which would be helpful.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is five sentences with no fluff. The first sentence states the core purpose, and subsequent sentences efficiently add detail on parameters and return values.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 6 parameters, no annotations, and an output schema, the description covers the return structure and hard_cap conditions. It lacks explanation of the 'angle' parameter and the rubric, but the output schema compensates for return structure.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description adds some meaning by explaining that jd_text is preferred and that title is required. It does not explain url, angle, company, or location, leaving their semantics unclear.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool scores a role 0-10 against FIT_RUBRIC.md and returns a pursue verdict. The verb 'score' and resource 'role' are specific, and the tool is well-differentiated from siblings like discover_jobs or build_resume.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It advises passing JD text when available because titles under- and over-sell, giving clear context on preferred input. It lacks explicit exclusions or comparisons to alternatives, but the guidance is actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
atsNo
urlYes
titleYes
companyYes
locationNo
resume_pathNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It discloses that no browser is driven, PII/credentials are read from environment and never stored, and the return value is a plan with specific components. It does not mention permissions, side effects, or failure modes, but provides sufficient behavioral context for an agent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences, starting with the core purpose. It is efficient and front-loaded. Minor verbosity in detailing the plan contents could be condensed, but overall it is appropriately sized for the information conveyed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 6 parameters, 0% schema coverage, no annotations, and an output schema, the description is incomplete. It explains the return value well but ignores parameter semantics. It adds context about PII and environment but misses guidance on how to use parameters. It is adequate for a high-level plan but lacks detail needed for accurate invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must explain parameters. It mentions 'standard field values' and 'ATS' but does not map to individual parameters like title, company, url, ats, location, resume_path. It does not explain why title, company, url are required or how resume_path is used. This is a significant gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool builds a fill-and-park submission plan for a role, emphasizing it does not drive a browser. It distinguishes itself from sibling tools by stating to report outcomes with record_application afterward, and it details the plan contents (ATS, action, field values, etc.). This is a specific verb+resource combination that differentiates it from siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a clear workflow: first use submit_application to build a plan, then report outcomes with record_application. It implies the tool is used before recording outcomes. However, it does not explicitly state when to use this tool versus alternatives like build_resume or verify_resume, lacking explicit exclusion criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses that the tool checks two gates and returns specific fields (lint_ok, verify_ok, passed, findings) with examples of findings. It is transparent about what the tool does, though it does not mention side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences long, with the first sentence stating the core action and the second providing additional detail on output. It is concise and front-loaded with essential information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the single required parameter and the presence of an output schema, the description is complete. It explains what the tool does, what it returns, and provides example findings, leaving no major gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description adds meaning by indicating that the 'path' parameter should point to a resume HTML file on disk. This clarifies the parameter's purpose beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool runs two static gates (lint + anti-fabrication verify) on a resume HTML. It distinguishes from sibling tools like build_resume and render_resume by specifying the verification purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description says 'Use this to check any resume on disk,' which implies when to use, but it does not explicitly state when not to use or mention alternative tools for similar tasks.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 4 tool updatesv0.3.0
    • Addedcurate_queue
    • Changeddiscover_jobs1 field changed
      • changedInput schema / properties / source / default
        Previous value: -"newsource"New value: +"boards"
    • Addedfetch_job_description
    • Addedfetch_verification_code
  2. 13 tool updatesv0.1.0
    • First observedbuild_resume
    • First observeddiscover_jobs
    • First observedget_search_angle
    • First observedledger_summary
    • First observedlist_applications
    • First observedlist_claim_fragments
    • First observedlist_queue
    • First observedlist_search_angles
    • First observedrecord_application
    • First observedrender_resume
    • First observedscore_job
    • First observedsubmit_application
    • First observedverify_resume

TDQS

A4.2/5.0
Disambiguation5/5

Each tool targets a distinct aspect of the job search and resume-building workflow: resume creation, job discovery, angle management, ledger operations, rendering, scoring, submission, and verification. No two tools have overlapping purposes, making selection unambiguous.

Naming Consistency4/5

Most tools follow a consistent verb_noun pattern (e.g., build_resume, discover_jobs, record_application). The only exception is ledger_summary, which is noun_noun, but this is a minor deviation that does not cause confusion.

Tool Count5/5

With 13 tools, the server is well-scoped for its domain. Each tool serves a necessary function without superfluous additions, and the count is within the ideal range for manageable agent integration.

Completeness5/5

The tool set covers the full lifecycle: job discovery (discover_jobs), scoring (score_job), application planning (submit_application), ledger tracking (record_application, list_applications, ledger_summary), resume building (build_resume), verification (verify_resume), and rendering (render_resume). No obvious gaps exist.

Maintenance

ActivityMaintained
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    A local-first, open-source MCP server that analyzes jobs, matches your CV, tailors documents, and tracks applications — all on your machine with no data uploaded.
    AGPL 3.0
  • A
    license
    Not graded
    quality
    C
    maintenance
    An MCP server that exposes job-search and application-management capabilities to compatible AI clients, enabling discovery of vacancies, drafting of tailored application materials, and coordinated human-approved submissions.
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    A privacy-first MCP server for locally managing job, fellowship, and graduate-school applications. It offers tools for tracking application status, analyzing role fit, generating LaTeX CV/cover letters, interview prep, and discovering public jobs from ATS APIs.
    8
    1
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    An MCP server that automates job applications by discovering postings from ATS boards, applying eligibility gates, scoring candidates, and drafting answers, while requiring human approval before submission. It respects anti-bot controls and only submits with explicit consent.
    22
    1
    MIT

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