Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

honest-cv

PYPI · HONEST-CV

Honest, ATS-safe CVs and cover letters from a skill inventory you confirm yourself.

Available components

+4 this week 70 Trust /100

Last scanned (18 hours ago)

Scores higher than 69% of PyPI servers

Category Documents and Files

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security50
  • Malware scan not yet available for this package.Unverified
  • No known CVEs affecting this package version or its production dependencies.Pass
  • Runs hatchling.build at install time, a recognised build step with no custom scripting around it. View diagnostics → Pass
  • 1 of 38 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency97
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Cryptographically verified build provenance (signed, bound to JesusCabreraReveles/honest-cv). View diagnostics → Pass
  • Clear OSI-approved license (MIT).Pass
  • Actively maintained (last published 0 days ago).Pass
  • Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability78
  • 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 6831 tokens (~220/item across 31 items; 31 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management23
  • Stability observed for 7 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • All 4 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
  • An AI judge read all 32 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a current MCP spec version (2026-07-28).Pass
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 22 Oct 26 −14
    • Malware scan: pass → unverified ▼ security
  • 21 Oct 26 +15
    • Tool safety: pass → unverified ▼ security
    • Stability: 0.17 → unverified ▼ security
    • Malware scan: unverified → pass ▲ security
    • Capabilities: pass → unverified ▼ functional
    • Tool coverage: 100 → unverified ▼ functional
    • Schema quality: 100 → unverified ▼ functional
    • Package version: 0.3.2 → 0.3.3 functional
  • 20 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 13 to 17. That category is still filling its 30-day observation window: 4 days of observed history at the previous scan, 5 at this one. The score rises as the window fills, whether or not the server changes.

  • 18 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 7 to 10. That category is still filling its 30-day observation window: 2 days of observed history at the previous scan, 3 at this one. The score rises as the window fills, whether or not the server changes.

  • 16 Oct 26 +1
    • Schema quality: 156 → 220 ▼ functional
    • Stability: unverified → 0.03 ▲ functional
    • Schema quality: good → excellent functional
    • Package version: 0.2.0 → 0.3.2 functional
    • Package version: 0.2.0 → 0.3.1 functional
    • Package version: 0.2.0 → 0.3.0 functional
  • 15 Oct 26 66

    First indexed and scored.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 22 Oct 2026 · Analysed pypi/honest-cv@0.3.3

Provenance Verified

A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.

Result Verified
Ecosystem pypi
Reason Verified
Discovered via Registry attestation endpoint
Source repo JesusCabreraReveles/honest-cv
Certificate issuer https://token.actions.githubusercontent.com
Certificate SAN https://github.com/JesusCabreraReveles/honest-cv/.github/workflows/release.yml@refs/tags/v0.3.3
Rekor log index 3366472726
Predicate type PyPI publish attestation https://docs.pypi.org/attestations/publish/v1
Subject digest sha256:17d8aa806ef5586c536d6fbcdb9753cc04d6447f5bc1a3cfb026448590a15092

Background: How many MCP packages publish verified provenance →

Install scripts 1 script
Hook Tier Command
build_backend allowlisted hatchling.build

Background: Why install scripts are a supply-chain risk →

Dependencies 38 packages
Packages resolved 38
No linked repository 1
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 31 exposed · ~6,185 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
add_bullet ~213

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

NameTypeReqDescription
idstringyesUnique bullet id, e.g. ft_k8s.
metrics––Numbers it claims, e.g. 40%, kept for review.
profile––Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).
role––Role id from profile.yaml this bullet belongs to.
tags––Skills and topics it shows, e.g. Kubernetes.
text_enstringyesThe achievement in English, as the person stated it.
text_es––The same achievement in Spanish.

No output schema declared.

No examples provided.

build_cv ~228

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 <profile>/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.

NameTypeReqDescription
formats––Formats to write: pdf, docx or both. Default: both.
langstring–Language of the output: en (English) or es (Spanish).
out_dir––Output folder. Default: <profile>/out.
profile––Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).
variantstringyesVariant id from variants.yaml, e.g. backend.

No output schema declared.

No examples provided.

build_letter ~283

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.

NameTypeReqDescription
closing––Closing line. Default: Sincerely, / Atentamente,
companystringyesCompany name, as in the job post.
formats––Formats to write: pdf, docx or both. Default: both.
greeting––Opening line. Default: Dear Hiring Team, / Estimado equipo de selección:
keywords––Keywords of the job post, for check_claims.
langstring–Language of the output: en (English) or es (Spanish).
out_dir––Output folder. Default: <profile>/out.
paragraphsarrayyesThe body, one string per paragraph, approved by the person.
profile––Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).
recipient––Hiring manager or team, if the post names one.
rolestringyesJob title, as in the job post.

No output schema declared.

No examples provided.

check_claims ~182

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.

NameTypeReqDescription
keywords––Keywords of the job post, so its technologies are checked too.
profile––Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).
textstringyesThe draft: a cover letter, a summary, any text about the person.

No output schema declared.

No examples provided.

checklist_apply ~271

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.

NameTypeReqDescription
pathstringyesA Markdown checklist marked by the person, e.g. <profile>/checklist.md.
profile––Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).

No output schema declared.

No examples provided.

checklist_list ~156

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 <profile>/checklists/). Any profession works. Pass `lang` in the person's language to get the translated templates. Read-only.

NameTypeReqDescription
langstring–The person's language: the built-in templates in it, where translated.
profile––Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).

No output schema declared.

No examples provided.

checklist_new ~240

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

NameTypeReqDescription
extra––More skill names to ask about, e.g. found in an imported profile.
langstring–The person's language: the file's headings and the built-in templates in it.
listsarrayyesIds from checklist_list, e.g. backend-jvm, or paths to .md templates.
overwriteboolean–Replace the file if it exists.
path––File to write. Default: <profile>/checklist.md.
profile––Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).

No output schema declared.

No examples provided.

export_json_resume ~167

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 <profile>/out, and returns its `path`.

NameTypeReqDescription
langstring–Language of the output: en (English) or es (Spanish).
out_dir––Output folder. Default: <profile>/out.
profile––Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).
variantstringyesVariant id from variants.yaml, e.g. backend.

No output schema declared.

No examples provided.

gap_report ~252

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.

NameTypeReqDescription
keywordsarrayyesRequired keywords from the job post, in its own wording.
langstring–Language of the output: en (English) or es (Spanish).
preferred––Nice-to-have keywords from the job post.
profile––Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).
variantstringyesVariant id from variants.yaml, e.g. backend.

No output schema declared.

No examples provided.

get_inventory ~116

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.

NameTypeReqDescription
profile––Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).

No output schema declared.

No examples provided.

import_profile ~259

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

NameTypeReqDescription
dry_runboolean–Report what would be added without writing.
pathstringyesA JSON Resume (.json), a LinkedIn data export (.zip) or a LinkedIn profile PDF.
profile––Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).

No output schema declared.

No examples provided.

init_profile ~95

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.

NameTypeReqDescription
profilestringyesFolder to create. Must not hold a profile yet.

No output schema declared.

No examples provided.

interview_prep ~273

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 <profile>/prep/<id>.md.

NameTypeReqDescription
applicationstringyesApplication id, from list_applications.
keywords––Required keywords from the job post, in its own wording. Leave out on the first call to get the saved post's text.
notes––The prep notes the person approved, in Markdown. Saved to <profile>/prep/<application>.md, replacing earlier notes.
preferred––Nice-to-have keywords from the job post.
profile––Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).

No output schema declared.

No examples provided.

linkedin_profile ~237

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.

NameTypeReqDescription
about––A polished About the person approved, to save instead of the draft.
headline––A polished headline the person approved, to save instead of the draft.
langstring–Language of the output: en (English) or es (Spanish).
out_dir––Output folder. Default: <profile>/out.
profile––Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).
variantstringyesVariant id from variants.yaml, e.g. backend.

No output schema declared.

No examples provided.

list_applications ~128

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.

NameTypeReqDescription
profile––Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).
status––Only applications in these statuses. Default: all.

No output schema declared.

No examples provided.

list_variants ~111

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.

NameTypeReqDescription
profile––Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).

No output schema declared.

No examples provided.

log_application ~363

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 <profile>/sent/<id>/, so the record keeps what was sent. Returns the `application` and `not_found`: paths it could not copy.

NameTypeReqDescription
companystringyesCompany name, as in the job post.
date––Date of this status, YYYY-MM-DD. Default: today.
files––Paths of the CV and letter sent. A copy is kept in <profile>/sent/.
lang––Language of the CV sent.
notes––Contact person, salary range, next step... Added to the notes already there.
post––The job post's full text, as the person gave it. Saved to <profile>/posts/.
prep––What to prepare for the interview: skills to back with an example, gaps to explain, questions to ask. Replaces the list.
profile––Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).
rolestringyesJob title, as in the job post.
status––New status: draft, applied, interview, offer, rejected or withdrawn. Each change is kept in the history with its date.
url––Link to the job post.
variant––Variant id of the CV sent.

No output schema declared.

No examples provided.

remove_bullet ~106

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

NameTypeReqDescription
idstringyesBullet id.
profile––Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).

No output schema declared.

No examples provided.

remove_publication ~105

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

NameTypeReqDescription
idstringyesPublication id from profile.yaml.
profile––Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).

No output schema declared.

No examples provided.

remove_role ~145

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

NameTypeReqDescription
idstringyesRole id from profile.yaml.
profile––Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).
with_bulletsboolean–Also delete the role's bullets. Only if the person agreed to lose them.

No output schema declared.

No examples provided.

remove_skill ~130

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

NameTypeReqDescription
namestringyesSkill name as in the inventory.
profile––Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).

No output schema declared.

No examples provided.

save_variant ~306

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

NameTypeReqDescription
competencies––Short list of core competencies.
extends––Variant to inherit from; set only what differs.
idstringyesVariant id, e.g. backend.
impact––Bullet ids for Selected Impact.
max_pages––Page limit, usually 1 or 2.
profile––Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).
publications––Publication ids to show, in order; [] shows none. Not set: all of them.
roles––Role id -> bullet ids to show, in order.
skills––Skill groups: a label and skill names.
summary––One string, or one per language: {"en": "...", "es": "..."}.
title––One string, or one per language: {"en": "...", "es": "..."}.

No output schema declared.

No examples provided.

score_job ~211

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.

NameTypeReqDescription
keywordsarrayyesRequired keywords from the job post, in its own wording.
langstring–Language of the output: en (English) or es (Spanish).
preferred––Nice-to-have keywords from the job post.
profile––Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).
variants––Variant ids to score, from list_variants. Default: all.

No output schema declared.

No examples provided.

set_contact ~199

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.

NameTypeReqDescription
email––Email for the CV.
links––All the links to show, e.g. LinkedIn, GitHub, a site. Replaces the current list.
location––One string, or one per language: {"en": "...", "es": "..."}.
name––Full name as it should appear on the CV.
phone––Phone, e.g. "+52 442 000 0000".
profile––Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).

No output schema declared.

No examples provided.

set_profile_details ~187

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.

NameTypeReqDescription
certifications––All the certifications, replacing the current list. Leave out to keep it.
courses––All the courses and trainings without an exam, replacing the current list; leave out to keep it. A course is never a certification.
languages––One string, or one per language: {"en": "...", "es": "..."}.
profile––Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).

No output schema declared.

No examples provided.

set_skill ~254

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

NameTypeReqDescription
aliases––Other spellings, e.g. k8s for Kubernetes.
evidence––Where and how the person used it. Required to raise a level.
last_used_year––Last calendar year the person used it, e.g. 2026.
levelstringyesP production at a job, L own project or lab, F familiarity, X does not have it.
namestringyesSkill name, e.g. Kubernetes. Matches existing skills ignoring case.
notes––Private notes; never printed on the CV.
profile––Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).
years––Years of use, e.g. 2.5.

No output schema declared.

No examples provided.

set_skills ~163

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.

NameTypeReqDescription
profile––Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).
skillsarrayyesThe skills to add or change.

No output schema declared.

No examples provided.

upsert_education ~182

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.

NameTypeReqDescription
degree––One string, or one per language: {"en": "...", "es": "..."}.
end––A year or year-month, e.g. "2021" or "2021-03".
institutionstringyesSchool or university.
profile––Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).
start––A year or year-month, e.g. "2021" or "2021-03".

No output schema declared.

No examples provided.

upsert_publication ~209

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.

NameTypeReqDescription
idstringyesShort id, e.g. book_adr_kit. Variants list these ids.
profile––Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).
title––The title as published.
url––A link to it.
venue––Where it is published, e.g. "Amazon (self-published)" or "Medium". Never a publisher it did not have.
year––A year or year-month, e.g. "2021" or "2021-03".

No output schema declared.

No examples provided.

upsert_role ~269

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.

NameTypeReqDescription
company––Company name.
context––One string, or one per language: {"en": "...", "es": "..."}.
end––Year it ended, e.g. "2024". "present" marks it as the current role.
idstringyesShort role id, e.g. acme. Bullets point to it.
location––One string, or one per language: {"en": "...", "es": "..."}.
profile––Path of the profile folder. Leave it out to use the server's default (--profile or HONEST_CV_PROFILE).
start––A year or year-month, e.g. "2021" or "2021-03".
title––One string, or one per language: {"en": "...", "es": "..."}.

No output schema declared.

No examples provided.

verify_pdf ~145

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.

NameTypeReqDescription
max_pages––Most pages allowed; the page_count check fails above it. Default: no limit.
pathstringyesPath to any PDF, made with honest-cv or not.

No output schema declared.

No examples provided.

Install

How do I install the honest-cv MCP server?

honest-cv runs locally as a PyPI package, launched with uvx honest-cv. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

pypi · honest-cv

# add to Claude Code
claude mcp add jesuscabrerareveles-honest-cv -- uvx honest-cv
Common questions

What is the honest-cv MCP server?

honest-cv is an MCP server listed in the public MCP registry as io.github.JesusCabreraReveles/honest-cv. Honest, ATS-safe CVs and cover letters from a skill inventory you confirm yourself. This page covers its PyPI package (honest-cv).

Is the honest-cv MCP server safe to use?

honest-cv scores 70 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 22 October 2026. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the honest-cv MCP server expose?

honest-cv exposes 31 tools: init_profile, get_inventory, set_skill, set_skills, import_profile, and 26 more. Their descriptions and schemas cost roughly 6,185 tokens of context every time the server is loaded.

Is the honest-cv MCP server still maintained?

honest-cv is still listed as active in the MCP registry. We last reached this channel on 22 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the honest-cv MCP server under?

honest-cv declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.