Skip to main content
Glama

honest-cv

CI License: MIT

Honest, ATS-safe CVs tailored to each role, generated by your AI agent. honest-cv is an MCP server, a CLI and a Claude Code skill. It keeps one source of truth about your experience and turns it into a PDF and DOCX for each type of role. It never claims a skill you don't have.

Leer en español

Demo: skill checklists including your own, scoring a job post, a verified build, a cover letter that refuses a skill the person lacks, LinkedIn texts and logging the application

Why

Many CVs that get no callbacks don't fail on design. They fail on targeting, and on details that quietly break text extraction. AI makes the opposite problem easy: a model will happily stuff a CV with keywords you can't defend in an interview. honest-cv is built around three ideas:

  • The code enforces honesty, not a prompt. Every skill has a level. A skill at familiarity level is always labeled as such, and a skill you don't have is never printed. Raising a level takes written evidence and your confirmation, which the server asks you for directly. The model can't confirm on your behalf.

  • Gaps are measured against your own inventory. For each keyword a job post asks for, honest-cv tells you which of three cases it is:

    • you have it, but this CV doesn't show it;

    • you only know it at familiarity level;

    • you don't have it.

  • ATS safety is checked on every build. Every PDF goes through two text extractors (pypdf and pdfminer.six). The build checks that the text is one column, has no ligatures, keeps each date on its role's line, follows the right reading order and includes every bullet.

The server is deterministic and needs no API key. Your MCP client's model runs the conversation; honest-cv validates, builds, verifies and measures. It keeps your profile in a folder on your machine and never sends it anywhere: see Privacy for what your AI client does with it.

Related MCP server: resume-mcp

Quick start

honest-cv needs uv. Typst and the fonts ship inside the package, so there is nothing else to install. It runs on Linux (glibc) on x86_64 and ARM64, macOS on Intel and Apple Silicon, and Windows on x64. Alpine Linux and Windows on ARM aren't supported, because the typst package doesn't publish wheels for them.

Claude Code

claude mcp add honest-cv -- uvx honest-cv serve --profile ~/cv-profile

To install the skill as well, which guides the interview and the tailoring:

mkdir -p ~/.claude/skills/honest-cv
curl -fsSL https://raw.githubusercontent.com/JesusCabreraReveles/honest-cv/master/skills/honest-cv/SKILL.md \
  -o ~/.claude/skills/honest-cv/SKILL.md

Then follow Your first CV, step by step.

Cursor

Add this to ~/.cursor/mcp.json, or to .cursor/mcp.json in a project:

{
  "mcpServers": {
    "honest-cv": {
      "command": "uvx",
      "args": ["honest-cv", "serve", "--profile", "/absolute/path/to/cv-profile"]
    }
  }
}

Claude Desktop

Edit claude_desktop_config.json:

  • on macOS, ~/Library/Application Support/Claude/;

  • on Windows, %APPDATA%\Claude\.

Add the same mcpServers block as in the Cursor example and restart the app. If the app can't find uvx, use its absolute path (which uvx).

How each client confirms a skill upgrade

Raising a skill's level needs your own confirmation, which the server asks for through MCP elicitation. Not every client supports it yet:

Client

Where you confirm

Claude Code

In the chat: a form with one "no / sí" field per upgrade, up to 10 at a time. Only the ones you answer "sí" are saved; Decline saves nothing.

Claude Desktop

In a terminal. The server refuses the change and gives you the command to run: uvx honest-cv skill <profile> "<name>" <level> --evidence "...".

Other clients

In the chat if they support elicitation, otherwise in a terminal as above.

Your first CV, step by step

This walkthrough uses Claude Code; any MCP client works the same way, only the setup differs.

1. Install uv and add honest-cv. One time only. On macOS or Linux:

curl -LsSf https://astral.sh/uv/install.sh | sh        # Windows: see docs.astral.sh/uv
claude mcp add honest-cv -- uvx honest-cv serve --profile ~/cv-profile

~/cv-profile is the folder where your profile will live. It doesn't have to exist yet, and it should not be inside a public repository. Install the skill too (Claude Code above).

2. Start the interview. Open Claude Code in any folder (claude) and write, in your own language, "Interview me for my CV", or run /mcp__honest-cv__interview. The assistant keeps your language for the whole conversation. You can answer by voice with your system's dictation (on macOS: System Settings → Keyboard → Dictation): it reads names and numbers back to you before saving them, since dictation mishears them. It goes like this:

You: Interview me for my CV.

Assistant: The folder ~/cv-profile doesn't exist yet. Shall I create it? … The whole interview can take a few hours, but everything is saved as we go. A first session with your contact details, your two most recent roles and the skills checklist is enough for a first CV. Do you have a LinkedIn data export or a JSON Resume to start from?

  • Import, if you can (optional). Download LinkedIn's data export (see Import) and give the assistant the path to the ZIP. Your roles, education and achievements come in, and skills arrive without a level for you to mark.

  • Contact, roles and education. It asks a few at a time and reads names and numbers back before saving. Then it asks once about certifications, courses and anything you wrote.

  • Achievements, role by role. For each role: what the team did, what you did, and what changed, with numbers. It drafts a bullet and saves it only after you approve the wording.

  • Skills. It offers a checklist, e.g. backend-jvm + engineering-lead, or your own for any profession. Open ~/cv-profile/checklist.md in your editor, put P, L, F or X on each line, add where you used it after " — ", save, and tell the assistant "done". It asks for the evidence it is missing, in groups. Then a form asks you to confirm the upgrades: only what you answer "sí" is saved.

  • Your biggest achievements. One achievement usually covers several skills. It then asks about your main P skills that no achievement shows yet; the rest can wait for a job post.

3. Build your first CV. The assistant proposes one variant per kind of role you apply to (for example "platform" or "engineering manager"): title, summary and which bullets to show. Once you approve it:

You: Build my platform CV in English and Spanish.

The PDF and DOCX land in ~/cv-profile/out/, already checked for ATS safety. Without an AI client, the same is uvx honest-cv build ~/cv-profile -v platform -l en.

4. Tailor it to a job post. Paste the post, or run /mcp__honest-cv__tailor_for_job:

You: Here is a job post: (paste it). How well do I fit, and what should I change?

You get the coverage of each variant, the missing keywords split into you have it but this CV doesn't show it, familiarity only and you don't have it, plus the ones you marked in your checklist but haven't backed with evidence yet (it asks where you used them), a tailored variant to approve, and the build. Then it can draft a cover letter, which check_claims checks before it is built, and log the application with the post's text and what to prepare for the interview. When you get the interview, "help me prepare the interview" drafts likely questions with answers from your own achievements.

5. Come back any day. Say "let's continue my CV interview": it starts from what is missing. When you need to update your LinkedIn profile, say "update my LinkedIn".

Your profile

A profile is a folder with four YAML files. Create one with honest-cv init ~/cv-profile, or let the interview prompt fill it in with you. Keep it out of public repositories.

File

What it holds

profile.yaml

Contact details, roles, education, certifications, publications, courses and languages.

bullets.yaml

A pool of achievements, each with an id, a role and tags.

skills.yaml

Your skill inventory, with levels and evidence.

variants.yaml

One CV plan per type of role. A variant can inherit from another with extends:.

Any text can be a single string or one string per language: {en: ..., es: ...}. CVs can be built in English and in Spanish.

Level

Meaning

On the CV

P

Used in production at a job

Shown

L

Your own project or lab

Shown

F

Familiarity

Only on the line labeled "Familiarity"

X

You don't have it

Never shown, but recorded so gap reports are honest

Skill checklists

Recording dozens of skills one question at a time is slow. A checklist is a Markdown file you mark in your editor, one letter per line:

## Messaging and streaming
evidence: Payments platform at Acme, 2020–2026
- [P] Kafka — reconciliation flow, 2M events a day · years: 6 · last year: 2026
- [F] RabbitMQ — a workshop and the official tutorials
- [X] NATS

Text after " — " is the evidence, and an evidence: line under a heading covers that section. Lines without evidence are never saved: they come back as pending, and your assistant asks you about them in groups. Upgrades are confirmed once for the whole file.

Checklists come in English and Spanish (--lang es): the Spanish names are synonyms of the English ones, so a skill you mark in Spanish still matches a job post in English.

honest-cv checklist list                                     # backend-jvm, platform-sre, ...
honest-cv checklist new ~/cv-profile backend-jvm engineering-lead
honest-cv checklist apply ~/cv-profile ~/cv-profile/checklist.md

Any profession works. The built-in checklists cover software (backend, frontend, mobile, data, platform/SRE, QA, security, ML/AI, embedded, game development, architecture, engineering leadership) and data analysis/BI, product and project management, UX design, marketing, sales, customer support, finance and accounting, human resources, supply chain, nursing and teaching. A template is just a Markdown list in this format: save your own (or one someone shared) in ~/cv-profile/checklists/ and it shows up in checklist list and combines with the others in checklist new, which also takes a path. A template can declare synonyms, such as same: Work Breakdown Structure = WBS, and the job score, the gaps and the letter check use them, along with its skill names. Start from examples/checklists/event-planning.md. You can also apply a file you marked yourself, in English or Spanish (años, último uso). When you're done, honest-cv names the P and L skills that no achievement shows, and your assistant asks you for one real example of each.

honest-cv checklist list ~/cv-profile                        # yours too, e.g. accounting
honest-cv checklist new ~/cv-profile accounting engineering-lead

New checklists for other kinds of roles are welcome: see CONTRIBUTING.md.

See examples/ada/ for a complete, fictional profile with three variants, a job post and its keywords.

Privacy

  • honest-cv itself makes no network calls. No accounts, no telemetry, no API keys. Your profile is a folder of YAML files on your machine, and the PDF engine and fonts run locally. You can check it: every command works with the network turned off.

  • Your AI client is a different matter. Whatever the client's model reads through the tools goes to that model's provider, under the provider's terms, like anything else you share in a chat. That includes your skills, bullets and the text of your CVs.

  • Some clients copy files to the cloud. To edit files directly, Claude Desktop may ask for access to the profile folder and say that the files leave your device. honest-cv's editing tools make that unnecessary: decline the request and ask the assistant to use the tools.

  • Running it on a hosted service takes it off your machine. Directories such as Glama offer to deploy honest-cv on their servers or try it in the browser. It works, but then your profile and your CVs live on that service, under its terms. For your real data, run it on your own computer with uvx honest-cv.

  • If you want nothing to leave your machine, use only the CLI (build, verify, score, skill) and edit the YAML files yourself.

Import what you already have

honest-cv import reads a JSON Resume file or LinkedIn's data export (Settings → Data privacy → Download your data, a ZIP of CSVs, or its folder if your browser unzipped it). Ask for the full archive: the basic one, offered when you pick files, has only your headline and summary, without roles. Contact, roles, education, certifications, languages and each role's achievements go into your profile; with a headline and a summary it also creates a first variant, so build works right away.

  • It only adds what your profile lacks and never overwrites. Try --dry-run first.

  • Imported achievements are tagged imported: review their wording.

  • Skills arrive without a level, because neither format says whether you used a skill in production. They go to imported-skills.md, a checklist for you to mark.

LinkedIn's "Save to PDF" profile changes layout without notice, so it isn't parsed: with an MCP client, the import_linkedin_pdf prompt reads its text and proposes each section for you to approve.

Track your applications

honest-cv apps keeps a log in applications.yaml, inside your profile folder: which variant and files went to which company, and each status with its date (draft, applied, interview, offer, rejected, withdrawn). Logging the same company and role again updates it. With an MCP client, your assistant offers to log an application after building the CV or letter, and list_applications points out the ones with no news for two weeks. It keeps a copy of each file you sent in sent/, since the next build overwrites out/, and the job post's text in posts/, since links expire, and what to prepare for the interview: ask your assistant "what did I need to prepare for Acme?".

When you get the interview, say "help me prepare the Acme interview" (or run the interview_prep prompt). For each keyword of the saved post, honest-cv lays out your level, your evidence and the bullets that back it, starting with the ones in the CV you sent. Your assistant drafts the likely questions with STAR answers taken only from those bullets, honest answers for what you only know at familiarity level or don't have, and questions to ask them. The notes you approve are saved in prep/. Without an AI client: honest-cv apps prep ~/cv-profile acme_sre -k "Kafka,Scala".

LinkedIn

honest-cv linkedin turns a variant into LinkedIn's texts, each within its limit: the headline (your title and up to five production skills), About (the summary and impact bullets), one description per position from its bullets, and the skills list. It writes them to a Markdown file to copy from. The skills are P and L only: LinkedIn can't label familiarity, so F skills stay out, and X skills never appear. With an MCP client, the linkedin_profile prompt polishes the wording and checks it with check_claims.

Export

To go the other way, honest-cv export writes a variant as JSON Resume for other CV tools and sites, with the same rules as the CV: X skills never appear, and F skills only in a "Familiarity" group with that level.

Cover letters

The cover_letter prompt drafts a one-page letter for a job post from your own bullets. Before it is built, check_claims reads the text against your profile:

  • Problems block the build: a skill you marked X, or a familiarity skill presented as experience ("I use Rust in production" when Rust is F; "I am familiar with Rust" is fine).

  • Warnings are for you to review: a technology neither your inventory nor your bullets show, or a number that appears nowhere in your profile. If it is true, record it first; if not, it comes out of the letter.

The letter uses the CV's fonts and passes the same ATS checks. Without an AI client, write it in a text file (paragraphs separated by blank lines) and use honest-cv letter check and letter build.

CLI

Run any command with uvx honest-cv ..., or install it once with uv tool install honest-cv to type just honest-cv.

honest-cv init ~/cv-profile                        # create the profile templates
honest-cv build ~/cv-profile -v backend -l en -l es # PDF + DOCX, verified on every build
honest-cv verify any-cv.pdf --text                  # check any PDF, even one made elsewhere
honest-cv score ~/cv-profile -k "Kubernetes,Go" -p "Rust"   # coverage per variant, with gaps
honest-cv skill ~/cv-profile "Rust" L --evidence "CLI tool on GitHub"  # asks you to confirm
honest-cv import ~/cv-profile linkedin-export.zip --dry-run         # or resume.json
honest-cv export ~/cv-profile -v backend -l en                       # JSON Resume
honest-cv apps log ~/cv-profile --company Acme --role "SRE" -s applied -v platform
honest-cv apps list ~/cv-profile                                     # latest first, with counts
honest-cv apps prep ~/cv-profile acme_sre -k "Kafka,Scala"           # what backs each keyword, for the interview
honest-cv linkedin ~/cv-profile -v platform -l en                    # texts to paste into LinkedIn
honest-cv remove skill ~/cv-profile "Kafka"                          # asks you to confirm
honest-cv letter check ~/cv-profile letter.txt -k "Kubernetes,Go"     # claims your profile doesn't support
honest-cv letter build ~/cv-profile letter.txt --company Acme --role "Platform Engineer" -l en
honest-cv serve --profile ~/cv-profile              # the MCP server, over stdio

verify works on any PDF. Use --text to see exactly what a parser extracts. Its single_column check also catches a common defect: a date aligned to the right, which parsers split away from its role.

MCP tools and prompts

Name

What it does

init_profile

Creates a profile folder with commented templates.

get_inventory

Returns your skills, grouped by level, with years and evidence.

set_skill

Adds or changes a skill. To raise its level it needs evidence and asks you to confirm.

set_skills

Adds or changes several skills at once. Upgrades are confirmed with one question that lists each change.

checklist_list

Lists the built-in checklists.

checklist_new

Merges built-in checklists into one file, prefilled from your inventory.

checklist_apply

Saves the skills marked in a checklist and returns the lines that still need evidence.

add_bullet

Adds an achievement to the pool.

remove_skill, remove_bullet, remove_role, remove_publication

Delete for good, and remove every use in the variants. A role with bullets needs with_bullets. Clients ask before running them.

set_contact

Changes contact details: name, email, phone, location, links.

set_profile_details

Replaces the certifications list, the courses list and the spoken-languages line.

upsert_role

Adds a role in date order, or changes fields of an existing one.

upsert_education

Adds or changes an education entry.

upsert_publication

Adds or changes a book, article or paper the person wrote. Each variant shows all of them, or the ones it lists.

save_variant

Adds or replaces a variant. Every reference is checked before saving.

list_variants

Lists the variants after inheritance, with their bullet texts and the bullets no variant uses.

build_cv

Renders a PDF and/or DOCX and verifies it.

verify_pdf

Runs the ATS checks on any PDF and returns its extracted text.

score_job

Measures the keyword coverage of each variant. The client extracts the keywords.

gap_report

Groups missing keywords by what you can honestly do about each one.

prompt interview

Fills your inventory and bullet pool, one question at a time.

check_claims

Checks any text against your profile: blocks X skills and familiarity sold as experience, flags what the profile doesn't show.

build_letter

Renders a cover letter to PDF and DOCX, one page, with the CV's ATS checks. Refuses while check_claims finds problems.

prompt tailor_for_job

Scores the variants, explains the gaps, adapts a variant and rebuilds.

prompt cover_letter

Drafts a letter for a job post from your bullets, checks its claims and builds it.

import_profile

Imports JSON Resume or a LinkedIn data export, adding only what is missing. For a LinkedIn PDF it returns the text.

export_json_resume

Exports a variant as JSON Resume; X skills never appear and F skills keep their label.

log_application

Records an application (company, role, CV variant, files sent, the post's text, what to prepare) or a new status, with its date.

linkedin_profile

LinkedIn headline, About, position descriptions and skills (P and L only) from a variant, within LinkedIn's limits.

list_applications

Lists applications, latest first, with a count per status and the ones with no news for 14+ days.

interview_prep

For an application: the saved post and, per keyword, your level, evidence and the bullets that back it. Saves the prep notes.

prompt import_linkedin_pdf

Turns the PDF from LinkedIn's "Save to PDF" into a profile, section by section, with your approval.

prompt linkedin_profile

Polishes the LinkedIn texts of a variant without adding claims, checked with check_claims.

prompt interview_prep

Prepares an interview: likely questions, STAR answers from your own bullets, honest answers for the gaps.

ATS guarantees

The template enforces these. verify checks them on every build, and the test suite runs in CI on Linux, macOS and Windows:

  • One column. No layout tables, images, icons, headers or footers.

  • Ligatures and kerning off, no hyphenation, and terms like "CI/CD", URLs and emails never split across lines.

  • Reading order equals source order. Dates sit on the same line as their role.

  • Text is extractable by both pypdf and pdfminer.six, and the two agree.

  • The fonts (Carlito, metric-compatible with Calibri) are embedded and identical on every machine.

Development

uv sync
uv run pytest
uv run honest-cv build examples/ada -l en -l es

The repository's .mcp.json registers honest-cv-dev with the fictional profile, so Claude Code in this folder can use your working copy. See CONTRIBUTING.md.

License

MIT. The bundled Carlito font is under the SIL Open Font License; see src/honest_cv/render/fonts/OFL.txt.

Available Tools

31 tools
add_bulletA

Add one achievement to the bullet pool, the material every CV variant picks from. Use it after the person approves the wording, one bullet per call; to change which bullets a CV shows, use save_variant. role is a role id from upsert_role; leave it out for bullets used only in Selected Impact. Use only facts the person stated, never invented numbers. Returns saved.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesUnique bullet id, e.g. ft_k8s.
roleNoRole id from profile.yaml this bullet belongs to.
tagsNoSkills and topics it shows, e.g. Kubernetes.
metricsNoNumbers it claims, e.g. 40%, kept for review.
profileNoPath of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).
text_enYesThe achievement in English, as the person stated it.
text_esNoThe same achievement in Spanish.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already flag this as a non-destructive write (readOnlyHint=false, destructiveHint=false, openWorldHint=false). The description adds value beyond that by disclosing the return value ('Returns `saved`') in the absence of an output schema, and by stating the grounding constraint ('Use only facts the person stated, never invented numbers'). It does not say whether reusing an existing `id` overwrites or errors, which is the notable remaining 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?

Four sentences, front-loaded with what the tool does before the routing guidance and parameter notes. Dense but every clause carries information; the backticked identifiers keep it scannable. Slightly packed, but 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 7-parameter write tool with no output schema, the description covers the key operational facts: where `role` originates, its default semantics, the grounding rule for content, and the return value. Remaining fields (tags, metrics, text_es, profile) are fully documented in the schema, so nothing critical 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?

Schema description coverage is 100%, so baseline is 3, but the description adds cross-tool semantics the schema cannot: `role` comes from upsert_role, and omitting it scopes the bullet to Selected Impact only. That is meaningfully more than the schema's 'Role id from profile.yaml this bullet belongs to.'

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 ('Add one achievement to the bullet pool') and immediately defines what the resource is ('the material every CV variant picks from'). Distinguishes it from save_variant, which governs which bullets a CV shows, so an agent can route correctly 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?

Explicit when-to-use ('after the person approves the wording, one bullet per call'), an explicit alternative ('to change which bullets a CV shows, use save_variant'), and a defaulting rule for the `role` parameter. Both inclusion and exclusion conditions are covered.

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

build_cvA

Render a CV variant to PDF and/or DOCX, then verify the PDF for ATS safety. Use it when the person wants the files; for a cover letter use build_letter, and to check a PDF made elsewhere use verify_pdf. Files go to out_dir, default /out, replacing earlier builds of the same variant and language. Returns the files, each PDF with its pages, ats_ok and failed checks. A failed check is probably a bug in honest-cv: report it, never reword the person's text to pass it.

ParametersJSON Schema
NameRequiredDescriptionDefault
langNoLanguage of the output: en (English) or es (Spanish).en
formatsNoFormats to write: pdf, docx or both. Default: both.
out_dirNoOutput folder. Default: <profile>/out.
profileNoPath of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).
variantYesVariant id from variants.yaml, e.g. backend.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations cover only the safety profile (readOnlyHint=false, destructiveHint=false, openWorldHint=false), but the description goes further: it discloses overwrite semantics ('replacing earlier builds of the same variant and language'), the default output location, the return payload (files, pages, ats_ok, failed checks), and even what to do on failure ('report it, never reword the person's text'). That is unusually rich behavioral context.

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 the routing guidance before the file/return details; each sentence carries distinct information. It runs slightly long across five sentences, but none are padding.

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, the description supplies the return contents (files, page counts, ats_ok, failed checks), the output destination, the overwrite behavior, and failure-handling policy, so 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.

Parameters3/5

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

Schema description coverage is 100%, so all five parameters (lang, formats, out_dir, profile, variant) are already fully documented in the schema; the description adds only the variant+language replacement rule and restates the out_dir default. Baseline 3 is appropriate since the schema does the heavy lifting.

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 ('Render a CV variant to PDF and/or DOCX') plus a secondary action (ATS verification), and explicitly names the siblings it is not: build_letter for cover letters and verify_pdf for PDFs made elsewhere. An agent can distinguish it from all 30 siblings 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 Guidelines5/5

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

Gives an explicit trigger ('use it when the person wants the files') and two named alternatives with the conditions that select them (cover letter -> build_letter; PDF made elsewhere -> verify_pdf). 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.

build_letterA

Render an approved cover letter to a one-page PDF and/or DOCX with the CV's ATS checks. Use it after drafting the letter with the person and running check_claims; for the CV itself use build_cv. It runs check_claims again and refuses while there are problems. Returns the files and any warnings to show the person.

ParametersJSON Schema
NameRequiredDescriptionDefault
langNoLanguage of the output: en (English) or es (Spanish).en
roleYesJob title, as in the job post.
closingNoClosing line. Default: Sincerely, / Atentamente,
companyYesCompany name, as in the job post.
formatsNoFormats to write: pdf, docx or both. Default: both.
out_dirNoOutput folder. Default: <profile>/out.
profileNoPath of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).
greetingNoOpening line. Default: Dear Hiring Team, / Estimado equipo de selección:
keywordsNoKeywords of the job post, for check_claims.
recipientNoHiring manager or team, if the post names one.
paragraphsYesThe body, one string per paragraph, approved by the person.

TDQS

A4.5/5.0
Behavior4/5

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

Discloses a real behavioral trait beyond the annotations: the tool re-runs check_claims and refuses while problems exist, and returns files and warnings to show the person. Annotations only cover the safety profile (readOnly=false, destructive=false), which the description is consistent with, so the validation gate and return shape are genuine added value.

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 what it renders and immediately followed by prerequisites, the sibling alternative, and the guard behavior. Every clause carries information with no repetition of name or title.

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 explains what is returned (files and warnings). Combined with 100% schema coverage on 11 parameters and the stated prerequisite chain, an agent has everything needed to invoke it 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 description coverage is 100%, so the 11 parameters are already fully documented in the schema. The description adds only tangential mapping ('with the CV's ATS checks' relating to keywords) and no format or syntax detail beyond the schema, so the baseline 3 applies.

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 (render) and resource (approved cover letter) plus output formats (one-page PDF and/or DOCX), and explicitly names the sibling it is not (build_cv) for the CV itself. An agent can distinguish this from build_cv 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 explicit sequencing preconditions ('after drafting the letter with the person and running check_claims') and routes to the alternative ('for the CV itself use build_cv'). The when-to-use and the sibling boundary are both stated outright.

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

check_claimsA
Read-only

Check any text about the person against their profile before it goes anywhere: a cover letter, a summary, a LinkedIn text. build_letter and linkedin_profile run it too. Returns problems, which must be fixed (a skill marked X, or a familiarity skill not called familiarity in its sentence), and warnings for the person (a technology the profile doesn't show, or a number found nowhere in it). Fix them by removing or qualifying the claim, never by adding skills. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesThe draft: a cover letter, a summary, any text about the person.
profileNoPath of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).
keywordsNoKeywords of the job post, so its technologies are checked too.

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 and openWorldHint=false, so the trailing 'Read-only' is largely redundant; however the description adds substantial value beyond the annotations by disclosing the return structure (problems vs warnings), what each contains, and the required remediation policy ('remove or qualify, never add skills'). This behavioral guidance is not inferable from 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.

Conciseness4/5

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

Front-loaded with the purpose in the first clause, then usage, return shape, and remediation in a tight sequence. It is slightly dense with parenthetical examples but 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.

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 carries the burden of explaining the return value (problems and warnings, with examples of each). Combined with the remediation guidance and the pointer to sibling tools that reuse it, an agent has everything needed to call and act on 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 description coverage is 100%, so text, profile, and keywords are fully documented in the schema. The description reinforces the profile-relative nature of the check but adds no syntax or format detail for the individual parameters, so the baseline 3 applies.

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 ('check') and resource ('any text about the person against their profile') and carves out scope by naming the related tools (build_letter, linkedin_profile) that invoke it internally. An agent can distinguish it from siblings like build_letter or verify_pdf 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 a clear trigger — 'before it goes anywhere' — and enumerates the artifact types it applies to (cover letter, summary, LinkedIn text), plus notes that build_letter and linkedin_profile run it automatically. It does not state explicit exclusions or name a competing tool to prefer instead, so it falls just short of 5.

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

checklist_applyA

Save the skills the person marked in a checklist file. Use it after checklist_new, once the person says they are done, and again to resume. Lines that keep or lower a level are saved at once; upgrades with evidence are confirmed in a form, up to 10 per call: call again while upgrades_not_asked_yet is not empty. Returns the counts saved, pending_evidence (marked lines without evidence: ask where they used them, in groups, and save with set_skills), skills_without_achievements and key_skills_without_achievements.

Ask about nothing else: unmarked lines are for the person to mark in the file. After the checklist, ask for the person's biggest achievements first, since one usually covers several skills, then for the key skills still without one; save each with add_bullet. The rest wait for a job post that asks for them (gap_report → no_achievement). Never write an achievement for them.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesA Markdown checklist marked by the person, e.g. <profile>/checklist.md.
profileNoPath of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only declare the generic write/safe/local profile (readOnlyHint=false, destructiveHint=false, openWorldHint=false). The description goes well beyond them: it discloses the 10-upgrades-per-call confirmation batching, the auto-save behavior for keep/lower lines, and names the exact return fields (counts, pending_evidence, skills_without_achievements, key_skills_without_achievements).

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 operation and its re-invocation rule are front-loaded in the first sentence, and the rest is dense but mostly load-bearing (return fields, follow-up ordering). It is longer than typical and blends downstream agent instructions with tool semantics, which costs a point, but little is 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 stateful, form-driven write tool with no output schema, the description covers when to call it, what it persists automatically vs. confirms, what the response contains, and what the agent should do next (achievements first, then key skills, gap_report fallback). Nothing an agent needs 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.

Parameters3/5

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

Schema description coverage is 100%, so both `path` and `profile` are already documented in the schema, including the default-profile fallback. The description adds no syntax or format detail for the parameters themselves, so baseline 3 applies.

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: 'Save the skills the person marked in a checklist file.' It explicitly anchors itself to the sibling workflow ('after checklist_new', 'save with set_skills'), so an agent can distinguish it from checklist_new, set_skills, and add_bullet 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 Guidelines5/5

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

Gives explicit triggering conditions ('after checklist_new, once the person says they are done, and again to resume') and an explicit re-invocation rule ('call again while upgrades_not_asked_yet is not empty'). It also states what NOT to do ('Ask about nothing else', 'Never write an achievement for them'), which is unusually complete routing guidance.

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

checklist_listA
Read-only

List the skill checklist templates the person can combine. Use it before checklist_new, to let the person pick the ones that fit their profession. Returns checklists: each with its id, title, description, number of skills and origin ("built-in", or "yours" for templates in /checklists/). Any profession works. Pass lang in the person's language to get the translated templates. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
langNoThe person's language: the built-in templates in it, where translated.en
profileNoPath of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the trailing 'Read-only' restates structured data and adds nothing. However, the description goes beyond the annotations by disclosing the return payload (checklists with id, title, description, skills count, origin) and the origin semantics ('built-in' vs 'yours' for templates in <profile>/checklists/), which is genuinely useful behavior detail.

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, then usage, then return shape — a sensible ordering. Slightly dense, and the closing 'Read-only' is redundant with annotations, but no sentence is wasted overall.

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 enumerates the returned fields and the origin values, so an agent knows exactly what it will receive. Combined with the routing guidance to checklist_new, nothing needed to call this 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?

Schema description coverage is 100%, so the baseline is 3. The description still adds meaning by explaining why lang matters ('Pass `lang` in the person's language to get the translated templates'), which clarifies the translation behavior of that parameter beyond the schema's terse wording.

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 the skill checklist templates') and immediately qualifies scope ('the person can combine'), which separates it from checklist_new, checklist_apply and the other checklist siblings. An agent can identify 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 Guidelines5/5

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

Gives explicit sequencing guidance ('Use it before checklist_new, to let the person pick the ones that fit their profession'), naming the alternative tool and the condition that selects it. It also clarifies applicability ('Any profession works'), removing a common hesitation point.

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

checklist_newA

Write a checklist file for the person to mark in their editor, merged from the templates picked in checklist_list, without duplicates and prefilled from the inventory. Use it when the person has many skills: it is much faster than asking one by one. Next step: once they have marked it, call checklist_apply. Refuses to replace an existing file unless overwrite. lists may be empty when extra names the skills. Returns the file's path and its number of skills.

ParametersJSON Schema
NameRequiredDescriptionDefault
langNoThe person's language: the file's headings and the built-in templates in it.en
pathNoFile to write. Default: <profile>/checklist.md.
extraNoMore skill names to ask about, e.g. found in an imported profile.
listsYesIds from checklist_list, e.g. backend-jvm, or paths to .md templates.
profileNoPath of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).
overwriteNoReplace the file if it exists.

TDQS

A4.3/5.0
Behavior4/5

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

Discloses behavior beyond annotations: refuses to replace an existing file unless overwrite is set, dedupes templates, prefills from inventory, and returns path plus skill count. Annotations only cover the safety triad, so these are genuine additions. Minor gap: no info on whether a partial read/write or permissions are involved.

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?

Compact and front-loaded with purpose, then usage, then next-step, then behavioral guarantees. Slightly dense with three ideas packed into single sentences, but no waste.

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

Completeness4/5

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

Covers purpose, workflow position, cross-parameter interaction, refusal behavior, and return value despite no output schema. Nearly complete for a file-producing tool; only missing error/edge-case behavior.

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 100%, so the schema already documents all six parameters with defaults and the lang enum. The description only adds that lists may be empty when extra supplies skills, a useful cross-parameter constraint but otherwise baseline.

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 ('Write a checklist file... merged from the templates picked in checklist_list') and distinguishes itself clearly from siblings by naming checklist_list as its upstream source and checklist_apply as its downstream step.

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 gives the when-to-use condition ('Use it when the person has many skills: it is much faster than asking one by one') and names the alternative workflow (asking one by one), then routes to the next tool (checklist_apply).

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

export_json_resumeA

Export a CV variant as a JSON Resume file, for other CV tools and sites that import that format. Use build_cv for a PDF or DOCX instead. Same honesty rules as the CV: X skills never appear, and F skills only in a "Familiarity" group. Writes to out_dir, default /out, and returns its path.

ParametersJSON Schema
NameRequiredDescriptionDefault
langNoLanguage of the output: en (English) or es (Spanish).en
out_dirNoOutput folder. Default: <profile>/out.
profileNoPath of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).
variantYesVariant id from variants.yaml, e.g. backend.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations only tell the agent it is a non-read-only, non-destructive, closed-world write; the description adds substantive behavior beyond that: the honesty filtering rule (X skills never appear, F skills only in a Familiarity group), the write destination and its default, and the returned path. This is genuinely useful context the structured fields do not carry.

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 purpose, then the alternative, then the behavioral rule, then the output detail. Every 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.

Completeness5/5

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

For a 4-parameter write tool with no output schema, the description covers what is produced (a JSON Resume file), where it is written (out_dir with default), what is returned (path), and the content-filtering rule. 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.

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents lang, out_dir, profile, and variant. The description restates the out_dir default and return path but adds no new parameter meaning beyond what the schema provides, so the baseline of 3 is appropriate.

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 (export) and resource (a CV variant as a JSON Resume file) with the target audience/format named. It explicitly distinguishes itself from the sibling build_cv, which produces PDF/DOCX, so an agent can route between the two 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 an explicit alternative: 'Use build_cv for a PDF or DOCX instead.' This is exactly the when-to-use-this-vs-sibling guidance the dimension rewards, with the format condition that selects each tool made clear.

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

gap_reportA
Read-only

Explain the keywords a job post asks for that one variant doesn't show, grouped by what can honestly be done. Use it after score_job picked the variant, before editing it with save_variant. Returns: in_inventory_not_in_cv (the person has it: add it, using unused_bullets, or name it in the summary or competencies), familiarity_only (only as familiarity), not_in_inventory (do not claim it), no_achievement (P or L skills no bullet shows: ask for one real achievement each) and marked_in_checklist (marked in their checklist, still without evidence: ask where they used it). Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
langNoLanguage of the output: en (English) or es (Spanish).en
profileNoPath of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).
variantYesVariant id from variants.yaml, e.g. backend.
keywordsYesRequired keywords from the job post, in its own wording.
preferredNoNice-to-have keywords from the job post.

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 and openWorldHint=false, and the description's 'Read-only' merely echoes that. The real value is the disclosed response shape: five named buckets with the prescribed action for each (add via unused_bullets, treat as familiarity only, do not claim, ask for an achievement, ask where it was used), which no annotation or schema conveys. It stops short of describing ordering, size, or how counts are derived.

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 dense paragraph, but front-loaded: purpose first, then usage and ordering, then the return-value breakdown. Every clause carries information, though the bucket list makes it long and could have been structured as a short list 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 carries the burden of explaining what comes back, and it does so thoroughly for all five result groups plus their intended follow-up actions. Combined with the explicit workflow placement, an agent has everything needed to call and act on 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 description coverage is 100%, so all five parameters (variant, keywords, preferred, profile, lang) are already documented in the schema. The description adds only indirect hints, such as keywords being the job post's own wording and the mention of `unused_bullets` as a source, which does not go beyond the structured fields.

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: 'Explain the keywords a job post asks for that one variant doesn't show', with the grouping dimension ('by what can honestly be done') that makes the output meaningful. It is clearly distinguishable from siblings like score_job, save_variant and check_claims.

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 sequencing: 'Use it after score_job picked the variant, before editing it with save_variant.' This places the tool in the workflow between two named siblings, so an agent knows exactly when it applies and when it is premature or too late.

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

get_inventoryA
Read-only

Read the person's skill inventory. Use it at the start of a session and before proposing skill changes; for CV content (roles, bullets, variants) use list_variants instead. Returns levels (what P, L, F and X mean) and skills grouped by level, each with its years, last_used_year, evidence, aliases and notes. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
profileNoPath of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already cover the safety profile via readOnlyHint/openWorldHint, and the trailing 'Read-only' largely repeats that. However, the description adds genuine behavioral value by describing the return payload (levels, skills grouped by level, per-skill years/last_used_year/evidence/aliases/notes), which matters because no output schema exists. No permissions, limits, or error behavior are discussed, keeping it below 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?

Three tight sentences, front-loaded with purpose then usage then return shape. The final 'Read-only' clause is redundant with the readOnlyHint annotation, a minor amount of wasted space.

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-optional-parameter read tool this is fully adequate: it covers purpose, timing, sibling routing, and enumerates the returned structure in place of the missing output schema. Nothing needed to call it correctly 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?

Only one optional parameter with 100% schema description coverage, so the schema already explains the profile path and its default resolution. The description adds no additional meaning about the parameter, which is the baseline 3 case.

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 person's skill inventory') and immediately distinguishes it from the sibling that handles CV content (list_variants). An agent can select this tool 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 Guidelines5/5

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

Gives explicit timing ('at the start of a session and before proposing skill changes') and names the alternative tool plus the condition that selects it ('for CV content (roles, bullets, variants) use list_variants instead'). Both when-to-use and when-not-to-use are covered.

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

import_profileA

Import an existing CV into the profile: a JSON Resume (.json), a LinkedIn data export (.zip or its unzipped folder) or a LinkedIn profile PDF. Use it at the start, right after init_profile, instead of typing everything; run it first with dry_run. Adds contact, roles with their achievements, education, certifications, courses, publications and languages; only what the profile lacks, never overwriting. Skills arrive without a level, so they go to /imported-skills.md for the person to mark, never to the inventory. Imported bullets are tagged imported: review them with the person. Returns what was added and an optional note to pass on. For a PDF nothing is written: it returns the text, to organize with the editing tools (see the import_linkedin_pdf prompt).

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesA JSON Resume (.json), a LinkedIn data export (.zip) or a LinkedIn profile PDF.
dry_runNoReport what would be added without writing.
profileNoPath of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only say it is not read-only, not destructive, not open-world; the description goes well beyond that by disclosing add-only merge semantics ('only what the profile lacks, never overwriting'), where level-less skills land (<profile>/imported-skills.md, not the inventory), that bullets are tagged 'imported', and that for a PDF nothing is written and the text is returned instead. This is exactly the extra context 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 formats are front-loaded, then details follow in roughly descending importance (what is written, skill handling, tagging, return value, PDF exception). It is dense and semicolon-heavy, but nearly every clause carries operational information; only the format list is redundant with the 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?

Despite having no output schema, it describes the return payload ('what was added' plus an optional note) and the PDF return ('the text'). For a multi-format, additive write tool, the write scope, non-overwrite guarantee, tagging side effect, and dry-run path cover 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?

Schema description coverage is 100%, so the baseline is 3, but the description adds real usage meaning for dry_run by prescribing 'run it first with dry_run' as the intended first call rather than leaving the flag's role to the schema alone. It also restates the path formats already in the schema, adding no new detail there.

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 ('Import an existing CV into the profile') and enumerates the exact accepted formats (.json JSON Resume, .zip LinkedIn export, LinkedIn PDF). It also situates itself relative to siblings ('right after init_profile', 'instead of typing everything'), so an agent can place it in the workflow 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 Guidelines5/5

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

Explicit about when to use it ('at the start, right after init_profile'), the recommended sequence ('run it first with dry_run'), and routes the PDF sub-case to the import_linkedin_pdf prompt for organizing text with editing tools. Alternatives and timing are both named.

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

init_profileA

Create a new profile folder with empty, commented YAML templates (profile, bullets, skills, variants). Use it once, before anything else, when the person has no profile; to start from LinkedIn or a JSON Resume, call import_profile afterwards. Refuses an existing profile and overwrites nothing. Returns created: the files written.

ParametersJSON Schema
NameRequiredDescriptionDefault
profileYesFolder to create. Must not hold a profile yet.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare destructiveHint=false and openWorldHint=false, so the safety profile is largely covered. The description adds genuinely new behavior: it refuses an existing profile, overwrites nothing, and names the returned key ('created': the files written). It stops short of describing failure ordering or permissions, hence 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.

Conciseness5/5

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

Three sentences, each earning its place: purpose, usage/alternative, safeguards and return. The most decision-relevant content (what it creates and when to call it) is front-loaded.

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

Completeness5/5

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

No output schema exists, but the description compensates by naming the returned field. Combined with the refusal/no-overwrite guarantees and the pointer to import_profile, an agent has everything needed to call this correctly in one shot.

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 100% and the single parameter is already fully documented ('Folder to create. Must not hold a profile yet.'). The description adds a return-value note rather than parameter meaning, so the schema carries the load and baseline 3 applies.

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 ('Create a new profile folder') and enumerates the artifacts produced (profile, bullets, skills, variants YAML templates). It also distinguishes itself from the sibling import_profile, which imports existing data rather than scaffolding empty templates.

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?

Explicit timing ('Use it once, before anything else, when the person has no profile') plus a named alternative and the condition that selects it ('to start from LinkedIn or a JSON Resume, call import_profile afterwards'). The precondition is unambiguous.

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

interview_prepA

Prepare the interview for one logged application from what the person can honestly back up. Call it first with only application to get the saved job post (post_text), then again with the post's keywords. For each keyword it returns their level, evidence, stories (the bullets that show it, those in the CV they sent first) and a standing: strong (tell a story from those bullets), no_achievement (ask for a real example), marked_pending (ask for evidence), familiarity (say it is familiarity) or lacking (say so honestly). Every story must come from stories. With notes, saves the approved prep to /prep/.md.

ParametersJSON Schema
NameRequiredDescriptionDefault
notesNoThe prep notes the person approved, in Markdown. Saved to <profile>/prep/<application>.md, replacing earlier notes.
profileNoPath of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).
keywordsNoRequired keywords from the job post, in its own wording. Leave out on the first call to get the saved post's text.
preferredNoNice-to-have keywords from the job post.
applicationYesApplication id, from list_applications.

TDQS

A4.6/5.0
Behavior4/5

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

With annotations declaring readOnlyHint=false and destructiveHint=false, the description adds real behavioral context: the write path persists to <profile>/prep/<id>.md and 'replacing earlier notes', disclosing an overwrite that the annotations don't surface. It stops short of permission/auth or failure behavior, so 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-loaded with the purpose and then the call sequence, and nearly every clause adds operational detail. It is dense and slightly run-on ('those in the CV they sent first'), but there is little dead weight.

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 tool with no output schema, the description covers the whole cycle: inputs per call, the returned fields (level, evidence, stories, standing), the enumerated standing meanings, and the persistence side effect. Nothing essential is left for the agent to guess.

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 100%, so the baseline is 3, but the description adds operative meaning the schema cannot: `keywords` must be in the post's own wording and pulled from the first call's `post_text`, and `notes` is what the person approved. It explains how keywords/preferred drive the returned keyword breakdown rather than just restating them.

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 ('prepare the interview for one logged application') and frames the scope as grounding prep in what the candidate can honestly back up. No sibling tool does interview prep, so the agent can distinguish it immediately.

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 two-call protocol: first with only `application` to retrieve the saved post, then again with the post's keywords, plus the optional `notes` path for saving. It also prescribes what to say aloud for each `standing` value, which is genuine when/how guidance.

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

linkedin_profileA

Write the LinkedIn texts for a variant, each within LinkedIn's limit: headline, About, one description per position from its bullets, and the skills (P and L only, since LinkedIn can't label familiarity). Use it when the person updates their LinkedIn profile. Writes them to a Markdown file to copy from and returns them with their path, plus left_out: bullets that didn't fit. After the person approves a polished headline or About, call it again with them: they are checked like a letter and saved in that file.

ParametersJSON Schema
NameRequiredDescriptionDefault
langNoLanguage of the output: en (English) or es (Spanish).en
aboutNoA polished About the person approved, to save instead of the draft.
out_dirNoOutput folder. Default: <profile>/out.
profileNoPath of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).
variantYesVariant id from variants.yaml, e.g. backend.
headlineNoA polished headline the person approved, to save instead of the draft.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations declare a non-read-only, non-destructive, closed-world write, and the description adds real behavior beyond that: it emits a Markdown file to copy from, returns `path`, and returns `left_out` for bullets that didn't fit. It also discloses that approved headline/About are 'checked like a letter' and replace the draft. It doesn't say whether a re-run overwrites a prior file, which is the main remaining gap for a file-writing tool.

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, but the prose is tangled — the final sentence about re-calling with approved headline/About ('checked like a letter') is convoluted and would read better as a discrete instruction. Sentences earn their place but are not tight.

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 carries the return contract (`path`, `left_out`), which is what an agent needs. It is largely complete for a 6-parameter write tool; overwrite/idempotency behavior and the src of skills data are the only notable omissions.

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 100%, so the baseline is 3, but the description adds workflow meaning the schema doesn't carry: `headline` and `about` are the approved/polished versions that supersede drafts and are persisted to the file. It also frames `variant` as the driver of per-position descriptions and skills filtering.

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 and resource set: it writes headline, About, per-position descriptions, and skills for a variant, within LinkedIn's limits, to a Markdown file. That scope is specific enough to distinguish it from build_cv, build_letter, and the set_* mutators in the sibling list.

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 triggering context explicitly ('Use it when the person updates their LinkedIn profile') and gives a second, conditional use case: re-call after approval with the polished headline/About. It does not name any alternative tool or say when not to use it, 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.

list_applicationsA
Read-only

List the person's job applications, most recently updated first. Use it when they ask how their search is going or which application to follow up; log_application records changes. Returns applications (each with its id, status and days_since_update), a count per status and waiting: open applications with no news for 14 days or more. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusNoOnly applications in these statuses. Default: all.
profileNoPath of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).

TDQS

A4.7/5.0
Behavior5/5

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

With no output schema, the description carries the return-value burden and does so explicitly: the `applications` array with id/status/days_since_update, per-status counts, and the non-obvious definition of `waiting` (open, no news for 14+ days). The closing 'Read-only' partly restates readOnlyHint but the return semantics are genuinely additive.

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 purpose then usage then return shape. No filler; each clause (trigger, sibling routing, return fields, `waiting` definition) 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?

For a read-only, two-optional-param list tool with no output schema, the description supplies everything an agent needs: when to call it, what it returns, and the meaning of the derived `waiting` field. Nothing material 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 100% for both `status` (enum list, default all) and `profile` (default path resolution), so the schema already does the work. The prose only references status indirectly via the per-status counts and adds no filtering syntax or default behavior beyond it.

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 ('List the person's job applications') and adds scope/detail (sort order 'most recently updated first'). It clearly contrasts against the write-path sibling log_application, so an agent can distinguish it 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 an explicit trigger ('when they ask how their search is going or which application to follow up') and names the alternative ('log_application records changes'), making the read-vs-write split unambiguous.

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

list_variantsA
Read-only

Read every CV variant, with extends already applied and the text of each bullet it uses. Use it before save_variant, build_cv or score_job, to know what each CV contains. Returns variants (with own: the fields each one defines itself) and unused_bullets: achievements no variant shows yet. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
profileNoPath of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).

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 and openWorldHint=false, and the description's 'Read-only' only restates that. However, without an output schema the description usefully discloses that the resolution is pre-computed ('extends already applied') and what comes back ('own', 'unused_bullets'), which the agent cannot get from 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.

Conciseness4/5

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

Three tight sentences with the purpose front-loaded, followed by usage routing and return shape. Slightly dense with backtick-laden field names, but every sentence carries 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 zero-required-parameter, read-only list tool with no output schema, the description covers purpose, when to call it, and the merged/resolved return structure including derived fields. Nothing critical for correct invocation 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 100% and the single 'profile' parameter is fully documented with its default fallback in the schema. The description adds nothing about parameters, so the baseline 3 applies.

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 every CV variant') and adds scope detail that distinguishes it: 'extends already applied' and 'the text of each bullet it uses'. An agent can tell this apart from save_variant, build_cv or score_job immediately.

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 names three sibling tools (save_variant, build_cv, score_job) as the operations to precede and states the reason ('to know what each CV contains'). This is direct when-to-use routing rather than inferred context.

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

log_applicationA

Record a job application, or update the one for the same company and role. Use it when the person sends a CV or letter, and whenever they tell you what happened (interview, offer, rejection); list_applications reads them back. Fields not given keep their value. Save the post's full text in post, since links expire, and your interview advice in prep. Each file in files is copied to /sent//, so the record keeps what was sent. Returns the application and not_found: paths it could not copy.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoLink to the job post.
dateNoDate of this status, YYYY-MM-DD. Default: today.
langNoLanguage of the CV sent.
postNoThe job post's full text, as the person gave it. Saved to <profile>/posts/.
prepNoWhat to prepare for the interview: skills to back with an example, gaps to explain, questions to ask. Replaces the list.
roleYesJob title, as in the job post.
filesNoPaths of the CV and letter sent. A copy is kept in <profile>/sent/.
notesNoContact person, salary range, next step... Added to the notes already there.
statusNoNew status: draft, applied, interview, offer, rejected or withdrawn. Each change is kept in the history with its date.
companyYesCompany name, as in the job post.
profileNoPath of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).
variantNoVariant id of the CV sent.

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the annotations (readOnly=false, destructive=false, openWorld=false) by disclosing merge semantics ('Fields not given keep their value'), a real side effect (each file is copied to <profile>/sent/<id>/), and the return payload including the not_found list. That is exactly the behavioral context an agent needs 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.

Conciseness4/5

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

Front-loaded with purpose and trigger, and every sentence carries information, but the middle is a dense run of embedded rationale and side-effect clauses rather than cleanly separated points.

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 explains what is returned (application and not_found), and it covers merge behavior, file side effects, and profile resolution for a 12-parameter mutation tool. 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?

Schema description coverage is 100%, so the baseline is 3, but the description adds rationale the schema lacks: save the post's full text because 'links expire', and use `prep` for interview advice. It leaves the remaining params (status, notes, variant, lang) to the schema.

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

Purpose5/5

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

States a specific verb and resource ('Record a job application') plus the upsert key ('or update the one for the same company and role'), which is the behavior an agent most needs to know. It also implicitly distinguishes itself from list_applications by noting that sibling 'reads them back'.

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 triggers: 'when the person sends a CV or letter, and whenever they tell you what happened (interview, offer, rejection)'. It routes reads to list_applications, but offers no explicit when-not-to-use or prerequisite guidance.

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

remove_bulletA
Destructive

Delete an achievement from the pool and from every variant that uses it. Use it when the person wants it gone; to stop showing it in one CV, change that variant with save_variant instead. Ask the person first; it cannot be undone. Returns what was removed and variants_updated.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesBullet id.
profileNoPath of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).

TDQS

A4.7/5.0
Behavior5/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 materially: the deletion is irreversible ('it cannot be undone'), requires human confirmation, propagates to every variant, and reports back 'what was removed and variants_updated'. This is context the structured fields do not carry.

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 sentences, zero waste: scope first, then routing, then the irreversibility warning. The most consequential information (destructive, irreversible) is front-loaded.

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

Completeness5/5

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

No output schema exists, yet the description covers the return value ('what was removed and variants_updated'), the reversibility profile, the confirmation requirement, and the alternative path. Nothing needed to call this 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 100% and both parameters (id, profile) are documented in the schema, so the description adds no syntax or format detail. Baseline 3 applies when the schema does the heavy lifting.

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 ('Delete an achievement') plus its blast radius ('from the pool and from every variant that uses it'). It explicitly contrasts with the sibling save_variant, so an agent can route 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 an explicit when-to-use ('when the person wants it gone'), an explicit alternative with its condition ('to stop showing it in one CV, change that variant with save_variant instead'), and a prerequisite ('Ask the person first'). 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.

remove_publicationA
Destructive

Delete a publication from the profile and from every variant that lists it. To hide it from one CV only, change that variant's publications with save_variant instead. Ask the person first; it cannot be undone. Returns what was removed and variants_updated.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPublication id from profile.yaml.
profileNoPath of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).

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 readOnlyHint=false, so the safety profile is partly covered. The description still adds genuinely new behavioral facts the annotations cannot express: the cascade across variants, that it cannot be undone, and the response shape (what was removed plus variants_updated).

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 sentences, no waste; the destructive scope is front-loaded, the alternative follows, and the safety warning and return contract close it out. Every 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?

For a destructive 2-parameter tool with no output schema, the description supplies the cascade semantics, irreversibility warning, alternative routing, and a statement of return values — everything an agent needs to invoke it safely and 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 description coverage is 100% and both parameters (id, profile) are fully documented in the schema, so the baseline is 3. The description mentions `publications` and `variants_updated`, but those belong to sibling tools/the response, not to this tool's own input parameters.

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 (delete) plus resource (publication) and, crucially, the scope: from the profile AND from every variant that lists it. This distinguishes it from sibling mutation tools like save_variant without requiring the caller to open 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 Guidelines5/5

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

Explicitly names the when-not condition and the alternative: to hide it from one CV only, change that variant's `publications` with save_variant instead. It also adds a consent prerequisite ("ask the person first") and the irreversibility constraint.

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

remove_roleA
Destructive

Delete a role from the profile and from every variant. A role that still has bullets is refused unless with_bullets is true, which deletes them too. To hide a role from one CV, edit that variant with save_variant instead. Ask the person first; it cannot be undone. Returns what was removed and variants_updated.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesRole id from profile.yaml.
profileNoPath of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).
with_bulletsNoAlso delete the role's bullets. Only if the person agreed to lose them.

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already flag destructiveHint=true, but the description adds substantial context beyond them: the refusal when bullets exist, the fact it spans all variants, that it cannot be undone, and to confirm with the person first. Only return-shape detail ('variants_updated') is thin, but no output schema exists so this is a minor gap.

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 refusal rule, then the alternative, then the caution. Four tight sentences, no redundancy, every clause carries operative 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?

Covers purpose, refusal condition, cross-variant scope, alternative tool, irreversibility, and return keys, which is thorough for a 3-param destructive tool. Missing only explicit permission/authorization requirements, but the 'ask the person first' cue partially fills that.

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 100%, so baseline is 3. The description still adds meaning: it explains the conditional behavior of with_bullets (only deletes bullets when true and agreed) and implies id must be a valid role with bullets. Slight added value over the schema's own text.

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 (delete a role) and immediately scopes it to the profile and every variant. Names and distinguishes from the sibling save_variant, clarifying this is a global delete, not a per-CV hide.

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?

Explicit when-to-use-vs-alternative: to hide a role from one CV, use save_variant instead. Adds the guardrail that a role with bullets is refused unless with_bullets is true, so the agent knows the exact condition that makes the call succeed.

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

remove_skillA
Destructive

Delete a skill from the inventory, e.g. a duplicate or a misspelling, and from the variants' skill groups and competencies. Use it only for mistakes: to record that the person doesn't have a skill, use set_skill with level X instead, which keeps gap reports honest. Ask the person first; it cannot be undone. Returns what was removed and variants_updated.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesSkill name as in the inventory.
profileNoPath of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already flag destructiveHint=true, but the description goes further: it states the change cannot be undone, that it cascades to variants' skill groups and competencies, and that the response contains the removed item plus variants_updated. That is genuine behavioral context the annotations do not carry.

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?

Every sentence earns its place: operation scope first, then the alternative-use rule, then the irreversibility warning, then the return shape. No filler and the critical scoping constraint is front-loaded.

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

Completeness5/5

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

No output schema exists, yet the description still describes the return payload (removed item and variants_updated), and it covers scope, safety and routing. 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.

Parameters3/5

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

Schema description coverage is 100%, so both parameters (name, profile) are already documented in the schema. The description only implies the skill is identified by name in the inventory and adds no syntax or format detail beyond the schema; baseline 3 applies.

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 (delete) plus resource (skill), and it names the exact scope of the operation: the inventory plus the variants' skill groups and competencies. An agent can distinguish it immediately from set_skill and other 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?

Explicit "use it only for mistakes" constraint, a named alternative (set_skill with level X) with the rationale (keeps gap reports honest), and a prerequisite (ask the person first). When-to-use, when-not-to-use and the alternative are all stated.

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

save_variantA

Create or replace a CV variant: the plan for one kind of role (title, summary, which bullets and skills to show). Use it to set up a variant or tailor one to a job post; read the current ones with list_variants first. It replaces the variant whole, so pass every field it should define (list_variants → own shows them). A variant without extends needs title and summary. Every reference is checked before saving. Returns saved and the variant.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesVariant id, e.g. backend.
rolesNoRole id -> bullet ids to show, in order.
titleNoOne string, or one per language: {"en": "...", "es": "..."}.
impactNoBullet ids for Selected Impact.
skillsNoSkill groups: a label and skill names.
extendsNoVariant to inherit from; set only what differs.
profileNoPath of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).
summaryNoOne string, or one per language: {"en": "...", "es": "..."}.
max_pagesNoPage limit, usually 1 or 2.
competenciesNoShort list of core competencies.
publicationsNoPublication ids to show, in order; [] shows none. Not set: all of them.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only declare the write/safety profile (readOnlyHint=false, destructiveHint=false), but the description adds the critical non-obvious trait that this is a whole-object replacement, not a merge ('It replaces the variant whole, so pass every field it should define'). It also discloses pre-save reference validation ('Every reference is checked before saving') and the return payload ('Returns `saved` and the `variant`'), which 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.

Conciseness5/5

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

Purpose is front-loaded in the first clause, followed by usage, replacement semantics, conditional requirements, validation, and return value in five tight sentences. Every sentence carries information an agent needs; 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?

For an 11-parameter mutation tool with no output schema, the description covers the risky parts: overwrite semantics, the inheritance/id-discovery workflow, conditional required fields, and the return keys. Combined with 100% schema coverage, an agent has enough to call it correctly without guessing.

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 100%, so the baseline is 3, but the description adds real semantics beyond it: conditional requirement logic ('A variant without `extends` needs `title` and `summary`') that the schema itself does not encode (only `id` is required there), plus the inheritance rule 'set only what differs'. It does not add format or ordering detail beyond the schema's own descriptions.

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 ('Create or replace a CV variant') and immediately defines the domain object as 'the plan for one kind of role (title, summary, which bullets and skills to show)'. An agent can distinguish it from list_variants and the set_*/upsert_* siblings without reading 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 Guidelines5/5

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

Gives explicit when-to-use ('set up a variant or tailor one to a job post') and names the read alternative with an ordering instruction ('read the current ones with list_variants first'). It also points to where ids come from ('list_variants → `own` shows them'), leaving little to inference.

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

score_jobA
Read-only

Measure how well each CV variant covers a job post's keywords, best first. Use it first when the person shares a post, to pick a variant; then call gap_report on that variant to see what is missing and why. Extract the keywords yourself in the post's own wording: keywords are the required ones, preferred the nice-to-haves. Returns scores: per variant, the required and overall coverage and each keyword found, found only as familiarity, or missing. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
langNoLanguage of the output: en (English) or es (Spanish).en
profileNoPath of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).
keywordsYesRequired keywords from the job post, in its own wording.
variantsNoVariant ids to score, from list_variants. Default: all.
preferredNoNice-to-have keywords from the job post.

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 and openWorldHint=false, and the description restates 'Read-only' rather than adding to it. However, it does disclose non-obvious behavior: results are ordered best-first, and the caller must extract keywords themselves in the post's own wording rather than being given them.

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 the when-to-use rule, then pivots to keyword-extraction guidance and return shape. Dense and mostly earn-its-place, though the trailing 'Read-only' is redundant with the 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?

With no output schema, the description correctly covers the return value: `scores` with per-variant required and overall coverage plus per-keyword found/familiarity/missing status. Combined with the extraction and sequencing guidance, 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.

Parameters3/5

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

Schema coverage is 100%, so the schema already documents lang, profile, keywords, variants, and preferred. The description's framing of `keywords` as required and `preferred` as nice-to-haves largely repeats the schema, so a baseline 3 is appropriate.

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 ('Measure how well each CV variant covers a job post's keywords') plus ranking behavior ('best first'). An agent can distinguish it from gap_report, which it names as the follow-up rather than the same operation.

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?

Explicit sequencing: use it first when a person shares a post to pick a variant, then call gap_report on that variant to see what is missing. It also names the alternative tool and the condition that selects it, leaving nothing to inference.

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

set_contactA

Update the person's contact details on the CV. Use it for name, email, phone, location and links; roles, education and the rest have their own tools. Only the fields given change; pass "clear" to remove an optional one. links replaces the whole list. Returns the contact as saved in profile.yaml.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoFull name as it should appear on the CV.
emailNoEmail for the CV.
linksNoAll the links to show, e.g. LinkedIn, GitHub, a site. Replaces the current list.
phoneNoPhone, e.g. "+52 442 000 0000".
profileNoPath of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).
locationNoOne string, or one per language: {"en": "...", "es": "..."}.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only mark it as a non-read, non-open-world write; the description adds the traits that matter: partial update (unspecified fields are preserved), a 'clear' sentinel for deleting optional values, whole-list replacement for `links`, and the return payload ('the `contact` as saved in profile.yaml') — valuable here since there is no output schema. The `links` replacement semantics go beyond, not against, destructiveHint=false, since it is a scoped setter for an explicitly whole-list field.

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 tight sentences, each doing distinct work: scope, boundary against siblings, mutation semantics, return value. The most decision-relevant facts (what it covers and what it does not) are front-loaded.

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

Completeness5/5

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

For a 6-parameter, all-optional mutation with no output schema, the definition covers scope, partial-update behavior, value-removal syntax, list-replacement behavior, and the return shape. 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?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning the schema lacks: the 'clear' sentinel for removing an optional field and the fact that `links` replaces rather than appends. It does not explain the `profile` resolution path beyond what the schema already says, so it stays 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 and resource ('Update the person's contact details on the CV') and immediately scopes which fields belong to it (name, email, phone, location, links). It explicitly hands off roles and education to other tools, so an agent can distinguish it from upsert_role/upsert_education 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 Guidelines5/5

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

Gives both when-to-use (contact fields) and when-not (roles, education and the rest have their own tools), which is the routing decision an agent actually faces among 30+ siblings. It also states the partial-update contract ('Only the fields given change'), removing the main source of misuse.

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

set_profile_detailsA

Replace the certifications, courses or spoken-languages line of the profile. Use it for those three lists only; roles, education and publications have their own tools. Each list you pass replaces the current one in full; leave a field out to keep it. A course or training without an exam goes in courses, never in certifications. Returns the saved values.

ParametersJSON Schema
NameRequiredDescriptionDefault
coursesNoAll the courses and trainings without an exam, replacing the current list; leave out to keep it. A course is never a certification.
profileNoPath of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).
languagesNoOne string, or one per language: {"en": "...", "es": "..."}.
certificationsNoAll the certifications, replacing the current list. Leave out to keep it.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false and destructiveHint=false, so the write/non-destructive profile is covered. The description adds the crucial overwrite semantics ('Each list you pass replaces the current one in full; leave a field out to keep it') and states the return value, which is real behavioral context an agent needs before calling. It stops short of noting validation failures or auth/profile-selection issues, so not 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.

Conciseness5/5

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

Five tight sentences, front-loaded with the scope and the sibling exclusion before the replacement semantics. Every sentence carries distinct information — scope, alternative tools, overwrite behavior, classification rule, return value — with no padding.

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 four-parameter, all-optional mutation with no output schema, the definition covers what it touches, what it does not touch, how partial updates behave, the field-classification edge case, and what it returns. An agent has everything required to invoke it 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 description coverage is 100%, so the schema already documents all four parameters, including the profile path default (--profile or HONEST_CV_PROFILE) and the per-language object shape. The description's only added semantic is the courses-vs-certifications rule, which is largely mirrored in the courses property description. Baseline 3 applies when the schema does the heavy lifting.

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 (replace/set) applied to three named resources (certifications, courses, spoken-languages) of the profile, and it explicitly names the sibling categories — roles, education, publications — that belong to other tools. An agent can route between set_profile_details and upsert_role/upsert_education/upsert_publication 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 Guidelines5/5

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

Explicit when-to-use and when-not-to-use: 'Use it for those three lists only; roles, education and publications have their own tools.' It also supplies a disambiguation rule between two of its own fields ('A course or training without an exam goes in courses, never in certifications'), which is exactly the kind of guidance that prevents misfiling. 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.

set_skillA

Add or change one skill in the inventory. Use it for a single skill; for several at once use set_skills, and for a whole marked list use checklist_apply. Raising a level (a new skill counts as rising from X) needs evidence, and the server asks the person to confirm before saving; lowering is always allowed. Returns saved (the stored skill) and previous_level.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesSkill name, e.g. Kubernetes. Matches existing skills ignoring case.
levelYesP production at a job, L own project or lab, F familiarity, X does not have it.
notesNoPrivate notes; never printed on the CV.
yearsNoYears of use, e.g. 2.5.
aliasesNoOther spellings, e.g. k8s for Kubernetes.
profileNoPath of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).
evidenceNoWhere and how the person used it. Required to raise a level.
last_used_yearNoLast calendar year the person used it, e.g. 2026.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations only declare readOnlyHint=false, destructiveHint=false and openWorldHint=false, so the description carries real extra weight: it discloses that level increases require evidence, that the server asks the person to confirm before saving, and that the call returns `saved` and `previous_level`. It does not cover permissions, failure modes, or how existing optional fields behave on a re-set, which keeps 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.

Conciseness5/5

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

Three sentences, front-loaded with the core action, then sibling routing, then the behavioral rule and return values. No filler and nothing redundant with the 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?

For an 8-parameter mutation tool with no output schema, the description supplies the missing pieces: sibling disambiguation, the evidence/confirmation rule, and the return payload. An agent has everything needed to invoke 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 100%, so the baseline is 3, but the description adds meaning the schema does not: it explains that evidence gates level raises and that a new skill is treated as rising from X, which clarifies the interaction between the `level` enum and `evidence` across parameters.

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 ('Add or change one skill in the inventory') and immediately delimits scope against two named siblings (set_skills, checklist_apply). An agent can distinguish this single-skill upsert from the batch tools without inspecting 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 Guidelines5/5

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

Explicit routing: use this for a single skill, set_skills for several at once, checklist_apply for a whole marked list. It also gives the conditional rule for evidence (required only when raising a level, including a brand-new skill) and notes that lowering is always permitted.

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

set_skillsA

Add or change several skills in one call, for example a group the person just told you about. Use set_skill for one skill and checklist_apply for a marked checklist. Every upgrade needs evidence; the person confirms upgrades in a form, up to 10 per call, and only those they answer "sí" are saved. Returns saved, upgrades_confirmed, upgrades_refused and upgrades_not_asked_yet: when that list is not empty, call set_skills again with those skills.

ParametersJSON Schema
NameRequiredDescriptionDefault
skillsYesThe skills to add or change.
profileNoPath of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only say this is a non-read-only, non-destructive local write. The description adds real behavioral context beyond that: every upgrade requires evidence, upgrades are confirmed by the person in a form, a cap of 10 per call, only affirmative answers are persisted, and the exact result fields plus the follow-up call needed when some were never asked.

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 sibling routing are front-loaded, then constraints, then the return/continuation contract - a sensible order. The text is dense and the mid-sentence line break reads awkwardly, but no sentence 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?

No output schema exists, yet the description names the four return fields and prescribes the action for a non-empty upgrades_not_asked_yet, which is exactly what a caller needs to drive the loop. Nothing required to invoke or follow up 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?

Schema coverage is 100%, so the baseline is 3, and the description still adds meaning the schema does not: the 10-upgrades-per-call limit, the human confirmation step, and that evidence is what gates a level increase. It does not restate per-field formats, which the schema already handles.

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 ('Add or change several skills in one call') and immediately distinguishes itself from the singular sibling set_skill and from checklist_apply. An agent can select between the three 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 Guidelines5/5

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

Explicit routing: 'Use set_skill for one skill and checklist_apply for a marked checklist,' plus a concrete continuation rule when upgrades_not_asked_yet is non-empty. Both when-to-use and when-to-use-something-else are covered.

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

upsert_educationA

Add an education entry, or change the one with the same institution and degree. Use it for degrees and formal studies; courses and certifications go in set_profile_details. Say honestly whether the degree was completed, e.g. "B.Sc. (unfinished)". Returns the education entry as saved.

ParametersJSON Schema
NameRequiredDescriptionDefault
endNoA year or year-month, e.g. "2021" or "2021-03".
startNoA year or year-month, e.g. "2021" or "2021-03".
degreeNoOne string, or one per language: {"en": "...", "es": "..."}.
profileNoPath of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).
institutionYesSchool or university.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations declare the mutation profile (not read-only, not destructive, not open-world), and the description goes beyond them by disclosing the upsert identity (institution+degree) and the return value. The one gap is that it doesn't state what happens when an existing match conflicts or that the entry is overwritten.

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 compact sentences: purpose+key, routing exclusion, then output. Front-loaded and 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.

Completeness4/5

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

For a 5-parameter mutation tool with full schema coverage and no output schema, the description covers purpose, routing, and return. It would be complete at 5 with a note on overwrite/merge behavior when an entry already exists.

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 100%, so every parameter already carries its own docs including date formats and the bilingual degree shape. The description adds the honesty convention for the degree string, which is real added value, but the rest is schema territory. Baseline 3 with a small lift.

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 (add/change) and resource (education entry), plus the upsert key semantics ('the one with the same institution and degree'). It explicitly distinguishes scope from the sibling set_profile_details, so an agent can route 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 Guidelines5/5

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

Explicit when-to-use ('degrees and formal studies') and an explicit exclusion routing courses/certifications to set_profile_details. Both the condition and the alternative are named.

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

upsert_publicationA

Add a book, article or paper the person wrote, or change some fields of the one with this id. Use it when the person mentions something they published; courses and certifications go in set_profile_details. Every variant shows all publications unless it lists the ones it wants (save_variant → publications). Returns the publication as saved.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesShort id, e.g. book_adr_kit. Variants list these ids.
urlNoA link to it.
yearNoA year or year-month, e.g. "2021" or "2021-03".
titleNoThe title as published.
venueNoWhere it is published, e.g. "Amazon (self-published)" or "Medium". Never a publisher it did not have.
profileNoPath of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare this is a non-destructive write (readOnlyHint=false, destructiveHint=false). The description adds genuine context beyond that: upsert semantics keyed on id (add-or-modify), the cross-variant publication behavior, and the return value. It stops short of stating permission/auth requirements, but adds real behavioral value.

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, then the routing guidance, then the variant aside and return value. Every sentence earns its place, though the variant clause is slightly dense in an otherwise tight definition.

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 add/modify branching, sibling routing, cross-variant behavior, and return value. Minor gaps (auth/permissions) remain but the essentials for correct invocation are present.

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 100%, so the schema already documents all six parameters (id, url, year, title, venue, profile). The description reinforces that id drives the add-vs-change branch but adds no syntax or format detail beyond the schema. Baseline 3 is appropriate.

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 (upsert) and resource (publication/book/article/paper) and explicitly distinguishes itself from siblings by routing courses and certifications to set_profile_details. An agent can tell what this does and what it does not handle.

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 a concrete trigger ("when the person mentions something they published"), names the alternative for a confusable case (set_profile_details), and explains the save_variant interaction. Explicit when-to-use plus alternatives.

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

upsert_roleA

Add a job role, or change some fields of an existing one by its id. Use it while interviewing the person about their work history; their achievements go in with add_bullet, pointing to this id. A new role needs title, company and start; roles stay in date order, newest first. Keep the person's real title. Returns the role as saved.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesShort role id, e.g. acme. Bullets point to it.
endNoYear it ended, e.g. "2024". "present" marks it as the current role.
startNoA year or year-month, e.g. "2021" or "2021-03".
titleNoOne string, or one per language: {"en": "...", "es": "..."}.
companyNoCompany name.
contextNoOne string, or one per language: {"en": "...", "es": "..."}.
profileNoPath of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).
locationNoOne string, or one per language: {"en": "...", "es": "..."}.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare write-non-destructive-closed-world, so the description is freed to add genuinely new traits: new roles require title/company/start (not captured by the schema, whose only required field is id), roles are kept in newest-first date order, and it returns the saved role. The 'Keep the person's real title' guidance is a useful quality constraint. It doesn't explain what happens to omitted fields on update, which is the main remaining 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 verb+resource, then layers usage, required fields, ordering, and return in a compact paragraph. Every sentence carries information; the 'Keep the person's real title' sentence is slightly tangential but still actionable.

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-parameter upsert with no output schema, the description covers the essential extras: conditional required fields, ordering behavior, the bullet cross-reference, and the return shape. Only the partial-update semantics (what happens to unsupplied fields) are left implicit.

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 100%, so the baseline is 3, but the description adds real meaning beyond the schema: it names title, company, and start as conditionally required for a new role even though the schema declares only id as required, and it reinforces the id-as-foreign-key relationship for bullets.

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 ('Add a job role, or change some fields of an existing one by its id') that is immediately distinguishable from siblings like upsert_education, upsert_publication, and remove_role. The upsert semantics and the id-based update path are both explicit.

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 usage context ('while interviewing the person about their work history') and routes the related achievement data to the add_bullet sibling with an explicit pointer ('pointing to this id'). It lacks an explicit when-not (e.g., use remove_role to delete), so it stops short of full exclusion guidance.

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

verify_pdfA
Read-only

Check whether any PDF is ATS-safe: one column, no ligatures, dates on their role's line, text extractable, and the page count. Use it on a CV from any tool, e.g. the person's current one; build_cv already runs it on the CVs it renders. Returns ok, pages, checks (each with name, ok, detail) and text: what an ATS reads. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesPath to any PDF, made with honest-cv or not.
max_pagesNoMost pages allowed; the page_count check fails above it. Default: no limit.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already establish readOnlyHint=true and openWorldHint=false, and the description reinforces this with 'Read-only.' More usefully, with no output schema present, it discloses the return shape (ok, pages, checks with name/ok/detail, and text), which is genuine behavioral context 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?

Front-loads the purpose, then usage, then return values in three compact sentences with little waste. The enumerated check list is dense but each item earns its place by defining what ATS-safe means.

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 read-only inspection tool with no output schema, the description covers purpose, usage context, and the return structure, which is what an agent needs. It leaves some ambiguity about interpreting individual `checks` details, but that is a minor 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 100%, so both `path` and `max_pages` are fully documented in the schema already. The description adds no syntax or format detail beyond that, so the baseline 3 applies.

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 (check) and resource (any PDF) with an explicit ATS-safety goal, enumerating the concrete checks: one column, no ligatures, dates on the role's line, text extractability, page count. It is clearly distinct from the many write-oriented sibling tools, and the build_cv reference anchors it in the workflow.

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 usage context: run it on a CV from any tool, and it notes that build_cv already runs it on the CVs it renders, which implicitly tells the agent when it is redundant. It stops short of an explicit exclusion statement, but the alternative and its condition are effectively named.

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. 30 tool updatesv0.3.2
    • Changedadd_bullet1 field changed
      • changedInput schema / properties / profile / description
        Previous value: -"Profile folder. Defaults to HONEST_CV_PROFILE."New value: +"Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE)."
    • Changedbuild_cv3 fields changed
      • changedInput schema / properties / formats / description
        Previous value: -"Default: both."New value: +"Formats to write: pdf, docx or both. Default: both."
      • changedInput schema / properties / lang / description
        Previous value: -"Language of the CV: en or es."New value: +"Language of the output: en (English) or es (Spanish)."
      • changedInput schema / properties / profile / description
        Previous value: -"Profile folder. Defaults to HONEST_CV_PROFILE."New value: +"Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE)."
    • Changedbuild_letter5 fields changed
      • changedInput schema / properties / closing / description
        Previous value: -"Default: Sincerely, / Atentamente,"New value: +"Closing line. Default: Sincerely, / Atentamente,"
      • changedInput schema / properties / formats / description
        Previous value: -"Default: both."New value: +"Formats to write: pdf, docx or both. Default: both."
      • changedInput schema / properties / greeting / description
        Previous value: -"Default: Dear Hiring Team, / Estimado equipo de selección:"New value: +"Opening line. Default: Dear Hiring Team, / Estimado equipo de selección:"
      • changedInput schema / properties / lang / description
        Previous value: -"Language of the CV: en or es."New value: +"Language of the output: en (English) or es (Spanish)."
      • changedInput schema / properties / profile / description
        Previous value: -"Profile folder. Defaults to HONEST_CV_PROFILE."New value: +"Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE)."
    • Changedcheck_claims1 field changed
      • changedInput schema / properties / profile / description
        Previous value: -"Profile folder. Defaults to HONEST_CV_PROFILE."New value: +"Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE)."
    • Changedchecklist_apply1 field changed
      • changedInput schema / properties / profile / description
        Previous value: -"Profile folder. Defaults to HONEST_CV_PROFILE."New value: +"Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE)."
    • Changedchecklist_list2 fields changed
      • addedInput schema / properties / lang
        Added value: +{
        +  "default": "en",
        +  "description": "The person's language: the built-in templates in it, where translated.",
        +  "enum": [
        +    "en",
        +    "es"
        +  ],
        +  "title": "Lang",
        +  "type": "string"
        +}
      • changedInput schema / properties / profile / description
        Previous value: -"Profile folder. Defaults to HONEST_CV_PROFILE."New value: +"Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE)."
    • Changedchecklist_new2 fields changed
      • addedInput schema / properties / lang
        Added value: +{
        +  "default": "en",
        +  "description": "The person's language: the file's headings and the built-in templates in it.",
        +  "enum": [
        +    "en",
        +    "es"
        +  ],
        +  "title": "Lang",
        +  "type": "string"
        +}
      • changedInput schema / properties / profile / description
        Previous value: -"Profile folder. Defaults to HONEST_CV_PROFILE."New value: +"Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE)."
    • Changedexport_json_resume2 fields changed
      • changedInput schema / properties / lang / description
        Previous value: -"Language of the CV: en or es."New value: +"Language of the output: en (English) or es (Spanish)."
      • changedInput schema / properties / profile / description
        Previous value: -"Profile folder. Defaults to HONEST_CV_PROFILE."New value: +"Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE)."
    • Changedgap_report2 fields changed
      • changedInput schema / properties / lang / description
        Previous value: -"Language of the CV: en or es."New value: +"Language of the output: en (English) or es (Spanish)."
      • changedInput schema / properties / profile / description
        Previous value: -"Profile folder. Defaults to HONEST_CV_PROFILE."New value: +"Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE)."
    • Changedget_inventory1 field changed
      • changedInput schema / properties / profile / description
        Previous value: -"Profile folder. Defaults to HONEST_CV_PROFILE."New value: +"Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE)."
    • Changedimport_profile1 field changed
      • changedInput schema / properties / profile / description
        Previous value: -"Profile folder. Defaults to HONEST_CV_PROFILE."New value: +"Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE)."
    • Addedinterview_prep
    • Changedlinkedin_profile2 fields changed
      • changedInput schema / properties / lang / description
        Previous value: -"Language of the CV: en or es."New value: +"Language of the output: en (English) or es (Spanish)."
      • changedInput schema / properties / profile / description
        Previous value: -"Profile folder. Defaults to HONEST_CV_PROFILE."New value: +"Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE)."
    • Changedlist_applications2 fields changed
      • changedInput schema / properties / profile / description
        Previous value: -"Profile folder. Defaults to HONEST_CV_PROFILE."New value: +"Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE)."
      • changedInput schema / properties / status / description
        Previous value: -"Only these statuses. Default: all."New value: +"Only applications in these statuses. Default: all."
    • Changedlist_variants1 field changed
      • changedInput schema / properties / profile / description
        Previous value: -"Profile folder. Defaults to HONEST_CV_PROFILE."New value: +"Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE)."
    • Changedlog_application3 fields changed
      • changedInput schema / properties / files / description
        Previous value: -"Paths of the CV and letter sent."New value: +"Paths of the CV and letter sent. A copy is kept in <profile>/sent/."
      • changedInput schema / properties / profile / description
        Previous value: -"Profile folder. Defaults to HONEST_CV_PROFILE."New value: +"Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE)."
      • changedInput schema / properties / status / description
        Previous value: -"New status. A change is kept in the history."New value: +"New status: draft, applied, interview, offer, rejected or withdrawn. Each change is kept in the history with its date."
    • Changedremove_bullet1 field changed
      • changedInput schema / properties / profile / description
        Previous value: -"Profile folder. Defaults to HONEST_CV_PROFILE."New value: +"Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE)."
    • Changedremove_publication1 field changed
      • changedInput schema / properties / profile / description
        Previous value: -"Profile folder. Defaults to HONEST_CV_PROFILE."New value: +"Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE)."
    • Changedremove_role1 field changed
      • changedInput schema / properties / profile / description
        Previous value: -"Profile folder. Defaults to HONEST_CV_PROFILE."New value: +"Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE)."
    • Changedremove_skill1 field changed
      • changedInput schema / properties / profile / description
        Previous value: -"Profile folder. Defaults to HONEST_CV_PROFILE."New value: +"Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE)."
    • Changedsave_variant1 field changed
      • changedInput schema / properties / profile / description
        Previous value: -"Profile folder. Defaults to HONEST_CV_PROFILE."New value: +"Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE)."
    • Changedscore_job3 fields changed
      • changedInput schema / properties / lang / description
        Previous value: -"Language of the CV: en or es."New value: +"Language of the output: en (English) or es (Spanish)."
      • changedInput schema / properties / profile / description
        Previous value: -"Profile folder. Defaults to HONEST_CV_PROFILE."New value: +"Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE)."
      • changedInput schema / properties / variants / description
        Previous value: -"Variant ids to score. Default: all."New value: +"Variant ids to score, from list_variants. Default: all."
    • Changedset_contact2 fields changed
      • changedInput schema / properties / links / description
        Previous value: -"Full list of links: LinkedIn, GitHub, site."New value: +"All the links to show, e.g. LinkedIn, GitHub, a site. Replaces the current list."
      • changedInput schema / properties / profile / description
        Previous value: -"Profile folder. Defaults to HONEST_CV_PROFILE."New value: +"Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE)."
    • Changedset_profile_details3 fields changed
      • changedInput schema / properties / certifications / description
        Previous value: -"The full list of certifications, replacing the current one."New value: +"All the certifications, replacing the current list. Leave out to keep it."
      • changedInput schema / properties / courses / description
        Previous value: -"The full list of courses and trainings without an exam, replacing the current one. A course is never a certification."New value: +"All the courses and trainings without an exam, replacing the current list; leave out to keep it. A course is never a certification."
      • changedInput schema / properties / profile / description
        Previous value: -"Profile folder. Defaults to HONEST_CV_PROFILE."New value: +"Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE)."
    • Changedset_skill1 field changed
      • changedInput schema / properties / profile / description
        Previous value: -"Profile folder. Defaults to HONEST_CV_PROFILE."New value: +"Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE)."
    • Changedset_skills1 field changed
      • changedInput schema / properties / profile / description
        Previous value: -"Profile folder. Defaults to HONEST_CV_PROFILE."New value: +"Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE)."
    • Changedupsert_education1 field changed
      • changedInput schema / properties / profile / description
        Previous value: -"Profile folder. Defaults to HONEST_CV_PROFILE."New value: +"Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE)."
    • Changedupsert_publication1 field changed
      • changedInput schema / properties / profile / description
        Previous value: -"Profile folder. Defaults to HONEST_CV_PROFILE."New value: +"Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE)."
    • Changedupsert_role1 field changed
      • changedInput schema / properties / profile / description
        Previous value: -"Profile folder. Defaults to HONEST_CV_PROFILE."New value: +"Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE)."
    • Changedverify_pdf1 field changed
      • changedInput schema / properties / max_pages / description
        Previous value: -"Fail the page_count check above this."New value: +"Most pages allowed; the page_count check fails above it. Default: no limit."
  2. 30 tool updatesv0.1.0
    • First observedadd_bullet
    • First observedbuild_cv
    • First observedbuild_letter
    • First observedcheck_claims
    • First observedchecklist_apply
    • First observedchecklist_list
    • First observedchecklist_new
    • First observedexport_json_resume
    • First observedgap_report
    • First observedget_inventory
    • First observedimport_profile
    • First observedinit_profile
    • First observedlinkedin_profile
    • First observedlist_applications
    • First observedlist_variants
    • First observedlog_application
    • First observedremove_bullet
    • First observedremove_publication
    • First observedremove_role
    • First observedremove_skill
    • First observedsave_variant
    • First observedscore_job
    • First observedset_contact
    • First observedset_profile_details
    • First observedset_skill
    • First observedset_skills
    • First observedupsert_education
    • First observedupsert_publication
    • First observedupsert_role
    • First observedverify_pdf

TDQS

A4.1/5.0

Scored across 31 tools

Disambiguation4/5

Despite 31 tools, the descriptions carefully staked out distinct boundaries (singular set_skill vs plural set_skills vs checklist_apply; build_cv vs build_letter vs export_json_resume vs linkedin_profile; score_job vs gap_report vs check_claims). A few clusters are dense—upsert_role/remove_role, remove_bullet/remove_role, and the several output builders—but the cross-references ('use X instead') keep them distinguishable.

Naming Consistency4/5

Predominantly consistent snake_case verb_noun (get_inventory, set_skill, upsert_role, add_bullet, build_cv, score_job). Minor deviations: a few noun-first names (checklist_list, checklist_new, checklist_apply, linkedin_profile, interview_prep, gap_report) break the otherwise uniform verb-first pattern.

Tool Count2/5

31 tools is well above the 16-25 heavy threshold and feels over-decomposed for a CV/profile domain. Removing a role/bullet/skill/publication are each their own tool, and multiple near-parallel setters (set_skill/set_skills/set_contact/set_profile_details) inflate the surface beyond what the task needs.

Completeness4/5

Coverage is broad: profile lifecycle, import, skills, roles, bullets, education, publications, contact, variants, CV/letter rendering, PDF verification, applications, interview prep, job scoring and gap analysis. Minor gaps exist (no explicit remove_variant or remove_education), but core workflows have no dead ends.

Maintenance

ActivityMaintained
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers