honest-cv
honest-cv is a deterministic, offline MCP server that turns a local YAML profile into honest, ATS-verified CVs, cover letters and LinkedIn texts, and tracks your job applications.
Profile setup: create a profile folder (
init_profile), set contact details, certifications, courses, languages, roles, education and publications.Skills: record skills with levels (P/L/F/X), years, last use, aliases and evidence; raising a level requires evidence and the person's own confirmation (
set_skill,set_skills).Checklists: list built-in or personal skill checklists for many professions, merge them into one file, and save the lines the person marked (
checklist_list,checklist_new,checklist_apply).Achievements: add achievement bullets linked to roles, with tags and metrics, and remove skills, bullets, roles or publications (
add_bullet,remove_*).CV variants: define one CV plan per type of role, with title, summary, bullet selection, skill groups, competencies, publications and page limit, including inheritance via
extends(save_variant,list_variants).Build and verify: render a variant to PDF and/or DOCX and run ATS checks, or verify any PDF and see the extracted text (
build_cv,verify_pdf).Job tailoring: score keyword coverage per variant and get a gap report splitting missing keywords into "have it but not shown", "familiarity only" and "don't have it" (
score_job,gap_report).Cover letters: check any draft against the profile for false claims and build a one-page letter that refuses unsupported claims (
check_claims,build_letter).Import/export: import JSON Resume, LinkedIn data exports or LinkedIn PDFs, and export a variant back as JSON Resume (
import_profile,export_json_resume).LinkedIn: generate headline, About, position descriptions and skills (P/L only) from a variant, and save approved polished text.
Applications: log applications with company, role, variant, files, post text, status history and interview prep notes; list them with stale-application alerts (
log_application,list_applications).Guided prompts: the
interview,tailor_for_job,cover_letter,import_linkedin_pdf,linkedin_profileandinterview_prepprompts walk through interviewing, tailoring, letter drafting, importing and interview preparation.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@honest-cvCould you tailor my CV for this job post and build the PDF?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
honest-cv
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.

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-profileTo 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.mdThen 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: |
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-profiledoesn'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.mdin 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 |
| Contact details, roles, education, certifications, publications, courses and languages. |
| A pool of achievements, each with an |
| Your skill inventory, with levels and evidence. |
| One CV plan per type of role. A variant can inherit from another with |
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 |
| Used in production at a job | Shown |
| Your own project or lab | Shown |
| Familiarity | Only on the line labeled "Familiarity" |
| 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] NATSText 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.mdAny 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-leadNew 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-runfirst.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".
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 stdioverify 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 |
| Creates a profile folder with commented templates. |
| Returns your skills, grouped by level, with years and evidence. |
| Adds or changes a skill. To raise its level it needs evidence and asks you to confirm. |
| Adds or changes several skills at once. Upgrades are confirmed with one question that lists each change. |
| Lists the built-in checklists. |
| Merges built-in checklists into one file, prefilled from your inventory. |
| Saves the skills marked in a checklist and returns the lines that still need evidence. |
| Adds an achievement to the pool. |
| Delete for good, and remove every use in the variants. A role with bullets needs |
| Changes contact details: name, email, phone, location, links. |
| Replaces the certifications list, the courses list and the spoken-languages line. |
| Adds a role in date order, or changes fields of an existing one. |
| Adds or changes an education entry. |
| Adds or changes a book, article or paper the person wrote. Each variant shows all of them, or the ones it lists. |
| Adds or replaces a variant. Every reference is checked before saving. |
| Lists the variants after inheritance, with their bullet texts and the bullets no variant uses. |
| Renders a PDF and/or DOCX and verifies it. |
| Runs the ATS checks on any PDF and returns its extracted text. |
| Measures the keyword coverage of each variant. The client extracts the keywords. |
| Groups missing keywords by what you can honestly do about each one. |
prompt | Fills your inventory and bullet pool, one question at a time. |
| Checks any text against your profile: blocks X skills and familiarity sold as experience, flags what the profile doesn't show. |
| Renders a cover letter to PDF and DOCX, one page, with the CV's ATS checks. Refuses while |
prompt | Scores the variants, explains the gaps, adapts a variant and rebuilds. |
prompt | Drafts a letter for a job post from your bullets, checks its claims and builds it. |
| Imports JSON Resume or a LinkedIn data export, adding only what is missing. For a LinkedIn PDF it returns the text. |
| Exports a variant as JSON Resume; X skills never appear and F skills keep their label. |
| Records an application (company, role, CV variant, files sent, the post's text, what to prepare) or a new status, with its date. |
| LinkedIn headline, About, position descriptions and skills (P and L only) from a variant, within LinkedIn's limits. |
| Lists applications, latest first, with a count per status and the ones with no news for 14+ days. |
| For an application: the saved post and, per keyword, your level, evidence and the bullets that back it. Saves the prep notes. |
prompt | Turns the PDF from LinkedIn's "Save to PDF" into a profile, section by section, with your approval. |
prompt | Polishes the LinkedIn texts of a variant without adding claims, checked with |
prompt | 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 esThe 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 toolsadd_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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Unique bullet id, e.g. ft_k8s. | |
| role | No | Role id from profile.yaml this bullet belongs to. | |
| tags | No | Skills and topics it shows, e.g. Kubernetes. | |
| metrics | No | Numbers it claims, e.g. 40%, kept for review. | |
| profile | No | Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE). | |
| text_en | Yes | The achievement in English, as the person stated it. | |
| text_es | No | The same achievement in Spanish. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language of the output: en (English) or es (Spanish). | en |
| formats | No | Formats to write: pdf, docx or both. Default: both. | |
| out_dir | No | Output folder. Default: <profile>/out. | |
| profile | No | Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE). | |
| variant | Yes | Variant id from variants.yaml, e.g. backend. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language of the output: en (English) or es (Spanish). | en |
| role | Yes | Job title, as in the job post. | |
| closing | No | Closing line. Default: Sincerely, / Atentamente, | |
| company | Yes | Company name, as in the job post. | |
| formats | No | Formats to write: pdf, docx or both. Default: both. | |
| out_dir | No | Output folder. Default: <profile>/out. | |
| profile | No | Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE). | |
| greeting | No | Opening line. Default: Dear Hiring Team, / Estimado equipo de selección: | |
| keywords | No | Keywords of the job post, for check_claims. | |
| recipient | No | Hiring manager or team, if the post names one. | |
| paragraphs | Yes | The body, one string per paragraph, approved by the person. |
TDQS
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.
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.
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.
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.
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.
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_claimsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | The draft: a cover letter, a summary, any text about the person. | |
| profile | No | Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE). | |
| keywords | No | Keywords of the job post, so its technologies are checked too. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | A Markdown checklist marked by the person, e.g. <profile>/checklist.md. | |
| profile | No | Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE). |
TDQS
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.
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.
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.
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.
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.
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_listARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | The person's language: the built-in templates in it, where translated. | en |
| profile | No | Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE). |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | The person's language: the file's headings and the built-in templates in it. | en |
| path | No | File to write. Default: <profile>/checklist.md. | |
| extra | No | More skill names to ask about, e.g. found in an imported profile. | |
| lists | Yes | Ids from checklist_list, e.g. backend-jvm, or paths to .md templates. | |
| profile | No | Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE). | |
| overwrite | No | Replace the file if it exists. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language of the output: en (English) or es (Spanish). | en |
| out_dir | No | Output folder. Default: <profile>/out. | |
| profile | No | Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE). | |
| variant | Yes | Variant id from variants.yaml, e.g. backend. |
TDQS
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.
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.
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.
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.
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.
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_reportARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language of the output: en (English) or es (Spanish). | en |
| profile | No | Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE). | |
| variant | Yes | Variant id from variants.yaml, e.g. backend. | |
| keywords | Yes | Required keywords from the job post, in its own wording. | |
| preferred | No | Nice-to-have keywords from the job post. |
TDQS
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.
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.
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.
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.
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.
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_inventoryARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| profile | No | Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE). |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | A JSON Resume (.json), a LinkedIn data export (.zip) or a LinkedIn profile PDF. | |
| dry_run | No | Report what would be added without writing. | |
| profile | No | Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE). |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| profile | Yes | Folder to create. Must not hold a profile yet. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| notes | No | The prep notes the person approved, in Markdown. Saved to <profile>/prep/<application>.md, replacing earlier notes. | |
| profile | No | Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE). | |
| keywords | No | Required keywords from the job post, in its own wording. Leave out on the first call to get the saved post's text. | |
| preferred | No | Nice-to-have keywords from the job post. | |
| application | Yes | Application id, from list_applications. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language of the output: en (English) or es (Spanish). | en |
| about | No | A polished About the person approved, to save instead of the draft. | |
| out_dir | No | Output folder. Default: <profile>/out. | |
| profile | No | Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE). | |
| variant | Yes | Variant id from variants.yaml, e.g. backend. | |
| headline | No | A polished headline the person approved, to save instead of the draft. |
TDQS
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.
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.
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.
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.
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.
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_applicationsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Only applications in these statuses. Default: all. | |
| profile | No | Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE). |
TDQS
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.
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.
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.
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.
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.
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_variantsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| profile | No | Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE). |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Link to the job post. | |
| date | No | Date of this status, YYYY-MM-DD. Default: today. | |
| lang | No | Language of the CV sent. | |
| post | No | The job post's full text, as the person gave it. Saved to <profile>/posts/. | |
| prep | No | What to prepare for the interview: skills to back with an example, gaps to explain, questions to ask. Replaces the list. | |
| role | Yes | Job title, as in the job post. | |
| files | No | Paths of the CV and letter sent. A copy is kept in <profile>/sent/. | |
| notes | No | Contact person, salary range, next step... Added to the notes already there. | |
| status | No | New status: draft, applied, interview, offer, rejected or withdrawn. Each change is kept in the history with its date. | |
| company | Yes | Company name, as in the job post. | |
| profile | No | Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE). | |
| variant | No | Variant id of the CV sent. |
TDQS
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.
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.
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.
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.
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.
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_bulletADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Bullet id. | |
| profile | No | Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE). |
TDQS
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.
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.
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.
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.
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.
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_publicationADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Publication id from profile.yaml. | |
| profile | No | Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE). |
TDQS
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.
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.
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.
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.
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.
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_roleADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Role id from profile.yaml. | |
| profile | No | Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE). | |
| with_bullets | No | Also delete the role's bullets. Only if the person agreed to lose them. |
TDQS
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.
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.
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.
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.
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.
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_skillADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Skill name as in the inventory. | |
| profile | No | Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE). |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Variant id, e.g. backend. | |
| roles | No | Role id -> bullet ids to show, in order. | |
| title | No | One string, or one per language: {"en": "...", "es": "..."}. | |
| impact | No | Bullet ids for Selected Impact. | |
| skills | No | Skill groups: a label and skill names. | |
| extends | No | Variant to inherit from; set only what differs. | |
| profile | No | Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE). | |
| summary | No | One string, or one per language: {"en": "...", "es": "..."}. | |
| max_pages | No | Page limit, usually 1 or 2. | |
| competencies | No | Short list of core competencies. | |
| publications | No | Publication ids to show, in order; [] shows none. Not set: all of them. |
TDQS
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.
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.
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.
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.
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.
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_jobARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language of the output: en (English) or es (Spanish). | en |
| profile | No | Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE). | |
| keywords | Yes | Required keywords from the job post, in its own wording. | |
| variants | No | Variant ids to score, from list_variants. Default: all. | |
| preferred | No | Nice-to-have keywords from the job post. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Full name as it should appear on the CV. | |
| No | Email for the CV. | ||
| links | No | All the links to show, e.g. LinkedIn, GitHub, a site. Replaces the current list. | |
| phone | No | Phone, e.g. "+52 442 000 0000". | |
| profile | No | Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE). | |
| location | No | One string, or one per language: {"en": "...", "es": "..."}. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| courses | No | All the courses and trainings without an exam, replacing the current list; leave out to keep it. A course is never a certification. | |
| profile | No | Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE). | |
| languages | No | One string, or one per language: {"en": "...", "es": "..."}. | |
| certifications | No | All the certifications, replacing the current list. Leave out to keep it. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Skill name, e.g. Kubernetes. Matches existing skills ignoring case. | |
| level | Yes | P production at a job, L own project or lab, F familiarity, X does not have it. | |
| notes | No | Private notes; never printed on the CV. | |
| years | No | Years of use, e.g. 2.5. | |
| aliases | No | Other spellings, e.g. k8s for Kubernetes. | |
| profile | No | Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE). | |
| evidence | No | Where and how the person used it. Required to raise a level. | |
| last_used_year | No | Last calendar year the person used it, e.g. 2026. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| skills | Yes | The skills to add or change. | |
| profile | No | Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE). |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | A year or year-month, e.g. "2021" or "2021-03". | |
| start | No | A year or year-month, e.g. "2021" or "2021-03". | |
| degree | No | One string, or one per language: {"en": "...", "es": "..."}. | |
| profile | No | Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE). | |
| institution | Yes | School or university. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Short id, e.g. book_adr_kit. Variants list these ids. | |
| url | No | A link to it. | |
| year | No | A year or year-month, e.g. "2021" or "2021-03". | |
| title | No | The title as published. | |
| venue | No | Where it is published, e.g. "Amazon (self-published)" or "Medium". Never a publisher it did not have. | |
| profile | No | Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE). |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Short role id, e.g. acme. Bullets point to it. | |
| end | No | Year it ended, e.g. "2024". "present" marks it as the current role. | |
| start | No | A year or year-month, e.g. "2021" or "2021-03". | |
| title | No | One string, or one per language: {"en": "...", "es": "..."}. | |
| company | No | Company name. | |
| context | No | One string, or one per language: {"en": "...", "es": "..."}. | |
| profile | No | Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE). | |
| location | No | One string, or one per language: {"en": "...", "es": "..."}. |
TDQS
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.
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.
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.
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.
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.
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_pdfARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to any PDF, made with honest-cv or not. | |
| max_pages | No | Most pages allowed; the page_count check fails above it. Default: no limit. |
TDQS
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.
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.
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.
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.
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.
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.
30 tool updates
v0.3.2- Changed
add_bullet1 field changed- changed
Input schema / properties / profile / descriptionPrevious 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)."
- Changed
build_cv3 fields changed- changed
Input schema / properties / formats / descriptionPrevious value: -"Default: both."New value: +"Formats to write: pdf, docx or both. Default: both." - changed
Input schema / properties / lang / descriptionPrevious value: -"Language of the CV: en or es."New value: +"Language of the output: en (English) or es (Spanish)." - changed
Input schema / properties / profile / descriptionPrevious 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)."
- Changed
build_letter5 fields changed- changed
Input schema / properties / closing / descriptionPrevious value: -"Default: Sincerely, / Atentamente,"New value: +"Closing line. Default: Sincerely, / Atentamente," - changed
Input schema / properties / formats / descriptionPrevious value: -"Default: both."New value: +"Formats to write: pdf, docx or both. Default: both." - changed
Input schema / properties / greeting / descriptionPrevious value: -"Default: Dear Hiring Team, / Estimado equipo de selección:"New value: +"Opening line. Default: Dear Hiring Team, / Estimado equipo de selección:" - changed
Input schema / properties / lang / descriptionPrevious value: -"Language of the CV: en or es."New value: +"Language of the output: en (English) or es (Spanish)." - changed
Input schema / properties / profile / descriptionPrevious 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)."
- Changed
check_claims1 field changed- changed
Input schema / properties / profile / descriptionPrevious 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)."
- Changed
checklist_apply1 field changed- changed
Input schema / properties / profile / descriptionPrevious 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)."
- Changed
checklist_list2 fields changed- added
Input schema / properties / langAdded value: +{ + "default": "en", + "description": "The person's language: the built-in templates in it, where translated.", + "enum": [ + "en", + "es" + ], + "title": "Lang", + "type": "string" +} - changed
Input schema / properties / profile / descriptionPrevious 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)."
- Changed
checklist_new2 fields changed- added
Input schema / properties / langAdded 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" +} - changed
Input schema / properties / profile / descriptionPrevious 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)."
- Changed
export_json_resume2 fields changed- changed
Input schema / properties / lang / descriptionPrevious value: -"Language of the CV: en or es."New value: +"Language of the output: en (English) or es (Spanish)." - changed
Input schema / properties / profile / descriptionPrevious 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)."
- Changed
gap_report2 fields changed- changed
Input schema / properties / lang / descriptionPrevious value: -"Language of the CV: en or es."New value: +"Language of the output: en (English) or es (Spanish)." - changed
Input schema / properties / profile / descriptionPrevious 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)."
- Changed
get_inventory1 field changed- changed
Input schema / properties / profile / descriptionPrevious 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)."
- Changed
import_profile1 field changed- changed
Input schema / properties / profile / descriptionPrevious 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)."
- Added
interview_prep - Changed
linkedin_profile2 fields changed- changed
Input schema / properties / lang / descriptionPrevious value: -"Language of the CV: en or es."New value: +"Language of the output: en (English) or es (Spanish)." - changed
Input schema / properties / profile / descriptionPrevious 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)."
- Changed
list_applications2 fields changed- changed
Input schema / properties / profile / descriptionPrevious 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)." - changed
Input schema / properties / status / descriptionPrevious value: -"Only these statuses. Default: all."New value: +"Only applications in these statuses. Default: all."
- Changed
list_variants1 field changed- changed
Input schema / properties / profile / descriptionPrevious 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)."
- Changed
log_application3 fields changed- changed
Input schema / properties / files / descriptionPrevious value: -"Paths of the CV and letter sent."New value: +"Paths of the CV and letter sent. A copy is kept in <profile>/sent/." - changed
Input schema / properties / profile / descriptionPrevious 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)." - changed
Input schema / properties / status / descriptionPrevious 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."
- Changed
remove_bullet1 field changed- changed
Input schema / properties / profile / descriptionPrevious 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)."
- Changed
remove_publication1 field changed- changed
Input schema / properties / profile / descriptionPrevious 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)."
- Changed
remove_role1 field changed- changed
Input schema / properties / profile / descriptionPrevious 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)."
- Changed
remove_skill1 field changed- changed
Input schema / properties / profile / descriptionPrevious 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)."
- Changed
save_variant1 field changed- changed
Input schema / properties / profile / descriptionPrevious 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)."
- Changed
score_job3 fields changed- changed
Input schema / properties / lang / descriptionPrevious value: -"Language of the CV: en or es."New value: +"Language of the output: en (English) or es (Spanish)." - changed
Input schema / properties / profile / descriptionPrevious 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)." - changed
Input schema / properties / variants / descriptionPrevious value: -"Variant ids to score. Default: all."New value: +"Variant ids to score, from list_variants. Default: all."
- Changed
set_contact2 fields changed- changed
Input schema / properties / links / descriptionPrevious 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." - changed
Input schema / properties / profile / descriptionPrevious 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)."
- Changed
set_profile_details3 fields changed- changed
Input schema / properties / certifications / descriptionPrevious value: -"The full list of certifications, replacing the current one."New value: +"All the certifications, replacing the current list. Leave out to keep it." - changed
Input schema / properties / courses / descriptionPrevious 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." - changed
Input schema / properties / profile / descriptionPrevious 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)."
- Changed
set_skill1 field changed- changed
Input schema / properties / profile / descriptionPrevious 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)."
- Changed
set_skills1 field changed- changed
Input schema / properties / profile / descriptionPrevious 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)."
- Changed
upsert_education1 field changed- changed
Input schema / properties / profile / descriptionPrevious 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)."
- Changed
upsert_publication1 field changed- changed
Input schema / properties / profile / descriptionPrevious 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)."
- Changed
upsert_role1 field changed- changed
Input schema / properties / profile / descriptionPrevious 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)."
- Changed
verify_pdf1 field changed- changed
Input schema / properties / max_pages / descriptionPrevious value: -"Fail the page_count check above this."New value: +"Most pages allowed; the page_count check fails above it. Default: no limit."
30 tool updates
v0.1.0- First observed
add_bullet - First observed
build_cv - First observed
build_letter - First observed
check_claims - First observed
checklist_apply - First observed
checklist_list - First observed
checklist_new - First observed
export_json_resume - First observed
gap_report - First observed
get_inventory - First observed
import_profile - First observed
init_profile - First observed
linkedin_profile - First observed
list_applications - First observed
list_variants - First observed
log_application - First observed
remove_bullet - First observed
remove_publication - First observed
remove_role - First observed
remove_skill - First observed
save_variant - First observed
score_job - First observed
set_contact - First observed
set_profile_details - First observed
set_skill - First observed
set_skills - First observed
upsert_education - First observed
upsert_publication - First observed
upsert_role - First observed
verify_pdf
TDQS
Scored across 31 tools
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.
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.
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.
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
Related MCP Connectors
A MCP server built for developers enabling Git based project management with project and personal…
Public MCP server for discovering open jobs. Search, filter, and get application links.
MCP server for VC pitch-deck scoring, thesis-fit matching, and deal-flow management.
MCP server for skill documentation, generated by doc2mcp.
Related MCP Servers
- AlicenseAqualityBmaintenanceMCP server for generating professional ATS-friendly CVs as PDF/DOCX from AI conversations. Auto-manages a Docker container with a visual editor for layout customization.4MIT
- FlicenseNot gradedqualityDmaintenanceMCP server for maintaining a professional profile database and generating tailored, ATS-optimized resumes for specific job postings.1-
- AlicenseNot gradedqualityDmaintenanceMCP server for processing Markdown resumes into multiple formats (PDF, LinkedIn templates) with AI analysis and Claude integration.MIT
- AlicenseCqualityDmaintenanceAn MCP server that analyzes job postings and generates tailored, ATS-friendly CVs, cover letters, and email templates in multiple formats including PDF.17202 npm30MIT