Comprehensive Model Context Protocol server for managing Home Assistant through AI assistants.
Honest Cv is installed from its publisher's own source and answers where it runs, so this marketplace is not in the path of a single call. There is no address here to send one to, and a panel that pretended otherwise would be showing you an answer we made up. Install it and call it from your own client — the Installation tab has the entry for each one.
What it does
Honest, ATS-safe CVs and cover letters from a skill inventory you confirm yourself.
Quickstart
# 1 — add it to Claude Code
claude mcp add --scope user honest-cv-mcp '--' uvx honest-cv serve
# 2 — ask your agent for something these tools do
# init_profile, get_inventory, set_skill and 28 more
Honest Cv costs nothing on mcprush: there is no plan to choose here, no cap to set and nothing mcprush can bill you for.
Collected from a public index. Nobody has claimed this account, so nothing here was written by its author — claim it if it is yours.
Where are you running it?
Every route below installs the same thing and ends at the same approval screen. This one runs on your machine: your client starts Honest Cv as a process under your own user, with your files and your network, so the tool surface below is what it can do to your computer rather than to a server somewhere else. Its scan result is on the Security tab — read the surface before you approve it.
This is a public server: you run it yourself and this marketplace is not in the path. You need uv (docs.astral.sh/uv): uvx comes with it. Claude Code registers it in one command; --scope user makes it available in every project. The '--' is in quotes so that PowerShell passes it on.
claude mcp add --scope user honest-cv-mcp '--' uvx honest-cv serveReconnect, or start a new session, and the tools appear in the model’s tool list.
Nothing is required, but it can take HONEST_CV_PROFILE (Folder that holds your profile, e.g. ~/cv-profile. Keep it out of public repositories. Tools also accept a profile argument.) if you want to set it.
One config entry your client uses to start the process locally. A local server runs with your file system and your network, which is why it is priced without metering.
31 tools, with what each one reads, writes and reaches shown before you agree — the same list on every route above. Read the tool surface.
Tool surface
What the model actually sees. Descriptions are diffed on every release — see version history.
Create a profile folder with empty, commented YAML templates. Refuses to overwrite.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| profile | string | yes | Folder to create. Must not hold a profile yet. |
The skill inventory: level (P/L/F/X), years, last use, evidence and aliases.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| profile | no | — |
Add or change a skill. Raising the level (a new skill counts as coming from X) needs evidence, and the server then asks the person to confirm. Lowering is always allowed.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | Skill name, e.g. Kubernetes. Matches existing skills ignoring case. |
| level | string | yes | P production at a job, L own project or lab, F familiarity, X does not have it. |
| confirmation | yes | — | |
| profile | no | — | |
| evidence | string | no | Where and how the person used it. Required to raise a level. |
| years | number | no | Years of use, e.g. 2.5. |
| last_used_year | integer | no | Last calendar year the person used it, e.g. 2026. |
| aliases | array | no | Other spellings, e.g. k8s for Kubernetes. |
| notes | string | no | Private notes; never printed on the CV. |
Add or change several skills at once. Every upgrade needs evidence; the person answers "sí" or "no" for each one, up to 10 per question, and only the "sí" ones are saved. Call it again with upgrades_not_asked_yet. Use it to record skills in groups.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| skills | array | yes | The skills to add or change. |
| confirmation | yes | — | |
| profile | no | — |
Import contact, roles with their achievements, education, certifications and languages.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| path | string | yes | A JSON Resume (.json), a LinkedIn data export (.zip) or a LinkedIn profile PDF. |
| profile | no | — | |
| dry_run | boolean | no | Report what would be added without writing. |
The skill checklist templates to combine with checklist_new: the built-in ones, one per kind of profile, and the person's own in <profile>/checklists/ (origin "yours"). Any profession works: a template is a Markdown list in the same format.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| profile | no | — | |
| lang | no | The person's language: the built-in templates in it, where translated. |
Merge checklist templates into one Markdown file, without duplicates and prefilled from the inventory. The person marks it in their editor; then call checklist_apply. lists may be empty when extra names the skills. Use the person's language: skill names in another language still match job…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| lists | array | yes | Ids from checklist_list, e.g. backend-jvm, or paths to .md templates. |
| profile | no | — | |
| path | string | no | File to write. Default: <profile>/checklist.md. |
| overwrite | boolean | no | Replace the file if it exists. |
| extra | array | no | More skill names to ask about, e.g. found in an imported profile. |
| lang | no | The person's language: the file's headings and the built-in templates in it. |
Save the lines the person marked in a checklist. The person answers "sí" or "no" for each upgrade with evidence, up to 10 per question: call it again while upgrades_not_asked_yet is not empty. Lines without evidence come back as pending_evidence: ask where they used them, in groups, and record…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| path | string | yes | A Markdown checklist marked by the person, e.g. <profile>/checklist.md. |
| confirmation | yes | — | |
| profile | no | — |
Add an achievement to the bullet pool. role is a role id from profile.yaml; leave it out for bullets used only in the Selected Impact section. Use only facts the person stated.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | Unique bullet id, e.g. ft_k8s. |
| text_en | string | yes | The achievement in English, as the person stated it. |
| profile | no | — | |
| text_es | string | no | The same achievement in Spanish. |
| role | string | no | Role id from profile.yaml this bullet belongs to. |
| tags | array | no | Skills and topics it shows, e.g. Kubernetes. |
| metrics | array | no | Numbers it claims, e.g. 40%, kept for review. |
Change the contact details given; the others stay as they are. Pass "clear" to remove an optional field.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| profile | no | — | |
| name | string | no | Full name as it should appear on the CV. |
| string | no | Email for the CV. | |
| phone | string | no | Phone, e.g. "+52 442 000 0000". |
| location | no | — | |
| links | array | no | Full list of links: LinkedIn, GitHub, site. |
Replace the certifications list, the courses list and/or the spoken-languages line.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| profile | no | — | |
| certifications | array | no | The full list of certifications, replacing the current one. |
| courses | array | no | The full list of courses and trainings without an exam, replacing the current one. A course is never a certification. |
| languages | no | — |
Add a role, or change the fields given on an existing one. A new role needs title, company and start, and goes in date order, newest first. Keep the person's real title.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | Short role id, e.g. acme. Bullets point to it. |
| profile | no | — | |
| title | no | — | |
| company | string | no | Company name. |
| start | no | — | |
| end | string | no | Year it ended, e.g. "2024". "present" marks it as the current role. |
| location | no | — | |
| context | no | — |
Add an education entry, or change the one with the same institution and degree. Say honestly whether the degree was completed, e.g. "B.Sc. (unfinished)".
| Parameter | Type | Required | Notes |
|---|---|---|---|
| institution | string | yes | School or university. |
| profile | no | — | |
| degree | no | — | |
| start | no | — | |
| end | no | — |
Add a book, article or paper the person wrote, or change the fields given of the one with this id. Every variant shows all publications unless it lists the ones it wants.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | Short id, e.g. book_adr_kit. Variants list these ids. |
| profile | no | — | |
| title | string | no | The title as published. |
| venue | string | no | Where it is published, e.g. "Amazon (self-published)" or "Medium". Never a publisher it did not have. |
| year | no | — | |
| url | string | no | A link to it. |
Add a variant or replace it whole: pass every field it should define. A variant without extends needs title and summary. See list_variants → own for what it defines now.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | Variant id, e.g. backend. |
| profile | no | — | |
| extends | string | no | Variant to inherit from; set only what differs. |
| title | no | — | |
| summary | no | — | |
| competencies | array | no | Short list of core competencies. |
| impact | array | no | Bullet ids for Selected Impact. |
| roles | object | no | Role id -> bullet ids to show, in order. |
| skills | array | no | Skill groups: a label and skill names. |
| publications | array | no | Publication ids to show, in order; [] shows none. Not set: all of them. |
| max_pages | integer | no | Page limit, usually 1 or 2. |
Delete a skill from the inventory, e.g. a duplicate or a misspelling. It also leaves the variants' skill groups and same-named competencies. To say the person doesn't have a skill, prefer set_skill with level X: it keeps gap reports honest. Ask the person first.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | Skill name as in the inventory. |
| profile | no | — |
Delete an achievement from the pool and from every variant that uses it. Ask the person first.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | Bullet id. |
| profile | no | — |
Delete a publication and its place in every variant. Ask the person first.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | Publication id from profile.yaml. |
| profile | no | — |
Delete a role and its place in every variant. A role with bullets is refused unless with_bullets is true. Ask the person first.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | Role id from profile.yaml. |
| profile | no | — | |
| with_bullets | boolean | no | Also delete the role's bullets. Only if the person agreed to lose them. |
Variants after extends: is applied, with the bullet texts each one uses.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| profile | no | — |
Render a variant to PDF and/or DOCX (default both) and verify the PDF for ATS safety.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| variant | yes | — | |
| lang | no | — | |
| profile | no | — | |
| formats | array | no | Default: both. |
| out_dir | string | no | Output folder. Default: <profile>/out. |
Check that any PDF is ATS-safe and return the text an ATS would extract.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| path | string | yes | Path to any PDF, made with honest-cv or not. |
| max_pages | integer | no | Fail the page_count check above this. |
Check a draft against the profile. problems must be fixed before build_letter: a skill the person marked X, or a familiarity (F) skill not called familiarity in its sentence.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| text | string | yes | The draft: a cover letter, a summary, any text about the person. |
| profile | no | — | |
| keywords | array | no | Keywords of the job post, so its technologies are checked too. |
Render a cover letter to PDF and/or DOCX, one page, with the CV's ATS checks. It runs check_claims first and refuses while there are problems.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| company | string | yes | Company name, as in the job post. |
| role | string | yes | Job title, as in the job post. |
| paragraphs | array | yes | The body, one string per paragraph, approved by the person. |
| lang | no | — | |
| profile | no | — | |
| recipient | string | no | Hiring manager or team, if the post names one. |
| greeting | string | no | Default: Dear Hiring Team, / Estimado equipo de selección: |
| closing | string | no | Default: Sincerely, / Atentamente, |
| keywords | array | no | Keywords of the job post, for check_claims. |
| formats | array | no | Default: both. |
| out_dir | string | no | Output folder. Default: <profile>/out. |
Export a variant as JSON Resume, for other CV tools and sites. Same rules as the CV:
| Parameter | Type | Required | Notes |
|---|---|---|---|
| variant | yes | — | |
| lang | no | — | |
| profile | no | — | |
| out_dir | string | no | Output folder. Default: <profile>/out. |
LinkedIn texts from a variant, within LinkedIn's limits: headline, About, each position's description from its bullets, and the skills (P and L only: LinkedIn can't label familiarity). Also writes them to a Markdown file to copy from. Once the person approves a polished headline or About, call it…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| variant | yes | — | |
| lang | no | — | |
| profile | no | — | |
| out_dir | string | no | Output folder. Default: <profile>/out. |
| headline | string | no | A polished headline the person approved, to save instead of the draft. |
| about | string | no | A polished About the person approved, to save instead of the draft. |
Record a job application, or update the one for the same company and role. Fields not given keep their value. Use it after build_cv or build_letter when the person sends them, and when they tell you what happened (interview, offer, rejection). Save the post's text, since links expire, and any…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| company | string | yes | Company name, as in the job post. |
| role | string | yes | Job title, as in the job post. |
| profile | no | — | |
| status | no | New status. A change is kept in the history. | |
| date | string | no | Date of this status, YYYY-MM-DD. Default: today. |
| url | string | no | Link to the job post. |
| variant | string | no | Variant id of the CV sent. |
| lang | no | Language of the CV sent. | |
| files | array | no | Paths of the CV and letter sent. A copy is kept in <profile>/sent/. |
| notes | string | no | Contact person, salary range, next step... Added to the notes already there. |
| post | string | no | The job post's full text, as the person gave it. Saved to <profile>/posts/. |
| prep | array | no | What to prepare for the interview: skills to back with an example, gaps to explain, questions to ask. Replaces the list. |
The person's applications, most recently updated first, with days_since_update, a count per status, and waiting: open applications with no news for 14 days or more.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| profile | no | — | |
| status | array | no | Only these statuses. Default: all. |
What the person can honestly say in the interview for one application. Returns the application, the saved job post's text and, for each keyword, their level, evidence and stories: the bullets that show it, the ones in the CV they sent first. standing says how to prepare it: strong (tell a…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| application | string | yes | Application id, from list_applications. |
| profile | no | — | |
| keywords | array | 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 | — | |
| notes | string | no | The prep notes the person approved, in Markdown. Saved to <profile>/prep/<application>.md, replacing earlier notes. |
Keyword coverage of each variant, best first. Extract the job post's keywords yourself:
| Parameter | Type | Required | Notes |
|---|---|---|---|
| keywords | yes | — | |
| profile | no | — | |
| preferred | no | — | |
| lang | no | — | |
| variants | array | no | Variant ids to score. Default: all. |
Missing keywords grouped by what can honestly be done:
| Parameter | Type | Required | Notes |
|---|---|---|---|
| variant | yes | — | |
| keywords | yes | — | |
| profile | no | — | |
| preferred | no | — | |
| lang | no | — |
- Every tool, no call limit
- No card, and mcprush charges nothing for it
- Source published under MIT
- Runs on your machine — nothing of it reaches our gateway
- Nothing to cap, because mcprush bills nothing
What counts against your monthly calls
| Tool | Unit | Calls used | Out of the allowance |
|---|
Nothing here is billable: mcprush charges nothing to install Honest Cv or to call it, at any volume.
Two independent axes, because powerful and malicious are different questions. The grade is threat only. The capability level is blast radius, and it is never a penalty on the grade — it is priced as one subtract-only term in the score, where you can see it.
| Term | Level | What it prices | Points |
|---|---|---|---|
| capability-exposure | moderate | capability blast radius (moderate) — client exposure if the model is manipulated | −3 |
| verification-discount | source | publisher verification (provenance) — cryptographic build provenance ties the artifact to its source | −0 |
| coverage-honesty | source | inspection depth (source) — how much of the target the scan could see | −0 |
What the scan could actually read
A grade is only as meaningful as its coverage, so the scanner publishes its own depth before it publishes its result.
Tools were statically extracted from the published source (31 recovered), not enumerated from a running server. Tool-poisoning, Unicode-smuggling, capability and toxic-flow analysis ran on this inferred surface, but a mis-parsed registration could be missed or mis-attributed, so tool-derived findings are capped below “confirmed”. To grade the real runtime surface, scan the running server: --command "npx -y <package>".
Capability — what it could do if the model were manipulated
Tags derived from each tool’s schema and the implementation, not from what the tool calls itself. moderate is the level these add up to.
| Tool | Capability tags | Why the tag was assigned |
|---|---|---|
| init_profile | no tags | |
| get_inventory | no tags | |
| set_skill | no tags | |
| set_skills | no tags | |
| import_profile | no tags | |
| checklist_list | no tags | |
| checklist_new | no tags | |
| checklist_apply | no tags | |
| add_bullet | no tags | |
| set_contact | no tags | |
| set_profile_details | no tags | |
| upsert_role | no tags | |
| upsert_education | no tags | |
| upsert_publication | no tags | |
| save_variant | no tags | |
| remove_skill | no tags | |
| remove_bullet | no tags | |
| remove_publication | no tags | |
| remove_role | no tags | |
| list_variants | no tags | |
| build_cv | no tags | |
| verify_pdf | no tags | |
| check_claims | no tags | |
| build_letter | external-sink | external-sink: parameter "recipient" |
| export_json_resume | no tags | |
| linkedin_profile | no tags | |
| log_application | no tags | |
| list_applications | no tags | |
| interview_prep | no tags | |
| score_job | no tags | |
| gap_report | no tags |
Toxic-flow graph
The lethal trifecta, checked as a graph rather than as a checklist: untrusted input, a sensitive source and an external sink have to meet before there is a path worth worrying about.
The public result for this release does not print the flow graph, so there is nothing to show here. That is not the same as "no paths were found": what the scan did read is above, under coverage.
Supply chain and provenance
This is the first scan of this surface here, so there is nothing yet to compare it against.
Every result on this tab comes from one deterministic pass over the published package — offline, rule by rule, and auditable line by line above. Same methodology version, same bytes, same score.
Release history
Always latest — the install command names no version, so it installs the newest release when it runs; the current release on file is 0.3.0. Pin a release below and the command asks for exactly that one.
No release note was published with this version.
One review per account, from a signed-in account that does not publish this listing. Nothing else is asked — you can say what you think before you install it. Publishers can reply once per review, and a review can be edited or deleted by whoever wrote it.
Any signed-in account that does not publish Honest Cv can review it, once — before installing it or after. A review from an account that has installed it is marked as one.
Nobody has reviewed this listing. The rating on the card is the mean of the reviews written here and nothing else, so there is no rating until somebody writes the first — which takes a signed-in account that does not publish it, and nothing else.