关于 honest-cv
honest-cv 是 MCP 服务、命令行工具和 Claude Code 技能,可根据用户确认的经历档案生成针对不同岗位的简历与求职信。它要求技能等级有证据并经本人确认,还会检查 PDF 的 ATS 文本提取问题。
主要功能
- 01有证据支持且需本人确认的技能等级
- 02职位关键词覆盖率与差距报告
- 03生成岗位专属 PDF 和 DOCX 简历
- 04通过两种文本提取器检查 ATS 兼容性
- 05求职信声明核验与申请记录
适用场景
- 01为不同岗位类型制作简历
- 02对照已记录技能分析职位要求
- 03根据档案证据核查求职信
- 04依据工作成果准备面试回答
MCP 相关
MCP 服务允许 MCP 客户端开展经历访谈、调整简历版本并构建和验证文档。技能等级升级须通过 MCP elicitation 或终端命令由本人确认。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
31收录的工具列表 · 更新于 1 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| profile | string | 是 | 要创建的文件夹。该文件夹中不得已有配置文件。 |
详细介绍
honest-cv
由你的 AI Agent 生成针对每个岗位量身定制、诚实且适合 ATS 的简历。 honest-cv 是一个 MCP 服务、命令行工具和 Claude Code 技能。它将你的经历集中保存在一个可信来源中,并针对每类岗位生成 PDF 和 DOCX。它绝不会声称你掌握了自己并不具备的技能。

为什么选择 honest-cv
许多杳无音讯的简历,问题并不在设计,而在于缺乏针对性,以及一些会悄悄破坏文本提取的细节。AI 则让相反的问题变得轻而易举:模型会乐于在简历中塞满你在面试中无法自圆其说的关键词。honest-cv 围绕三个理念构建:
- 由代码确保诚实,而不是依靠提示词。 每项技能都有一个等级。熟悉程度的技能始终会明确标注,你不具备的技能绝不会出现在简历上。提高技能等级需要提供书面证据并由你本人确认,服务会直接向你询问。模型不能代替你确认。
- 根据你自己的技能清单衡量差距。 对于职位要求的每个关键词,honest-cv 会告诉你它属于以下三种情况中的哪一种:
- 你具备这项技能,但简历中没有体现;
- 你只达到熟悉程度;
- 你不具备这项技能。
- 每次构建都会检查 ATS 兼容性。 每份 PDF 都会经过两个文本提取器(pypdf 和 pdfminer.six)检查。构建过程会确认文本是否为单栏、没有连字、每个日期是否与对应职位处于同一行、阅读顺序是否正确,以及是否包含所有项目符号。
该服务具有确定性,无需 API 密钥。你的 MCP 客户端模型负责对话;honest-cv 负责验证、构建、核验和评估。它会将你的个人资料保存在你设备上的一个文件夹中,绝不会发送到其他地方:关于 AI 客户端如何处理这些资料,请参阅隐私。

快速开始
honest-cv 需要 uv。Typst 和字体已随软件包提供,
因此无需安装其他内容。
它支持运行于 x86_64 和 ARM64 架构、使用 glibc 的 Linux,Intel 和 Apple
Silicon 版 macOS,以及 x64 版 Windows。Alpine Linux 和 ARM 版 Windows 不受支持,因为 typst
软件包没有为这些平台发布 wheel 文件。
Claude Code
claude mcp add honest-cv -- uvx honest-cv serve --profile ~/cv-profile
如需同时安装用于引导面试和简历定制的技能:
mkdir -p ~/.claude/skills/honest-cv
curl -fsSL https://raw.githubusercontent.com/JesusCabreraReveles/honest-cv/master/skills/honest-cv/SKILL.md \
-o ~/.claude/skills/honest-cv/SKILL.md
然后按照逐步创建你的第一份简历操作。
Cursor
将以下内容添加到 ~/.cursor/mcp.json,或项目中的 .cursor/mcp.json:
{
"mcpServers": {
"honest-cv": {
"command": "uvx",
"args": ["honest-cv", "serve", "--profile", "/absolute/path/to/cv-profile"]
}
}
}
Claude Desktop
编辑 claude_desktop_config.json:
- 在 macOS 上,路径为
~/Library/Application Support/Claude/; - 在 Windows 上,路径为
%APPDATA%\Claude\。
添加与 Cursor 示例中相同的 mcpServers 配置块,然后重启应用。如果应用找不到 uvx,
请使用它的绝对路径(which uvx)。
各客户端如何确认技能升级
提升技能等级需要你亲自确认,服务器会通过 MCP 询问功能征求你的确认。目前并非所有客户端都支持此功能:
| 客户端 | 确认位置 |
|---|---|
| Claude Code | 在聊天中:每次升级都会显示一个包含「no / sí」选项的表单,一次最多处理 10 项。只有你回答「sí」的项目才会保存;选择拒绝则不会保存任何内容。 |
| Claude Desktop | 在终端中。服务器会拒绝此次更改,并提供要运行的命令:uvx honest-cv skill <profile> "<name>" <level> --evidence "..."。 |
| 其他客户端 | 如果支持询问功能,则在聊天中确认;否则,按上述方式在终端中确认。 |
一步步制作你的第一份简历
本指南使用 Claude Code;任何 MCP 客户端都能以相同方式工作,只是设置有所不同。
1. 安装 uv 并添加 honest-cv。 只需安装一次。在 macOS 或 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 是存放个人资料的文件夹。它可以暂时不存在,而且不应放在公开仓库中。也请安装技能(参见上文的 Claude Code)。
2. 开始面试。 在任意文件夹中打开 Claude Code(claude),并用你自己的语言输入 "Interview me for my CV",或运行 /mcp__honest-cv__interview。助手会在整个对话中使用你的语言。你可以通过系统的听写功能口述回答(macOS 上:系统设置 → 键盘 → 听写):保存前,它会把姓名和数字读回给你,因为听写可能会听错。流程如下:
你: Interview me for my CV.
助手:
~/cv-profile文件夹尚不存在。要创建它吗?……整个面试可能需要几小时,但我们会边进行边保存。首次会话只需填写联系信息、最近两份工作经历和技能清单,就足以制作第一份简历。你有 LinkedIn 数据导出文件或 JSON Resume 可以作为起点吗?
- 导入已有资料(如有)(可选)。下载 LinkedIn 数据导出文件(参见导入已有资料),并将 ZIP 文件路径提供给助手。系统会导入你的工作经历、教育背景和成就,技能则会导入为未标记等级的状态。
- 联系信息、工作经历和教育背景。 助手每次询问几项,并在保存前把姓名和数字读回给你。然后只会询问一次证书、课程和你撰写过的内容。
- 逐份工作经历梳理成就。 对每份工作经历,助手都会询问团队做了什么、你做了什么,以及发生了哪些变化,并要求提供数字。它会起草一条要点,只有在你批准措辞后才会保存。
- 技能。 助手会提供一份清单,例如
backend-jvm+engineering-lead,也可以使用适用于任何职业的自定义清单。在编辑器中打开~/cv-profile/checklist.md,在每一行填写 P、L、F 或 X,在 " — " 后补充使用该技能的场景,保存后告诉助手 "done"。它会分组询问缺失的证明材料。然后会提供表单,让你确认技能等级提升:只有你回答 "sí" 的项目才会保存。 - 你最突出的成就。 一项成就通常能体现多项技能。接着,助手会询问尚未由任何成就体现的主要 P 级技能;其余技能可以等到有具体职位描述时再处理。
3. 制作第一份简历。 助手会针对你申请的每种职位类型(例如 "platform" 或 "engineering manager")提出一个版本,包括职位名称、简介以及要展示的要点。批准后:
你: Build my platform CV in English and Spanish.
PDF 和 DOCX 文件会生成在 ~/cv-profile/out/,并已通过 ATS 兼容性检查。不使用 AI 客户端时,可运行 uvx honest-cv build ~/cv-profile -v platform -l en 完成相同操作。
4. 根据职位描述调整简历。 粘贴职位描述,或运行 /mcp__honest-cv__tailor_for_job:
你: 这是职位描述:(粘贴内容)。我的匹配度如何?应该做哪些调整?
你会看到每个版本的匹配度,以及分类后的缺失关键词:你具备但这份简历未体现的技能、仅有一定了解和你不具备的技能;此外,还会列出你在清单中标记、但尚无证明材料支持的技能(助手会询问你在哪里使用过这些技能),并提供一个待你批准的定制版本和生成的简历。之后,助手还能起草求职信,并在生成前通过 check_claims 检查内容;还可以记录申请信息,包括职位描述文本和面试准备事项。收到面试通知后,输入 "help me prepare the interview",助手就会根据你自己的成就起草可能出现的问题及答案。
5. 随时回来继续。 输入 "let's continue my CV interview",助手会从缺少的内容开始。需要更新 LinkedIn 个人资料时,输入 "update my LinkedIn"。
你的档案
档案是一个包含四个 YAML 文件的文件夹。使用 honest-cv init ~/cv-profile 创建档案,或让 interview 提示词引导你填写。请勿将其放入公开仓库。
| 文件 | 内容 |
|---|---|
profile.yaml | 联系方式、职位、教育经历、认证、出版物、课程和语言。 |
bullets.yaml | 成就集合,每条成就都有一个 id、一个 role 和一些 tags。 |
skills.yaml | 技能清单,包含等级和证明材料。 |
variants.yaml | 每种职位类型对应一份简历方案。变体可以通过 extends: 继承另一个变体。 |
任何文本都可以写成单个字符串,或每种语言各写一个字符串:{en: ..., es: ...}。简历可以用英语和西班牙语生成。
| 等级 | 含义 | 简历中的显示方式 |
|---|---|---|
P | 在工作中用于生产环境 | 显示 |
L | 个人项目或实验室项目 | 显示 |
F | 了解 | 仅显示在标注为“了解”的一栏 |
X | 不具备此技能 | 不显示,但会记录下来,确保技能差距报告真实准确 |
技能清单
逐个问题记录数十项技能很慢。技能清单是一个 Markdown 文件,你可以在编辑器中标记,每行填一个字母:
## Messaging and streaming
evidence: Payments platform at Acme, 2020–2026
- [P] Kafka — reconciliation flow, 2M events a day · years: 6 · last year: 2026
- [F] RabbitMQ — a workshop and the official tutorials
- [X] NATS
“ — ”后面的文本是证明材料,标题下的 evidence: 行则涵盖该部分。没有证明材料的行不会保存:它们会重新显示为待处理项,助手会分组询问你。整个文件只会确认一次升级。
技能清单提供英语和西班牙语版本(--lang es):西班牙语名称是英语名称的同义词,因此即使你用西班牙语标记技能,也能匹配英语职位描述。
honest-cv checklist list # backend-jvm, platform-sre, ...
honest-cv checklist new ~/cv-profile backend-jvm engineering-lead
honest-cv checklist apply ~/cv-profile ~/cv-profile/checklist.md
任何职业都适用。 内置技能清单涵盖软件领域(后端、前端、移动、数据、平台/SRE、QA、安全、ML/AI、嵌入式、游戏开发、架构、工程领导力),以及数据分析/BI、产品与项目管理、UX 设计、营销、销售、客户支持、财务与会计、人力资源、供应链、护理和教学。模板只需采用此格式的 Markdown 列表:将你自己的模板(或他人分享的模板)保存到 ~/cv-profile/checklists/,就会出现在 checklist list 中,并可与其他模板一起用于 checklist new;该命令也接受路径。模板可以声明同义词,例如 same: Work Breakdown Structure = WBS;技能评分、差距分析和求职信检查都会使用这些同义词以及技能名称。可以从 examples/checklists/event-planning.md 开始。你也可以应用自己标记的文件,支持英语或西班牙语(años、último uso)。完成后,honest-cv 会列出没有任何成就作为佐证的 P 和 L 级技能,助手会请你为每项技能提供一个真实案例。
honest-cv checklist list ~/cv-profile # yours too, e.g. accounting
honest-cv checklist new ~/cv-profile accounting engineering-lead
欢迎为其他职位类型添加技能清单:请参阅 CONTRIBUTING.md。
请参阅 examples/ada/,了解一份完整的虚构档案,其中包含三个变体、一份职位描述及其关键词。
隐私
- honest-cv 本身不会发起网络请求。 无需账户,不收集遥测数据,也无需 API 密钥。你的 个人资料是设备上的一个 YAML 文件夹,PDF 引擎和字体也都在本地运行。你可以验证这一点: 关闭网络后,每条命令都能正常运行。
- 你的 AI 客户端则是另一回事。 客户端的模型通过工具读取的任何内容,都会发送给该模型的提供商, 并受提供商的条款约束,就像你在聊天中分享的其他内容一样。这包括你的技能、要点和简历文本。
- 有些客户端会将文件复制到云端。 要直接编辑文件,Claude Desktop 可能会请求访问个人资料文件夹, 并告知你文件会离开设备。honest-cv 的编辑工具让这一步变得不必要:拒绝该请求,并让助手使用这些工具。
- 在托管服务上运行会使资料离开你的设备。 Glama 等目录提供在其服务器上部署 honest-cv
或在浏览器中试用的选项。虽然可行,但这样你的个人资料和简历就会存储在该服务上,并受其条款约束。
对于真实数据,请在自己的电脑上运行
uvx honest-cv。 - 如果你不希望任何内容离开设备, 只使用 CLI(
build、verify、score、skill),并自行编辑 YAML 文件。
导入现有资料
honest-cv import 可读取 JSON Resume 文件,或 LinkedIn 的数据导出文件
(设置 → 数据隐私 → 下载你的数据,即一份 CSV 压缩包,或浏览器解压后的文件夹)。请下载完整档案:
选择文件时提供的基础档案只有你的标题和简介,不包含职位经历。联系方式、职位经历、教育经历、
认证、语言以及每份职位经历的成就都会导入个人资料;如果有标题和简介,它还会创建第一个变体,
这样你就可以立即运行 build。
- 只添加个人资料中缺少的内容,绝不会覆盖现有内容。请先试用
--dry-run。 - 导入的成就会标记为
imported:请检查其措辞。 - 导入的技能不会附带级别,因为这两种格式都不会说明你是否在生产环境中使用过某项技能。
这些技能会写入
imported-skills.md,作为待你标记的清单。
LinkedIn 的“另存为 PDF”可能会在不通知的情况下更改个人资料布局,因此不会解析此类文件:使用 MCP
客户端时,import_linkedin_pdf 提示词会读取其中的文本,并列出各个部分供你审核。
跟踪求职申请
honest-cv apps 会在个人资料文件夹中的 applications.yaml 里记录日志:哪个变体和哪些文件发送给了哪家公司,
以及各状态及其日期(draft、applied、interview、offer、rejected、withdrawn)。再次记录同一家公司和职位
时,会更新已有记录。使用 MCP 客户端时,助手会在生成简历或求职信后询问是否记录申请;list_applications
会指出两周没有消息的申请。它会在 sent/ 中保存每份已发送文件的副本,因为下一次构建会覆盖 out/;
还会在 posts/ 中保存职位描述文本,因为链接可能会过期。你也可以询问面试准备事项:问助手
“我需要为 Acme 准备什么?”。
收到面试通知后,请说 “帮我准备 Acme 的面试”(或运行
interview_prep 提示词)。对于已保存职位描述中的每个关键词,honest-cv 会列出你的级别、
相关证据及支撑它的要点,并优先展示你所发送简历中的要点。你的助手会根据这些要点起草可能的问题及
STAR 回答、针对你仅达到熟悉程度或尚不具备的内容给出诚实回答,并列出你可以向对方提问的问题。
你批准的笔记会保存到 prep/。如果不使用 AI 客户端:honest-cv apps prep ~/cv-profile acme_sre -k "Kafka,Scala"。
honest-cv linkedin 会将一个变体转换为 LinkedIn 文案,每部分都不超过字数限制:标题
(你的职位和最多五项生产环境技能)、About(摘要和成就要点)、每个职位根据其要点生成的一段
描述,以及技能列表。它会将这些内容写入 Markdown 文件,供你复制。技能仅包含 P 和 L:LinkedIn 无法标注熟悉程度,因此不会包含 F 技能,也绝不会出现 X 技能。使用 MCP 客户端时,linkedin_profile 提示词会润色文案,并使用 check_claims 检查内容。
导出
反向操作时,honest-cv export 会将变体写出为 JSON Resume,供其他 CV 工具和网站使用,规则与 CV 相同:绝不会包含 X 技能;F 技能只会以对应级别列在 “Familiarity” 分组中。
求职信
cover_letter 提示词会根据职位招聘信息和你自己的要点起草一页求职信。生成前,check_claims 会将文本与你的个人资料进行比对:
- 问题会阻止生成: 你标记为 X 的技能,或是将熟悉程度技能描述为经验(例如,Rust 为 F 时写“I use Rust in production”;写“I am familiar with Rust”则没问题)。
- 警告供你审核: 你的技能清单和要点中都没有出现的技术,或个人资料中从未出现过的数字。如果属实,先将其记录下来;否则,就会从求职信中删除。
求职信会使用 CV 的字体,并通过相同的 ATS 检查。没有 AI 客户端时,请在文本文件中撰写(段落之间用空行分隔),然后使用 honest-cv letter check 和 letter build。
CLI
使用 uvx honest-cv ... 运行任意命令,或使用 uv tool install honest-cv 安装一次,以后只需输入 honest-cv。
honest-cv init ~/cv-profile # create the profile templates
honest-cv build ~/cv-profile -v backend -l en -l es # PDF + DOCX, verified on every build
honest-cv verify any-cv.pdf --text # check any PDF, even one made elsewhere
honest-cv score ~/cv-profile -k "Kubernetes,Go" -p "Rust" # coverage per variant, with gaps
honest-cv skill ~/cv-profile "Rust" L --evidence "CLI tool on GitHub" # asks you to confirm
honest-cv import ~/cv-profile linkedin-export.zip --dry-run # or resume.json
honest-cv export ~/cv-profile -v backend -l en # JSON Resume
honest-cv apps log ~/cv-profile --company Acme --role "SRE" -s applied -v platform
honest-cv apps list ~/cv-profile # latest first, with counts
honest-cv apps prep ~/cv-profile acme_sre -k "Kafka,Scala" # what backs each keyword, for the interview
honest-cv linkedin ~/cv-profile -v platform -l en # texts to paste into LinkedIn
honest-cv remove skill ~/cv-profile "Kafka" # asks you to confirm
honest-cv letter check ~/cv-profile letter.txt -k "Kubernetes,Go" # claims your profile doesn't support
honest-cv letter build ~/cv-profile letter.txt --company Acme --role "Platform Engineer" -l en
honest-cv serve --profile ~/cv-profile # the MCP server, over stdio
verify 适用于任何 PDF。使用 --text 查看解析器准确提取的内容。它的
single_column 检查还可以捕获一种常见缺陷:日期右对齐,导致解析器将其与对应职位分开。
MCP 工具和提示词
| 名称 | 功能 |
|---|---|
init_profile | 创建个人资料文件夹,并附带带注释的模板。 |
get_inventory | 按级别分组返回你的技能,并附上年限和佐证。 |
set_skill | 添加或更改一项技能。若要提升技能级别,需要提供佐证,并会要求你确认。 |
set_skills | 一次添加或更改多项技能。升级会通过一个问题确认,其中会列出每项更改。 |
checklist_list | 列出内置清单。 |
checklist_new | 将内置清单合并到一个文件中,并根据你的技能清单预先填写内容。 |
checklist_apply | 保存清单中标记的技能,并返回仍需佐证的条目。 |
add_bullet | 将一项成就添加到内容池。 |
remove_skill、remove_bullet、remove_role、remove_publication | 永久删除,并移除所有版本中的相关内容。包含要点的职位需要使用 with_bullets。客户端会在运行这些工具前征求确认。 |
set_contact | 更改联系信息:姓名、电子邮件、电话、所在地和链接。 |
set_profile_details | 替换认证列表、课程列表和口语语言这一行。 |
upsert_role | 按日期顺序添加职位,或更改现有职位的字段。 |
upsert_education | 添加或更改一条教育经历。 |
upsert_publication | 添加或更改本人撰写的书籍、文章或论文。每个版本都会显示全部出版物,或其列出的出版物。 |
save_variant | 添加或替换一个版本。保存前会检查所有引用。 |
list_variants | 列出继承后的各个版本,包括要点文本,以及没有任何版本使用的要点。 |
build_cv | 生成 PDF 和/或 DOCX,并进行验证。 |
verify_pdf | 对任意 PDF 运行 ATS 检查,并返回提取出的文本。 |
score_job | 衡量每个版本的关键词覆盖率。关键词由客户端提取。 |
gap_report | 按你可以如何诚实应对,归类缺失的关键词。 |
提示词 interview | 一次提问一个问题,逐步完善你的技能清单和要点内容池。 |
check_claims | 根据你的个人资料检查任意文本:阻止将 X 级技能和熟悉程度包装成经验,并标出个人资料中未体现的内容。 |
build_letter | 生成一页的求职信 PDF 和 DOCX,并进行与简历相同的 ATS 检查。如果 check_claims 发现问题,则拒绝生成。 |
提示词 tailor_for_job | 为各版本评分、说明差距、调整一个版本并重新生成。 |
提示词 cover_letter | 根据你的要点为职位发布内容起草求职信,检查其中的陈述并生成求职信。 |
import_profile | 导入 JSON Resume 或 LinkedIn 数据导出文件,只添加缺失内容。对于 LinkedIn PDF,返回其文本。 |
export_json_resume | 将一个版本导出为 JSON Resume;X 级技能不会出现,F 级技能会保留其标签。 |
log_application | 记录一份申请(公司、职位、简历版本、发送的文件、职位发布文本、准备事项),或记录新的状态及其日期。 |
linkedin_profile | 根据一个版本生成符合 LinkedIn 字数限制的 LinkedIn 标题、自我介绍、职位描述和技能(仅限 P 和 L 级)。 |
list_applications | 按时间倒序列出申请,显示各状态的数量,以及 14 天以上没有消息的申请。 |
interview_prep | 针对一份申请,提供已保存的职位发布内容,以及每个关键词对应的你的级别、佐证和支持该关键词的要点。保存准备笔记。 |
提示词 import_linkedin_pdf | 经你批准,按章节将 LinkedIn 的“保存为 PDF”生成的 PDF 转换为个人资料。 |
提示词 linkedin_profile | 润色一个版本的 LinkedIn 文本,不添加未经证实的陈述,并使用 check_claims 进行检查。 |
提示词 interview_prep | 准备面试:预测可能的问题,根据你自己的要点撰写 STAR 答案,并为差距准备诚实的回答。 |
ATS 保证
模板会强制执行以下要求。每次构建时,verify 都会检查这些要求;测试套件也会在 CI 中针对 Linux、macOS 和 Windows 运行:
- 单栏。不得使用布局表格、图片、图标、页眉或页脚。
- 关闭连字和字距调整,不进行断字,并确保“CI/CD”、URL 和电子邮件等内容不会跨行拆分。
- 阅读顺序与源文档顺序一致。日期与对应的职位位于同一行。
- 文本可由 pypdf 和 pdfminer.six 提取,且两者结果一致。
- 字体(Carlito,与 Calibri 度量兼容)会嵌入文档,并在每台机器上保持一致。
开发
uv sync
uv run pytest
uv run honest-cv build examples/ada -l en -l es
仓库的 .mcp.json 会使用虚构配置注册 honest-cv-dev,因此 Claude Code 在此文件夹中可以使用你的工作副本。请参阅 CONTRIBUTING.md。
许可证
MIT。随附的 Carlito 字体采用 SIL Open Font License;请参阅
src/honest_cv/render/fonts/OFL.txt。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。