Skip to main content
Glama

Stop rewriting your resume for every job.

Maestro tailors it from your whole career history in under a minute, and every bullet is something you actually did, so you can defend it in an interview.

  • Same score, every time. The match score runs on fixed rules and a small model on your own computer, with no AI service involved. Same resume, same job, same number.

  • Every AI edit is a diff. Suggested changes arrive as a before and after. You accept or undo them one by one.

  • It fills the form and stops there. The Companion fills job applications from your saved answers and attaches your resume. It never submits. That click is yours. With full automation on, Apply can also click Next through the pages for you and stops on the review page. On known application sites it signs in, or makes the account, with the job-site login you saved.

Install in two commands, or follow the Getting Started guide if this is all new to you.

Many resume versions become one career history, then a specialist resume per role, company and country, matched to a job and ready to apply. You press Submit.

Give your AI your career

Connect Claude, Codex or the ChatGPT desktop app and your assistant gets your career history, your resumes and your jobs. Then just ask.

You ask

What happens

Extract

"Here's a posting. Should I even apply?"

It saves the job, scores your resumes against it and flags knock-outs like visa or years of experience.

Maintain

"I shipped the fraud model this quarter. Add it."

A new bullet, as a draft you approve, that every resume can use.

Maintain

"Make me a resume for fintech ML roles in the UK."

A specialist resume built from your history, targeted to that role and country.

Hunt

"Every morning, find new ML roles that fit and file the good ones."

The job-hunt skill files them to your Agent inbox. You queue or skip each one.

Hunt

"Which skills keep showing up that I don't have?"

The gaps across every job you saved, most frequent first.

Apply

"Tailor this one, walk me through the gaps, then make the PDF."

It asks about each gap instead of inventing, keeps every change as a diff you can undo and renders the PDF.

Apply

"Fill the applications I queued. Show me each one before it goes."

Nothing is submitted without your yes, unless you turn on full automation.

That is 88 tools and ready-made skills for a daily hunt, an apply run and email status: see the MCP guide.

Free and open source. Your career history lives on your laptop, not in someone else's cloud, and there is no account. Bring an OpenAI, Gemini or Claude key (scoring, PDFs and tracking work without one), get real LaTeX and Typst PDFs, and take everything with you in one career.md file.

Made for one person on one computer. There is no login, so anything that can reach the app can read and change your whole career record and your saved API keys. Out of the box it only listens on your own machine (127.0.0.1). Never expose the app to a network. The one published path is /api/sync, sealed, and only as sync setup describes. SECURITY.md has the details. Your career record stays on your computer. When you use AI features, resume and job information goes to the AI service you choose.


Related MCP server: CareerMate

Why it works this way

If your resume folder has a v2finalcopy(3) in it, this is for you. Maestro keeps one record of what you have actually done, and every resume is a view of that record. Approved bullets go into a resume word for word, and rewording one is a separate step that asks you first. When a job asks for something your resume does not show, Maestro asks you about it. If it is true, it is saved for every future application. If it is not, it stays a gap.

The score is fixed rules, so the same resume and job always get the same number. It is not an employer's score or a prediction of an interview, so use it to compare your own drafts. Saving a job and tailoring for it took about 10 seconds on Gemini and about 40 on the OpenAI default in our tests, at about $0.01 (OpenAI) or under $0.03 (Gemini) per application (the numbers).

Nothing here is rented. It is free and open source (Apache 2.0), with no account, and you pay only for the AI you use. Your career has one history. Your resume should too.

The long version, with the score, tailoring, templates and the rest of the toolkit, is in Using Maestro CS.


Quickstart

Install uv once. After that, Maestro is two commands: no Docker, no Git, no clone. uv installs Maestro as a single maestro command and fetches the Python it needs, and the package brings its own web app and its own Node. It runs on macOS, Linux and Windows (x64).

# 1. Install uv once, then open a new terminal.
curl -LsSf https://astral.sh/uv/install.sh | sh     # macOS and Linux
# On Windows, in PowerShell instead of the line above:
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
# 2. Install Maestro, then start it.
uv tool install --python 3.12 maestro-career-studio
maestro start

maestro start runs Maestro in the background and opens http://localhost:3000. Closing the terminal does not stop it. The first start downloads the small scoring model (about 100 MB, once) from Hugging Face, so allow a minute or two. If the terminal says maestro is not found, run uv tool update-shell and open a new terminal.

Best effort, not tested: Windows on ARM has no PDF-engine (typst) wheel, so install an x64 Python under emulation: uv tool install --python cpython-3.12-windows-x86_64-none maestro-career-studio. Alpine and other musl Linux are not supported by the PDF engine's wheels; use a glibc distro or Docker.

Then:

  1. Add your AI key in Settings › AI & models. One key from OpenAI, Gemini or Claude is enough. Without a key, scoring, PDFs and tracking still work (what a key costs and does).

  2. Import your resumes, save a job, and tailor (step by step).

  3. Optional: maestro connect adds Maestro to Claude Desktop, Claude Code, Codex, Cursor or VS Code, and the Companion is a Chrome side panel for saving and filling job pages.

Command

What it does

maestro start

Start Maestro and open the app (--no-browser, --skip-model)

maestro stop

Stop it

maestro status

Whether it is running, its version and whether a newer one exists (--offline skips that check, --json for scripts; exit code 3 means stopped)

maestro update

Save a snapshot of your data, update, restart (-y skips the question)

maestro connect [app]

Add Maestro to Claude Desktop, Claude Code, Codex, Cursor or VS Code

maestro import-docker CHECKOUT

Move your data from a Docker install into this one, once (--dry-run shows the plan; steps)

The full command table also covers logs, open, restart, autostart, backup, uninstalling and TeX for LaTeX templates. What the command contacts, and when: PRIVACY.md.

Young, but rehearsed. The app runs daily on my machine. A fresh Docker install (clone, start, first tailored resume) has been checked end to end on a second machine, and CI installs and starts the uv package on macOS, Linux and Windows for every change. It has had little testing on machines that aren't mine. If it fails on yours, please open an issue with the log. That report is one of the most valuable contributions there is.

Alternative: run with Docker (self-hosters)

Docker stays the route for contributors and for servers. It needs Docker, Git and about a 1 GB download (roughly 3–4 GB unpacked); the prerequisites have the detail, and on Windows you run it under WSL (steps).

# 1. Download the project and create your settings file
git clone https://github.com/seinun-ai/maestro-career-studio.git
cd maestro-career-studio
cp .env.example .env

# 2. Start the app (downloads about 1 GB the first time)
docker compose up -d

Then open http://localhost:3000 and add your AI key in Settings › AI & models. The first start sets up your database and adds a demo resume so you have something to look at. The rest of the Docker route is in the setup reference.

Docker and uv are separate copies. They keep separate data, and both want ports 8001 and 3000, so run one at a time. Moving from Docker to uv? Stop Docker, install Maestro as above, then run maestro import-docker CHECKOUT once (steps). It reads your Docker folder and changes nothing in it.

Working with AI assistants

Driving it from Claude, Codex, or ChatGPT (MCP)

MCP is the connector that lets an AI assistant use the app for you: read a posting, score it, work the gaps, make the PDF, all in conversation, on your computer against your data. All 88 tools are on by default, and smaller tool sets (hunt, apply, explore, templates, career) keep a chat focused. On a uv install, run maestro connect; otherwise open Settings › Connected agents › Connect an agent app. Setup, example prompts, tool sets and the ready-made skills are in Using Maestro CS and the MCP guide. An always-on bot can work your search while your laptop is off.

Going all the way: agent applications

Maestro CS can take an application right up to the submit button. A job your agent finds becomes a proposal. You review proposals in the Agent inbox and queue or skip them, and an apply run works only the ones you queued. By default it waits for your yes before each submit. Full automation (off by default, in Settings › Connected agents) lets your agent submit a queued job without asking when its final review shows nothing to check, within your daily limit. Nothing is ever submitted from the web app itself, and the Companion never presses Submit. That yes is recorded by the agent, so it is an audit trail and a volume limit, not a lock that a manipulated agent can't pick: run it while you're watching. The risks, plainly: a job posting is untrusted text that can try to instruct the agent reading it, a posting the agent found is not a vetted employer, and we won't help you hide automation from bot detection. Read the full section before you turn it on.


Updating

Installed with uv? Run maestro update. It checks PyPI for a newer release, prints any breaking changes from the changelog, saves a verified snapshot of your data, stops Maestro, updates it and starts it again.

On Docker? From the folder you cloned, run ./scripts/update.sh (--check only tells you whether you're up to date). It needs bash, so on Windows run it under WSL.

Your data is not touched by an update, and deleting the project folder does delete it on the Docker route. After updating, reload the browser extension and restart your AI assistant so it sees new tools. docs/UPDATING.md has the rest: updating by hand, pinning a version, what the backup covers, rolling back, and coming from v0.3.0 or older.

Where your files live

A uv install keeps everything in one folder per user: the database, resumes, settings, backups, logs and maestro.env (your API keys and, if you need them, port overrides). Deleting the folder deletes your data.

System

Folder

macOS

~/Library/Application Support/Maestro Career Studio

Windows

%APPDATA%\Maestro Career Studio

Linux

$XDG_DATA_HOME/maestro-career-studio (default ~/.local/share/maestro-career-studio)

Finished resume PDFs are also copied to Documents/Maestro Career Studio/Applications, one folder per job (Settings › Tailoring › Resumes folder).

On the Docker route everything stays inside the folder you cloned (data/, base_resumes/, applications/, settings/ and more; the full list). Your files are yours, never uploaded. Every application's PDF is saved in applications/, and career.md exports your whole career history as one Markdown file.

Troubleshooting

maestro status and maestro logs come first, and a port already in use is named in the message. maestro check prints the install's facts as JSON to paste into an issue. Ports, API keys and quota errors, "database is locked", PDFs that fail to build and an empty app after updating are covered in Troubleshooting & Common Questions.

Community, Documentation & Contributing

Contribution fast-path: docs fixes, resume/cover-letter templates and extension job-board adapters go straight to a pull request — no issue needed. Features and bigger changes: open an issue first. Every pull request gets a human reply within 48 hours and is read by a human — we don't merge AI slop.

This is an early release. If something doesn't work, please say so — a clear bug report is one of the most valuable contributions right now.

  • Project site: maestrocareerstudio.com — a five-minute tour before you install anything.

  • Getting Started: docs/GETTING_STARTED.md — install to first tailored PDF, step by step.

  • Using Maestro CS: docs/USING_MAESTRO.md — how it works, how to use it well, and the rest of the toolkit.

  • Setup reference: docs/SETUP_REFERENCE.md — the maestro command, prerequisites, API keys, local models and troubleshooting.

  • Updating: docs/UPDATING.md — updating by hand, backups, rolling back.

  • Known issues: KNOWN_ISSUES.md — what works well, what's rough, and what's a deliberate limitation.

  • Skills for your AI assistant: docs/skills/ — job hunt, apply run, mail status, referral pages, tailor run, and a skill that builds your own; the app's Automations page copies each as a prompt.

  • Contributing: CONTRIBUTING.md — development setup, tests, development mode and LLM tracing, and where help is wanted. SYSTEM.md is the architecture reference for contributors and coding agents; read the relevant part before changing behaviour. UBIQUITOUS_LANGUAGE.md is the project's vocabulary, worth ten minutes before your first contribution.

  • Changelog: CHANGELOG.md — what changed in each release; read any Breaking changes heading before updating. Maintainers: docs/RELEASING.md.

  • Security & privacy: SECURITY.md — the local-only rule and how to report a vulnerability. PRIVACY.md — what is stored, and what leaves your computer.

  • License: LICENSE — Apache License 2.0, plus NOTICE.

Privacy Policy

There is no Maestro CS server or account, and the author never receives your data. Your career record stays in files on your computer; it goes to an AI service only when you add a key and use an AI feature, and to the assistant you connect over MCP when it calls a tool. With a model on your own computer, the app sends nothing out. PRIVACY.md has the full policy: what is stored, every place data can go, retention, and how to ask a question.

Licensing

Maestro CS is free software under the Apache License 2.0.

You may use it commercially, and you don't have to publish your changes. Fork it, build it into a product, run a modified copy as a hosted service — all permitted. Apache 2.0 asks three things in return: keep the license and copyright notices, say what you changed in the files you changed, and pass along the NOTICE file with any redistribution. It also includes an explicit patent grant from every contributor, the main practical reason to prefer it over MIT or BSD.

Credits for the third-party pieces we redistribute — the LaTeX resume template, the XCharter font, the scoring model — are in THIRD_PARTY_NOTICES.md, which the license also asks you to carry forward.

No CLA. Contributions are licensed under Apache 2.0 by section 5 of the license itself; there's nothing to sign. Commercial questions: ajey@seinun.com.

Credits & Citation

Maestro Career Studio is a free, open-source project from Seinun LLC. It stands on other people's work. The full list — bundled sources, the scoring model, the PDF tools, and every dependency with its license — is in THIRD_PARTY_NOTICES.md. The ones that shape the product most:

Using Maestro CS in published work? Cite it with GitHub's "Cite this repository" button, which reads CITATION.cff.

Available Tools

88 tools
archive_base_resumeArchive Base ResumeA
Idempotent

Hide a base resume from pickers without deleting it.

Sets archived_at (reversible timestamp, not a delete). Archived bases drop
out of list_base_resumes' default view; JSON, PDF, TEX and version history
stay. Undo with unarchive_base_resume.
ParametersJSON Schema
NameRequiredDescriptionDefault
slugYes

TDQS

A4.5/5.0
Behavior5/5

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

Goes well beyond the annotations: annotations only say readOnlyHint=false, idempotentHint=true, destructiveHint=false, while the description discloses the mechanism (sets archived_at), confirms reversibility, and enumerates exactly what is preserved (JSON, PDF, TEX, version history) and what changes (drops out of list_base_resumes' default view). No contradiction with annotations; mutation with idempotent=true is consistent with re-archiving being harmless.

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 short sentences, front-loaded with the purpose, then mechanism, then the undo path. Every sentence carries distinct information with no repetition of the title or annotations.

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?

For a one-parameter, non-destructive mutation with no output schema, the description covers the essential facts an agent needs: what changes, what persists, effect on other tools, and how to reverse it. Nothing material about calling it correctly is missing.

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% and the description never mentions the slug parameter, so it adds no meaning about identifier format or where to obtain it. With only one unambiguous parameter in a family where slug is the standard key, the gap is minor, but the description does no compensating work.

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 a specific verb and resource ('Hide a base resume from pickers') and immediately disambiguates from a sibling action by clarifying it is not a delete. An agent can distinguish this from update_base_resume, edit_base_resume, or a delete-style operation without opening any schema.

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?

Gives clear context for use (removing a base from pickers while preserving it) and names the exact reversal path, unarchive_base_resume. It stops short of stating when NOT to archive (e.g., to permanently remove a base, use something else), so it is clear but not fully exclusionary.

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

attach_evidenceAttach Evidence ImageA

Attach step evidence image (base64) to a proposal. The image is supplied inline in the call; when the screenshot already exists as a file on this machine, attach_evidence_file uploads it by path without passing image bytes through the model context. kind must be step | final_review | submission_receipt.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNostep
stepYes
labelYes
proposal_idYes
image_base64Yes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare the safety profile (readOnly=false, destructive=false, idempotent=false, openWorld=false), so the bar is lower. The description adds the inline-base64 transport detail and the alternative's rationale, but says nothing about what happens on repeat attaches (relevant given idempotentHint=false), size limits, or permissions on the proposal.

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 short sentences, front-loaded with the core action and the routing alternative. The final sentence restates the schema enum verbatim, so it earns slightly less than a perfect score, but nothing is padded.

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

Completeness2/5

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

A mutation tool with four required parameters, no output schema, and zero schema description coverage needs more than transport hints. Missing are the semantics of step/label/proposal_id, behavior on duplicate attaches, and any constraint on image size or format beyond 'base64', leaving real gaps for correct 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% across 5 parameters, so the description must carry the load. It explains image_base64 (inline base64 rather than a path) and restates the kind enum, but says nothing about step, label, or proposal_id — the meaning of step (index? existing step reference?) and what label is used for are left entirely undocumented.

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 a specific verb and resource (attach an evidence image to a proposal) and immediately names the sibling it is not — attach_evidence_file — with the condition that separates them. An agent can pick between the two without opening either schema.

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 routes the agent: use this tool when the image is supplied inline, use attach_evidence_file when the screenshot already exists as a file on this machine so bytes never pass through model context. No exclusions or prerequisites are given for the kind values or for when attaching evidence is appropriate, which keeps it short of a 5.

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

attach_evidence_fileAttach Evidence FileA

Attach evidence from an image file already on this machine's disk (e.g. a browser tool's saved screenshot — Playwright MCP saves to its --output-dir and reports the path). file_path is an absolute path to an existing image, typically as reported by the browser tool — with the standard setup that is under the repo's .playwright-mcp/ tree (e.g. /Users//Projects/maestro-career-studio/.playwright-mcp/.png); a relative or ~ path is resolved against this server's working directory. When this server runs inside the backend container, a host path with a .playwright-mcp/ segment is read from the container's mount of that tree (paths that leave the tree are refused). The bytes are read and uploaded server-side so they never enter the model context. PNG/JPEG only, 5 MB max. kind must be step | final_review | submission_receipt.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNostep
stepYes
labelYes
file_pathYes
proposal_idYes

TDQS

A4/5.0
Behavior5/5

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

Adds substantial context beyond the write/non-idempotent annotations: file bytes are read and uploaded server-side so they never enter model context, path resolution rules (relative/~ vs absolute), container mount behavior, refusal of paths leaving the tree, and hard constraints (PNG/JPEG, 5 MB max). This is exactly the kind of behavioral disclosure annotations cannot carry.

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?

Purpose and the key constraint are front-loaded, and each sentence carries real information. The embedded hard-coded example path (/Users/<user>/Projects/maestro-career-studio/...) is verbose filler that could be trimmed without loss.

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?

For a 5-param mutation with no output schema and 0% schema coverage, the description covers the file-handling dimension thoroughly but leaves the identity/placement params (proposal_id, step, label) and success behavior unexplained. Adequate but with clear gaps.

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 coverage is 0%, so the description must compensate, and it does richly for file_path and the kind enum values. But proposal_id, step, and label — three of the four required params — are entirely undescribed in both schema and description, leaving half the call under-specified.

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?

States a specific verb+resource: attaching evidence from an image file already on disk. Clear what it does, though it never explicitly contrasts itself with the sibling attach_evidence (the non-file variant), so an agent must infer the split from the name alone.

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?

Gives concrete context for when this is used — a browser tool's saved screenshot reported by path — which sorts it from a generic evidence attach. However, it offers no explicit when-not or named alternative routing to attach_evidence.

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

close_tailoring_sessionClose Tailoring SessionA

Abandon an OPEN tailoring session without tailoring it.

`tailoring_session_id` is the id returned by create_tailoring_session. This is
the explicit exit for a "changed my mind" flow — e.g. the user walks through
some gaps, then decides to use the base resume as-is and does not run
tailor_session. Marks the session's status "abandoned" so it stops looking like
unfinished work. Errors (409) if the session isn't currently open (already
tailored, already superseded, or already abandoned).
ParametersJSON Schema
NameRequiredDescriptionDefault
tailoring_session_idYes

TDQS

A4.9/5.0
Behavior5/5

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

Annotations give the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false), and the description adds real state-machine context beyond them: it marks status 'abandoned', explains the intent (stops looking like unfinished work), and lists the exact 409 failure conditions (already tailored/superseded/abandoned). This is consistent with idempotentHint=false.

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?

Front-loads the core action, then the scenario, then the status effect and error behavior. No redundant sentences; each line contributes distinct 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?

For a single-parameter state-transition tool with no output schema, the description covers purpose, when to use, what state changes, and error conditions. Nothing needed to call it correctly is missing.

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?

With only one parameter and 0% schema description coverage, the description carries the burden and does so by explaining provenance: tailoring_session_id is the id returned by create_tailoring_session. It doesn't add format/syntax detail, but provenance is the meaningful gap an agent would otherwise lack.

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 a specific verb (abandon/close) and resource (OPEN tailoring session) plus the key scope qualifier 'without tailoring it'. This cleanly separates it from tailor_session and create_tailoring_session, so an agent can distinguish it without opening the schema.

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?

Explicitly describes the 'changed my mind' scenario where the user walks through gaps then decides to use the base resume as-is and does not run tailor_session. It names the alternative (tailor_session) and the condition that selects this tool, and even documents the 409 error when the session isn't open.

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

compare_atsCompare Match ScoresA
Read-onlyIdempotent

Before/after match score comparison for an application: composite and per-layer deltas plus a per-skill diff (absent→matched, skills-list-only→dual, decayed→recent). Computes any missing phase row on demand.

ParametersJSON Schema
NameRequiredDescriptionDefault
application_idYes

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), but the description adds real behavioral context by disclosing the diff taxonomy (absent→matched, skills-list-only→dual, decayed→recent) and the lazy behavior 'computes any missing phase row on demand'. That last clause hints at an on-demand computation/persistence step that annotations alone would not reveal.

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?

Two tight sentences, front-loaded with the core comparison purpose and followed by the supporting detail. No filler; the second sentence about computing missing rows earns its place by adding behavior not present elsewhere.

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 no output schema, the description usefully describes the return shape (composite/per-layer deltas, per-skill diff) and the on-demand computation behavior. For a one-parameter read tool the only real gaps are the absent usage guidance and parameter documentation.

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% and the description never mentions application_id, so it does not compensate for the gap. However, the single parameter is self-documenting by name with no format or syntax nuance to explain, so the omission is low-cost.

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 a specific verb (compare) and resource (before/after match scores) and even enumerates the output components: composite and per-layer deltas plus a per-skill diff. It is clearly distinguishable from score_ats (which produces a single score) by the 'before/after' framing, though it never names the sibling explicitly.

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 'before/after' framing implies the scenario (comparing an application's match state across phases), but there is no explicit when-to-use statement and no routing versus score_ats or explore_ats_over_time. Usage is inferable from context rather than stated.

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

create_base_resumeCreate Base ResumeC

Create a new base resume. Slug must be lowercase alphanumeric/underscores, not 'master'.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataYes
slugYes
display_nameYes

TDQS

C2.9/5.0
Behavior3/5

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

Annotations already disclose that this is a non-read-only, non-idempotent, non-destructive write, so the safety profile is covered. The description adds a real operational constraint (slug format and the reserved 'master' value) but says nothing about failure modes on duplicate slugs or what the returned object contains.

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?

Two short sentences, no filler, purpose stated first and the constraint second. Efficient, though extremely terse for a creation tool.

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

Completeness2/5

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

For a write tool with a nested free-form 'data' object, no output schema, and zero schema coverage, the description leaves too much unexplained — what shape 'data' takes and what a successful create returns are both unspecified.

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% across three required parameters. The description only constrains 'slug' (lowercase alphanumeric/underscores, not 'master'), leaving 'display_name' and especially the nested 'data' object entirely undocumented in both schema and description.

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?

States a specific verb+resource ('Create a new base resume') that is unambiguous. It does not differentiate itself from the sibling create_base_resume_from_kb, which an agent might reasonably confuse it with.

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

Usage Guidelines2/5

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

No when-to-use guidance, no prerequisites, and no mention of the alternative create_base_resume_from_kb. The agent must infer from the name alone which creation path to take.

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

create_base_resume_from_kbCreate Resume from Career KBA

Compose a new base resume from selected Career KB entities. LLM-free.

entity_ids is REQUIRED. An empty list composes nothing and 422s — that is
deliberate; omitting the argument is not allowed because it would have to
mean "the whole KB". A role_label or role_category is required (no slug
argument). role_category is strict: an unknown value 422s, no
normalization. An unmatched role_label maps to role_category "other" and
slug `other`/`other_2`…; display_name never affects the slug, which is
`base.slug` in the response. Only APPROVED points under the selected entities compose —
points from kb_ingest_resume are DRAFTS and contribute nothing until
kb_approve_points (or the user, at /career) approves them.
skills and contact arrive in full from the KB profile regardless of entity
selection (the KB has no per-entity skill data), so skills may need trimming
on the resulting base. The
whole-career summary is dropped unless include_summary, or pass a reviewed
summary. A 422 "no resume content" means the selected entities have no
approved points.

Response is {base, next}. next is a hint (null when suppressed or when its
settings read fails; the base is created either way, and repeating the call
mints a second slug, <slug>_2).
ParametersJSON Schema
NameRequiredDescriptionDefault
summaryNo
entity_idsYes
role_labelNo
display_nameNo
role_categoryNo
include_summaryNo

TDQS

A4.7/5.0
Behavior5/5

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

Adds substantial behavior beyond the annotations: 422 semantics for unknown role_category, unmatched role_label mapping to 'other' with a slug scheme, slug minting on repeat calls (<slug>_2), draft vs approved point filtering, skills/contact always arriving in full from the KB profile, and summary suppression rules. This is consistent with idempotentHint=false and destructiveHint=false and discloses mutation side effects the annotations only imply.

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?

Purpose and the required-argument rule are front-loaded, and nearly every sentence carries non-obvious information. It is dense and somewhat sprawling with mid-sentence line breaks, but there is little pure filler for a tool with this many edge cases.

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?

No output schema exists, so the description compensates by describing the return shape ({base, next}), the meaning of next as a hint, when it is null, and that the base is created regardless. For a 6-parameter, non-idempotent mutation tool it covers the failure modes, side effects, and output an agent needs.

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?

With 0% schema description coverage, the description carries the full burden and does: entity_ids required + empty-list behavior, role_label vs role_category precedence and strict validation, display_name having no effect on the slug, include_summary gating the career summary, and the reviewed summary option. Every one of the 6 parameters is given meaning.

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 a specific verb and resource ('Compose a new base resume from selected Career KB entities') and adds the distinguishing constraint 'LLM-free', separating it from siblings like create_base_resume and kb_sync_base. An agent can tell what this does without opening the schema.

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?

Gives clear preconditions: entity_ids is REQUIRED, an empty list deliberately 422s, and a role_label or role_category must be supplied. It explains the approved-points gate (kb_ingest_resume drafts contribute nothing until kb_approve_points). It does not explicitly name when to choose this over create_base_resume or kb_sync_base, so no full when/when-not routing.

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

create_tailoring_sessionStart Tailoring SessionA
Destructive

Start the gap-analysis tailoring workflow for a job + base resume.

Calling again for the same job+base SUPERSEDES the open session (saved
resolutions become unreachable); list_tailoring_sessions shows existing
sessions.

Scores the base (deterministic ATS engine, persisted as the 'before' score) and
returns a session whose gaps_json.categories list every gap in fix-cost order:
missing skills, wording mismatches, placement upgrades, stale evidence, adjacent
skills, title/structure. The intended flow is: gather the user's answer for each
gap, save them with resolve_gaps, then tailor_session. Each gap carries its
allowed actions. A missing skill MAY use add_keyword ONLY to add the keyword to
a skills category (placement_target.section="skills"): that inserts an
unverified skills-list item, never a fabricated bullet. The evidence-backed
alternatives are a user_input resolution (the user's answer to
enrichment.elicitation_question), attach_project, or skip.

enrich=False (default) skips the backend's fast-model enrichment pass — no
in-house LLM call — so gaps carry only their deterministic fields (no
enrichment.elicitation_question / suggested_wording / suggested_placement).
KB coverage detection does NOT depend on it: the deterministic self-nomination
and evidence-verification pass that used to sit downstream of the LLM call now
runs unconditionally, so KB autos still get stamped with enrich=False, and
even during a provider outage. enrich=True pays for one fast-model call
adding those display-only explanations and elicitation questions per gap —
it never changes scores or which gaps exist.

Response is the session plus a `next` next-step hint (null when hints are off
or unavailable). `base_anchors` are the base's emphasis hints (countries,
role, company, focus), not evidence; the anchor company is the resume's own
target, not necessarily this job's employer.
ParametersJSON Schema
NameRequiredDescriptionDefault
enrichNo
job_idYes
base_resumeYes

TDQS

A4.8/5.0
Behavior5/5

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

Annotations flag destructive/non-idempotent, but the description explains WHY: re-calling makes saved resolutions unreachable. It further discloses that the base score is deterministic and persisted as the 'before' score, and precisely what enrich does and does not change (no score/gap-set change, no LLM call by default, KB autos stamped even during an outage).

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?

Front-loads purpose and the destructive supersede warning before the enrich detail. Sentences are dense and mostly earn their place, though the enrich/KB paragraph is verbose enough to risk burying the operational essentials.

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?

With no output schema, the description nonetheless describes the response shape (the session, gaps_json.categories ordering, the `next` hint, base_anchors) and the constraint that gap actions are limited (add_keyword only into a skills category, else user_input/attach_project/skip). Complete enough for an agent to invoke and interpret results.

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 coverage is 0%, so the description must carry the burden. It fully explains the non-obvious `enrich` parameter (default, cost, effect on enrichment fields only), but job_id and base_resume are never described beyond their self-evident identifier roles. Strong compensation for the covered parameter, partial gap on the other two.

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 a specific verb+resource: 'Start the gap-analysis tailoring workflow for a job + base resume.' This clearly distinguishes it from read-only siblings like list_tailoring_sessions, get_tailoring_session, and close_tailoring_session, and from the downstream tailor_session.

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?

Explicitly warns that calling again for the same job+base SUPERSEDES the open session, and names list_tailoring_sessions as the way to inspect existing sessions. It also lays out the intended downstream flow (gather answers, resolve_gaps, then tailor_session), so the agent knows where this sits in the sequence.

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

create_template_draftCreate Template DraftA

Create a DRAFT template. engine defaults to 'latex'. Pass engine='typst' for Typst — then source is REQUIRED: raw .typ text (no Jinja, no escape filters; read via json(bytes(sys.inputs.resume)) / json(bytes(sys.inputs.fmt)); engine is immutable after creation).

Both engines consume the same resume JSON (contact, summary,
skills[].{category,items}, experience/projects/education, certifications,
extra_sections). Typst reads r.contact.name etc.; optional fields arrive
as `none` — guard with `!= none`. LaTeX uses resume.* with |latex_escape
on every value.

Typst constraints: dates arrive PRE-FORMATTED server-side (fmt.date_format
is not read). Package imports (`#import "@preview/..."` or any `@...`
import) are REJECTED (no external packages). Fonts: only
vendored XCharter plus typst's embedded defaults (e.g. Libertinus Serif);
any other family compiles WITHOUT error and silently substitutes. A template
that does not render r.extra_sections (both `entries` and `bullets` shapes)
hard-fails on resumes with custom sections; get_template('typst-classic')
shows the block.

LaTeX: omit `source` to start from the canonical starter. Given source
must be a complete compilable document (\documentclass + preamble) as
Jinja2 with blocks ((* *)), variables ((( ))), comments ((# #)). The source
is raw LaTeX: bare `&` for tabular cells, `\&` for a literal ampersand;
HTML entities such as `&amp;` are not decoded. Includable:
((* include '_header.tex.j2' *)). Spacing and look can be wired to `fmt.*`
(full knob list on get_template) instead of hard-coded values;
get_template('default') is a starting point.

validate=True test-compiles in the same call (status/last_error). A LaTeX
draft cannot validate on a backend with no TeX (list_templates →
engine_available); engine='typst' works there. Not usable until validation
succeeds. `id` is a slug: [a-z0-9_-].
ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
engineNolatex
sourceNo
validateNo
display_nameYes

TDQS

A4.7/5.0
Behavior5/5

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

Annotations only declare the safety profile (write, non-destructive, non-idempotent); the description goes far beyond: engine is immutable after creation, drafts are not usable until validation succeeds, LaTeX cannot validate on a backend without TeX, Typst rejects @-imports, unknown fonts silently substitute without error, templates that skip r.extra_sections hard-fail, and HTML entities are not decoded. These are exactly the non-obvious behaviors an agent must know before writing source.

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?

Front-loaded with the core action and the engine branch, then progressively details Typst constraints, LaTeX format, and validation. Dense but each sentence carries operative information. It is long for a tool description and the Typst/LaTeX blocks could be slightly tightened, so it is not a model of concision, but little is filler.

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?

For a 5-parameter, no-output-schema mutation tool, the description covers the full call surface plus the failure modes: what source must contain per engine, what validation does and reports (status/last_error), engine availability via list_templates, and post-creation immutability. Nothing an agent needs to call it correctly is missing.

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 carries the full burden and does: engine default and the source-required-for-typst rule, the exact required format of source per engine (raw .typ with sys.inputs access vs. complete Jinja2 LaTeX document with ((* *)), ((( ))), ((# #)) blocks), validate's test-compile semantics, and id's slug charset [a-z0-9_-]. Only display_name is left undocumented, which is self-evident.

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 a specific verb + resource + lifecycle state: 'Create a DRAFT template.' Distinguishes itself from siblings by naming the read path (get_template), the enumeration tool (list_templates), and the mutation follow-up (update_template_draft implied), so an agent can place it in the template lifecycle without opening another schema.

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?

Gives concrete conditional guidance: engine defaults to 'latex'; pass engine='typst' and then source becomes REQUIRED; omit source for the LaTeX canonical starter; validate=True test-compiles in the same call. It also names get_template('default') and get_template('typst-classic') as starting points. It does not explicitly route 'editing an existing draft' to update_template_draft, so it stops short of 5.

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

duplicate_base_resumeDuplicate Base ResumeC

Clone an existing base resume into a new slug.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYes
new_slugYes
new_display_nameNo

TDQS

C2.7/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=false and destructiveHint=false, so safety is partly covered. The description adds nothing beyond that: it does not say whether the copy is deep or shallow, whether source content is left untouched, or what happens if new_slug already exists (annotations mark idempotentHint=false, so a collision error is plausible but unstated).

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?

A single short sentence with the verb and target front-loaded and no wasted words. It is concise, though the brevity comes partly from under-specification rather than disciplined editing.

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

Completeness2/5

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

For a mutation tool with three undocumented parameters, no output schema, and only a default-valued third argument, the description omits too much: no mention of the third parameter, no collision behavior, and no indication of what the new resume inherits. An agent could call it, but with avoidable guesswork.

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 carry the load, but it only gestures at two of the three parameters ('existing' slug and 'new slug'). The optional new_display_name is never mentioned, nor is uniqueness/format expected for new_slug or the default display name of the clone.

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?

States a specific verb ('Clone') and resource ('base resume') plus the outcome ('into a new slug'), so an agent knows this is a copy operation. It does not, however, distinguish itself from close siblings like create_base_resume, create_base_resume_from_kb, or kb_sync_base, which could also produce a new resume.

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

Usage Guidelines2/5

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

There is no when-to-use guidance and no mention of the alternatives that produce a new base resume (create_base_resume, create_base_resume_from_kb, kb_sync_base). The agent must infer that this tool is for copying an existing resume rather than building one from knowledge-base data.

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

edit_applicationEdit Tailored ResumeA
Destructive

INCREMENTAL FIX: apply typed edit ops on top of an existing application's CURRENT tailored resume (customized_json), preserving every prior edit.

Falls back to the base resume only when the application has no customized_json
yet (nothing to preserve). Suited to refining or retrying a tailored resume
after inspecting PDF previews — swap a bullet, tweak wording, fix one thing —
without losing the rest of what's already been tailored and without creating
duplicate applications. tailor_application is the from-scratch alternative:
it recomputes customized_json off the BASE resume and discards any tailored
edits already on the application.
Accepts the FULL op vocabulary documented on edit_base_resume — every
kind. replace_entry changes an entry's dates, title, company, project name
or tech list; add/replace/remove/move_extra_section handle the custom
Publications/Awards/Volunteer sections.

Op field names (these exact keys, no synonyms):
{"kind": "replace_bullet", "section": "experience", "index": 0,
 "bullet_index": 2, "value": "New bullet text"} — `kind` (not op/type),
`index` (not entry_index; 0-based into the FULL array incl. disabled rows),
`value` (not text).
Index is 0-based into the full customized_json array (including enabled:false),
as shown by get_application, not PDF ordinals. Response `applied[].name`
echoes the entry each op touched.
Clears pdf_path/tex_path (the old PDF is stale); render_pdf produces a new one.
ParametersJSON Schema
NameRequiredDescriptionDefault
opsYesTyped edit ops. Each is an object with a `kind`, one of: replace_summary | toggle_entry | replace_bullet | replace_skills_group | add_skill_item | add_bullet | add_entry | replace_entry | remove_entry | remove_bullet | replace_contact | replace_certifications | add_extra_section | replace_extra_section | remove_extra_section | move_extra_section. To change a field ON an entry — dates, title, company, project name, link, tech — use replace_entry with that entry's index and the full edited entry object; it is scoped to that one entry (a whole-resume replace is the separate update_base_resume tool). See the tool description for each op's shape. add_extra_section/replace_extra_section `value` is {key,title,enabled,type:"entries"|"bullets"} plus EITHER entries:[{heading,subheading?,location?,date?,link?,enabled,bullets:[str]}] OR bullets:[str] — never both; unknown keys are rejected (400, extra="forbid").
application_idYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, idempotentHint=false, readOnlyHint=false, but the description adds real operational context beyond them: prior edits are preserved incrementally, the base-resume fallback only fires when customized_json is absent, and pdf_path/tex_path are cleared because the old PDF is stale (with render_pdf as the recovery). It doesn't cover auth/permission requirements or how a partially-failing op batch is reported, keeping it short of a 5.

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?

Front-loaded with the mode ('INCREMENTAL FIX') and then layers fallback, usage, alternative, op vocabulary, and field-name constraints in a logical order. Every sentence carries operational weight, though the op-vocabulary and key-name sections are dense enough that a couple of clauses could be tightened.

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?

There is no output schema, but the description compensates by documenting the response shape (`applied[].name` echoes each touched entry) and the side effect on pdf_path/tex_path plus the render_pdf recovery. Nothing critical for correct invocation is missing; only error/partial-failure semantics go unaddressed.

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 coverage is only 50% (application_id has no schema description), so the description must compensate, and it does: it pins exact key names ('kind' not op/type, 'index' not entry_index, 'value' not text), specifies 0-based indexing into the FULL array including enabled:false rows as shown by get_application, and points to edit_base_resume for the full op vocabulary. This maps directly onto the loosely-typed ops array and adds meaning the schema alone does not convey.

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 a specific verb+resource and a precise operation mode: 'apply typed edit ops on top of an existing application's CURRENT tailored resume (customized_json), preserving every prior edit.' It explicitly distinguishes itself from tailor_application (from-scratch) and update_base_resume (whole-resume replace), so an agent can disambiguate without opening schemas.

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?

Gives explicit when-to-use ('refining or retrying a tailored resume after inspecting PDF previews — swap a bullet, tweak wording, fix one thing') and names the alternative with the condition that selects it: tailor_application recomputes off the BASE resume and discards tailored edits. Also covers the no-customized_json fallback case. Routing is fully specified.

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

edit_base_resumeEdit Base ResumeA
Destructive

Apply typed edit ops to a base resume. replace_entry changes a field on one entry (dates, title, company, project name, link, tech) given that entry's index and the full edited entry; update_base_resume instead replaces the whole resume body (PUT). ExtraSection shape is on ops (ATS-neutral).

Indices are 0-based into the FULL array (incl. enabled:false), as returned by get_base_resume, never PDF order. Response applied echoes each op. Kinds:

  • {"kind":"replace_summary","value":str|null,"expected_content_hash"?:str}

  • {"kind":"toggle_entry","section":"experience"|"projects","index":int,"enabled":bool}

  • {"kind":"replace_bullet","section":,"index":int,"bullet_index":int,"value":str,"expected_content_hash"?:str}

  • {"kind":"replace_skills_group","category":str,"items":[str]} (case-insensitive)

  • {"kind":"add_skill_item","category":str,"item":str}

  • {"kind":"add_bullet","section":"experience"|"projects","index":int,"text":str}

  • {"kind":"add_entry","section":,"value":} (appends)

  • {"kind":"replace_entry","section":,"index":int,"value":} (one indexed entry only)

  • {"kind":"remove_entry","section":,"index":int}

  • {"kind":"remove_bullet","section":,"index":int,"bullet_index":int}

  • {"kind":"replace_contact","value":}

  • {"kind":"replace_certifications","items":[str]}

  • {"kind":"add_extra_section","value":}

  • {"kind":"replace_extra_section","section_key":str,"value":} (key may not change)

  • {"kind":"remove_extra_section","section_key":str}

  • {"kind":"move_extra_section","section_key":str,"to_index":int} =experience|projects|education (toggle_entry/add_bullet: experience|projects). section_key is ExtraSection.key. Bad index/category/key → error. Re-renders PDF. Every response carries render_error: non-null means the automatic re-render failed and the existing PDF is stale.

ParametersJSON Schema
NameRequiredDescriptionDefault
opsYesTyped edit ops. Each is an object with a `kind`, one of: replace_summary | toggle_entry | replace_bullet | replace_skills_group | add_skill_item | add_bullet | add_entry | replace_entry | remove_entry | remove_bullet | replace_contact | replace_certifications | add_extra_section | replace_extra_section | remove_extra_section | move_extra_section. To change a field ON an entry — dates, title, company, project name, link, tech — use replace_entry with that entry's index and the full edited entry object; it is scoped to that one entry (a whole-resume replace is the separate update_base_resume tool). See the tool description for each op's shape. add_extra_section/replace_extra_section `value` is {key,title,enabled,type:"entries"|"bullets"} plus EITHER entries:[{heading,subheading?,location?,date?,link?,enabled,bullets:[str]}] OR bullets:[str] — never both; unknown keys are rejected (400, extra="forbid").
slugYes

TDQS

A4.4/5.0
Behavior4/5

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

With annotations already declaring destructiveHint=true and idempotentHint=false, the description goes beyond them by disclosing error conditions ('Bad index/category/key → error'), the PDF re-render side effect, and the render_error/stale-PDF signal. It does not state whether a batch of ops applies atomically or partially, which is the remaining behavioral gap.

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?

Front-loaded with purpose, the key sibling distinction, index semantics, and response semantics before the long op catalogue, and the bulleted JSON sketches keep it scannable. It is nevertheless a dense wall of near-schema duplication (the kind list reappears in the schema description), so some redundancy exists.

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 high-complexity batch-mutation tool with no output schema, it explains the `applied` echo and render_error return semantics adequately. It omits atomicity/partial-failure behavior and never defines the required `slug` parameter, so it is not fully closed.

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?

The description is the de facto documentation for the polymorphic `ops` array, spelling out the shape of all 16 op kinds, index base ('0-based into the FULL array incl. enabled:false, never PDF order'), and enum-like constraints for <sec>, section_key, and case-insensitive category. It adds far more meaning than the schema's 50% coverage provides.

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 a specific verb and resource ('Apply typed edit ops to a base resume') and immediately contrasts itself with the sibling update_base_resume ('instead replaces the whole resume body (PUT)'). An agent can distinguish the two mutation tools without opening either schema.

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?

Gives a clear when-to-use rule for the key ambiguity: 'replace_entry changes a field on one entry ... a whole-resume replace is the separate update_base_resume tool.' However it never explains when to reach for edit_base_resume at all versus versioning/tailoring alternatives, and it introduces expected_content_hash without saying when an agent should supply it.

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

explore_ats_over_timeMatch Score TrendB
Read-onlyIdempotent

Average match score over time (weekly), split by phase (base vs tailored) and role category. Optionally filtered by role/level/type.

ParametersJSON Schema
NameRequiredDescriptionDefault
levelNo
role_categoryNo
employment_typeNo

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context — that results are weekly aggregates split by phase and role category — but says nothing about the time window, bucketing boundaries, or whether empty buckets appear.

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?

Two short sentences, front-loaded with the metric and granularity, then the filters. No filler or restatement of the title.

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?

For a read-only aggregation tool with no output schema and undocumented parameters, the definition covers what is aggregated and how it is split, which is the core. It is still missing the time range covered by 'over time' and any expectation about result shape, which an agent would need to interpret the output.

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 coverage is 0% and the three properties (level, role_category, employment_type) have no descriptions, so the description is the only source. It partially compensates by naming 'role/level/type' as the filter dimensions, but gives no accepted values, casing, or format, leaving the agent guessing at valid inputs.

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?

States a specific metric (average match score), a granularity (weekly), and the two splits (phase base vs tailored, role category) — enough to distinguish it from most siblings like explore_role_mix_over_time. It does not, however, explicitly separate itself from adjacent ATS analytics tools such as explore_tailoring_lift or compare_ats.

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

Usage Guidelines2/5

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

The only usage sentence is 'Optionally filtered by role/level/type,' which describes parameters rather than when to choose this tool over alternatives. There is no guidance on when the trend view is preferable to explore_tailoring_lift or compare_ats.

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

explore_fit_distributionResume Fit DistributionB
Read-onlyIdempotent

How each base resume's match scores (deterministic engine) are distributed across jobs. Each row's display_name is the resume's own name (null for a slug with no row); the slug is an internal identifier.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds genuinely useful field semantics — that display_name is the resume's own name and is null for a slug with no row, and that the slug is an internal identifier — but says nothing about the granularity of the distribution, ordering, or how scores are bucketed.

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?

Two short sentences with no filler, front-loaded on what is distributed. The parenthetical about the deterministic engine and the display_name note both earn their place, though the sentence flow is slightly choppy.

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?

With no output schema and no parameters, the description must carry the whole burden, and it only partially does: it explains two output fields but not the shape of the result (per-resume rows vs. buckets, score ranges, ordering) an agent needs to interpret a 'distribution'.

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 takes zero parameters, so the baseline of 4 applies. The description need not document any inputs, and the empty schema is consistent with that.

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?

States a specific subject — per-base-resume match-score distribution across jobs — and clarifies the deterministic engine as the source of the scores. It reads clearly as an analytics/distribution tool, though it never explicitly differentiates itself from the other explore_* siblings (top_skills, role_mix_over_time, skill_heatmap).

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

Usage Guidelines2/5

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

There is no when-to-use guidance and no named alternative, despite a crowded explore_* family where an agent must choose among several distribution-style tools. Usage is only inferable from the name and the word 'distribution'.

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

explore_gap_frequencyRecurring Skill GapsA
Read-onlyIdempotent

Skills that recur as gaps across saved JDs (best-scoring base resume vs JD, before tailoring), ranked by how many jobs want them and their potential match score gain. This is RECURRING DEMAND, not a "you lack this" or learn-next list: a skill can recur because the evidence lives on a different base resume, is stale, or is merely mis-placed on this one. The learn-vs-move distinction is the per-skill tier on build_areas (build = no resume evidence AND nothing in the Career KB, the only genuinely learn-it rows; surface = the material exists, port or strengthen it) — get_job_search_brief carries build_areas, or GET /api/explore/build-areas. Hygiene mirror_wording gaps are excluded here: the resume already matches those at full keyword credit, so the literal JD token moves no score and is not demand. Each row also carries category_label, the plain-words form of category (e.g. "Add an example in a job or project"); the raw keys (dual_place, missing_skills) and the build_areas tier values are internal identifiers, and category_label / the tier word is their user-facing wording. Optionally filtered by role/level/type; limit caps the number of skills returned.

ParametersJSON Schema
NameRequiredDescriptionDefault
levelNo
limitNo
role_categoryNo
employment_typeNo

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the bar is lower. The description adds real behavioral context beyond them: ranking semantics, exclusion of mirror_wording hygiene gaps and why (full keyword credit means no score movement), and guidance that raw keys (dual_place, missing_skills, tier values) are internal with category_label as the user-facing wording.

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 core definition is front-loaded in the first clause and the following sentences are dense with interpretation-relevant guidance rather than filler. It runs long, and the internal-identifier aside is somewhat discursive, but each part earns its place by preventing misreading of the output.

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 no output schema, the description must convey the return shape, and it does: each row carries category_label and ranking by job demand plus potential match-score gain. Filtering behavior is sketched but not specified in detail, which is the main remaining gap.

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 carries the full parameter burden. Its single line 'Optionally filtered by role/level/type; limit caps the number of skills returned' maps all four schema params to plain words, but supplies no value formats, allowed values, or defaults for level, role_category, employment_type, or limit.

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?

States a specific resource and scope: skills recurring as gaps across saved JDs, measured on best-scoring base resume vs JD before tailoring, ranked by job count and potential match-score gain. It clearly disambiguates from a 'you lack this / learn-next' interpretation. It does not name sibling analytics tools (explore_top_skills, explore_skill_heatmap, resolve_gaps) by name, so sibling differentiation is partial.

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?

Explains what this output represents and explicitly redirects the learn-vs-move question to another surface ('the learn-vs-move distinction is the per-skill tier on build_areas ... get_job_search_brief carries build_areas'). That is a concrete when-to-use-something-else pointer, though it never states a positive trigger condition for calling this tool.

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

explore_role_mix_over_timeRole Mix Over TimeB
Read-onlyIdempotent

Counts of jobs by role category per week.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already declare the full safety profile (readOnly, idempotent, non-destructive, closed-world), so the description only needs to add context. It contributes the output granularity (per week) and grouping dimension (role category), but says nothing about data scope, default time range, or cardinality of the result.

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?

A single front-loaded clause with zero filler — the grouping and the time bucket both land immediately. It is arguably too terse for the tool's analytical role, but no sentence is wasted.

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?

With no parameters and no output schema, the description carries the burden of explaining the shape of the result, and it only partially does: it names two dimensions but not the time horizon, whether counts span all jobs or the user's jobs, or the form of the returned series. Adequate minimum but with clear 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?

The tool takes zero parameters, so per the rubric the baseline is 4. There is nothing for the description to clarify on the input side.

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?

States a specific computation and grouping: counts of jobs grouped by role category, bucketed per week. That distinguishes it from explore_ats_over_time and explore_tailoring_lift by subject matter, but the description never names those siblings or explicitly frames the tool as an analytics/exploration query, so an agent must infer the routing from the shared 'explore_' prefix.

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

Usage Guidelines2/5

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

There is no when-to-use guidance at all — no statement of what question this answers, no indication of the time window analyzed, and no mention of alternatives among the six other explore_* siblings. The noun-phrase style implies an exploratory query but leaves all selection logic to inference.

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

explore_skill_heatmapSkill Demand HeatmapC
Read-onlyIdempotent

Skill demand by role category (pct of jobs per skill x role).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo

TDQS

C2.7/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is fully covered externally. The description contributes the metric definition (pct of jobs per skill x role), which is genuine context, but says nothing about granularity, aggregation scope, or default sizing.

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?

A single short sentence with no filler, and the core metric is front-loaded. It is efficient, though arguably too terse given the undefined parameter.

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

Completeness2/5

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

There is no output schema, so the description must convey the shape of the result; it only implies a matrix without saying whether it returns rows, a grid, or serialized cells. Combined with the undocumented 'limit', it is not complete enough to invoke confidently.

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% and the single parameter 'limit' is never mentioned in the description. With no explanation of what limit bounds (skills, roles, cells) or its default of null, the agent must guess its meaning entirely.

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

Purpose3/5

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

The description states what is computed (skill demand as a percentage of jobs per skill x role), which is more than a restatement of the title. However, it never uses a verb like 'compute' or 'return', and it does not distinguish itself from the sibling analyze tool explore_top_skills, which also deals with skill demand.

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

Usage Guidelines2/5

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

There is no when-to-use guidance, no condition under which this heatmap is preferable to explore_top_skills, and no mention of prerequisites or data assumptions. The agent gets no routing help.

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

explore_tailoring_liftTailoring Score LiftB
Read-onlyIdempotent

How much tailoring lifts the match score (base->tailored), averaged per role category, plus an overall row. Optionally filtered by role/level/type.

ParametersJSON Schema
NameRequiredDescriptionDefault
levelNo
role_categoryNo
employment_typeNo

TDQS

B3.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and closed-world, so safety is covered. What the description adds is genuinely beyond that: the return shape is grouped per role category with an additional overall row. It still leaves the unit of 'lift' (raw points vs. percentage) and empty-result behavior unstated, so it is good but not complete.

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?

Two tight sentences with the core definition front-loaded and the filter caveat last; no filler. The shorthand 'role/level/type' is slightly compressed relative to the schema's actual field names, which costs a little clarity but not economy.

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?

With no output schema and 0% schema description coverage, the description must carry the burden and does cover purpose, aggregation grouping, and the optional-filter behavior. It omits valid filter values, the scale/unit of the lift score, and how many rows to expect, which an agent needs to interpret or call this confidently.

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% for three nullable string parameters. The description maps loosely onto them ('role/level/type' covering role_category, level, employment_type) and confirms they are optional filters, but gives no accepted values, matching semantics, or whether filters are exact or partial. It compensates only partially.

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 names a specific computed metric (tailoring lift on match score, base->tailored) and its aggregation unit (per role category plus an overall row), which distinguishes it from sibling explore_* tools like explore_fit_distribution or explore_ats_over_time. It does not explicitly name an alternative sibling, but the resource being measured is unambiguous.

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

Usage Guidelines2/5

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

The only usage cue is that filters are optional. There is no statement of when to reach for this tool versus explore_fit_distribution, score_ats, compare_ats, or get_tailoring_session, nor any prerequisite or scope condition. The agent must infer intent from the metric name alone.

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

explore_top_skillsTop In-Demand SkillsB
Read-onlyIdempotent

Most in-demand skills across stored JDs, optionally filtered by role/level/type.

ParametersJSON Schema
NameRequiredDescriptionDefault
levelNo
limitNo
role_categoryNo
employment_typeNo

TDQS

B3.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and a closed-world scope, so the safety profile is covered. The description only adds the data source (stored JDs) and optional filtering; it says nothing about aggregation basis, ranking, or how many results come back.

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?

One tight sentence with the scope front-loaded and no filler. It is efficient, though the brevity is part of why the parameter and return semantics are underspecified.

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

Completeness2/5

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

For an analytics tool with no output schema, an agent cannot tell what the response looks like (ranked list? counts? share percentages?) and gets no filtering vocabulary. Given 0% schema coverage and four undocumented parameters, the single sentence is not enough.

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% and no parameter has a description or enum, so the description carries the full burden. It names role/level/type, loosely mapping to three of the four parameters, but leaves valid values unspecified and never mentions limit at all.

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?

States a specific operation and resource: ranking the most in-demand skills across stored JDs. An agent can tell what it retrieves, though it never contrasts itself with the nearby explore_skill_heatmap or explore_gap_frequency, which cover adjacent analytics.

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?

"Across stored JDs, optionally filtered by role/level/type" implies the context of use and that all filters are optional, but there is no when-to-use guidance and no mention of when a sibling like explore_skill_heatmap would be the better pick.

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

export_jobsExport JobsA
Read-onlyIdempotent

Export jobs, newest first, with extracted fields and nested skills, for open-ended analysis. Paged by limit (default 10, max 50) and offset; a page shorter than limit is the last. Rows run a few thousand characters (the skills list is most of it) and omit raw_text and extracted_json, which get_job returns for one posting. since is an ISO date (YYYY-MM-DD); skill is a case-insensitive substring.

ParametersJSON Schema
NameRequiredDescriptionDefault
levelNo
limitNo
sinceNo
skillNo
offsetNo
role_categoryNo

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive, so safety is covered. The description adds real behavioral detail beyond them: pagination semantics (page shorter than limit is the last), row size in characters, and the fact that raw_text and extracted_json are omitted. Return format is only partially covered (no output schema).

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?

Dense but front-loaded: purpose first, then pagination, then payload shape, then parameter formats. Every sentence carries information, though the parenthetical asides add some length without changing agent behavior.

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 6-param read-only export with no output schema, the description supplies the pagination contract, row-size expectations, and omitted fields, which is what an agent needs to call it. The only shortfall is the undocumented level and role_category filters.

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 coverage is 0%, so the description must carry the load. It documents limit (default 10, max 50), offset, since (ISO YYYY-MM-DD), and skill (case-insensitive substring), which is most of the parameter surface. However, the level and role_category filters are left entirely unexplained, which is a real gap for a 6-param tool.

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 a specific verb and resource (export jobs), the ordering and payload shape (newest first, extracted fields, nested skills), and the intent (open-ended analysis). It explicitly distinguishes itself from get_job, which returns raw_text and extracted_json for a single posting, so an agent can route without opening the schema.

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?

Frames the use case (open-ended analysis, bulk export) and names get_job as the single-posting alternative. It stops short of explicit exclusions against sibling list_jobs, so the when-not-to-use case is inferred rather than stated.

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

find_job_by_urlFind Job by URLA
Read-onlyIdempotent

Answer "is this posting already captured?", so an extraction can be skipped: posting-equality source_url lookup returning {found, job, application_exists, application_id}. Matching ignores query strings and fragments (?utm_*, ?gh_src=, #apply) and treats the posting's own sub-paths (/apply, /application) as the same posting, so tracking parameters need not be stripped from the input. A search-results or employer-index URL still matches nothing. found=False means the posting is new; store_extracted_jd still dedupes authoritatively via already_existed.

ParametersJSON Schema
NameRequiredDescriptionDefault
source_urlYes

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), and the description adds real behavioral detail beyond them: the matching algorithm (ignores ?utm_*/?gh_src=/#apply, treats /apply and /application as the same posting), what counts as a non-match, and the meaning of found=False. That is exactly the extra context a caller needs.

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?

Front-loads the purpose and return shape, then layers matching rules and the dedupe caveat. It is dense and information-rich with no wasted sentences, though the parenthetical lists make it slightly heavier to parse than necessary.

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?

For a one-parameter lookup with no output schema, the description fully covers purpose, matching edge cases, return keys, and the relationship to the authoritative dedupe path. An agent has everything needed to call and interpret it correctly.

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 coverage is 0% for the single source_url parameter, but the description compensates with real semantics: tracking parameters and fragments need not be stripped, and the posting's own sub-paths are normalized. It clarifies what input is acceptable rather than just naming the field.

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?

Opens with the concrete question it answers ("is this posting already captured?") and names the resource (posting-equality source_url lookup) and the return shape. An agent can immediately tell it apart from siblings like store_extracted_jd, list_jobs, and get_job.

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?

Explicitly frames when to use it (before an extraction, to skip work when found=True) and names the alternative that dedupes authoritatively (store_extracted_jd via already_existed). It also states the failure mode: search-results or employer-index URLs match nothing. Nothing is left to inference.

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

generate_cover_letterGenerate Cover LetterB
Destructive

Generate a cover letter for an application in the requested tone. This replaces the application's prior generated cover-letter entry.

ParametersJSON Schema
NameRequiredDescriptionDefault
toneYes
application_idYes

TDQS

B3.3/5.0
Behavior4/5

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

Annotations already flag destructiveHint=true and idempotentHint=false, and the description usefully adds the specific destructive consequence: it replaces the application's prior generated cover-letter entry. It does not cover auth requirements, output format, or regeneration limits, but it meaningfully explains what gets destroyed.

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?

Two compact sentences, front-loaded with the action and followed immediately by the replacement warning. Every sentence earns its place with no filler.

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?

The mutation semantics are covered by annotations plus the replacement note, but with no output schema the description says nothing about what the generated letter looks like or how it is returned, and the tone parameter contract is undefined. Adequate but with clear gaps for a write tool.

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% and there are no enums, so the description must carry the load. It only gestures at 'requested tone' without listing valid tone values, and says nothing about application_id. Both required parameters remain under-specified.

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?

States a specific verb (generate) and resource (cover letter) scoped to an application and a requested tone. It clearly identifies the operation; there is no sibling cover-letter tool to be confused with, but the description does not explicitly differentiate from adjacent tools like tailor_application or generate_qa_answers.

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

Usage Guidelines2/5

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

No guidance on when to use this versus alternatives, no prerequisites, and no indication of required application state. The description only asserts what the tool does, leaving the agent to infer context.

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

generate_qa_answersGenerate Screening AnswersB

Generate a batch of screening-question answers for an application. questions is the complete list of questions to answer in this batch. Outreach/cold messages are asked as free-form questions here (e.g. "Write a short LinkedIn DM to the hiring manager") — answers are grounded in the resume and the application's linked referral contact when one exists.

ParametersJSON Schema
NameRequiredDescriptionDefault
questionsYes
application_idYes

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, idempotentHint=false, and openWorldHint=true, so the write/creative nature is covered structurally. The description adds genuinely useful context that answers are grounded in the resume and the application's linked referral contact, but it omits return format, cost/latency, and any persistence behavior.

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?

Front-loaded with the core purpose, then two supporting sentences with no filler. Slightly verbose in the final clause but every sentence contributes.

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?

There is no output schema, so the description ideally would explain what the generated answers look like or where they go, which it does not. It is adequate for a generation tool but leaves the return/consumption story and application_id semantics unaddressed.

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 coverage is 0%, so the description must carry the burden. It meaningfully explains `questions` (the complete list for this batch, including free-form outreach prompts), but says nothing about `application_id`, leaving half the required parameters undocumented.

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?

States a specific verb+resource ('Generate a batch of screening-question answers for an application'), which clearly identifies the operation. It does not explicitly differentiate from siblings like list_qa_entries or record_filled_answers, but the purpose is unambiguous.

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

Usage Guidelines2/5

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

No when-to-use guidance, no prerequisites, and no alternatives named. It clarifies the content of `questions` and notes that outreach messages surface here as free-form questions, but this is context about inputs, not routing guidance for selecting this tool over its siblings.

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

get_applicationGet ApplicationB
Read-onlyIdempotent

Get one application's full detail: the tailored resume (customized_json) and the joined job. Use compare_ats for before/after scores.

ParametersJSON Schema
NameRequiredDescriptionDefault
application_idYes

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered. The description adds the return payload (customized_json plus joined job), which is useful given no output schema, but says nothing about behavior for a missing or invalid ID or any auth requirements.

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?

Two short sentences, front-loaded with what is retrieved and what is returned; no filler or restatement of the name.

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 single-entity read tool with one param and no output schema, the description is nearly sufficient — it characterizes the return value and points at a related comparison tool. The only real omission is how to obtain the application_id.

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% and the description says nothing about application_id — neither its format nor that it originates from list_applications/propose_application. With only one parameter this is a small gap, but the description contributes no parameter meaning at all.

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?

States a specific verb and resource (get one application) and enumerates the payload: the tailored resume (customized_json) and the joined job. That payload description distinguishes it meaningfully from list_applications and from edit/update_application, though it doesn't contrast with other single-entity getters like get_proposal.

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 sentence 'Use compare_ats for before/after scores' routes the agent on an adjacent need, but there is no explicit statement of when to call this tool versus get_application-adjacent siblings (get_proposal, get_final_review) or where the application_id comes from. Usage is implied rather than prescribed.

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

get_autofill_profileGet Autofill ProfileA
Read-onlyIdempotent

Read the user's application-form autofill data: profile (personal contact + address, typed work-authorization answers, preferences like salary/notice/relocation, education, languages — each a language with read/speak/write level Basic/Intermediate/Fluent and separate native and fluent booleans — custom Q&A presets), plus employment blocks and skills from the selected resume when application_id or base is given. Response is labeled source: "profile" and includes canonical_identity (legal_first, legal_last, preferred) mapped only from stored autofill personal fields; it is the source of truth for form identity fields and takes precedence over ATS-parsed values. This is the same feed the Chrome extension's deterministic fill uses, so it supplies real stored values for ATS forms. EEO/demographic answer values (profile.eeo) are returned ONLY when Profile standing consent is active (eeo_consent.enabled) and are stripped otherwise; when returned they are the user's stored answers, intended for Playwright/agent fill verbatim with no inference or model-authored values. eeo.veteran_status is no, yes or decline: one question, "Are you a veteran?" (a no also answers "not a protected veteran"; a yes alone never says which protected class applies, so leave a protected-class list to the user). eeo.gender is male, female, non_binary, self_describe or decline; with self_describe, eeo.gender_self_describe is the user's own words for a form's self-describe box. A form lacking a matching option is left to the user. Missing EEO values are completed by the user in Profile or in the browser; consented answers are not pasted or re-dictated through chat. A value absent here (e.g. an unstored county) is not in the profile and is not guessable. WOTC, signatures and terms are human-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
baseNo
application_idNo

TDQS

A4.3/5.0
Behavior5/5

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

Goes well beyond the readOnly/idempotent annotations: it discloses consent gating and stripping of `profile.eeo`, that canonical_identity takes precedence over ATS-parsed values, that answers are for verbatim fill with no inference, and that WOTC/signatures/terms are human-only. These are non-obvious behavioral traits an agent cannot infer from the structured fields.

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

Conciseness3/5

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

Front-loaded with the payload summary, and most content earns its place, but the EEO/veteran/gender enumeration is extremely dense and reads like field-level documentation rather than tool-selection guidance. It is long enough that key routing information risks being buried.

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?

With no output schema and no annotation coverage of content, the description must describe returns, and it does so thoroughly, including edge cases (missing county), consent-dependent fields, and identity precedence. An agent has everything needed to call and interpret the result.

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 coverage is 0% and neither parameter is described in the schema, so the description carries the burden; it explains that supplying `application_id` or `base` adds employment blocks and skills from the selected resume. However it never clarifies what `base` is (base resume id?) or how the two parameters differ, so half the parameter meaning is still implicit.

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?

Names a specific verb+resource ('Read the user's application-form autofill data') and then enumerates the exact payload (profile fields, employment, skills, canonical_identity, EEO) so it is unmistakable against siblings like get_application or get_career_context. The scope is narrow and self-defining, so an agent can select it without opening the schema.

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?

Gives clear conditions ('plus employment blocks and skills from the selected resume when application_id or base is given') and states the operational context ('same feed the Chrome extension's deterministic fill uses, so it supplies real stored values for ATS forms'). It also tells the agent what to do when data is absent ('not guessable', 'left to the user'), though it never names an alternative sibling or an explicit when-not.

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

get_base_resumeGet Base ResumeB
Read-onlyIdempotent

Get a base resume's full data JSON, render status, and metadata.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYes

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered by structured data. The description adds value by disclosing what the read returns (full data JSON, render status, metadata), which is useful given there is no output schema. It stops short of describing error/not-found behavior.

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?

A single front-loaded sentence with no filler; the payload contents are listed compactly and every clause informs the agent about the call's output.

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 no output schema and only one parameter, the description does the necessary work by naming the returned artifacts. It is nearly complete for a simple read tool; only the slug semantics and failure behavior are absent.

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% for the single 'slug' parameter, so the description carries the full burden. It implies the slug identifies the resume but never explains the slug's format, source (e.g., from list_base_resumes), or what happens on an unknown slug.

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?

States a specific verb ('Get') and resource ('base resume') and enumerates the payload ('full data JSON, render status, and metadata'), so it is clearly distinguishable from list_base_resumes. It does not explicitly distinguish itself from retrieval-adjacent siblings like get_resume_version, but the purpose is unambiguous.

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

Usage Guidelines2/5

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

There is no statement of when to use this tool versus list_base_resumes, get_resume_version, update_base_resume, or edit_base_resume. No preconditions or exclusions are given; the agent must infer usage entirely from the name.

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

get_career_contextGet Career ContextA
Read-onlyIdempotent

Read the full composed career context from the Career KB: resume (the approved-points resume view assembled from profile + non-archived entities) and memory (the beyond-the-resume string: identity facts and entity notes that don't belong on a resume). Intended as grounding for writing about the user's career (LinkedIn posts, outreach drafts), optionally with get_base_resume for a specific resume's voice. resume carries approved points only; memory also includes the profile summary and notes and the non-archived entities' notes. It never invents facts, metrics, employers, or dates; anything absent from it (and from a fetched base resume) is not part of the user's recorded career. It carries no IDs: kb_list_entities / kb_get_entity / kb_list_points return the IDs needed to correct anything.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive/openWorld=false, yet the description adds real behavioral context beyond them: it never invents facts, metrics, employers or dates, absence from the output means the fact is not recorded, and it deliberately carries no IDs (routing to kb_list_entities / kb_get_entity / kb_list_points). This is substantive disclosure layered on top of the safety profile.

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?

Front-loaded with what is read and the two output sections before the usage and caveat sentences, so an agent can stop early. It is dense and slightly long, but each sentence (composition, grounding use, no-invention guarantee, ID absence) carries information rather than filler.

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?

With no output schema, the description must explain the return shape, and it does: `resume` is approved points only while `memory` adds the profile summary, notes, and notes from non-archived entities. Combined with the grounding contract and ID guidance, an agent has everything needed to call and interpret this correctly.

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 takes zero parameters, so the baseline is 4 and there is nothing for the description to disambiguate. No misleading parameter hints are present.

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?

Specific verb+resource (reads the composed career context from the Career KB) with the two returned sections, `resume` and `memory`, explicitly defined. It distinguishes itself from the kb_* siblings by naming them as the ID-bearing tools it is not, and from get_base_resume by framing that as an optional companion.

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?

States the intended use clearly: grounding for writing about the user's career (LinkedIn posts, outreach drafts), optionally paired with get_base_resume for a specific resume's voice. It names the correct siblings for ID correction, but gives no explicit when-not-to-use condition or exclusion.

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

get_career_exportGet Career ExportA
Read-onlyIdempotent

Read the exact portable career.md generated from the current Career KB.

Returns deterministic Markdown for copy-out, download-equivalent use, or
Markdown-oriented grounding. For structured resume and memory fields, use
get_career_context. Read-only; this does not alter tailoring behavior.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description still adds value beyond them: the output is 'deterministic' Markdown and it 'does not alter tailoring behavior', a domain-specific side-effect statement. It stops short of explaining generation/refresh behavior, so not a full 5.

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 short sentences, front-loaded with what is returned, followed by the routing hint and the safety note. Every sentence earns its place 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?

An output schema exists, so return values need not be re-explained, and there are no parameters or nested objects to cover. For a simple read-only export, nothing an agent needs to call it correctly is missing.

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 takes zero parameters, so there is nothing for the description to clarify; the baseline for a parameterless tool applies. No param information is needed or missing.

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 a specific verb and resource ('Read the exact portable career.md generated from the current Career KB') and explicitly names the sibling it is not ('For structured resume and memory fields, use get_career_context'). An agent can distinguish this from get_career_context without opening either schema.

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?

Gives the conditions that select this tool ('copy-out, download-equivalent use, or Markdown-oriented grounding') and names the alternative plus the condition that selects it (structured resume/memory fields). Routing is explicit and unambiguous.

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

get_final_reviewGet Final ReviewA
Read-onlyIdempotent

Compact final-review bundle: job summary, chosen base/match score delta, PDF readiness, QA answers, EEO consent flag (no values), blocked/manual items, evidence manifest. Requires an existing proposal — a 404 usually means propose_application was not called (it accepts application_id to late-link) or an application id was passed where a proposal id belongs. duplicate_submitted=true means a same-company+title proposal was already submitted (relevant to the user's approval decision). flags lists the job's recorded form answers worth a second look (record_filled_answers): question, source, answer (an EEO one carries eeo_answered instead) and each flag's reason. base_country.eligible is false when the resume being sent is set for other countries than the job's.

ParametersJSON Schema
NameRequiredDescriptionDefault
proposal_idYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so safety is covered. The description adds genuine behavioral context beyond that: the 404 failure mode and its likely cause, the meaning of duplicate_submitted, and the conditional semantics of base_country.eligible. Its only shortfall is that much of that detail is really return-field semantics rather than operation behavior.

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 payload description is front-loaded in the first sentence and every subsequent sentence adds distinct information (precondition, 404 cause, duplicate_submitted meaning, flags shape, base_country semantics). It is dense and readable, though the long run-on paragraph could be broken into labeled segments for faster scanning.

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?

With no output schema, the description must carry the return contract, and it does: it enumerates the bundle sections, explains the flags entry shape (question, source, answer, reason, EEO variant), and documents two derived fields. Nothing an agent needs to call and interpret this tool is missing.

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% for the single parameter, so the description carries the burden — and it partially does by clarifying that proposal_id means a proposal id, not an application id, which is the common misuse. It adds no format, naming, or sourcing guidance beyond that disambiguation, so it compensates only in part.

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?

Names a specific verb+resource (get_final_review) and immediately enumerates the bundle contents (job summary, score delta, PDF readiness, QA answers, EEO consent flag, blocked items, evidence manifest). An agent can distinguish this pre-approval review artifact from get_proposal or get_application without opening any schema.

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?

States the precondition clearly ('Requires an existing proposal') and gives the remediation path plus the exact failure mode (404 usually means propose_application was not called, or an application id was passed instead of a proposal id). It also frames the intended consumer context ('relevant to the user's approval decision'). It stops short of naming an alternative sibling for the adjacent questions, so it is context-rich but not a full when/when-not routing statement.

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

get_health_reportGet Resume Health ReportA
Read-onlyIdempotent

Fetch the most recent stored health report for a base resume or application without re-running it. kind is 'base' or 'application', key is the slug or application id. Returns {score, grade, tier, next_grade, gates, counts, findings} (fields as in run_health_check), or an error if no report exists yet (run_health_check creates one).

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYes
kindYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so the safety profile is covered. The description adds genuinely useful behavioral context beyond that: the failure mode (error when no report exists yet) and the pointer to run_health_check as the remedy.

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?

Front-loaded with the core action, followed by parameter meaning and return shape in two tight sentences. The inline field list is dense but earns its place given there is no output schema.

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 no output schema, the description steps in to enumerate the returned fields and the error case, which is enough to call and interpret the tool. A mention of report freshness/staleness semantics would make it complete.

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 carry the burden and largely does: it explains that `kind` is 'base' or 'application' and `key` is the slug or the application id. Only minor gaps remain (format of the slug/id is not spelled out).

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 a specific verb (Fetch) and resource (most recent stored health report) plus the scope (base resume or application) and the key constraint ('without re-running it'). It is immediately distinguishable from the sibling run_health_check, which it names.

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?

Clearly frames when to use it: to read an existing report rather than recompute one, and it points at run_health_check as the tool that creates a report when none exists. It stops short of an explicit 'use X when you want a fresh score' rule, but the routing is inferable.

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

get_jobGet Job DetailsB
Read-onlyIdempotent

Get a job with its most recent application. The nested job carries ownership (owned_here, owner, handover, pending_requests), identifying replicas and jobs being handed over.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYes

TDQS

B3/5.0
Behavior3/5

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

Annotations already declare readOnly/idempotent/non-destructive and closed-world, so the safety profile is covered. The description adds genuinely useful context about the payload shape (nested ownership fields: owned_here, owner, handover, pending_requests) and what those fields identify, which goes beyond the annotations.

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?

Two sentences, purpose front-loaded first, return-shape detail second. Efficient and no padding, though the second sentence is dense with parenthetical field names.

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?

No output schema exists, so the description must carry the return burden; it partially does by naming the ownership fields. But job_id semantics and the relationship to siblings (get_application) are left unstated, leaving gaps for a lookup tool.

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% and the description adds nothing about job_id — no format, source, or how to obtain a valid id. With a single undocumented parameter, the description fails to compensate for the schema gap.

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?

States a specific verb+resource ('Get a job') and adds scope detail ('with its most recent application'), which distinguishes it from siblings like list_jobs and get_application. It stops short of explicitly naming alternatives, but the agent can tell what it retrieves.

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

Usage Guidelines2/5

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

There is no guidance on when to use this versus get_application, list_jobs, or get_job_search_brief. Usage is only implied by the word 'Get' on a single job_id; no exclusions or prerequisites are stated.

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

get_job_search_briefGet Job Search BriefA
Read-onlyIdempotent

Read the server-composed job-search brief: profile constraints (location, relocation, work-auth VERBATIM plus warnings[] when values are contradictory or missing — never guessed), persona text (may be empty, in which case the analytics-derived targets are the stronger signal), active base-resume summaries, role mix, top required skills, build areas (per-skill tier plus category_label, the plain-words label for the raw category key), referral careers pages (company + careers_url + has_contact), and counts of jobs captured in the last 30 days by role category. It is the entry point of the agentic job-search workflow (playbook: docs/agentic-job-search.md), which covers capture, scoring and proposals; applying is outside its scope. sync carries enabled and role (home, remote, or null when sync is off). applying.answer_level is the Screening answers level (facts, history, queued).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, closed-world), so the bar is lower; the description adds real behavioral context by disclosing that constraints are returned VERBATIM and 'never guessed', that warnings[] appear on contradictions/missing values, that persona text may be empty, and what sync/applying fields mean. It does not cover auth needs or rate limits, keeping it at 4.

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

Conciseness3/5

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

The purpose is front-loaded, which is good, but the rest is a single dense run-on paragraph packed with parentheticals and trailing fragments like 'applying.answer_level is the Screening answers level (facts, history, queued)'. Given there is no output schema the content is largely justified, but the parsing burden is high and the structure could be broken into clearer segments.

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?

With no output schema, the description carries the entire burden of explaining the return payload and does so thoroughly — listing every section, its fields, and edge cases (empty persona, contradictory constraints, null role when sync is off). An agent has everything needed to interpret the response.

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 takes zero parameters, so per the rubric the baseline is 4; there is nothing to disambiguate and the description correctly focuses entirely on the returned payload instead of inventing arguments.

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?

Opens with a specific verb+resource ('Read the server-composed job-search brief') and then enumerates its sections, so an agent knows exactly what it returns. It also positions itself against siblings by naming itself the entry point of the agentic job-search workflow and excluding exploration/applying tools from its scope.

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?

States when to reach for it (the entry point of the capture/scoring/proposal workflow, with a playbook pointer) and draws an explicit boundary ('applying is outside its scope'). It stops short of naming specific sibling alternatives for adjacent needs, so it is clear context without full when-not routing.

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

get_job_site_loginGet Job-Site LoginA
Idempotent

The email and password the user saved for job-site accounts, for creating an account or signing in on this proposal's application site. Available only while full automation is on and only for a queued or approved proposal; each call is recorded (never the value). The value passes through the agent's AI provider, which is why it is a password the user keeps for job sites alone. Returns {email, password}.

ParametersJSON Schema
NameRequiredDescriptionDefault
proposal_idYes

TDQS

A4.3/5.0
Behavior4/5

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

With annotations already covering safety hints, the description adds substantial non-obvious context: every call is recorded (but never the value), the value is exposed to the agent's AI provider, and the user's password is deliberately scoped to job sites. It also pre-empts the odd readOnlyHint=false by explaining the audit side effect, so there is no contradiction. It stops short of describing failure behavior when the preconditions are unmet.

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?

Front-loaded with what the tool returns, followed by availability constraints, audit/privacy notes, and the return shape. Three dense sentences, all earning their place; the AI-provider sentence is slightly circuitous but adds meaningful warning 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?

There is no output schema, and the description compensates by specifying the return shape {email, password}, plus availability gates and a privacy warning. Complete for invocation; only a note on what happens when the tool is unavailable or the proposal is unapproved is missing.

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% for the single proposal_id parameter, so the description carries the burden. It only implies the parameter via 'this proposal's application site' and 'a queued or approved proposal', which conveys the concept but not the id format or source (e.g., from list_proposals). Baseline 3 for a one-param tool with a partial hint.

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 a precise verb+resource: it retrieves the user's saved email and password for job-site accounts tied to a proposal's application site, and names the intended use (creating an account or signing in). No sibling tool does credential retrieval, so it is unambiguously distinct from get_proposal, get_application, and the kb_* family.

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?

Gives explicit preconditions that act as when/when-not guidance: available only while full automation is on, and only for a queued or approved proposal. The purpose statement also names the concrete situation in which the agent should reach for it (signing in or creating an account on the application site).

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

get_proposalGet ProposalB
Read-onlyIdempotent

Get proposal detail including job facts, application summary, QA entries, and evidence manifest. Reading expires an overdue pending_review or needs_decision proposal (terminal 'expired').

ParametersJSON Schema
NameRequiredDescriptionDefault
proposal_idYes

TDQS

B3/5.0
Behavior1/5

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

The description states that reading the resource mutates it, expiring an overdue pending_review or needs_decision proposal into a terminal 'expired' state. That is a state-changing, effectively irreversible side effect, which directly contradicts the readOnlyHint=true and destructiveHint=false annotations. This is a genuine annotation contradiction.

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?

Two sentences, zero filler, and the return payload is front-loaded before the critical side-effect warning. Every clause earns its place.

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 no output schema, the description usefully enumerates the returned sections (job facts, application summary, QA entries, evidence manifest) and warns of the expiry transition, which is the most important thing an agent must know here. It is only incomplete in that it says nothing about the proposal_id parameter.

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?

There is a single required parameter, proposal_id, with 0% schema description coverage, and the description never explains its meaning, format, or where to obtain it. With no annotations or schema text to lean on, the description fails to compensate for the coverage gap.

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?

States a specific verb and resource ('Get proposal detail') and enumerates the payload it returns (job facts, application summary, QA entries, evidence manifest), which is far more useful than a tautology. It implicitly contrasts with list_proposals via 'detail', but never names that sibling explicitly, so it falls short of a 5.

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?

Usage is only implied: an agent can infer this fetches one proposal by id rather than listing them. There is no explicit when-to-use, when-not-to-use, or named alternative (e.g. list_proposals for discovery), so guidance is thin.

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

get_rendered_pdfGet Rendered PDFA
Read-onlyIdempotent

Save a rendered PDF locally and render one PNG per page without inlining images. target_type 'base_resume'(slug)/'application'(id) returns the last rendered resume PDF; 'template'(id) returns the sample preview PDF. Returns {filename, path, size_bytes, mime_type, page_count, page_images, em_dash_found, em_dash_pages, artifact_dir?}. Requires an existing render (render_pdf, or validate_template for a template preview). Paths are local to where the backend/MCP server run; browser uploads use the copy staged by prepare_application_pdf_upload. The PDF and per-page PNGs ({id}.pN.png, ~120 dpi) are written under $MAESTRO_CS_PDF_DIR (or a temp dir). This slim response never includes image base64; get_rendered_pdf_page_image returns the visual bytes of exactly one page. em_dash_found reports whether the PDF contains an em dash (U+2014), which rendered resumes in this product are required not to contain; em_dash_pages lists the page numbers. (page_count is None / page_images empty if the PDF can't be read.)

ParametersJSON Schema
NameRequiredDescriptionDefault
target_idYes
target_typeYes

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the readOnly/idempotent hints it discloses concrete behavior: it writes the PDF and per-page PNGs under $MAESTRO_CS_PDF_DIR (or a temp dir), guarantees no inlined base64, and defines how em_dash_found/em_dash_pages are computed and how page_count/page_images degrade when the PDF can't be read. This is unusually rich disclosure of side effects and edge cases.

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?

Front-loads the core action, then returns, then prerequisites, then environment details, so an agent can stop reading early. It is a dense block rather than bulleted and the return-shape detail is long, but nearly every sentence adds distinct, useful 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?

With no output schema, the description fully enumerates the return object ({filename, path, size_bytes, mime_type, page_count, page_images, em_dash_found, em_dash_pages, artifact_dir?}), the prerequisite, the file destination, and the edge case where the PDF is unreadable. Nothing an agent needs to call and interpret this tool is missing.

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 carries the full burden and does so well: it explains that target_type accepts 'base_resume' (slug), 'application' (id), and 'template' (id), and describes what each target returns. target_id semantics (slug vs id) are implied by the per-type parentheticals.

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 pairs a specific verb with a specific resource ('Save a rendered PDF locally and render one PNG per page') and clarifies the exact scope (the last rendered resume PDF, a template preview PDF). It is immediately distinguishable from the sibling get_rendered_pdf_page_image, which only returns one page's visual bytes.

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 states the prerequisite plainly ('Requires an existing render (render_pdf, or validate_template for a template preview)') and routes the agent to the alternative tool when image bytes are needed. It doesn't spell out an explicit 'do not use when' clause, so it falls just short of the fully explicit 5.

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

get_rendered_pdf_page_imageGet PDF Page ImageA
Read-onlyIdempotent

Return one rendered PDF page as an explicit opt-in visual payload. page_number is 1-based. max_dimension_px (default 1024) is the longest side of the re-rendered PNG; larger values grow the payload, and encoded payloads over ~1MB are rejected (a smaller max_dimension_px fits). Returns target_type, target_id, page_number, page_count, filename/path/ size/mime metadata, and page_image_b64 for only the requested PNG. Out-of-range page numbers are rejected. Does not change get_rendered_pdf's pre-rendered preview PNGs.

ParametersJSON Schema
NameRequiredDescriptionDefault
target_idYes
page_numberYes
target_typeYes
max_dimension_pxNo

TDQS

A4.3/5.0
Behavior5/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), and the description adds meaningful behavior the annotations cannot: payload-size rejection above ~1MB, out-of-range page rejection, 1-based numbering, and that only the requested PNG is included. These are real operational constraints an agent must plan around.

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?

Front-loads the core purpose before diving into parameter and return detail, and each sentence carries distinct information with no filler. It is dense but every clause earns its place; only the long parenthetical clauses make it slightly heavy.

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 no output schema, the description usefully enumerates the return fields (target_type, target_id, page_number, page_count, filename/path/size/mime, page_image_b64), and constraints are covered. The gap is the unexplained target_type/target_id semantics for a tool that requires both.

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 carries the param burden, yet it only documents two of four: page_number (1-based) and max_dimension_px (default 1024, longest side, larger grows the payload). target_type and target_id semantics, including the three enum values, are left entirely undocumented.

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 a specific verb and resource ('Return one rendered PDF page') and immediately distinguishes itself from the sibling get_rendered_pdf by noting it does not change that tool's pre-rendered preview PNGs. An agent can tell what this produces without opening the schema.

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 'explicit opt-in visual payload' framing tells the agent this is the deliberate choice for pulling a single page image, and the closing sentence contrasts it with get_rendered_pdf's default previews. It establishes context and the alternative, but never states an explicit trigger condition such as 'use this when you need a page the pre-render doesn't cover.'

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

get_resume_versionGet Resume VersionA
Read-onlyIdempotent

Fetch one resume version including its snapshot and the diff vs its parent.

kind/key as on list_resume_versions: "base"+slug or "application"+id.
number is the version number from that list.
ParametersJSON Schema
NameRequiredDescriptionDefault
keyYes
kindYes
numberYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is covered structurally. The description adds genuine behavioral value by disclosing what is returned (snapshot plus parent diff), which is not inferable from the schema.

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?

Two sentences, both front-loaded with the highest-value information (what it returns, then how to source the parameters). No filler.

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?

There is no output schema, so the description correctly takes on the job of explaining the return payload (snapshot + diff). Combined with full parameter coverage and annotation-backed safety, only minor gaps remain, such as error behavior for a nonexistent version.

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 carry the burden, and it does: it defines kind as 'base' vs 'application', explains key as a slug for base or an id for application, and identifies number as the version number from list_resume_versions. It compensates well, though it omits format details such as whether number is 0-indexed or 1-indexed.

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 a specific verb (Fetch) and resource (one resume version), and further specifies the payload: the snapshot and the diff vs its parent. This clearly distinguishes it from the sibling list_resume_versions, which returns many versions rather than one with a diff.

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 anchors usage to list_resume_versions by telling the agent that kind/key/number come from that list, which is real workflow context. It does not, however, state when not to use this tool or name restore_resume_version as the mutation alternative.

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

get_tailoring_sessionGet Tailoring SessionA
Read-onlyIdempotent

Fetch a tailoring session to resume a half-done gap walkthrough.

`tailoring_session_id` is the id returned by create_tailoring_session. Returns
the session with its frozen gap list (gaps_json), any resolutions saved so far
(resolutions_json), and status (open/tailored). resolutions_json may already
contain SYSTEM-PLANNED auto-resolutions stamped at creation (their payload
carries `provenance`, e.g. library_auto/kb_auto/kb_profile/wording_auto —
hand-made resolutions never do): verified evidence the resolver pre-applied.
To retract one, resend its gap_id with action "skip" via resolve_gaps.
Unresolved gaps are those in gaps_json with no entry in resolutions_json;
tailor_session consumes the saved resolutions. `base_anchors` are the base's
emphasis hints (countries, role, company, focus), not evidence; the anchor
company is the resume's own target, not necessarily this job's employer.
ParametersJSON Schema
NameRequiredDescriptionDefault
tailoring_session_idYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint and destructiveHint, so safety is covered; the description adds real signal beyond them — the frozen gap list, that resolutions_json can carry pre-stamped SYSTEM-PLANNED auto-resolutions with provenance, and that tailor_session consumes the saved resolutions. It does not need auth/rate-limit detail for a safe read.

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?

Purpose is front-loaded and every sentence conveys domain-specific meaning, but the paragraph is dense with jargon and packs downstream usage (retraction, tailor_session consumption, base_anchors) into a single block that is harder to scan than it needs to be.

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 no output schema and no annotation detail on payloads, the description compensates by explaining the returned fields (gaps_json, resolutions_json, status) and the unresolved-gap definition. It is close to complete, missing only the exact status-transition or format conventions.

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 carry the load for the single parameter, and it does: tailoring_session_id is explicitly defined as the id returned by create_tailoring_session. It does not state the string format, but the origin/linkage is the practically important information.

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 a specific verb (fetch) and resource (tailoring session) plus intent (resume a half-done gap walkthrough). It is clearly distinguishable from create_tailoring_session, list_tailoring_sessions and close_tailoring_session among 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 'to resume a half-done gap walkthrough' framing gives clear when-to-use context, and it names the producing tool (create_tailoring_session) and the consuming tool (tailor_session), plus resolve_gaps for retraction. It does not give explicit when-NOT-to-use or exclusion guidance.

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

get_templateGet Resume TemplateA
Read-onlyIdempotent

Get a template incl. its full source (Jinja2+LaTeX for engine='latex'; raw .typ text for engine='typst') plus engine, engine_available (see list_templates), and supported_fmt_keys. A template of either engine opts into look knobs by referencing fmt.* (LaTeX via the Jinja namespace, Typst via sys.inputs.fmt; defaults reproduce Classic): font_size (11), side_margins (0.4in), top_bottom_margin (0.3in), line_spacing (1.0), section_spacing (6pt), entry_spacing (0pt), justify (false), hide_divider (false), bullet_icon ("bullet"|"dash"), header_align ("center"|"left"|"right"), skills_layout ("inline"|"bulleted"), education_order ("degree_first"|"institution_first"), date_format ("verbatim"; feeds |format_date). For engine='typst', supported_fmt_keys always includes date_format (applied server-side) even if the source never names it.

ParametersJSON Schema
NameRequiredDescriptionDefault
template_idYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, non-destructive, so the safety profile is covered, and the description adds real domain context: the returned source differs by engine (Jinja2+LaTeX vs raw .typ), how templates opt into fmt.* knobs, the defaults, and a typst-specific quirk where date_format is always supported server-side. This is meaningful behavior beyond the annotations, though it does not discuss failure modes.

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

Conciseness3/5

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

The purpose is front-loaded in the first clause, which is good, but the body then expands into a long enumeration of fmt.* knobs and defaults that is more relevant to rendering/tailoring than to merely fetching a template. The density is high and could be trimmed or moved, making it verbose for the stated action.

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 no output schema, the description correctly takes on the burden of describing return values and does so thoroughly (source, engine, engine_available, supported_fmt_keys, and the fmt namespace semantics). It is close to complete, with only error/missing-template behavior left unspecified.

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 single template_id parameter has 0% schema coverage, so the description carries the burden, but it never defines the id's format or where it comes from beyond an implicit nod via '(see list_templates)'. It does add substantial context about what a template object contains, which indirectly clarifies the resource, but the parameter itself is only weakly explained.

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 names a specific verb (get) and resource (template) and enumerates exactly what is returned: full source, engine, engine_available, and supported_fmt_keys. It also distinguishes itself from list_templates by referencing it, so an agent can tell the retrieval tool apart from the listing tool without opening schemas.

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 only routing cue is the parenthetical '(see list_templates)', which implies that list_templates supplies the template_id this tool consumes. There is no explicit when-to-use/when-not statement, no prerequisite about needing a valid template_id, and no mention of error behavior for a missing template.

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

kb_approve_pointsApprove or Retire Career PointsA
DestructiveIdempotent

Batch-set Career KB point state to approved or retired. Approved points are the only ones that appear on composed resumes and the career export; this is the single approval path available over MCP. The state written is the user's decision about the listed points; the server does not check that the user reviewed them (a convention, not enforcement, as with record_consent).

state is approved|retired only; bulk-to-draft is impossible. 1-500 ids;
repeats collapse to one result row. Per-id results are honest: unknown ids
return ok=false detail="not found" and the rest still proceed; a failed id
fails the same way until corrected (kb_list_points returns the current ids).

Response is {results: [{id, ok, state, detail}], next}. next is a hint
(null when suppressed or unavailable).
ParametersJSON Schema
NameRequiredDescriptionDefault
stateNoapproved
point_idsYes

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare the mutation profile (destructiveHint=true, idempotentHint=true), but the description adds real substance beyond them: approved points are the only ones surfaced on resumes/exports, the server does NOT verify user review ('a convention, not enforcement'), and unknown ids fail per-id while the rest proceed. Minor deduction for not stating auth/permission requirements for this write path.

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?

Purpose and the key scoping constraint are front-loaded in the first sentence, and the response shape is last. It runs dense across several lines and includes a couple of low-yield asides (the record_consent analogy, the slightly tangled 'fails the same way until corrected' phrasing) that could be tightened.

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?

No output schema exists, so the description supplies the return contract ({results:[{id, ok, state, detail}], next}) including the semantics of next. Combined with the partial-failure behavior, an agent has everything needed to call it and interpret results in a batch context.

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 carries the load and does: it constrains state to approved|retired, bounds point_ids to 1-500, and discloses that duplicate ids collapse to one result row. These are non-obvious constraints not derivable from the schema alone.

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 a specific verb (batch-set) plus resource (Career KB point state) and the exact value domain (approved or retired). It also self-identifies as 'the single approval path available over MCP', which distinguishes it from sibling mutators like kb_edit_point and kb_list_points.

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?

Explicitly frames when to reach for it ('the single approval path'), rules out a category of misuse (bulk-to-draft is impossible), and points to kb_list_points for obtaining valid ids. An agent knows both the trigger and the guard rails without opening a schema.

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

kb_captureCapture Career NotesA

Capture free-text career news into DRAFT points. A model matches it to an existing entity or proposes a new one (this call uses the configured LLM provider); pass entity_id to force placement. Points land as drafts for the user to approve at /career. The text is stored as the user's own words and facts; the server does not verify it.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYes
entity_idNo

TDQS

A4.6/5.0
Behavior5/5

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

Adds substantial behavior beyond the annotations: the call invokes the configured LLM provider (cost/latency/external-dependency implication), a model matches or proposes an entity, output lands as drafts needing user approval, and text is stored verbatim as user-owned unverified content. These facts meaningfully extend the readOnly/openWorld/idempotent hints.

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 tight sentences, front-loaded with the core action, each adding a distinct fact (matching/LLM, drafts+approval, verbatim storage). No filler or repetition of the title.

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 2-param, no-output-schema write tool the description covers purpose, behavior, side effects, and the approval gate well. The main residual gap is what the call returns (e.g. created draft point/entity identifiers), which the absence of an output schema leaves undocumented.

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 coverage is 0%, so the description carries the load, and it does explain both parameters: 'text' is the user's own words stored verbatim, and 'entity_id' forces placement into a specific entity instead of model-matched. It stops short of telling the agent where entity_id values come from (e.g. kb_list_entities).

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 a specific verb and resource ('Capture free-text career news into DRAFT points') and immediately frames the pipeline role (draft → approval at /career). It is distinguishable from sibling kb_* tools like kb_create_entity, kb_edit_point, and kb_approve_points because it is the ingestion step, not the editing or approval step.

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?

Gives clear context for use (capture free-text career news; pass entity_id to force placement) and describes the downstream approval workflow. It does not, however, compare itself to alternatives such as kb_create_entity or kb_ingest_resume, so the agent gets context but no explicit when-not guidance.

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

kb_create_entityCreate Career EntityA

Create a Career KB entity — kind is experience|project|education| certification|extra. Writes immediately and is not draft-gated: the entity, with the dates and wording supplied, is stored as the user's own career record, and no duplicate is blocked (possible_duplicates hints are returned). detail is a free-form dict (conventional keys: tech list[str]|str, link, field); kind="extra" REQUIRES section_key (lowercase slug), section_type ("entries"|"bullets"), and section_title nested inside detail — no top-level params exist. A certificate PDF still has to be uploaded from the web UI.

ParametersJSON Schema
NameRequiredDescriptionDefault
orgNo
kindYes
notesNo
titleYes
detailNo
statusNo
end_dateNo
start_dateNo

TDQS

A4.1/5.0
Behavior5/5

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

Goes well beyond the annotations: it discloses that the write is immediate with no draft gate, that no duplicate is blocked and possible_duplicates hints come back, and that a certificate PDF cannot be created here and must be uploaded via the web UI. These are non-obvious behavioral traits that annotations (readOnlyHint=false, idempotentHint=false) alone would not convey.

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?

Front-loaded with the verb+resource and the kind enum, then progressively adds constraints. Dense but each clause adds a real constraint; a small amount of parenthetical nesting makes it slightly harder to scan than it needs to be.

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 an 8-param mutation with no output schema and 0% schema coverage, the description covers the highest-risk pieces (immediate persistence, no dedupe, kind='extra' nesting, upload limitation). The undocumented side of the parameters (status, notes, date formats) is the remaining gap.

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 carries the burden. It does define kind's value set, the free-form detail dict conventions (tech/link/field), and the nested section_key/section_type/section_title requirement for kind='extra', but org, notes, status, start_date and end_date receive no semantic treatment at all.

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 a specific verb (Create) and resource (Career KB entity) and enumerates the concrete kinds it accepts (experience|project|education|certification|extra). An agent can distinguish this from kb_edit_entity and kb_capture without opening either schema.

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?

Usage is only implied: 'writes immediately and is not draft-gated' contrasts indirectly with the draft/approval flow behind kb_capture and kb_approve_points, but no alternative is named and no explicit when-to-use condition is given. Adequate but leaves the agent to infer the routing against siblings.

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

kb_edit_entityEdit Career EntityA
DestructiveIdempotent

Fix an entity's dates, title, org, notes or lifecycle status (ongoing|completed|archived). Omitted fields are left alone. Writes immediately with no draft gate; each supplied value replaces the stored one. Kind cannot be changed here — that is a rebuild, not a correction.

ParametersJSON Schema
NameRequiredDescriptionDefault
orgNo
notesNo
titleNo
detailNo
statusNo
end_dateNo
entity_idYes
start_dateNo

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, idempotentHint=true, readOnlyHint=false. Beyond that the description adds real behavior: 'Omitted fields are left alone' (partial-update merging), 'writes immediately with no draft gate' (no approval step, no undo window), and 'each supplied value replaces the stored one' (overwrite, not append). That is genuine added context over the annotations.

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 short sentences, front-loaded with what the tool does, then partial-update semantics, then the immediate-write caveat, then the immutable-field limitation. No filler and nothing buried.

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 mutation tool with no output schema, the description covers the important gaps: partial update behavior, no draft gate, destructive overwrite, and the kind immutability boundary. Missing only return-value expectations, error behavior on a bad entity_id, and the 'detail' parameter's meaning.

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?

With 0% schema description coverage the description must carry the load, and it does for most fields: it maps dates, title, org, notes, and status, and supplies the status enum (ongoing|completed|archived) that the schema itself omits. It leaves the 'detail' object parameter and the date string format unaddressed, so it is strong but not complete.

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 a specific verb (Fix/Edit) and resource (entity), then enumerates the editable field set (dates, title, org, notes, lifecycle status). The 'Kind cannot be changed here — that is a rebuild, not a correction' clause separates it cleanly from the create/rebuild path without the agent needing to open any schema.

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?

Gives an explicit exclusion (kind changes belong elsewhere) and frames this as a correction rather than a rebuild, which routes the agent productively. It stops short of naming the alternative tool for rebuilds, so it lands below the explicit when/when-not/alternative bar of 5.

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

kb_edit_pointEdit Career PointA
DestructiveIdempotent

Reword a Career KB point or retag it. Changing the text sends the point back to DRAFT, so it leaves the composed resume and career export until it is re-approved (kb_approve_points or /career). Cannot approve, retire or delete a point.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNo
textNo
point_idYes

TDQS

A4.4/5.0
Behavior5/5

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

Annotations only say it is a non-read-only, destructive, idempotent, closed-world write. The description goes well beyond that by disclosing the workflow side effect: editing text regresses the point to DRAFT and removes it from the composed resume and career export until re-approval. That is exactly the consequence an agent must know before mutating.

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?

Two sentences, zero filler. The action is front-loaded and the consequence statement follows immediately, with the exclusion clause last.

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 3-param mutation tool with no output schema, the description supplies the important missing piece (the draft regression). It omits what happens when both optional fields are null and whether any point state blocks editing, but nothing critical to a correct call is absent.

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 must carry parameter meaning, and it only names the two optional fields (text, tags) without explaining that null means 'leave unchanged', whether tags replaces or merges the existing set, or the point_id format. The field names align with the schema, so this is adequate but leaves real ambiguity.

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 a specific verb pair and resource: 'Reword a Career KB point or retag it.' It also draws the boundary against sibling tools by declaring 'Cannot approve, retire or delete a point,' which separates it from kb_approve_points and the other kb_edit_* tools without needing to open their schemas.

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?

Gives clear context (text vs. tag edits) and names the follow-up route when approval is needed (kb_approve_points or /career). It does not spell out when to prefer kb_edit_point over kb_edit_entity/kb_edit_profile, but the resource noun makes that inference safe.

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

kb_edit_profileEdit Career ProfileA
DestructiveIdempotent

Update the Career KB profile: contact block, career summary, skill groups, notes. Omitted fields are left alone; a supplied field REPLACES its stored value wholesale (current values are in get_career_context), so changing one list item means sending the full merged field. Writes immediately with no draft gate.

ParametersJSON Schema
NameRequiredDescriptionDefault
notesNo
skillsNo
contactNo
summaryNo

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, and the description adds real context beyond them: 'Writes immediately with no draft gate' and the wholesale-replacement semantics that justify the idempotent hint. It does not cover failure modes or validation behavior.

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 tight sentences, front-loaded with the target and affected fields, then the critical merge semantics, then the side-effect warning. No filler.

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?

No output schema exists, so the description carries the behavioral load, and it does so well for a zero-required-parameter mutation tool: it covers scope, merge behavior, read-before-write routing, and immediacy. Minor gaps remain around input shape hints and error handling.

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% and all four parameters are undocumented nullables, so the description carries the burden. It compensates by mapping its four named fields to the four parameters and clarifying the replace-not-merge semantics, though it says nothing about the expected shape of the contact object or skills array.

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?

States a specific verb ('Update') and resource ('Career KB profile') and enumerates exactly which fields it touches (contact block, summary, skill groups, notes). It is distinguishable from nearby siblings like kb_edit_point and kb_edit_entity by scope, though it never explicitly contrasts itself with them.

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?

Gives concrete guidance on how to use it correctly: omitted fields are untouched, supplied fields are replaced wholesale, and current values live in get_career_context (a named sibling to consult first). It lacks an explicit 'use X instead when...' exclusion relative to the point/entity editors.

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

kb_get_entityGet Career EntityA
Read-onlyIdempotent

Full detail for one Career KB entity: dates, notes, its points (each with id, text and state), attached documents, and the activity timeline; also used_in_bases, the base resumes it is on (archived included, deleted excluded).

ParametersJSON Schema
NameRequiredDescriptionDefault
entity_idYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare read-only, idempotent, non-destructive, closed-world behavior, so the safety profile is covered. The description adds genuine value beyond that by enumerating what is returned (dates, notes, points with id/text/state, documents, activity timeline) and by disclosing the filtering nuance 'archived included, deleted excluded' for used_in_bases.

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?

One sentence, front-loaded with the core purpose ('Full detail for one Career KB entity'), followed by the return contents. No filler, no repetition of the title.

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 no output schema, the description usefully enumerates the return payload and its filtering rules, which is exactly what an agent needs for a read-only single-entity fetch. The only gap is the unstated provenance/format of entity_id.

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% and there is a single required entity_id, so the description must compensate. It implies the parameter selects 'one Career KB entity' but gives no format, source, or lookup guidance for the id. Baseline adequacy, no added semantics.

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 a specific verb and resource ('Full detail for one Career KB entity') and the singular scoping implicitly separates it from list siblings like kb_list_entities. An agent can tell it is a detail-fetch for a single entity without opening the schema.

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?

Usage is only implied by 'for one Career KB entity' – it presupposes a known entity_id but never states where that id comes from (e.g., kb_list_entities) or when to prefer this over kb_list_points or kb_edit_entity. No explicit exclusions or prerequisites are given.

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

kb_ingest_resumeImport Parsed ResumeA
Idempotent

Persist one caller-parsed resume into the Career KB. No in-house LLM.

Points land as DRAFTS and appear on no resume until approved with
kb_approve_points (or at /career), which records the user's approval.

HONESTY: `data` is stored as the user's own resume content, so a faithful
transcription is expected. The server does not detect embellishment,
rewording or invented metrics (same trust model as caller-authored tailor
ops); approved points become part of the career record.

ENTITY NAMES: matching is two-pass. Exact identity-key first (experience:
company+role+start_date; projects: name; education: institution+degree;
certs: the string), then a near-identity pass for experience/projects/certs
(token-subset; projects allow ≤2 extra tokens). Education and extra are
identity-key-only. Different spellings can merge on the second pass;
names outside its coverage still fork.

Re-running the same resume_key is a merge: no duplicate entities; a bullet
already on the entity (even retired) is not re-created. resume_key must
match ^[a-z0-9][a-z0-9_]*$.

`data` is ResumeData (only contact.name and contact.email required).
Sections: contact, summary, skills[{category, items}], experience, projects,
education, certifications[str], extra_sections. Experience:
{company, role, location?, start_date?, end_date?, bullets[str]}.
extra_sections are NOT stored in the KB (report warns); they can be added to
a base resume after it exists. skills/contact/summary go to the KB profile
(no draft state). Profile seeding is first-write-wins, so the first resume
ingested determines the profile.

Response {report, next}. report: created/matched entity ids, DRAFT point
ids, counts, warnings. next is a hint (null when suppressed/unavailable); brief=True
(multi-resume loops) suppresses it before any settings read. 422 on a
ResumeData validation failure or duplicate source key (atomic).
ParametersJSON Schema
NameRequiredDescriptionDefault
dataYesResumeData. Only contact.name and contact.email are required. 422 if any source fails validation or on a duplicate SOURCE key (re-running the same resume_key is a merge, not an error); atomic either way: nothing persisted on a 422.
briefNo
resume_keyYes

TDQS

A4.7/5.0
Behavior5/5

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

Goes far beyond the annotations: it discloses draft state, first-write-wins profile seeding, merge-not-duplicate behavior on identical resume_key (matching idempotentHint), atomic 422 semantics, two-pass entity-name matching that can merge differently-spelled names, and that extra_sections are not persisted. This is exactly the behavioral context an agent needs before a mutating call.

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?

Front-loaded purpose followed by labeled blocks (HONESTY, ENTITY NAMES) makes the density navigable, and each section adds decision-relevant information. The entity-name matching paragraph is long and borders on internal mechanics, which slightly blunts conciseness, but little is pure filler.

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?

With no output schema, the description still specifies the return shape {report, next}, what report contains, when next is null, and the 422 failure conditions. Between this, the nested ResumeData breakdown, and the annotation-delimited safety profile, nothing needed to invoke it correctly is missing.

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?

With only 33% schema coverage, the description carries the load: it gives the resume_key regex ^[a-z0-9][a-z0-9_]*$, spells out the ResumeData shape and section list, notes only contact.name/email are required, and defines brief=True as suppressing the next hint in multi-resume loops. This meaningfully exceeds 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?

States a specific verb and resource – 'Persist one caller-parsed resume into the Career KB' – and immediately disambiguates scope with 'No in-house LLM', signalling the caller owns parsing. Combined with the draft/approval lifecycle, an agent can tell this apart from kb_capture or kb_create_entity without opening a schema.

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?

Gives clear lifecycle context: points land as DRAFTS and must be approved via kb_approve_points (or /career), and describes the re-run merge case. It stops short of naming when to prefer this over sibling capture tools like kb_capture, so it is clear but lacks explicit exclusions.

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

kb_list_entitiesList Career EntitiesA
Read-onlyIdempotent

List Career KB entities with their IDs (get_career_context returns prose with no IDs; this tool returns the IDs needed to edit). Optionally filter by kind (experience|project|education|certification|extra) or status (ongoing|completed|archived). Each item carries point_count, draft_count and approved_count (the bullets a resume can use; retired ones are in point_count only) and used_in_bases, the base resumes it is on (archived included, deleted excluded).

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNo
statusNo

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already establish read-only, idempotent, non-destructive behavior, and the description goes further by disclosing the archive/delete semantics: archived bases are included in used_in_bases, deleted ones excluded, and retired bullets appear only in point_count. It does not discuss pagination or ordering of results, which would be the remaining behavioral gap.

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?

Front-loaded with the core action and its differentiator, then filters, then return-field meaning. Information density is high and nothing is filler, but the stacked parentheticals make it read as one dense block rather than clearly segmented guidance.

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?

With no output schema, the description takes on the burden of explaining the return shape and does so: point_count, draft_count, approved_count (with the retired-bullet nuance) and used_in_bases (with archive/delete semantics). Combined with the filter value lists, an agent has everything needed to call and interpret it.

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% and the schema declares kind/status only as untyped strings with null defaults, so the description carries the full load. It enumerates the exact accepted values for both filters (experience|project|education|certification|extra and ongoing|completed|archived) and signals that both are optional, which is meaning the schema does not provide.

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 a specific verb and resource ("List Career KB entities with their IDs") and immediately distinguishes itself from the nearest sibling by noting get_career_context returns prose with no IDs. An agent can tell this apart from kb_get_entity, kb_list_points and get_career_export without opening a schema.

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 frames the use case: fetch IDs when you intend to edit, since get_career_context gives prose only. It also explains the two optional filters. It stops short of naming all alternatives (kb_get_entity, kb_list_points) or stating when not to use it, so it falls short of a 5.

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

kb_list_pointsList Career PointsA
Read-onlyIdempotent

List Career KB points across all entities, optionally by state (draft|approved|retired), oldest first. An unfiltered call returns the first limit points (default 50, max 100); offset pages on. Each row carries id, entity_id/entity_title/entity_kind, text, state, origin, tags and dates; the per-use port history and merge provenance are omitted (kb_get_entity).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
stateNo
offsetNo

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world). The description adds real behavioral value on top: default and max page size, offset-based paging, sort order, and which fields are deliberately omitted from each row. It does not mention row-count/total behavior, so it is strong but not exhaustive.

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 front-loaded sentences with no filler; the core action and default paging come first, and the sibling pointer closes it out. Some clauses are densely packed (field list plus omitted-field parenthetical), which costs a little readability.

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 no output schema, the description usefully enumerates the returned row fields and flags what is omitted, and it covers filtering, ordering and pagination. What is missing is minor: no statement of total result count or behavior when `offset` runs past the end.

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 carries the load and does so well: it supplies the enum values for `state` (draft|approved|retired) that the schema lacks, plus `limit` default 50 / max 100 and the paging meaning of `offset`. The only gap is that the column list ('id, entity_id/...') is output-oriented rather than parameter detail.

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 a specific verb and resource ('List Career KB points across all entities'), plus the ordering ('oldest first') and the optional filter axis. An agent can distinguish it from kb_list_entities and kb_get_entity without opening either schema.

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?

Explains the unfiltered case (returns first `limit` points) and the paging mechanism (offset), and explicitly redirects to kb_get_entity for per-use port history and merge provenance. It gives clear context but does not state when this should be preferred over the other list-type siblings.

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

kb_sync_baseSync Resume to Career KBA
Idempotent

Sync one base resume into the Career KB.

Deterministic: zero LLM calls. New material lands as DRAFT points
(origin=base_sync) for the user to approve at /career. Never edits
resumes. Safe to rerun — a second call is a no-op when already in sync.
ParametersJSON Schema
NameRequiredDescriptionDefault
slugYes

TDQS

A3.8/5.0
Behavior5/5

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

Annotations declare the safety profile (destructiveHint=false, idempotentHint=true), and the description adds substantial context beyond them: zero LLM calls (deterministic), the exact state change (new material lands as DRAFT points with origin=base_sync), that approval happens at /career, and that the source resume is never modified. It even explains why reruns are safe, going past the bare idempotentHint flag.

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?

Extremely tight: what it does first, then scoping, then side-effect semantics. Every clause carries distinct information (determinism, draft origin, approval location, no source edits, idempotency) with no filler.

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?

There is no output schema and only one parameter, so the description carries most of the load and does it well for behavior: state changes, determinism, and side effects are all covered. The remaining gap is the undocumented 'slug' parameter and any error behavior for an unknown slug, which prevents a 5.

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% and there is one required parameter, 'slug', which the schema does not document at all. The description implies the slug identifies 'one base resume' but gives no format, no examples, and no hint about how to obtain a valid value (e.g., from list_base_resumes). With low coverage the description was expected to compensate and does not.

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?

States a specific verb and resource with directionality: 'Sync one base resume into the Career KB.' An agent knows the source (a base resume) and the destination (the Career KB). It does not differentiate itself from adjacent siblings such as kb_ingest_resume, kb_capture, or sync_now, so it stops short of a 5.

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?

Provides operational guidance ('Safe to rerun — a second call is a no-op when already in sync') which tells the agent repeated invocation is harmless, and 'Never edits resumes' bounds the side effects. However it never states when to choose this over kb_ingest_resume, kb_capture, or sync_now, and gives no prerequisites for the slug. Usage is implied rather than specified.

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

list_applicationsList ApplicationsA
Read-onlyIdempotent

List your applications as a thin paginated summary array. Filter by status/role_category; page with limit/offset. Rows name their base resume (base_resume_name) and the stored score (ats_score, null when unscored). Use get_application(id) for the full record and compare_ats for scores.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo
statusNo
role_categoryNo

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds useful behavior beyond that: the output is a thin summary (not full records), ats_score is null when unscored, and paging is limit/offset based.

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 dense sentences, front-loaded with the core purpose and result shape, followed by filtering/paging and then routing. No filler; every clause adds information.

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 no output schema, the description usefully names the returned fields (base_resume_name, ats_score) and their null semantics. It is largely complete for a list tool, though valid filter values and pagination limits remain unspecified.

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 carry the load, and it maps each parameter to a purpose: status/role_category for filtering and limit/offset for paging. It does not, however, give valid status values or bounds for limit/offset, leaving some ambiguity.

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 a specific verb and resource ('List your applications') plus the shape of the result ('thin paginated summary array'). It clearly distinguishes itself from get_application(id), which returns the full record.

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?

Explicitly routes the agent to alternatives: use get_application(id) for the full record and compare_ats for scores. This tells an agent exactly when this tool is the right choice versus its siblings.

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

list_base_resumesList Base ResumesA
Read-onlyIdempotent

List all base resumes (slug, display name, summary).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered. The description adds only the returned field set (slug, display name, summary), which is mild output context — no pagination, ordering, or result-size behavior is disclosed.

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?

A single front-loaded sentence with the verb and resource first and the field list second. Nothing redundant and nothing padded.

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 zero-parameter read-only listing tool with no output schema, the description is nearly sufficient; the parenthetical field list partially compensates for the missing output schema. It stops short of stating whether all resumes are returned or how archived ones are treated.

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 takes zero parameters and the schema is an empty object, so there is nothing for the description to disambiguate. Baseline 4 applies for a no-parameter tool.

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?

States a specific verb and resource: 'List all base resumes', with parenthetical field hints. An agent can distinguish it from get_base_resume (singular fetch) and list_resume_versions by the resource noun. It does not, however, explicitly name or contrast with any sibling tool.

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

Usage Guidelines2/5

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

No when-to-use guidance and no alternatives named. With siblings like get_base_resume, list_resume_versions, and kb_list_entities in the same namespace, the description offers no routing signal beyond the tool name itself.

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

list_jobsList Saved JobsA
Read-onlyIdempotent

List stored jobs as a thin summary array, newest first, paged by limit (default 50, max 500) and offset; a page shorter than limit is the last. Each item is a slim projection (company, title, role_category, level, employment_type, work_mode, location, salary, work_authorization, opt_accepted, best_ats_score: the best stored base-resume score, null when unscored) of roughly 0.8k characters, with no raw_text or extracted_json; use get_job for full detail. Optionally only jobs without an application. Each job carries ownership (owned_here, owner, handover, pending_requests), identifying replicas and jobs being handed over.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo
without_applicationNo

TDQS

A4.6/5.0
Behavior5/5

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

Adds substantial context beyond the readOnly/idempotent annotations: page-termination semantics ('a page shorter than limit is the last'), item size (~0.8k chars), excluded fields (no raw_text or extracted_json), null semantics for best_ats_score when unscored, and ownership/handover flags. This is exactly what an agent needs to interpret results.

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?

Front-loaded with the core action and paging rule, then projection contents, then the optional filter and ownership fields. Dense but every clause carries information; the parenthetical field list is long but justified by the absent output schema.

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?

With no output schema, the description fully specifies the returned projection fields, null semantics, and page-boundary behavior, plus ownership metadata. An agent can consume and paginate results correctly without further documentation.

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 carries the burden and does so well: it restates limit default/max, explains offset paging behavior, and gives meaning to without_application. It stops short of documenting edge cases like out-of-range offset, but coverage is strong for three params.

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?

Specific verb+resource with scope modifiers: 'List stored jobs as a thin summary array, newest first, paged by limit and offset.' It also explicitly distinguishes itself from the sibling get_job ('use get_job for full detail') and implicitly from export_jobs/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?

Clear routing context: use this for slim summaries and get_job when full detail is needed, plus the 'only jobs without an application' filter condition. No explicit exclusions (e.g., when to prefer export_jobs), so it falls short of a 5.

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

list_proposalsList Application ProposalsA
Read-onlyIdempotent

List application proposals, newest first, as {items, total}. status is one status or a comma-separated set; limit (default 20, max 50) and offset page through total. A row is a couple of thousand characters (fit and job).

status 'accepted' means the user queued the proposal for an apply run (via
the /proposals page or record_triage); 'pending_review' proposals are awaiting
the user's triage. Batch apply runs work 'accepted' proposals by convention
(the agent-apply playbook); the server also permits preparation, evidence and
consent from 'pending_review'. Each item's proposed_by names who filed it: an
MCP client's name, "you" for the web app's queue, or null. Reading expires
overdue pending_review and needs_decision proposals (terminal 'expired').
ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo
statusNo

TDQS

A3.7/5.0
Behavior1/5

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

The annotations declare readOnlyHint=true and idempotentHint=true, but the description states 'Reading expires overdue pending_review and needs_decision proposals (terminal "expired")' — i.e., invoking this read mutates persisted state. That is a direct contradiction of the read-only/idempotent claims and would mislead an agent about whether repeated calls can change results.

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?

Front-loads the essential contract (what, ordering, return shape, paging) in the first two sentences, then adds status lifecycle detail. The second paragraph is dense and references internal playbook concepts, but nearly every sentence conveys distinct, non-redundant information.

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 no output schema, the description supplies the return shape ({items, total}), row size, and the proposed_by provenance values, plus full status lifecycle semantics — enough to call it correctly. It omits item field details beyond proposed_by and any error/empty-result behavior, keeping it short of complete.

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 coverage is 0%, so the description carries the burden and does so: status is 'one status or a comma-separated set' (the schema only says string|null), limit is default 20/max 50, and offset 'pages through total'. It adds real semantics beyond the schema, though it does not cover invalid status values or behavior past the end of the list.

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?

Opens with a specific verb+resource ('List application proposals'), states ordering ('newest first') and the exact return envelope ({items, total}), which distinguishes it immediately from get_proposal, list_applications, and list_jobs. An agent can tell what this returns without opening the schema.

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?

Gives strong operational context: 'accepted' means queued for an apply run, 'pending_review' is awaiting triage, batch apply runs work 'accepted' by convention, and record_triage is named as the accept path. It stops short of an explicit 'use this instead of get_proposal when you need one row' statement, so it is clear context rather than full alternative routing.

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

list_qa_entriesList Application AnswersB
Read-onlyIdempotent

List the generated screening answers and cover letters for an application, newest first.

ParametersJSON Schema
NameRequiredDescriptionDefault
application_idYes

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds one genuinely new behavioral trait, the 'newest first' sort order, but nothing about volume, pagination, or what a missing application returns.

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?

One front-loaded sentence with no filler; the resource and the sort order are stated immediately with zero redundancy.

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?

For a one-parameter read-only list tool with no output schema, the description covers the essentials and annotations cover safety. However it omits any indication of return shape or how it relates to the sibling generation and application-listing tools, leaving the agent with a thin picture.

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 coverage is 0% for the single application_id parameter, so the schema adds no descriptive text. The phrase 'for an application' only loosely signals that application_id scopes the result; format or constraints are not described, so it partially but not fully compensates for the coverage gap.

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?

Clear verb 'List' plus a specific resource ('generated screening answers and cover letters for an application'), and it adds ordering ('newest first'). It distinguishes the content from generation siblings like generate_qa_answers/generate_cover_letter only implicitly, without naming them.

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

Usage Guidelines2/5

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

The description states what is returned but gives no when-to-use guidance, no prerequisites, and does not point to alternatives such as get_application or the generate_* tools. Usage is left entirely to inference from the name.

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

list_referralsList Referral ContactsA
Read-onlyIdempotent

List referral contacts (company, careers URL, contact name, notes, applications_count).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so safety and mutability are fully covered without the description. The description adds the shape of returned data (company, careers URL, contact name, notes, applications_count), which is useful since there is no output schema, but it says nothing about scope, volume, or pagination.

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?

A single parenthetical sentence with zero filler; the resource is front-loaded and the returned fields are compactly listed. Every token earns its place.

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 zero-parameter read tool with full annotation coverage, the description is nearly complete, and the field enumeration substitutes for the missing output schema. It could still state whether all referrals are returned or whether ordering/pagination applies.

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?

This tool takes zero parameters, so the baseline is 4. The description correctly implies no filtering input is accepted and instead documents the output fields, adding marginal value beyond the empty schema.

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?

States a specific verb (List) and resource (referral contacts), and enumerates the returned fields, so an agent knows exactly what this retrieves. It is distinguishable from sibling list tools like list_jobs and list_applications even without explicit sibling routing.

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

Usage Guidelines2/5

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

The description gives no indication of when to use this over alternatives, no prerequisites, and no filtering or scoping context. It is a bare statement of what the tool returns with no usage guidance at all.

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

list_resume_versionsList Resume VersionsA
Read-onlyIdempotent

List append-only resume snapshots for one target, newest last.

kind is "base" (key = base-resume slug) or "application" (key = application
id). This is NOT render_pdf's target_type vocabulary — there is no
"base_resume" kind here. Each row is a version summary (number, label,
created_at); use get_resume_version for the snapshot and diff.
ParametersJSON Schema
NameRequiredDescriptionDefault
keyYes
kindYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations cover the safety profile (readOnly, idempotent, non-destructive), so the bar is lower. The description still adds real behavioral context: the list is append-only, ordered 'newest last', and rows are version summaries with number/label/created_at fields.

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?

Front-loads the core action, then parameter semantics, then alternative routing. Three tight sentences with no filler; each sentence earns its place.

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?

No output schema exists, yet the description describes the return rows (version summary: number, label, created_at), defines both required params, and points to the companion tool. An agent has everything needed to call it correctly.

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 carries the burden, and it does so well: it defines kind ('base' vs 'application') and the meaning of key for each ('base-resume slug' vs 'application id'). It even pre-empts confusion with render_pdf's different vocabulary.

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 a specific verb and resource ('List append-only resume snapshots for one target') plus scope ('newest last'). It explicitly distinguishes itself from siblings, clarifying it is NOT render_pdf's target_type vocabulary and routing detail retrieval to get_resume_version.

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?

Names the alternative explicitly ('use get_resume_version for the snapshot and diff'), giving clear context for when to use this lister vs. the getter. It stops short of broader when-not guidance, but the routing is unambiguous.

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

list_tailoring_sessionsList Tailoring SessionsA
Read-onlyIdempotent

List all tailoring sessions for a job, newest first.

A lost session id can be rediscovered here (create_tailoring_session would
supersede the open one). Each item is a summary (id, job_id, base_resume,
status, application_id, timestamps, gap_count, resolution_count); the gap
list and saved resolutions are on get_tailoring_session. Status is one of:
open (in-progress gap walkthrough, resumable via get_tailoring_session),
tailored (finished — tailor_session already ran), superseded (a newer
session for the same job+base replaced it), or abandoned (explicitly closed
via close_tailoring_session without tailoring).
ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYes

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already cover the safety profile (readOnlyHint, idempotentHint, destructiveHint=false, openWorldHint=false), and the description still adds substantial behavior: it documents the summary-level item shape and enumerates all four status values with their meanings and the action that produces each. This is exactly the kind of state semantics structured fields cannot express.

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?

Front-loaded with the one-line purpose, then layered detail on rediscovery and item shape. Dense but every clause carries information; the middle sentence is a long parenthetical that could be slightly tighter but is not wasted.

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?

With no output schema, the description carries the burden of describing the return value, and it does so completely: item fields, what is excluded (gaps and resolutions), and full status enum semantics. An agent can use the result without calling another tool first.

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% for the single job_id parameter. The description compensates only partially by scoping the tool to 'for a job,' implying job_id is the target job identifier, but it never states the expected format or whether the job must exist. Adequate for a self-evident single key, not more.

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 a specific verb and resource ('List all tailoring sessions for a job') plus the ordering ('newest first'). It is cleanly separable from the adjacent siblings get_tailoring_session, create_tailoring_session, and close_tailoring_session, which are each named and assigned distinct roles.

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?

Gives an explicit when-to-use trigger ('A lost session id can be rediscovered here') and routes the agent to alternatives: get_tailoring_session for gap lists and resolutions, create_tailoring_session to supersede an open session, close_tailoring_session for abandonment. The division of labor between listing, reading detail, and mutating is fully spelled out.

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

list_templatesList Resume TemplatesA
Read-onlyIdempotent

List resume templates — both engines (id, display_name, status['draft'|'ready'], engine, is_default, last_error). parse_certified false = a 'ready' template that still loses word boundaries under strict extraction — see validate_template. engine_available=false marks a LaTeX template on a backend with no TeX: still pickable, renders through Typst with a render_note.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already establish readOnly/idempotent/no-destructive, so the description's real value is explaining non-obvious domain flags: parse_certified=false meaning a 'ready' template still loses word boundaries, and engine_available=false meaning a LaTeX template on a TeX-less backend still renders via Typst with a render_note. That is meaningful behavioral context beyond the annotations, though it does not cover pagination or result size.

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?

Front-loaded with the core action and the returned field list, then two compact parenthetical clarifications for the ambiguous flags. Dense but every clause carries information; slightly over-packed but not padded.

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 no output schema, the description must carry return-value meaning, and it does so for the fields an agent would act on (status enum values, is_default, last_error, parse_certified, engine_available). It omits ordering and any note that this is a full list with no filtering, which is a minor gap.

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 takes zero parameters, so per the rubric the baseline is 4. The description instead spends its words on returned-field semantics, which is appropriate and adds value over the empty schema.

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?

States a specific verb+resource ('List resume templates') and immediately scopes it ('both engines'), and enumerates the shape of what comes back (id, display_name, status, engine, is_default, last_error). It does not explicitly contrast with the sibling get_template, so sibling differentiation is only partial.

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?

Usage is implied by the listing action, and it routes one narrow case to validate_template ('parse_certified false ... see validate_template'), but there is no explicit when-to-use vs get_template or when to prefer this over create/update_template_draft. Guidance exists but is incidental rather than directive.

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

mark_submittedMark Application SubmittedA
Destructive

Flip an approved proposal to submitted (terminal; links the application to applied). Requires submission_receipt evidence, or user_attested=True, which records the user's own statement that they submitted it (or that a submission_uncertain proposal went through, e.g. a confirmation email or portal check) as an attested consent event with their words in note. user_attested substitutes for receipt evidence and the server does not verify it; it is the user's attestation, not the caller's. In full automation mode, channel auto records the agent's own word that the application went through, with note naming what confirmed it (the confirmation page or a confirmation email); no receipt is needed, and it is accepted only while full automation is on.

ParametersJSON Schema
NameRequiredDescriptionDefault
noteNo
channelNochat
proposal_idYes
user_attestedNo

TDQS

A4.5/5.0
Behavior5/5

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

Goes well beyond the annotations (destructiveHint=true, readOnlyHint=false, idempotentHint=false) by disclosing the terminal nature of the transition, the evidence requirement, that user_attested is the user's attestation rather than the caller's and is not server-verified, and that channel='auto' is accepted only while full automation is on. This is exactly the kind of auth/verification/mode behavior an agent needs.

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?

Front-loads the core action and terminal scope before the evidence rules, and every sentence carries information. The middle passage on user_attested is dense and slightly repetitive ('the user's attestation, not the caller's'), but not wasteful.

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 no-output-schema mutation tool, the description covers the state change, evidence/attestation requirements, verification posture, and automation-mode gating. It does not spell out what the response returns or precisely how the application link is applied, a minor gap.

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?

With 0% schema coverage the description must carry the load, and it does: it explains user_attested's meaning and substitution role, note's content ('their words' / 'naming what confirmed it'), and channel='auto' semantics. proposal_id is only implied as 'an approved proposal', leaving one small 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?

States a specific verb and resource ('flip an approved proposal to submitted'), plus the consequential scope detail that it is terminal and links the application to applied. An agent can distinguish this state-transition from siblings like propose_application, record_decision, or resume_proposal without opening a schema.

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?

Clearly states the conditions under which the tool may be invoked: a submission_receipt must exist, or user_attested=True, or the auto channel while full automation is on. It does not name explicit alternatives (e.g., use record_decision to approve first), so it is strong context without full routing guidance.

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

prepare_application_pdf_uploadStage PDF for UploadA
Idempotent

Stage a disposable copy of an application's canonical rendered PDF for direct Playwright upload. If the PDF has not been rendered, render it and retry once. Writes atomically under $MAESTRO_CS_UPLOAD_DIR/<application_id>/, defaulting to the repository's .playwright-mcp/uploads directory (pair Playwright --output-dir with the parent .playwright-mcp tree). Returns upload_path, an absolute path usable directly by Playwright's file chooser. The staged copy is the only location intended for browser file uploads; the canonical server artifact (under applications/artifact_dir) is preserved and is not an upload source. Also returns filename/path integrity and PDF lint metadata. This preparation tool does not authorize or submit an application.

ParametersJSON Schema
NameRequiredDescriptionDefault
application_idYes

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=true, and the description is consistent with all of them while adding real behavioral detail: atomic write, deterministic path layout, default directory, render-and-retry-once fallback, and that it returns integrity/lint metadata. It also states the safety boundary (no authorization or submission), which annotations alone would not convey.

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?

Front-loaded with the core action and consumer, then layers useful operational detail (paths, retry, return value). It is longer than typical but nearly every sentence carries non-redundant information; only the canonical-vs-staged point is restated in slightly different 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?

With no output schema, the description correctly documents return values (upload_path, filename/path integrity, PDF lint metadata). Combined with retry semantics, path conventions, and the explicit non-authorization boundary, an agent has everything needed to call and correctly interpret 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?

Schema coverage is 0% and there is one parameter, but the description shows the parameter's role by embedding it in the output path template ($MAESTRO_CS_UPLOAD_DIR/<application_id>/<canonical filename>). It also documents the returned upload_path despite having no output schema, compensating well for a trivially simple single-argument signature.

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 a specific verb and resource ('Stage a disposable copy of an application's canonical rendered PDF') and specifies the exact consumer (direct Playwright upload). It is clearly distinguishable from siblings like render_pdf, get_rendered_pdf, and mark_submitted, and it explicitly declares the boundary that it does not submit.

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?

Gives clear context for use (Playwright file chooser upload) and an explicit when-not: the canonical server artifact under applications/artifact_dir 'is preserved and is not an upload source.' It also gives the paired configuration hint (--output-dir with the parent .playwright-mcp tree). It stops short of naming the alternative tool for users who just want the canonical PDF, so not a full 5.

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

propose_applicationPropose ApplicationA
Idempotent

File an agent-hunted application proposal for user review.

If an open proposal already exists for the job, returns that proposal (idempotent)
instead of 409. Pass application_id after tailoring to late-link when the open
proposal is still unlinked (409 if already linked to a different application).
Refused (409) when the company is blocklisted or when THIS posting was
previously declined (declines are posting-scoped and permanent; other roles
at the same company are unaffected).
plan may include "company_note" (1-2 sentences: what the company is/does,
direct employer vs staffing, any legitimacy doubt) — the proposals page
shows it as "About the company" for triage.
ParametersJSON Schema
NameRequiredDescriptionDefault
fitNo
planNo
job_idYes
referral_idNo
application_idNo

TDQS

A4.4/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint=false, idempotentHint=true), the description explains what idempotency concretely means (returns existing proposal instead of 409), the late-link semantics, and two distinct 409 refusal paths including that declines are posting-scoped and permanent while other roles at the same company are unaffected. This is rich behavioral detail the annotations cannot convey.

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?

Purpose is front-loaded in the first sentence, followed by conditional edge cases in a logical order. It is dense but each sentence (idempotency, late-link, refusal, company_note) carries distinct information, with only minor compression possible.

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 a mutation tool with no output schema, the description covers idempotency, refusal conditions, and partial parameter intent adequately. It stops short of describing the returned proposal shape or the full fit/referral semantics, but the core invocation contract is complete.

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% across 5 parameters, so the description carries the full burden, yet it only documents application_id (late-link use) and one aspect of plan (company_note). fit, referral_id, and the rest of plan's structure are entirely unexplained, leaving an agent to guess their format and effect.

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 a specific verb+resource ('File an agent-hunted application proposal for user review') that is clearly distinct from siblings like tailor_session, tailor_application, and get_proposal. An agent can tell this creates a reviewable proposal rather than performing tailoring or reading an existing one.

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?

Explicitly routes usage: idempotent return when an open proposal exists, pass application_id 'after tailoring to late-link' when the proposal is unlinked, and 409 refusal conditions (blocklisted company, previously declined posting). This is concrete when/when-not guidance rather than implied context.

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

quick_tailorQuick TailorA
Destructive

Start Quick Tailor over MCP: the fast path that fills gaps from the user's saved quick-tailor profile instead of walking them one by one.

Calling again for the same job+base SUPERSEDES the open session (saved
resolutions become unreachable); list_tailoring_sessions shows existing
sessions.

Composes create_tailoring_session(enrich=False) with the profile fill
(deterministic; resolve_gaps' honesty-gated save path).

This tool makes NO in-house LLM call: sessions rely on the calling agent's
own model. The saved profile only plans
mechanical, evidence-respecting moves — it does NOT write resume prose.
The returned resolutions_json may already resolve every gap, including
system-planned entries (payload.provenance). Resume text comes from
caller-authored typed edit ops passed to
tailor_session(tailoring_session_id=..., ops=[...]), which skips the backend
LLM pass.

Honesty: the server does not gate caller-authored ops against fabricated
skills, experience, metrics, or dates. An unverified or absent skill can only
enter a skills category (add_skill_item), never as an experience or project
bullet asserting the candidate did the work.

The tailor_session that follows writes the job's ONE application: it
rebuilds the draft and removes its PDF (version history keeps the old
draft).

A session whose resolutions_json contains no planned action beyond
"skip" means the profile was not ALLOWED to add anything to THIS
session — it is not an error; the gaps can then be resolved with
resolve_gaps.

Raises (409, message says which): a failing fatal health gate on the
base blocks session creation; a stale or no-longer-open session blocks
the profile fill. Response is the filled session plus a `next` hint
suggesting tailor_session (profile standing instruction as user_prompt
when the session has no note of its own).
ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYes
base_resumeYes

TDQS

A4.3/5.0
Behavior5/5

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

Annotations declare destructive/non-idempotent, and the description adds substantial behavior beyond that: re-calling supersedes the open session and makes saved resolutions unreachable, no in-house LLM call is made, the honesty gate on caller-authored ops, the 409 failure conditions (fatal health gate, stale/closed session), and the PDF removal done by the follow-up tailor_session. This is exactly the extra context annotations cannot convey.

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

Conciseness3/5

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

The key routing constraint (supersedes the open session) is front-loaded, which is good, but the description sprawls across six dense paragraphs with heavy dash-clause nesting and some restatement (resolve_gaps' save path, then resolve_gaps again at the end). Several sentences could be tightened considerably.

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?

For a multi-step, stateful tool with no output schema, the description covers the mechanical composition, the LLM/honesty boundaries, the failure modes with status codes, and what the response contains (filled session plus a next hint). An agent has what it needs to call and follow up correctly.

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 coverage is 0% for job_id and base_resume, so the description carries the burden. It references 'the same job+base' when describing supersede behavior, implying these identify the job and base resume, but never states their expected format (ID vs. name) or relationship. This is partial compensation for the coverage gap.

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 that it starts a Quick Tailor session over MCP and fills gaps from the saved profile, and it explicitly distinguishes this fast path from create_tailoring_session (which it composes with enrich=False) and resolve_gaps. The verb is somewhat implicit ('Start... over MCP') but the resource and scope are clear enough to separate 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 Guidelines5/5

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

It gives explicit when-to-use context (fast path instead of walking gaps one by one), names alternatives for adjacent needs (list_tailoring_sessions to see sessions, resolve_gaps for unresolved gaps, tailor_session to write the resume), and states the supersede condition on re-invocation. Nothing about routing is left to inference.

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

record_decisionRecord Proposal DecisionA

Record user decision when proposal is in needs_decision state. Resolves back to pending_review. application_id may be omitted; the backend then links the job's application on fit.chosen_base when there is one, else the job's one application (409 only when the job has no application); an automatic link sets fit.chosen_base to the linked application's resume.

ParametersJSON Schema
NameRequiredDescriptionDefault
fitYes
proposal_idYes
application_idNo

TDQS

A3.5/5.0
Behavior4/5

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

Annotations only declare the generic profile (readOnly=false, idempotent=false, destructive=false, openWorld=false). The description goes beyond them by disclosing the post-condition state transition to pending_review, the side effect of writing fit.chosen_base, and the precise 409 failure condition when the job has no application — all behavior an agent could not derive from the annotations.

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

Conciseness3/5

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

Purpose is correctly front-loaded in the first sentence. The second sentence, however, is a run-on with nested clauses and parentheticals about linkage and the 409 case, which is information-dense but harder to parse than it needs to be.

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?

For a mutation tool with no output schema, no annotation detail, and 0% parameter description coverage, the description supplies the state machine and the application-linking/error behavior but omits any indication of what `fit` must contain. The agent still cannot construct a valid required payload from what is given.

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% and the required `fit` object is an open-ended additionalProperties object with no semantics given anywhere, so the core payload remains opaque. The description does explain application_id thoroughly (omitted → link job's application on fit.chosen_base, else the job's single application), which is real added value, but covers only one of three parameters.

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 a specific verb and resource (record user decision / proposal) and anchors it to a named state machine position ('needs_decision state') with its resulting state ('pending_review'). It is clearly a decision-recording mutation, distinguishable from read-only siblings like get_proposal, though it never names the closest alternatives (request_decision, resume_proposal) to draw the boundary explicitly.

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 gives a concrete precondition for use: the proposal must be in the needs_decision state. That is real when-to-use guidance, but there are no exclusions or comparisons against request_decision/resume_proposal, so the agent must infer which sibling to call when the proposal is not in that state.

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

record_filled_answersRecord Filled AnswersA

Record what was filled into this job's application form, one call per form page: each field's question, answer and source. Per question the latest call wins; the job page's What was submitted tab shows the record. An EEO answer is kept only while the user's standing EEO consent is recorded, and no MCP read returns its value. Returns {id, application_id, flag_count, flags}: each flagged field by its index in fields, with guessed_screening (a screening question answered by inference or composed prose), ticked_everything (a multi-select with every one of 3+ options ticked), differs_from_profile or eeo_without_saved_answer, each with a one-line reason. Flags warn; nothing is blocked, and get_final_review lists the job's flags again. step names the page: pass its URL path (location.pathname), the Companion's own key, so an agent row and a Companion row for one page fold together; a page number is still accepted. application_id links the record now; without it the record links, for the application of base_resume (the base resume's slug), when that application is created, marked applied or submitted.

ParametersJSON Schema
NameRequiredDescriptionDefault
stepNo
fieldsYesThe page's fields as filled: {question, source, answer?, section?, required?, options_count?, slot?, eeo?, edited_by_you?}. answer is a string, or for a multi-select the list of ticked options with options_count, the number offered. source: profile (the autofill profile) | resume (work history or skills) | custom (a saved answer) | written (prose composed for this form) | inferred (a choice no saved fact states) | you (typed or changed by the user) | upload (a file: slot resume or cover_letter, answer the file name). slot names the profile fact, such as preferences.willing_to_relocate. eeo marks a voluntary self-identification question.
job_idYes
base_resumeNo
application_idNo

TDQS

A4.7/5.0
Behavior5/5

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

Goes well beyond the annotations: discloses latest-call-wins overwrite semantics, that EEO answers persist only while standing consent is recorded and no MCP read returns their value, the exact return shape {id, application_id, flag_count, flags}, each flag type with meaning, and that flags warn rather than block. Annotations only cover write/safety hints, so this added context is substantive.

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?

Dense but mostly front-loaded, starting with the action and page granularity. The application_id/base_resume linking sentence is convoluted and hard to parse, costing some clarity, but nearly every sentence conveys non-obvious behavior.

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?

With no output schema and low schema coverage, the description compensates fully: it documents return values, flag semantics, consent-gated EEO handling, overwrite behavior, and the keying strategy for pages and applications. Nothing an agent needs to call it correctly appears missing.

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?

With only 20% schema coverage, the description carries the load and does: `step` is explained as the page URL path (location.pathname) so agent and Companion rows fold together, while page numbers are still accepted; `application_id` vs `base_resume` linking rules are spelled out; and the `fields` payload format, source enum, and eeo/slot semantics are detailed.

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?

Opens with a specific verb+resource: recording what was filled into a job's application form, one call per page. It is unmistakably distinct from siblings like record_triage, record_decision, or edit_application, and it states the granularity (per form page) that governs invocation.

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?

Gives clear operational context: call once per form page, per question the latest call wins, and points at the 'What was submitted' tab and get_final_review for verification. It does not name a competing tool or an explicit when-not-to-use condition, so it stops short of a 5.

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

record_runRecord Automation RunA

Stores one finished automation run. The Automations page lists the newest run of each automation under Recent runs (its counts, digest and job links) and each card shows when its automation last ran; the Agent inbox says so when the run proposed jobs. automation is the card id (mail-status, job-hunt, referral-pages, tailor-run, apply-session) or a custom automation's own name, 40 characters at most. outcome: ok, partial (some of the work failed) or failed (none of it was done). The newest 200 runs are kept. Returns the stored run.

ParametersJSON Schema
NameRequiredDescriptionDefault
reportNo{counts?, digest?, job_ids?}. counts: whole numbers for found, proposed, skipped, tailored, updated and needs_you; other keys are refused. digest: the run's plain-text summary, kept to its first 2000 characters; it holds counts and title-and-company lines, not email text. job_ids: the jobs the run touched, the first 50 kept; unknown job ids are dropped.
outcomeYes
automationYes

TDQS

A4.3/5.0
Behavior4/5

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

Beyond the annotations (mutation, non-idempotent, non-destructive), the description discloses real side effects: the run appears under Recent runs, updates the card's last-ran timestamp, and can surface the proposed jobs in the Agent inbox. It also states the 200-row retention cap, which annotations do not convey. Non-destructiveHint plus silent eviction of older runs is a mild tension, but it is a documented cap rather than a contradiction.

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?

Front-loads the core action, then spends a long clause enumerating UI surfaces (Recent runs, card timestamps, Agent inbox) that is informative but slightly sprawling. Nothing is off-topic and every sentence earns its place, though the middle sentence could be tighter.

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 3-param write tool with no output schema, it covers the essentials: what is stored, side effects, retention, and the return ("Returns the stored run"). The report-shape details live in the schema, so the description need not repeat them; only the retention boundary and idempotency of repeated identical runs go unaddressed.

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 only 33%, and the description fills the biggest hole by naming the valid card ids (mail-status, job-hunt, referral-pages, tailor-run, apply-session) and the 40-character custom-name rule for `automation`. It also expands the `outcome` enum into plain meanings (ok / partial = some work failed / failed = none done), which the bare enum does not.

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?

Opens with a specific verb+resource: "Stores one finished automation run." It immediately distinguishes this from sibling recorders (record_triage, record_decision, report_failure) by tying it to automation runs and describing where the stored run surfaces. An agent can tell what it does without opening the schema.

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 "finished automation run" scoping plus the list of valid automation card ids gives clear context for when to call it, and the 200-run retention implies it is an append-style ledger. It does not, however, name an alternative or state any exclusion, so it stops short of an explicit when/when-not rule.

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

record_triageRecord Triage DecisionA
Destructive

Record the user's TRIAGE decision over one or many proposals — accept queues them for the next apply run; decline drops those unique postings (posting-scoped, never the company). The decision is the user's own, stated directly or as a selection rule they gave. One append-only consent row is written per proposal and the result is a per-id ok/error report (a mixed batch partially succeeds). Accept is NOT submit consent: the per-application approval is recorded separately by record_consent.

ParametersJSON Schema
NameRequiredDescriptionDefault
noteNo
actionYes
reasonNo
channelNomcp
proposal_idsYes

TDQS

A4.3/5.0
Behavior5/5

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

Annotations declare destructiveHint=true and idempotentHint=false, and the description goes well beyond them: an append-only consent row is written per proposal, the result is a per-id ok/error report, mixed batches partially succeed, and decline is posting-scoped rather than company-scoped. It tells the agent exactly what gets destroyed and the partial-success semantics that annotations cannot convey.

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 content is dense but front-loaded, leading with the core action before the scoping and consent caveats. It reads as a long run-on paragraph, and a tighter split would aid scanning, but every clause carries real information.

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 destructive, non-idempotent mutation with no output schema, the description supplies the return shape (per-id ok/error report), the side effect (append-only consent rows), and the boundary against record_consent — exactly the details an agent needs. Only the optional note/reason/channel parameters are left unexplained.

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 carries the load. It ably documents the action enum (accept vs decline) and implies proposal_ids via 'one or many proposals,' but note, reason, and channel receive no explanation at all, leaving three of five parameters undocumented in either place.

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?

It states a specific verb (record) and resource (the user's triage decision over one or many proposals) and spells out the two actions' effects: accept queues for the next apply run, decline drops those unique postings. It explicitly distances itself from the sibling record_consent, so an agent can route correctly without opening another schema.

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 frames when to call it — the user's own decision, stated directly or as a selection rule — and clarifies that accept is NOT submit consent, pointing to record_consent for the separate approval step. It stops short of contrasting with record_decision/request_decision, so context is clear but alternatives aren't fully enumerated.

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

render_pdfRender Resume PDFA
Idempotent

Render a PDF. target_type is 'base_resume' (target_id=slug) or 'application' (target_id=application id). Optional template_id selects a template (either engine; must be 'ready'; omit for the default). Response reports resolved_template_id / resolved_engine (the template actually used); template_fallback=true only when an explicit template_id was passed and the resolved id differs — a substitution of the persisted choice is reported by render_note, never by the flag. render_note is non-null only when the backend has no TeX and a LaTeX template was rendered through a Typst template instead; it names both. Returns the render result incl. pdf_path (an application render also has copy_path: where the user finds the PDF in their resumes folder, null when off), plus a next key: for an 'application' render this is the terminal apply-readiness hint (autofill_ready, incomplete/blocking groups, a conditional browser-handoff offer); for a 'base_resume' render it is always null — a base-resume preview isn't part of the score->tailor->render arc, so there is nothing to offer.

ParametersJSON Schema
NameRequiredDescriptionDefault
target_idYes
target_typeYes
template_idNo

TDQS

A4.1/5.0
Behavior5/5

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

Goes well beyond the annotations (readOnly=false, idempotent=true, destructive=false) by disclosing the fallback semantics: template_fallback is only true when an explicit template_id resolves differently, persisted-choice substitution is surfaced via render_note, and render_note itself means the backend lacked TeX and a LaTeX template was rendered through a Typst one. It also explains the meaning of the `next` key per target type.

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?

Front-loaded with the core action, and every sentence (fallback rules, render_note meaning, response keys) carries distinct information rather than padding. It is dense with nested parentheticals and em-dashes, which makes it slightly harder to scan than an ideally structured definition.

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?

No output schema exists, so the description must document returns and it does: resolved_template_id/resolved_engine, template_fallback, render_note, pdf_path, conditional copy_path, and the `next` key with per-target behavior. For a non-read-only, idempotent mutation tool this covers everything an agent needs to call it and interpret the result.

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?

With 0% schema description coverage, the description must carry the load and does: it maps target_type values to what target_id should contain ('base_resume'->slug, 'application'->application id) and constrains template_id (either engine, must be 'ready', omit for default). The remaining gap is that it doesn't state the exact id format accepted.

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?

Specific verb+resource ("Render a PDF") with an immediate scoping of the two target types and their id semantics. It clearly differentiates a base-resume preview from an application render, but never names a sibling tool to contrast against, so it stops short of full sibling differentiation.

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 target_type choice and the template_id constraint ('either engine; must be ready; omit for default'), and notes that a base_resume render is outside the score->tailor->render arc. However, it gives no explicit when-not guidance or reference to alternatives (e.g. get_rendered_pdf for retrieval), leaving usage to inference.

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

report_failureReport Application FailureA
Destructive

Report execution failure. From pending_review/accepted/approved, transitions to needs_human (resumable). reason='submission_uncertain' (for a submit click that could not be verified) moves the proposal to the terminal submission_uncertain status: resume_proposal is refused for it. The user's attestation, or the agent's (channel auto) in full automation mode, through mark_submitted moves it on.

ParametersJSON Schema
NameRequiredDescriptionDefault
reasonYes
proposal_idYes

TDQS

A4.3/5.0
Behavior5/5

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

Annotations only declare the generic mutation profile (destructive, not read-only, not idempotent); the description goes well beyond by disclosing reversibility semantics — needs_human is resumable while submission_uncertain is terminal — and cross-tool effects (resume_proposal refused, mark_submitted advances it). This is exactly the behavioral context annotations cannot convey.

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?

Front-loaded with the core action and state transition, then the special-case reason, then the recovery path. Dense and mostly efficient, though the final sentence ('The user's attestation, or the agent's (channel auto) in full automation mode, through mark_submitted moves it on') is convoluted and requires re-reading.

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 mutation tool with no output schema, the description covers the critical states, transitions, and cross-tool interactions an agent needs. Minor gaps remain: behavior on invalid state transitions, and what non-'submission_uncertain' reason values do.

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 coverage is 0%, so the description must carry parameter meaning. It adds real value for `reason` by defining the special value 'submission_uncertain' and its effect, but is silent on other accepted reason values and says nothing about `proposal_id` beyond the obvious. Partial compensation for a low-coverage 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 a specific verb and resource ('Report execution failure') and immediately defines the state machine it drives: from pending_review/accepted/approved to needs_human. This lets an agent distinguish it from siblings like resume_proposal and mark_submitted without opening the schema.

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?

Gives clear preconditions (only valid from pending_review/accepted/approved) and explains the consequence of each path, including that resume_proposal is refused once the terminal submission_uncertain status is reached. It lacks an explicit 'use this instead of X when Y' framing against sibling tools, but the workflow context is strong enough to route correctly.

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

request_decisionRequest Proposal DecisionB
Idempotent

Escalate an unlinked/ambiguous proposal to needs_decision. Idempotent if already needs_decision.

ParametersJSON Schema
NameRequiredDescriptionDefault
reasonYes
proposal_idYes

TDQS

B3.3/5.0
Behavior3/5

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

The idempotency claim duplicates idempotentHint=true from the annotations and earns no credit, but the description does add the target state (needs_decision) and the escalation semantics. It says nothing about side effects, notifications, or what the proposal looks like afterward, so it is only moderately transparent.

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?

Two short sentences, front-loaded with the action and target state, with zero filler. Every clause carries information.

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?

The tool is low-complexity (two params, no output schema) and annotations already carry the safety and idempotency profile, so the description's coverage of the state transition is arguably sufficient. It still leaves both parameters undocumented, which is a real gap for a mutation tool.

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% and both parameters are required with no schema-level documentation. The description never mentions proposal_id or reason, so it fails to compensate for the coverage gap; an agent gets no guidance on what a valid reason looks like or how the ID is scoped.

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?

States a specific action (escalate) on a specific resource (proposal) and names the resulting state (needs_decision), which is more informative than the title. It doesn't explicitly distinguish itself from the closely related sibling record_decision, so it falls short of a 5.

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?

"Unlinked/ambiguous proposal" implies the trigger condition, giving implied usage guidance. However, it never names the alternative tools (record_decision, resume_proposal) or states when NOT to use this tool, leaving the routing decision partly to inference.

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

resolve_gapsSave Gap ResolutionsA
DestructiveIdempotent

Save gap resolutions on a tailoring session (merge by gap_id, idempotent). The batch is validated as ONE unit — one invalid item saves NOTHING (existing saved resolutions untouched).

`tailoring_session_id` is the id from create_tailoring_session. Each item
is {gap_id, action, payload}. Actions: add_keyword, user_input,
attach_project, skip, enable_entry, port_kb_point, cannot_confirm.
Payload shapes live on the `resolutions` parameter schema.

enable_entry and port_kb_point carry verified evidence and are exempt
from the add_keyword missing-skill rule (unverified additions stay in
skills). Re-sending a gap_id overwrites that gap; other saved resolutions
stay — including system-planned autos (payload.provenance; see
get_tailoring_session). May be called repeatedly; tailor_session consumes
the saved resolutions. Merge-only: omitting a gap_id never removes its saved resolution — resend
that gap_id with action "skip" to retract.

Response is the session plus a `next` hint (null when hints are off or unavailable).
ParametersJSON Schema
NameRequiredDescriptionDefault
resolutionsYesBatch of {gap_id, action, payload}. Actions: add_keyword | user_input | attach_project | skip | enable_entry | port_kb_point | cannot_confirm. Validated as ONE unit — one invalid item saves NOTHING (existing saved resolutions untouched). Merge-by-gap_id; omit never deletes — resend skip to retract. Payloads: add_keyword needs placement_target {section, index_or_category} (+ optional wording); a MISSING skill may use add_keyword ONLY with section=skills. user_input {text}. attach_project {project_name}. enable_entry {section: experience|projects, index}. port_kb_point {kb_point_id, kb_entity_id, placement_target, wording}. skip/cannot_confirm {} (cannot_confirm also stores a durable user_cannot_confirm KB record; only legal on gaps that ask a question, i.e. where user_input is allowed).
tailoring_session_idYes

TDQS

A4.8/5.0
Behavior5/5

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

Goes well beyond the annotations (destructive=true, idempotent=true). It discloses the all-or-nothing batch validation ('one invalid item saves NOTHING'), the merge-only overwrite rule per gap_id, the exemption of enable_entry/port_kb_point from the add_keyword missing-skill rule, and that system-planned autos are preserved. Notably it reconciles the destructiveHint by clarifying that omission never deletes and retraction requires an explicit skip.

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?

Dense but well-organized, with the atomicity and merging rules front-loaded in the first three sentences before the finer action-level detail. A few clauses (payload provenance, evidence exemption) could be tightened, but nearly every sentence carries operational information the schema lacks.

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?

With no output schema, the description still characterizes the response (session plus a 'next' hint, null when hints are off or unavailable). Given a two-parameter mutation tool with heavy schema detail and annotations present, the description supplies everything an agent needs to call it correctly.

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 resolutions parameter is heavily documented inside the schema itself, and the description defers payload shapes there rather than duplicating them. Its added value is real: it explains tailoring_session_id's origin, the cross-item interaction rules, and the evidence exemption that the schema does not state, compensating for the 50% coverage 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?

States a specific verb+resource ('Save gap resolutions on a tailoring session') and immediately qualifies it with merge-by-gap_id and idempotent semantics. It is clearly distinct from its sibling tailor_session, which is named as the downstream consumer of what this tool saves.

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?

Explicitly states prerequisites (tailoring_session_id comes from create_tailoring_session), that it may be called repeatedly, that tailor_session consumes the results, and how to retract a resolution (resend the gap_id with action 'skip'). It also names get_tailoring_session as the place to inspect provenance, giving the agent a clear alternative for the read side.

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

restore_resume_versionRestore Resume VersionA
Destructive

Copy a past version's snapshot into the live resume.

Restore goes through the standard versioned write path — it is itself a
new version (history is append-only; nothing is deleted). kind/key as on
list_resume_versions: "base"+slug or "application"+id. For applications,
the old PDF is cleared; render_pdf produces a new one. A "base" restore
re-renders, so the response carries render_note (see render_pdf: non-null
only when a TeX-less backend rendered a LaTeX template through a Typst
one) and, if that render failed, render_error — the restore landed either
way, only the PDF is stale.
ParametersJSON Schema
NameRequiredDescriptionDefault
keyYes
kindYes
numberYes

TDQS

A4.1/5.0
Behavior5/5

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

Annotations only flag destructive/not-idempotent; the description goes far beyond them by disclosing that history is append-only and nothing is deleted, that restoring an application clears the old PDF, and that a base restore re-renders with render_note/render_error while the restore still lands. This is exactly the kind of operational context annotations cannot convey.

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?

Front-loads the purpose in the first sentence, then layers the mechanism and edge cases. Dense but nearly every sentence adds a distinct fact; the render_note aside is slightly parenthetical but still load-bearing.

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 no output schema, the description responsibly explains the return values (render_note, render_error) and the failure semantics. The only gap is the 'number' parameter, which is left for the agent to infer.

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 coverage is 0%, so the description must carry the burden. It clarifies kind/key ('base'+slug or 'application'+id), which covers two of three parameters, but leaves 'number' (the version to restore) unexplained beyond the vague 'past version's snapshot.' Partial compensation warrants a baseline 3.

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 a specific verb and resource: 'Copy a past version's snapshot into the live resume.' An agent can immediately tell this apart from siblings like list_resume_versions or get_resume_version, which are reads rather than a restore.

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?

It cross-references list_resume_versions to explain the kind/key convention, which helps the agent orient, but it never states when to prefer this over alternatives (e.g., edit_base_resume or duplicate_base_resume) or any preconditions/exclusions. Usage is implied rather than guided.

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

resume_proposalResume ProposalA

Return a needs_human proposal to pending_review so preparation can continue. Releases any pre-click daily-cap reservation. Refused for submission_uncertain.

ParametersJSON Schema
NameRequiredDescriptionDefault
proposal_idYes

TDQS

A3.7/5.0
Behavior4/5

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

Annotations declare readOnlyHint=false, idempotentHint=false, destructiveHint=false, so the agent knows it mutates without destroying. The description adds genuinely useful context beyond annotations: it releases a daily-cap reservation and is refused for submission_uncertain proposals. It does not explain permissions or the full effect of the state change.

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 terse sentences, each earning its place: the action, the side effect, and the refusal condition. Fully front-loaded with zero filler.

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?

For a one-parameter mutation with annotations covering the safety profile and no output schema, the state transition, side effect, and refusal condition are enough to avoid misuse. However, it omits the parameter's meaning and how to reach the needs_human state, leaving meaningful gaps.

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?

With one required parameter at 0% schema coverage, the description carries the burden of documenting proposal_id but never mentions it, its format, or where to obtain it. It only implicitly constrains which proposals are eligible. Baseline 3 is the best fit.

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?

States a specific state transition: it moves a needs_human proposal to pending_review. A reader can distinguish it from get_proposal or request_decision. However, it does not say what 'preparation' is or which sibling performs it, so scope is partly implied.

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 usage by describing the state transition but never states when to call this versus alternatives like request_decision or record_decision. It also gives no prerequisites, only a refusal condition.

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

run_health_checkRun Resume Health CheckA

Run the JD-independent resume health check on a base resume or a tailored application. kind is 'base' (then key is the base-resume slug) or 'application' (then key is the application id). Classifies every bullet on the evidence ladder, checks structure/content gates, and returns {score, grade, tier, next_grade, gates, counts, findings} ranked by what each defect costs. Concrete qualitative results can earn full credit. An ask/fix finding carries question, ask_kind (measure|detail|reword), measure_target, alt_question, gain and evidence. Notes score zero: the evidence.no_numbers flag and language.* wording notes. Disputes and the word bank are web-only for now. create_tailoring_session returns 409 when the base resume's latest, current report has an unwaived failing fatal gate; this call produces that report.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYes
kindYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations only tell us it is not read-only, not idempotent, not destructive and open-world; the description adds that the call produces a persisted report that gates downstream tailoring, describes the return contract, and notes that notes score zero and disputes/word bank are web-only. It never states explicitly that repeated calls may create fresh report records, which is the main residual gap for a non-idempotent write.

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

Conciseness3/5

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

Front-loaded correctly: purpose and parameter semantics come first. But the middle is stuffed with implementation-level detail (ask_kind values, measure_target, alt_question, evidence.no_numbers, language.* wording notes) that an agent needs only after deciding to call, which dilutes scannability.

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 no output schema, the description usefully summarizes the return object (score, grade, tier, gates, counts, findings) and explains the finding payload. Combined with the gate/409 relationship and the web-only caveat, an agent has enough to call it and interpret results, though permission or cost requirements are unstated.

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 carries the burden and largely does: it explains that 'kind' selects the domain and that 'key' means a base-resume slug or an application id depending on that value. The enum values themselves come from the schema, but the semantics of the pairing are supplied only here.

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 a specific verb+resource (run the resume health check) and pins the scope with 'JD-independent', which separates it from the JD-based score_ats/compare_ats siblings and from the retrieval-only get_health_report. The two operating modes are named up front.

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?

Gives clear conditions for each mode ('kind' is 'base' -> key is slug; 'application' -> key is application id) and, more valuably, ties the tool to a workflow: create_tailoring_session returns 409 until a current report exists, and 'this call produces that report'. It stops short of naming the sibling alternatives (get_health_report, waive_health_gate) or saying when not to call it.

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

score_atsScore Resume Against JobA

Deterministic hybrid match score (no LLM): deterministic lexical layers + anchored pinned-model semantic matching + section-level semantic_fit. Omit target to score ALL base resumes (fast).

target_type "base_resume" (target_id = slug) or "application" (target_id = id).
Same inputs always give the same score; use it to compare bases and to
verify an edit actually moved the number.

Response is {scores, recommendation, countries, next}. `scores` is the raw per-target
list: composite (0-100), per-layer subscores (incl. semantic_fit), gate
warnings, and a per-skill diagnostic table with fix_hints. `recommendation`
is a deterministic ranking of the base-resume rows (order, recommended slug,
margin, close_call, reasons, coverage_warning) — always present, cheap, and
useful during triage even with hints off. Bases set for other countries are
not scored for this job unless `include_other_countries` is true; the
`countries` block ({job_country, fallback, skipped}) names them and is
omitted when a target_id is given. `next` is an optional next-step
hint (null when suppressed or unavailable) naming quick_tailor / create_tailoring_session
against the recommended base.

brief=True suits scoring many jobs in a triage/mass-capture loop: it
suppresses ONLY `next` (never `recommendation`) and is checked before any
settings lookup, so a twenty-posting triage loop pays no extra HTTP
round-trip for a hint nobody will read.
ParametersJSON Schema
NameRequiredDescriptionDefault
briefNo
job_idYes
target_idNo
target_typeNo
include_other_countriesNo

TDQS

A4.1/5.0
Behavior3/5

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

Adds real context beyond the annotations: the {scores, recommendation, countries, next} shape, that recommendation is always present even with hints off, that bases for other countries are skipped unless include_other_countries is set, and that brief is checked before any settings lookup. It does not, however, reconcile its determinism/repeatability claim with the readOnlyHint=false and idempotentHint=false annotations, nor explain what side effects (if any) trigger those hints.

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?

Purpose leads, parameter guidance follows, response contract and the brief/triage rationale come last, so it is well front-loaded. Minor waste in the opening redundancy ('Deterministic hybrid match score ... deterministic lexical layers') and the mildly promotional 'always present, cheap, and useful during triage'.

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 no output schema, the description correctly takes on return-value explanation and does it in detail (composite, per-layer subscores, gate warnings, diagnostic table, recommendation fields, countries block, next hint). Missing only edge behavior such as invalid job_id or target_id handling and any error surface.

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 carries the load, and it largely does: target_type semantics with the slug-vs-id distinction, omitting target to score all bases, include_other_countries gating, and brief's exact suppression behavior. Only job_id is left to inference, keeping it short of a 5.

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 a specific verb+resource (score a resume against a job) and pins down the mechanism precisely: deterministic lexical layers plus anchored pinned-model semantic matching, explicitly no LLM. An agent can distinguish this from compare_ats or tailor_session without opening a schema.

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?

Gives concrete when-to-use framing: 'use it to compare bases and to verify an edit actually moved the number' and 'omit target to score ALL base resumes (fast)', plus a triage/mass-capture case for brief=True. It never explicitly excludes a sibling (e.g. compare_ats) or states a when-not-to-use condition, so it stops short of a 5.

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

set_base_resume_identitySet Resume TargetA
Idempotent

Set what a base resume is written for. Only the fields passed change. countries (ISO codes) restricts which jobs the resume is scored and recommended for: a job in another country skips it, and a resume sent to one is flagged. role_category/role_label name the role, company and focus are free-text emphasis hints for tailoring (at most 80 characters each), and display_name renames the resume. [] clears countries and "" clears company or focus. color_hue (0-359) sets the colour the app shows beside the resume's name; it never changes the PDF. An unknown country, an over-long value or a hue outside 0-359 is a 422 that saves none of the fields. Resume content, versions and the PDF are never touched.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYes
focusNo
companyNo
color_hueNo
countriesNo
role_labelNo
display_nameNo
role_categoryNo

TDQS

A4.5/5.0
Behavior5/5

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

Goes well beyond the annotations: it discloses partial-update semantics ('only the fields passed change'), clearing conventions ([] and ""), an atomic 422 failure that 'saves none of the fields', and explicit no-side-effect guarantees for content/versions/PDF. The idempotentHint is matched and enriched by this 'only passed fields change' behavior.

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?

Dense but front-loaded, opening with the core purpose and partial-update rule before enumerating fields. Every clause adds real information (limits, clear sentinels, error behavior), though the field-by-field list makes it long enough to be close to overstuffed.

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?

For a mutation tool with no output schema and 8 undocumented parameters, the description supplies update semantics, per-field meaning, validation constraints, clearing behavior, and failure/atomicity guarantees. An agent has everything needed to call it correctly without further context.

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?

With 0% schema coverage across 8 parameters, the description carries the full load and does so thoroughly: it explains countries (ISO codes and their scoring/recommendation effect), role_category/role_label, company and focus (free-text, 80-char cap), display_name, and color_hue (0-359, UI-only). It even documents clear-value sentinels and validation ranges that the bare schema omits.

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 a specific verb and resource: setting the targeting/identity metadata a base resume is written for. It is clearly distinguished from the many siblings that touch resume content (update_base_resume, edit_base_resume) by explicitly noting content, versions and PDF are never touched.

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 intended scope is strongly implied by contrast ('Resume content, versions and the PDF are never touched'), which effectively signals this is for metadata-only changes rather than content edits. However, it never explicitly names an alternative tool or states when to prefer this over update_base_resume/edit_base_resume, leaving the routing to inference.

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

store_extracted_jdSave Extracted JobA
Idempotent

Store a job description the caller already extracted into JSON (the backend makes no LLM call).

extracted_json must match the app's JobExtraction schema: company, title,
role_category, level, employment_type, work_mode, city/state/country,
location_raw, salary_min/max, salary_period,
work_authorization: "sponsorship_available"|"no_sponsorship"|"citizen_or_gc_required"|"unstated",
opt_accepted: "yes"|"stem_opt_ok"|"no"|"unstated",
years_experience_min/max, skills[{skill_name, skill_category,
requirement_level: "required"|"preferred"|"mentioned"}],
responsibilities[], qualifications[]. ANY other work_authorization or
opt_accepted value silently normalizes to "unstated" with no error.
source is "user" (default) or "agent"; source="agent" marks agent-hunted jobs,
which need an open proposal before the apply helpers act on them. A job
stored with source="user" is not proposal-gated: the server skips the
open-proposal check for any non-agent source. Returns the stored job.
ParametersJSON Schema
NameRequiredDescriptionDefault
sourceNouser
raw_textNo
source_urlNo
extracted_jsonYes

TDQS

A4.7/5.0
Behavior5/5

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

Goes well beyond the annotations by disclosing a silent-failure behavior ('ANY other work_authorization or opt_accepted value silently normalizes to "unstated" with no error'), the proposal-gating consequence of source='agent' versus 'user', and that no LLM call is made on the backend. These are consequences an agent could not infer from readOnlyHint=false / idempotentHint=true / destructiveHint=false.

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?

It is long, but the length is largely forced by the 0% schema coverage and the purpose constraint is front-loaded. The mid-paragraph enum dump is dense but each clause is load-bearing; only the trailing 'Returns the stored job' is near-redundant.

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?

For a write tool with no output schema, no parameter descriptions, and a nested object parameter, the description supplies the schema contract, the enum fallback semantics, the gating behavior, and the return statement. Nothing material is missing for an agent to call it correctly.

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 carries the full burden, and it does: it enumerates the extracted_json fields (company, title, salary_min/max, skills[{skill_name, skill_category, requirement_level}], etc.) plus exact enum vocabularies for work_authorization, opt_accepted, and requirement_level, and explains source semantics. Only raw_text and source_url go unmentioned, which are minor given their self-evident names and null defaults.

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 a specific verb+resource ('Store a job description') and immediately bounds scope with 'the caller already extracted into JSON (the backend makes no LLM call)', which distinguishes it from any extraction-oriented sibling. An agent knows exactly what this does and what it does not do.

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?

Gives real usage context: source='agent' jobs are proposal-gated before apply helpers act on them, while source='user' skips the open-proposal check. It does not explicitly compare against alternative storage/ingest paths (e.g. kb_ingest_resume, sync_now), so the when-to-use-vs-alternative framing is implied rather than stated.

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

sync_nowSync NowA
Idempotent

Run one sync round on the always-on copy. Returns its outcome (ok, transient, needs_person) and per-step counts, or a skip reason. Forces a round through the backoff window; an attempt within the last 30 seconds is skipped with 'Synced moments ago.'. Sync off returns "Sync isn't set up."; home returns "This is your laptop's copy; your bot runs the sync."

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior5/5

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

Well beyond the annotations, it enumerates the outcome vocabulary (ok, transient, needs_person), per-step counts, skip reasons, and the 30-second rate-limit behavior with the exact returned string. That is exactly the behavioral detail an agent needs before invoking a mutating, open-world sync.

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?

Front-loaded with the action, then outcome, then edge cases; each sentence carries distinct information. The quoted literal responses are slightly verbose but they are the actual contract the caller will see, so they earn their place.

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?

With no parameters and no output schema, the description carries the full burden and does so: it documents the return shape, outcome values, skip reasons, and the not-set-up/home cases. Nothing needed to call it correctly is missing.

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 takes zero parameters, so the schema baseline is 4 and there is nothing for the description to disambiguate. No param guidance is needed or missing.

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 opens with a specific verb+resource and scope: "Run one sync round on the always-on copy." That is unambiguous and clearly not the same as the KB or resume siblings. It stops short of naming any sibling as the alternative path, so it is clear but not explicitly differentiated.

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 gives concrete usage context: forcing a round through the backoff window, and the states where it is a no-op (sync off, home copy). Those effectively describe when the call is pointless. It does not, however, route the agent to a different tool for those cases.

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

tailor_applicationRebuild Tailored ResumeA
Destructive

REBUILD FROM SCRATCH: apply typed edit ops to the BASE resume and store the result as customized_json, REPLACING whatever was there before wholesale.

`ops` carry only the changed fields (same op shapes as edit_base_resume; the
base is in get_base_resume) — the server starts from the stored base and
inherits every untouched field from IT, not from any prior tailored draft.
If an application already has tailored edits (from a previous tailor_application
or edit_application call), calling this again DESTROYS them — the new result is
computed fresh from the base, not layered on top. edit_application is the
in-place alternative that preserves the current tailored draft (refining
wording, swapping a bullet, retrying after a PDF preview).
Does NOT trigger AI suggestions. A job has one application: with no application_id,
the job's newest is updated in place and takes this base (still replaced wholesale);
pass application_id to target a specific application explicitly. `ops` accepts
the FULL vocabulary documented on edit_base_resume — every kind, not just
the bullet/summary ones: replace_entry is how you change an entry's dates, title,
company or tech list, and add/replace/remove/move_extra_section handle custom
sections, which are ATS-neutral.
ParametersJSON Schema
NameRequiredDescriptionDefault
opsYesTyped edit ops. Each is an object with a `kind`, one of: replace_summary | toggle_entry | replace_bullet | replace_skills_group | add_skill_item | add_bullet | add_entry | replace_entry | remove_entry | remove_bullet | replace_contact | replace_certifications | add_extra_section | replace_extra_section | remove_extra_section | move_extra_section. To change a field ON an entry — dates, title, company, project name, link, tech — use replace_entry with that entry's index and the full edited entry object; it is scoped to that one entry (a whole-resume replace is the separate update_base_resume tool). See the tool description for each op's shape. add_extra_section/replace_extra_section `value` is {key,title,enabled,type:"entries"|"bullets"} plus EITHER entries:[{heading,subheading?,location?,date?,link?,enabled,bullets:[str]}] OR bullets:[str] — never both; unknown keys are rejected (400, extra="forbid").
job_idYes
base_resumeYes
application_idNo

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=false, but the description adds substantial non-obvious context: prior tailored edits are DESTROYED, the result is computed fresh from the base rather than layered, untouched fields inherit from the base not a prior draft, and it does NOT trigger AI suggestions. This goes well beyond the annotation flags, though it doesn't cover return shape or error behavior.

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?

Front-loaded with the core destructive action, then alternatives, then parameter behavior. It is long and caps-heavy, but nearly every sentence carries distinct information (destruction, inheritance, alternative, op vocabulary). Slightly dense.

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 destructive, no-output-schema mutation tool, the description covers destruction semantics, inheritance behavior, the in-place alternative, and the full op vocabulary. The main residual gap is what base_resume expects, which matters for a required parameter.

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?

With only 25% schema coverage, the description carries real weight: it explains the ops vocabulary ('FULL vocabulary documented on edit_base_resume'), op shapes, and application_id/job_id targeting semantics. However, the required base_resume string parameter is never explained (id? name? content?), leaving one of four params under-specified.

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 a specific verb and resource with scope: 'apply typed edit ops to the BASE resume and store the result as customized_json, REPLACING whatever was there before wholesale.' It explicitly distinguishes itself from edit_application (in-place) and edit_base_resume (base editing), so an agent can route correctly without opening schemas.

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?

Gives explicit when-to-use vs alternative: 'edit_application is the in-place alternative that preserves the current tailored draft (refining wording, swapping a bullet, retrying after a PDF preview).' It also names when-not: calling again destroys prior edits, and explains application_id targeting vs the no-id default.

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

tailor_sessionTailor Resume SessionA
Destructive

Run the tailor pipeline for a session: resolutions -> edit ops -> tailored application, auto-scored.

`tailoring_session_id` is the id returned by create_tailoring_session.
Two ways to produce the edit ops:
- Default (ops omitted): the backend builds the tailor prompt from the saved
  resolutions and calls the LLM to generate the ops.
- Caller-supplied (ops given): the caller has already produced the typed edit
  ops (same op shapes as tailor_application/edit_application). The backend
  skips its own LLM pass and applies them directly — the caller's judgment
  IS the tailor. `ops` carry only the changed fields (the base is in
  get_base_resume).

Caller-supplied ops are applied as authored: the server validates structure
only, so nothing gates fabricated skills, experience, metrics, or dates
(keyword-survival checks run only on the backend-LLM path). A skill the
candidate cannot evidence goes only in the skills list (add_skill_item), not
in a bullet; the compare view audits any edit beyond the saved resolutions.

Resume text must be implied first person: no I/he/she/they or the owner's name; a hit returns 400 naming the lines.

Optional user_prompt adds free-form tailoring guidance. Writes the job's ONE
application from the base plus the ops: it rebuilds the draft and removes its
PDF (version history keeps the old draft), scores it, and returns
{session, compare, compare_error, next}. compare (before/after match score
deltas) may be null with compare_error set: the tailor still succeeded, so do
not retry. `kb_writeback_skips` derives from each user_input
resolution's STORED placement_target from resolve_gaps, not from the ops, so
ops that disagree with the stored target produce a spurious wrong_section
skip. `next` is a next-step hint naming render_pdf for that application
(null when suppressed or unavailable).
ParametersJSON Schema
NameRequiredDescriptionDefault
opsNo
user_promptNo
tailoring_session_idYes

TDQS

A4.5/5.0
Behavior5/5

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

Far beyond the annotations (which only say destructive/not-read-only/not-idempotent), it discloses that it rebuilds the draft and removes its PDF (version history retained), that caller-supplied ops are applied as authored with structure-only validation and no gating of fabricated content, the implied-first-person rule with a 400 naming offending lines, and the kb_writeback_skips/stored-placement_target caveat.

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?

It is long but front-loaded, opening with the pipeline before flowing into input modes, constraints, and return shape. Nearly every sentence adds operational value; a few (e.g. the repeated op-shape cross-references) could be tightened, keeping it just short of maximal efficiency.

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?

With no output schema, the description fully specifies the return payload {session, compare, compare_error, next}, explains when compare is null and that a compare_error is not a failure, and clarifies that next is a render_pdf hint (null when suppressed). Mutation effects and the first-person validation constraint are also covered, leaving nothing essential unstated.

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 carries the full burden and does: tailoring_session_id is the id from create_tailoring_session, ops has two modes with shapes tied to tailor_application/edit_application and carries only changed fields (base is in get_base_resume), and user_prompt is free-form tailoring guidance. All three parameters are meaningfully documented.

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 names a specific verb and resource and states the full pipeline: 'Run the tailor pipeline for a session: resolutions -> edit ops -> tailored application, auto-scored.' It distinguishes itself from create_tailoring_session, resolve_gaps, and render_pdf, but never contrasts itself with the most confusable siblings (tailor_application, quick_tailor), so the agent must infer when this session-based path beats the direct one.

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 gives clear context for the two invocation modes: default (ops omitted) uses the backend LLM, caller-supplied ops skip the LLM pass. It also supplies operational guidance like 'the tailor still succeeded, so do not retry' on compare_error. What's missing is any statement of when to choose this tool over tailor_application or quick_tailor.

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

unarchive_base_resumeUnarchive Base ResumeA
Idempotent

Restore an archived base resume to list_base_resumes' default view.

Clears archived_at. The resume is again selectable; nothing else changes.
ParametersJSON Schema
NameRequiredDescriptionDefault
slugYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnly=false, idempotent=true, destructive=false, openWorld=false, so the bar is lower. The description still adds real behavioral detail: it clears archived_at, makes the resume selectable again, and explicitly states 'nothing else changes' — a valuable scope guarantee. It does not, however, cover error behavior (e.g. unarchiving a non-archived resume).

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 short, front-loaded sentences with zero waste: the action and its scope lead, followed by the concrete state change and a reassurance clause. Nothing is redundant or padded.

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 simple, single-identifier state-flip tool whose safety profile is fully covered by annotations and with no output schema to explain, the description is nearly complete. Only the meaning/format of slug and the non-archived edge case remain unstated.

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 single slug parameter has 0% schema description coverage, so the description would ideally clarify it, and it does not mention slug at all. The parameter is a trivially inferable identifier, which softens the gap, but the description provides no semantic compensation for the missing schema documentation.

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 a specific verb (restore/unarchive) and resource (an archived base resume), and the inverse action clearly distinguishes it from the sibling archive_base_resume. Naming list_base_resumes' default view scopes exactly what the operation achieves.

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?

Usage is implied by the operation itself ('restore an archived...'), and it implies a prerequisite (the resume must be archived). However, it never states when to use this versus alternatives like restore_resume_version or update_base_resume, nor the condition under which it is the wrong tool.

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

unwaive_health_gateRemove Health Gate WaiverA
DestructiveIdempotent

Remove a health-gate waiver and restore the gate's protection. Deletes the stored waiver for this gate (a no-op if none exists), so the gate blocks create_tailoring_session with a 409 again. The counterpart waive_health_gate records the user's decision to bypass a failing gate.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYes
kindYes
gate_idYes

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the safety profile is covered. The description adds genuinely non-structured behavior: it deletes the stored waiver, is a no-op if none exists, and causes create_tailoring_session to return 409 again. That downstream effect is valuable context not present in the annotations.

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 tight sentences with no filler; the core action is front-loaded and the counterpart tool is described last as supporting context. Slightly longer than strictly necessary but every sentence contributes.

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?

For a small mutation tool with annotations covering the safety profile and no output schema, the description is mostly adequate. However, with 0% parameter coverage and an unexplained enum, an agent cannot confidently supply kind or key, leaving a real completeness gap.

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% across three required parameters, so the description carries the full burden, yet it explains none of them. "For this gate" loosely implies gate_id, but kind (base vs application) and key are left completely undefined, and the enum's two values are nowhere explained.

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 a specific verb and resource ("Remove a health-gate waiver") and explicitly names its counterpart tool, waive_health_gate, so an agent can distinguish the two without opening either schema. The effect (restore the gate's protection) is unambiguous.

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 the situation that motivates the call: it undoes a prior bypass so the gate blocks create_tailoring_session again, and it identifies waive_health_gate as the reverse operation. It stops short of explicit when-to-use/when-not wording, but the context is clear enough to select the tool.

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

update_applicationUpdate Application TrackingA
DestructiveIdempotent

Update an application's tracking fields (status, applied_at, notes, referral_id).

Only the arguments passed are sent to the backend — the PATCH endpoint is
driven by which fields were actually set on the request, so omitting an
argument leaves that field untouched. This tool cannot clear a field back to
null/empty (e.g. remove notes or unlink a referral): omitting an arg skips it
entirely rather than sending an explicit null, and clearing a field requires
the web UI.

Allowed statuses: draft, applied, interviewing, offered, accepted, rejected,
withdrawn (anything else is rejected). Setting status to applied,
interviewing, offered or accepted also closes any open proposal on the job,
recorded as a declined "applied manually" consent event.

applied_at sync rule: if you change `status` without also passing `applied_at`,
the backend keeps applied_at in sync automatically — entering "applied" stamps
it with the current time (only if not already set), moving back to "draft"
clears it, and every later stage (interviewing/offered/accepted/rejected/
withdrawn) preserves whatever applied_at already holds. An explicit
`applied_at` overrides that sync and must carry a UTC offset
(e.g. `2026-08-18T14:32:11+00:00`) — a naive value is a 422.
ParametersJSON Schema
NameRequiredDescriptionDefault
notesNo
statusNo
applied_atNo
referral_idNo
application_idYes

TDQS

A4.4/5.0
Behavior5/5

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

Annotations declare destructiveHint=true and idempotentHint=true, and the description goes well beyond them: PATCH omission semantics, inability to null fields, the allowed status whitelist, a real side effect (setting applied/interviewing/offered/accepted closes open proposals and records a declined 'applied manually' consent event), and a 422 failure mode for naive timestamps. This is rich, non-redundant 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?

Long but front-loaded: the purpose and field list come first, then mutation semantics, then side effects, then the applied_at rule. Nearly every sentence carries operational weight (enum, sync rule, 422 condition), with only mild redundancy in the verbose applied_at paragraph.

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 mutation tool with no output schema, it covers arguments, side effects, validation, and error behavior thoroughly. The one omission is what the tool returns after a successful update, which an agent might want since no output schema exists to describe it.

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 coverage is 0% with no enums declared, so the description carries the full burden and does: it lists valid status values, documents the applied_at auto-sync algorithm and required UTC offset format with an example, and states that notes/referral_id cannot be cleared. Meaning is added for every meaningful argument beyond the bare anyOf string/null schema.

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?

Specific verb+resource: 'Update an application's tracking fields' with the exact field set (status, applied_at, notes, referral_id) enumerated, which effectively separates it from the sibling edit_application. It never names a sibling explicitly, so it stops short of full differentiation.

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?

Gives a clear when-not with a concrete alternative: clearing a field back to null is impossible here and 'requires the web UI', and it explains the omission-vs-null PATCH rule that governs all invocations. No sibling tool is offered as an alternative for related edits, but the operational context is explicit.

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

update_base_resumeReplace Base Resume DataA
DestructiveIdempotent

Replace a base resume's data (the full ResumeData object, required). Optionally also update display_name. PUT replaces the whole resume body.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataYes
slugYes
display_nameNo

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, but they do not say whether the write merges or overwrites. The description fills that gap: 'PUT replaces the whole resume body' plus 'the full ResumeData object, required' tells the agent anything omitted from data is lost, which is genuinely additive. It still omits auth requirements and what happens on invalid data.

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 short sentences, front-loaded with the core action and payload requirement; nothing padding. Minor redundancy with the title ('Replace Base Resume Data') but it earns its place by adding the PUT/replacement semantics.

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?

For a destructive mutation with a nested unschematized payload and no output schema, the description is minimal but directionally adequate. It leaves the ResumeData structure entirely undocumented and never mentions the slug parameter or failure behavior, so an agent still has gaps before calling it safely.

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 must carry the load. It clarifies that data is the required full ResumeData object and that display_name is optional ('optionally also update'), but says nothing about slug and gives no shape for the nested data object.

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?

States a specific verb+resource ('Replace a base resume's data') and defines the primary payload as the full ResumeData object. 'PUT replaces the whole resume body' implicitly distinguishes it from partial-edit siblings such as edit_base_resume, though no sibling is named explicitly.

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 phrase 'PUT replaces the whole resume body' implies the tool is for wholesale replacement rather than a patch, which is useful routing context. However, it never states when to choose this over edit_base_resume, set_base_resume_identity, or create_base_resume_from_kb, and lists no prerequisites.

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

update_template_draftEdit Template DraftA
DestructiveIdempotent

Edit a draft template; changing the source resets it to 'draft'. Pass validate=True to save + test-compile in one call (returned status/last_error show the result); otherwise re-validate separately. The active default template cannot be edited through these tools (the backend rejects it).

ParametersJSON Schema
NameRequiredDescriptionDefault
sourceNo
validateNo
template_idYes
display_nameNo

TDQS

A4.5/5.0
Behavior5/5

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

Annotations only declare readOnly=false, destructive=true, idempotent=true. The description adds non-obvious behavior beyond that: editing the source resets the template to 'draft', validate=True performs a save+test-compile with results surfaced via status/last_error, and the active default template is rejected by the backend. These are exactly the side effects an agent needs.

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 dense sentences, front-loading the core edit action and the source-reset caveat. The parenthetical about returned status/last_error is slightly compressed but each sentence carries distinct information with no filler.

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 destructive mutation with no output schema, the description covers the mutation's side effects, the validation shortcut and its result fields, and a key restriction. Only the undocumented display_name/template_id parameters leave a small gap.

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 must carry the load. It explains the validate parameter's semantics and the source parameter's side effect (reset to draft), but display_name and template_id are not described at all. Partial compensation for a 0% coverage 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 a specific verb+resource ('Edit a draft template') and immediately scopes it against siblings by noting changing the source resets status to 'draft' and that re-validation can happen separately (routing away from validate_template). An agent can distinguish this from create_template_draft and validate_template without opening schemas.

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?

Explicitly says when to use the one-call path ('Pass validate=True to save + test-compile in one call') versus validating separately, and states a hard when-not: the active default template cannot be edited and the backend rejects it. Both the alternative and the exclusion are named.

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

validate_templateValidate TemplateA
Idempotent

Test-compile a template against a built-in sample resume. On success it becomes 'ready' (usable via render_pdf template_id) and a preview is available via get_rendered_pdf('template', id). On failure returns {ok: false, error} with the engine's compile error (Typst errors carry file:line:col). Returns {ok, error, parse_certified} — parse_certified is true when the template's compiled PDF round-trips through a strict text extractor with word boundaries intact, false when it drops text, null when not assessed. Also returns parse_report: {missing, headers_missing, extra_sections_supported, extra_sections_missing} — missing lists the exact sample phrases the PDF dropped; extra_sections_missing non-empty means the template will hard-fail rendering any resume that has custom sections.

ParametersJSON Schema
NameRequiredDescriptionDefault
template_idYes

TDQS

A4.4/5.0
Behavior5/5

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

Goes well beyond the annotations by disclosing the state transition to 'ready', the exact failure shape ({ok:false, error} with Typst file:line:col), and the semantics of parse_certified (true/false/null) and parse_report. The idempotentHint is reinforced by the deterministic test-compile behavior.

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?

Front-loads the purpose and outcome, then layers the return-value contract. Dense but each sentence carries information; the parse_certified/parse_report details are justified since there is no output schema. Slightly long, but no filler.

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?

With no output schema, the description carries the full burden of explaining return values, and it does so thoroughly for both success and failure paths, including the hard-fail warning for extra_sections_missing. An agent has everything needed to call and interpret this tool.

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 coverage is 0% and the sole parameter (template_id) has no schema description. The description references template_id only indirectly through render_pdf/get_rendered_pdf usage, and never says where template_id comes from (e.g., list_templates). It adds marginal meaning but leaves the parameter under-documented.

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 a specific verb+resource ('Test-compile a template') and explains the concrete outcome: on success the template becomes 'ready' and is usable via render_pdf. An agent can immediately distinguish this from create_template_draft or render_pdf.

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?

Clearly frames the use case as a pre-flight validation step ('On success it becomes ready... usable via render_pdf template_id'), implying it should be run before rendering. It does not name an explicit when-not-to-use or a competing alternative, but the context is unambiguous.

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

waive_health_gateWaive Health GateA
Idempotent

Escape hatch for the fatal-health-gate 409 from create_tailoring_session. Waiving bypasses a safety gate, so the stored waiver records an explicit user decision: reason is the user's stated reason for bypassing the named gate. The server stores the waiver as given and does not verify who made the decision. kind is 'base' or 'application', key is the resume slug or application id. The 409 names each failing gate by its label; the gate_id to pass is that gate's gates[].id in get_health_report.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYes
kindYes
reasonYes
gate_idYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare a non-read-only, non-destructive, idempotent, closed-world mutation; the description adds genuinely non-obvious context on top: that waiving bypasses a safety gate, that the server stores the waiver verbatim and does not verify who made the decision, and that the stored waiver is meant to represent an explicit user decision. It doesn't cover repeat-call behavior or the response shape, keeping it at 4 rather than 5.

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?

Front-loads the purpose in the first sentence, then moves to behavioral trust model and finally parameter semantics, with no filler sentences. It is dense and slightly run-on across five sentences, but each one adds information an agent needs.

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 4-required-param mutation with no output schema, the description covers trigger, trust model, and all parameter meanings, and annotations carry the safety profile. Minor gaps remain around idempotent repeat behavior and what the stored waiver looks like on return.

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?

With 0% schema description coverage the description must carry all parameter meaning, and it does: kind is 'base' or 'application' (matching the enum), key is the resume slug or application id, reason is the user's stated justification, and gate_id is pinpointed as the gates[].id value from get_health_report. Every required parameter is disambiguated 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?

States a precise verb+resource (waive a health gate) and anchors it to a concrete trigger: the fatal-health-gate 409 from create_tailoring_session. It also names the sibling tools it interacts with (create_tailoring_session, get_health_report), so an agent can distinguish it from nearby tools like unwaive_health_gate or run_health_check.

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?

Gives a clear when-to-use condition (only as an escape hatch after create_tailoring_session returns a fatal-health-gate 409) and explains how to obtain the required gate_id from get_health_report. It never explicitly names unwaive_health_gate as the reverse operation or states when NOT to waive, so it falls just short of full routing guidance.

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.

  1. 88 tool updatesv0.11.1
    • First observedarchive_base_resume
    • First observedattach_evidence
    • First observedattach_evidence_file
    • First observedclose_tailoring_session
    • First observedcompare_ats
    • First observedcreate_base_resume
    • First observedcreate_base_resume_from_kb
    • First observedcreate_tailoring_session
    • First observedcreate_template_draft
    • First observedduplicate_base_resume
    • First observededit_application
    • First observededit_base_resume
    • First observedexplore_ats_over_time
    • First observedexplore_fit_distribution
    • First observedexplore_gap_frequency
    • First observedexplore_role_mix_over_time
    • First observedexplore_skill_heatmap
    • First observedexplore_tailoring_lift
    • First observedexplore_top_skills
    • First observedexport_jobs
    • First observedfind_job_by_url
    • First observedgenerate_cover_letter
    • First observedgenerate_qa_answers
    • First observedget_application
    • First observedget_autofill_profile
    • First observedget_base_resume
    • First observedget_career_context
    • First observedget_career_export
    • First observedget_final_review
    • First observedget_health_report
    • First observedget_job
    • First observedget_job_search_brief
    • First observedget_job_site_login
    • First observedget_proposal
    • First observedget_rendered_pdf
    • First observedget_rendered_pdf_page_image
    • First observedget_resume_version
    • First observedget_tailoring_session
    • First observedget_template
    • First observedkb_approve_points
    • First observedkb_capture
    • First observedkb_create_entity
    • First observedkb_edit_entity
    • First observedkb_edit_point
    • First observedkb_edit_profile
    • First observedkb_get_entity
    • First observedkb_ingest_resume
    • First observedkb_list_entities
    • First observedkb_list_points
    • First observedkb_sync_base
    • First observedlist_applications
    • First observedlist_base_resumes
    • First observedlist_jobs
    • First observedlist_proposals
    • First observedlist_qa_entries
    • First observedlist_referrals
    • First observedlist_resume_versions
    • First observedlist_tailoring_sessions
    • First observedlist_templates
    • First observedmark_submitted
    • First observedprepare_application_pdf_upload
    • First observedpropose_application
    • First observedquick_tailor
    • First observedrecord_consent
    • First observedrecord_decision
    • First observedrecord_filled_answers
    • First observedrecord_run
    • First observedrecord_triage
    • First observedrender_pdf
    • First observedreport_failure
    • First observedrequest_decision
    • First observedresolve_gaps
    • First observedrestore_resume_version
    • First observedresume_proposal
    • First observedrun_health_check
    • First observedscore_ats
    • First observedset_base_resume_identity
    • First observedstore_extracted_jd
    • First observedsync_now
    • First observedtailor_application
    • First observedtailor_session
    • First observedunarchive_base_resume
    • First observedunwaive_health_gate
    • First observedupdate_application
    • First observedupdate_base_resume
    • First observedupdate_template_draft
    • First observedvalidate_template
    • First observedwaive_health_gate

TDQS

B3.4/5.0

Scored across 88 tools

Disambiguation3/5

The extensive descriptions do a lot of work distinguishing overlapping tools (tailor_application vs edit_application, update_base_resume vs edit_base_resume), but genuine confusion remains. The proposal state-machine tools (record_decision, request_decision, record_triage, record_consent, resume_proposal) and pairs like attach_evidence vs attach_evidence_file, score_ats vs compare_ats require careful reading to select correctly.

Naming Consistency4/5

Almost everything is snake_case with a verb_noun shape (list_jobs, create_base_resume, kb_edit_point, render_pdf), and prefixes cleanly partition domains (kb_*, explore_*). A few names drop the noun (quick_tailor, sync_now, process-free but verb-only) and ingestion verbs vary (kb_ingest_resume / store_extracted_jd / kb_capture), but the overall convention is predictable.

Tool Count2/5

88 tools is far beyond the 25+ heavy threshold and forces an agent to navigate a very large surface. The career-studio domain is genuinely broad (KB, resumes, tailoring, scoring, rendering, templates, job capture, proposals, evidence, automation), so most tools earn a place, but the set could plausibly be consolidated into a smaller, more navigable surface.

Completeness4/5

Coverage is unusually thorough: full CRUD on resumes, KB entities/points, templates, applications, proposals, plus scoring, health checks, rendering, evidence, and automation lifecycle. Minor documented gaps remain that force fallbacks to the web UI (cannot clear application fields to null, disputes/word bank web-only, certificate PDF upload), but the core workflows are complete.

Maintenance

ActivityActive
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    CareerMate is an MCP-first, local-only career management tool that stores your career data (profiles, resumes, cover letters, job postings, applications, interview prep) on your computer and exposes it through MCP tools for AI agents to read and write.
    16 npm
    2
    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
    Enables parsing a master resume, analyzing job descriptions for ATS/match scores, generating truthful tailored resumes, tracking applications, and producing PDF reports through Claude Desktop.
    17
    MIT