一小时把简历系统接入 Claude:手把手实现 ATS 优化简历的 MCP 服务
✅ 他们本来就有啥?(省掉 80% 工作量)
- 后端是 Go 单体仓库,稳定跑着
- 简历数据全存在 Firestore(Google 的 NoSQL 数据库)
- 用户登录走 Firebase Auth(不用自己搭账号系统)
- 最关键的是:已有统一简历数据格式(resume-standard),字段清晰、结构规范——AI 一看就懂,不靠“猜”
👉 所以,真正的挑战不是“怎么存简历”,而是:“怎么让 Claude 安全、合法、有权限地来读/写它?”
🔑 最难的不是代码,是“开门的钥匙”:OAuth 2.1 + PKCE
MCP 客户端(比如 Claude Code)不会直接发 token,它要求一套标准认证流程:
/.well-known/oauth-protected-resource(告诉 AI:“我支持什么权限”)- 动态客户端注册(AI 自动注册自己为“合法访客”)
- PKCE 加密防窃听(比传统密码更安全)
这听起来很重?确实——光 OAuth 基础设施就写了几百行。但好消息是:只写一次,后面所有工具都复用。就像装好门锁,之后挂多少把钥匙(工具)都轻松。
🛠️ 三个核心工具(极简但够用)
他们先上线了最基础的 3 个 MCP 工具,验证整个链路是否通:
list_resumes:列出你所有简历(返回 ID + 标题 + 更新时间)read_resume:根据resume_id读取完整简历 JSON(含 ATS 关键字段:skills、experience、education…)write_resume:智能写入——不传resume_id就新建;传了就更新,且只改你明确给的字段(见下文修复!)
💡 为什么
write_resume不拆成 create/update?
因为 Claude 内部思考方式就是:“我要改这份简历”或“我要做一份新简历”。强行拆开会增加 AI 的推理负担。一个接口 + 可选参数,更自然、更鲁棒。
⚠️ 关键修复:别一写就清空整份简历!
上线前代码审查发现一个隐蔽大坑:
// ❌ 危险写法:直接覆盖整个 Firestore 文档
_, err := client.Collection("resumes").Doc(resumeID).Set(ctx, updatedData)
问题在哪?
AI 每次只传它想改的字段(比如只改 summary 或加一条 job),但上面代码会把 Firestore 里原有的 template_id、custom_css、privacy_settings 全部清空!
✅ 正确做法:深合并(deep merge),只更新传入字段,其余保留:
// ✅ 安全写法:只更新传入字段,其他保持原样
docRef := client.Collection("resumes").Doc(resumeID)
// 先读旧数据
oldData := make(map[string]interface{})
if err := docRef.Get(ctx).Map(&oldData); err != nil {
return errors.New("failed to read existing resume")
}
// 将 updatedData 深度合并进 oldData(Go 中可用第三方库如 "github.com/mitchellh/mapstructure" 或手动递归)
mergedData := deepMerge(oldData, updatedData) // ← 这里是关键逻辑
_, err := docRef.Set(ctx, mergedData, firestore.MergeAll)
注释说明:
firestore.MergeAll是 Firestore 的原生功能,表示“只更新传入的 key,其他字段不动”。无需手写深合并逻辑——Go SDK 已内置支持。
🚀 效果:一句话接入,全程可视化授权
用户只需在 Claude 中输入:
claude mcp add rezi --transport http https://api.rezi.ai/mcp
→ Claude 自动弹出浏览器授权页
→ 你点“允许”(用现有 Rezi 账号登录)
→ 授权后,Claude 就能:
– list_resumes 查你有几份简历
– read_resume --id abc123 看某份细节
– write_resume --id abc123 --summary "AI 工程师,专注开发者体验" 实时保存
所有操作都在一次对话流里完成,没有跳转、没有复制粘贴、不暴露原始数据库密钥。
➕ 后续扩展:从“管简历”到“找工作闭环”
验证 MVP 成功后,立刻加了两个新工具:
search_jobs:根据当前简历自动搜匹配职位(用简历里的 skills/experience 当搜索关键词)get_job_details:拉取某岗位的完整 JD(公司、要求、薪资范围等)
现在完整工作流是:
读我的简历 → 搜 10 个匹配岗位 → 挑一个 → 让 Claude 自动重写简历(突出匹配项)→ 一键导出 PDF
全部在同一个聊天窗口里完成。
直达网址:https://rezi.io
