honest-cv
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| HONEST_CV_PROFILE | No | Path to the profile folder that holds your YAML files (profile.yaml, bullets.yaml, skills.yaml, variants.yaml). Every tool uses it unless it gets its own profile argument. Create the folder with `honest-cv init` or the `init_profile` tool. Run honest-cv on your own computer for your real data: on a hosted service, your profile lives there. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| 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 |
| get_inventoryA | 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 |
| 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 |
| 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 |
| 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 |
| checklist_listA | 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 |
| 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 |
| 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
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 → |
| add_bulletA | Add one achievement to the bullet pool, the material every CV variant picks from. Use it
after the person approves the wording, one bullet per call; to change which bullets a CV shows,
use save_variant. |
| 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. |
| 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 |
| upsert_roleA | Add a job role, or change some fields of an existing one by its |
| 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 |
| upsert_publicationA | Add a book, article or paper the person wrote, or change some fields of the one
with this |
| 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 → |
| remove_skillA | 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 |
| remove_bulletA | 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 |
| remove_publicationA | Delete a publication from the profile and from every variant that lists it. To
hide it from one CV only, change that variant's |
| remove_roleA | Delete a role from the profile and from every variant. A role that still has bullets
is refused unless |
| list_variantsA | Read every CV variant, with |
| 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 |
| verify_pdfA | 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 |
| check_claimsA | 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
|
| 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
|
| 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 |
| 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 |
| 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 |
| list_applicationsA | 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 |
| interview_prepA | Prepare the interview for one logged application from what the person can honestly
back up. Call it first with only |
| score_jobA | 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: |
| gap_reportA | 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: |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| cover_letter | Write a cover letter for a job post from the person's real bullets and skills. |
| import_linkedin_pdf | Turn the PDF from LinkedIn's "Save to PDF" into a profile, with the person's approval. |
| linkedin_profile | Headline, About, positions and skills for LinkedIn, from a variant, without adding claims. |
| interview_prep | Likely questions, STAR stories from the person's own achievements and honest answers for the gaps, for an application they logged. |
| interview | Guided interview that fills the skill inventory and the bullet pool, one question at a time. |
| tailor_for_job | Score the variants against a job post, explain the honest gaps, adjust a variant and rebuild. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
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.