内容
# 职业打造
一款MCP服务器,能将您的简历转化为有针对性的职位申请——解析、匹配和求职信,完全在您的机器上运行。
指向克劳德桌面、克劳德代码或光标,然后询问:
> 读取我位于 ~/Documents/cv.pdf 的简历,找到我有竞争力的远程数据角色,并告诉我为最佳角色我还缺少什么。
除了职位板搜索本身外,您的计算机上没有任何信息离开。没有API密钥,没有账户,也没有遥测。
[](https://github.com/tpequegnot/careercraft-mcp/actions/workflows/ci.yml)
[](https://pypi.org/project/careercraft-mcp/)
[](https://pypi.org/project/careercraft-mcp/)
[](LICENSE)
---
## 安装
### 克劳德桌面
将以下内容添加到 `claude_desktop_config.json`,然后重启克劳德桌面:
```json
{
"mcpServers": {
"careercraft": {
"command": "uvx",
"args": ["careercraft-mcp"]
}
}
}
```
配置文件位于:
| 操作系统 | 路径 |
|---|---|
| macOS | `~/Library/Application Support/Claude/claude_desktop_config.json` |
| Windows | `%APPDATA%\Claude\claude_desktop_config.json` |
| Linux | `~/.config/Claude/claude_desktop_config.json` |
要读取PDF简历——您可能需要这样做——请使用 `[pdf]` 额外功能:
```json
{
"mcpServers": {
"careercraft": {
"command": "uvx",
"args": ["--from", "careercraft-mcp[pdf]", "careercraft-mcp"]
}
}
}
```
### 克劳德代码
```bash
claude mcp add careercraft -- uvx --from 'careercraft-mcp[pdf]' careercraft-mcp
```
### 光标
将相同的 `mcpServers` 块添加到 `~/.cursor/mcp.json`。
### 无MCP主机
```bash
uv tool install 'careercraft-mcp[pdf]'
careercraft doctor # 这个安装可以做什么
careercraft parse ~/cv.pdf # 解析简历,打印JSON
careercraft api # HTTP API,http://127.0.0.1:8000/docs
```
---
## 功能
七种工具,通常的路径是三种:
| 工具 | 功能 |
|---|---|
| `parse_resume` | 从PDF、Word或文本简历中提取技能、职位、教育和联系信息。 |
| `match_jobs` | 将职位发布与简历进行排名,提供每个职位的理由和*缺少的技能*列表。 |
| `generate_cover_letter` | 根据两个文件草拟一封信。 |
| `search_jobs` | 获取远程职位发布。`match_jobs`如果您传递查询,它将执行此操作。 |
| `get_job` | 获取一个完整的职位发布。 |
| `list_resumes` | 到目前为止解析的所有内容。 |
| `save_job` | 书签一个职位发布,以便它在缓存过期后仍然存在。 |
此外,模型可以直接读取的资源——`careercraft://capabilities`、`careercraft://resume/{id}`、`careercraft://jobs/recent`——以及三个提示(`job_search_workflow`、`tailor_cover_letter`、`resume_feedback`),您的主机将作为斜杠命令显示。
### 自我解释的匹配
每个匹配项都报告了职位发布要求哪些技能**以及您的简历中未提及哪些技能**。第二个列表是有用的:它是您与职位发布之间的差距,以职位发布自己的词汇表示。
```
0.68 数据工程师在Northwind
共享5种技能:Python、SQL、Airflow、AWS、ETL。
职位发布还要求:dbt、Snowflake、Spark。
```
如果您无法满足职位发布的资历或学位要求,则在排名之前会过滤掉这些职位发布,因此新毕业生不会看到以高级工程师职位发布为主的列表。传递 `filter_seniority=false` 以查看所有内容。
### 没有本地模型的求职信
如果您运行的是 [Ollama](https://ollama.com),则由您的本地模型编写信件。如果您没有,`generate_cover_letter` 返回一个**简短**的文字:主题、从您的简历中提取的证据、职位发布的特定钩子和段落计划。
然后,您的MCP主机根据该简短文字撰写信件——这通常是*更好的*结果,因为阅读它的模型比本地1B模型强大得多。无需安装即可实现此功能。
---
## 安装大小和可选内容
基本安装故意保持小规模,因此 `uvx careercraft-mcp` 在几秒钟内启动,而不是下载机器学习堆栈。每个繁重的依赖项都是一个额外项,服务器会诚实地报告它可以做什么。
| 安装 | 大小 | 添加 |
|---|---|---|
| `careercraft-mcp` | ~75 MB | 文本简历、关键词匹配、信件简介、模板 |
| `[pdf]` | +30 MB | PDF和Word简历、布局感知章节检测 |
| `[nlp]` | +200 MB | spaCy NER,用于不在第一行的人员名称 |
| `[ocr]` | +20 MB | 扫描的PDF(还需要`tesseract`二进制文件) |
| `[embeddings]` | **+2.5 GB** | 语义匹配代替关键词匹配 |
| `[api]` | +15 MB | Web UI后面的HTTP API |
| `[all]` | ~2.8 GB | 所有内容 |
关键词匹配是默认的,不作为备用:它是TF-IDF余弦相似度与技能覆盖相结合,并且在职位发布中——它们是短的、关键词密集的文档——它表现良好,占用很小。安装 `[embeddings]` 如果您想要语义匹配;您不需要它来获得有用的结果。
运行 `careercraft doctor` 以查看您的安装支持什么以及启用其余部分的精确命令。
---
## 配置
所有内容都是环境变量,MCP主机通过环境变量配置服务器:
```json
{
"mcpServers": {
"careercraft": {
"command": "uvx",
"args": ["--from", "careercraft-mcp[pdf]", "careercraft-mcp"],
"env": {
"CAREERCRAFT_ALLOWED_PATHS": "/Users/you/Documents",
"CAREERCRAFT_OLLAMA_MODEL": "llama3.2:3b"
}
}
}
}
```
| 变量 | 默认值 | 含义 |
|---|---|---|
| `CAREERCRAFT_DATA_DIR` | 平台数据目录 | SQLite数据库和上传文件的位置 |
| `CAREERCRAFT_ALLOWED_PATHS` | `~` | `parse_resume(path=…)` 可以读取的根目录 |
| `CAREERCRAFT_MAX_UPLOAD_BYTES` | `10485760` | 上传大小上限 |
| `OLLAMA_BASE_URL` | `http://127.0.0.1:11434` | 设置为 `disabled` 以关闭生成 |
| `CAREERCRAFT_OLLAMA_MODEL` | `llama3.2:1b` | 您可以拉取的任何模型 |
| `CAREERCRAFT_EMBEDDING_MODEL` | `all-MiniLM-L6-v2` | 仅在 `[embeddings]` 下使用 |
| `CAREERCRAFT_TRANSPORT` | `stdio` | `stdio` 或 `http` |
| `CAREERCRAFT_HOST` / `CAREERCRAFT_PORT` | `127.0.0.1` / `8000` | HTTP绑定 |
| `CAREERCRAFT_AUTH_TOKEN` | *(无)* | 绑定到除环回以外的任何主机时需要 |
| `CAREERCRAFT_LOG_LEVEL` | `INFO` | |
`careercraft info` 打印已解析的配置。
---
## 隐私和安全
- **您的简历保留在本地。** 它在您的机器上被解析并存储在本地SQLite文件中。唯一的出站请求是职位板搜索,仅发送您的查询字符串。
- **路径是允许的。** `parse_resume(path=…)` 解析符号链接,然后检查包含关系,因此路径在 `CAREERCRAFT_ALLOWED_PATHS` 之外的路径将被拒绝而不是读取。
- **本地路径在HTTP上被完全拒绝。** 在 `--transport http` 下,调用者不一定是您,因此 `path=` 被直接拒绝;改为上传。
- **服务器拒绝不安全地暴露自己。** 绑定到除环回以外的任何主机而没有 `CAREERCRAFT_AUTH_TOKEN` 是错误而不是警告。
- **删除所有内容** 通过删除 `careercraft info` 报告的数据目录。
---
## Docker
```bash
docker compose up
```
在 `http://127.0.0.1:8000` 上启动API,在 `http://127.0.0.1:3000` 上启动Web UI,两者都在环回上。docker-compose文件已经将 `OLLAMA_BASE_URL` 指向 `host.docker.internal`,因此主机侧的Ollama可以从容器中访问。
---
## 开发
```bash
git clone https://github.com/tpequegnot/careercraft-mcp
cd careercraft-mcp
uv venv && uv pip install -e '.[all,dev]'
pre-commit install
pytest
ruff check src tests
mypy
```
分层结构由linter强制执行,而不是通过约定:`careercraft.core` 不得导入 `fastmcp`、`fastapi` 或 `sqlite3`,因此领域逻辑保持可测试和可重用,而无需使用它们。
参见 [CONTRIBUTING.md](CONTRIBUTING.md) 以获取其余部分,以及 [docs/MIGRATION-PLAN.md](docs/MIGRATION-PLAN.md) 以了解架构为何如此设计。
---
## 许可证
MIT。参见 [LICENSE](LICENSE)。