内容
# 简历MCP服务器
[](https://github.com/mnoomnoo/resume-mcp-server/actions/workflows/ci.yml)
[](https://www.gnu.org/licenses/gpl-3.0)
[](https://www.python.org/)
[](https://modelcontextprotocol.io)
[](https://pypi.org/project/resume-mcp-server/)
[](https://glama.ai/mcp/servers/mnoomnoo/resume-mcp-server)
一个MCP服务器,为Claude(或其他MCP客户端)提供结构化、可搜索的简历集合访问权限 - 简历、求职信和申请材料,支持 `.docx`、`.pdf`、`.md` 或 `.txt` 格式。
求职者通常会积累大量的文件:多个针对不同职位的简历版本、求职信草稿、参考资料。手动搜索这些文件来起草新的申请非常耗时。可以将此服务器指向您的简历文件夹,Claude可以回答问题,例如 *"哪些简历强调了Kubernetes经验?"*、 *"我在后端角色中列出了哪些成就?"* 或 *"根据我在Acme Corp的工作经历,起草一封求职信"* - 无需您粘贴任何内容。
服务器将每个文档解析为结构化数据(联系信息、工作经历、教育背景、技能、个人项目),并提供27种工具,涵盖全文搜索、技能查找、公司和职位查询、成就挖掘、教育搜索、收藏分析等。文件会被监视并自动重新索引,因此对文档的编辑会立即生效。
---
## 快速开始
为Claude提供结构化访问您的简历集合。服务器在启动时解析文档,并提供27种工具用于按名称、公司、技能、教育背景、个人项目或全文搜索,以及技能频率和收藏统计的分析工具 - 并支持文件变更时的自动热加载。
**立即使用附带的示例简历试用:**
```bash
pip install resume-mcp-server
RESUME_DIR=./sample_resumes resume-mcp-server
```
然后连接Claude Code:
```bash
claude mcp add resume-collection resume-mcp-server -e RESUME_DIR=$(pwd)/sample_resumes
```
有关持久化设置,请参阅 [Docker部署](#docker-deploy) 或 [开发环境](#dev-environment)。
---
## Docker部署
推荐的服务器运行方式。Docker Compose通过HTTP公开服务器,因此任何AI客户端都可以连接到它。
### 1. 设置简历目录
复制示例env文件并设置您的文档路径:
```bash
cp .env.example .env
# 然后编辑.env中的RESUME_DIR_HOST
```
### 2. 同步镜像版本(可选)
使用当前 `pyproject.toml` 版本标记镜像:
```bash
python scripts/sync_version.py
```
### 3. 构建和启动
```bash
docker compose build resume-mcp
docker compose up -d
```
服务器现在可在 `http://localhost:8001/mcp` 访问。
### 4. 连接您的AI客户端
**Claude Desktop** (`~/Library/Application Support/Claude/claude_desktop_config.json` 在macOS上):
```json
{
"mcpServers": {
"resume-collection": {
"type": "http",
"url": "http://localhost:8001/mcp"
}
}
}
```
**VS Code** (`.vscode/mcp.json`):
```json
{
"servers": {
"resume-collection": {
"type": "http",
"url": "http://localhost:8001/mcp"
}
}
}
```
**Claude Code**:
```bash
claude mcp add resume-collection --transport http http://localhost:8001/mcp
```
要全局添加,请将以下内容添加到 `~/.claude.json`:
```json
{
"mcpServers": {
"resume-collection": {
"type": "http",
"url": "http://localhost:8001/mcp"
}
}
}
```
### 停止
```bash
docker compose down
```
### Docker(stdio)
直接运行镜像 - 无需Compose - 适用于使用stdio传输的MCP客户端(包括Glama.ai和Claude Desktop):
```bash
docker run -i --rm -v /path/to/your/resumes:/resumes resume-mcp-server
```
**Claude Desktop** (`~/Library/Application Support/Claude/claude_desktop_config.json` 在macOS上):
```json
{
"mcpServers": {
"resume-collection": {
"command": "docker",
"args": ["run", "-i", "--rm", "-v", "/path/to/your/resumes:/resumes", "resume-mcp-server"]
}
}
}
```
---
## 开发环境
适用于本地开发或在没有Docker的情况下运行服务器。
### 先决条件
Python 3.12+
### 安装
```bash
pip install .
# 包括测试依赖:
pip install ".[dev]"
```
### 运行
```bash
resume-mcp-server
# 使用自定义目录:
RESUME_DIR=/path/to/docs resume-mcp-server
```
或在您运行服务器的目录中创建 `.env` 文件:
```bash
# .env
RESUME_DIR=/path/to/docs
FASTMCP_PORT=8001
```
然后直接运行 `resume-mcp-server` - `.env` 文件将自动加载。shell中已经设置或由MCP客户端设置的环境变量始终优先于`.env`值。
### 连接您的AI客户端(stdio)
**Claude Desktop**:
```json
{
"mcpServers": {
"resume-collection": {
"command": "resume-mcp-server",
"env": {
"RESUME_DIR": "/path/to/your/resumes"
}
}
}
}
```
如果 `resume-mcp-server` 不在您的 `PATH` 中,请使用完整路径(例如 `~/.venv/bin/resume-mcp-server`)。
**Claude Code**:
```bash
claude mcp add resume-collection resume-mcp-server -e RESUME_DIR=/path/to/your/resumes
```
**uvx:**
```json
{
"mcpServers": {
"resume-collection": {
"command": "uvx",
"args": ["resume-mcp-server"],
"env": {
"RESUME_DIR": "/path/to/your/resumes"
}
}
}
}
```
---
## 配置
**Docker Compose** (`.env`):
| 变量 | 描述 |
|---|---|
| `RESUME_DIR_HOST` | 您机器上的文档目录路径 - 挂载到容器内的 `/resumes` |
| `FASTMCP_PORT` | HTTP服务器监听的端口(默认为 `8001`) |
| `LOG_LEVEL` | 日志详细程度: `DEBUG`、`INFO`、`WARNING`、`ERROR`(默认为 `INFO`) |
**本地运行** (环境变量或 `.env`):
| 变量 | 默认值 | 描述 |
|---|---|---|
| `RESUME_DIR` | `~/resumes` | 扫描文档的目录 |
| `FASTMCP_TRANSPORT` | `http`(本地)/ `stdio`(Docker镜像) | 传输协议(`http` 或 `stdio`) |
| `FASTMCP_HOST` | `0.0.0.0` | 绑定地址 |
| `FASTMCP_PORT` | `8001` | HTTP服务器监听的端口 |
如果存在,服务器启动时会自动加载工作目录中的 `.env` 文件。shell环境变量和MCP客户端设置的值始终优先于 `.env` 值。
服务器在启动时递归扫描 `RESUME_DIR`,并在文件更改时自动重新加载。
### 文档类型推断
根据文件名推断类型:
| 类型 | 文件名模式 |
|---|---|
| `resume` | 包含 `resume` |
| `cover_letter` | `cover letter`、`_cl.`、`coverletter` |
| `application_material` | `interview`、`study guide`、`why_`、`application question`、`job desc` |
| `other` | 其他所有文件 |
---
## 搜索行为
所有 `search_*` 工具都将查询字符串按空格分隔,并支持通过可选的 `mode` 参数使用两种令牌匹配模式:
| `mode` | 行为 |
|---|---|
| `"and"` *(默认)* | 所有令牌必须出现在同一个字段中。 `"latency throughput"` 只匹配包含两个单词的描述。 |
| `"or"` | 任何令牌都足够。 `"latency throughput"` 匹配包含任一单词的描述。 |
**多字段注意:** 对于搜索多个字段的工具(公司名称、职位名称、成就文本等),AND模式要求所有令牌共存于 **相同** 字段中,而不是分布在各个字段中。当您想要更宽松的跨字段匹配时,请使用OR模式。
**单字查询** 在两种模式下的行为相同。
---
## 分页
所有 `list_*` 工具都接受 `limit`(默认为 `100`)和 `offset`(默认为 `0`)参数,并返回一致的信封:
```json
{"total_count": 247, "items": [...]}
```
`total_count` 是切片前的完整集合大小。要检查是否存在更多页面:`offset + len(items) < total_count`.
---
## MCP工具
### `list_resume_summaries`
列出所有简历作为轻量级身份记录。首先使用此工具来定位并选择 `resume_id`,然后获取详细信息 - 比 `list_resumes` 更高效。
| 参数 | 类型 | 描述 |
|---|---|---|
| `limit` | 整数(可选) | 结果的最大数量(默认为 `100`) |
| `offset` | 整数(可选) | 要跳过的结果数量(默认为 `0`) |
返回:分页信封 - `total_count` + `items`,其中每个项目都有 `id`、`first_name`、`last_name`、`email`、`phone_num`。
---
### `list_resumes`
列出所有文档,可选地按类型筛选。
| 参数 | 类型 | 描述 |
|---|---|---|
| `doc_type` | 字符串(可选) | `resume`、`cover_letter`、`application_material` 或 `other` |
| `limit` | 整数(可选) | 结果的最大数量(默认为 `100`) |
| `offset` | 整数(可选) | 要跳过的结果数量(默认为 `0`) |
返回:分页信封 - `total_count` + `items`.
---
### `get_resume`
返回文档的完整提取文本。
| 参数 | 类型 | 描述 |
|---|---|---|
| `path` | 字符串 | `list_resumes` 返回的相对路径 |
---
### `get_resume_profile`
获取简历的顶级字段(联系信息、职业声明、教育背景)而无需嵌套的工作经验或徽章技能列表。优先使用此工具而不是 `get_resume`,当您需要结构化的联系数据而不是原始文本时。
| 参数 | 类型 | 描述 |
|---|---|---|
| `resume_id` | 字符串 | `list_resume_summaries` 或 `search_resumes_by_name` 返回的简历ID |
---
### `search_resumes`
对所有文档进行全文搜索(不区分大小写),按匹配数量排序。
| 参数 | 类型 | 描述 |
|---|---|---|
| `query` | 字符串 | 要搜索的文本 |
| `doc_type` | 字符串(可选) | 按类型筛选(与 `list_resumes` 相同的值) |
---
### `search_resumes_by_name`
按人名(名或姓)查找简历。返回最小身份字段 - 使用返回的 `id` 结合其他工具获取完整详细信息。
| 参数 | 类型 | 描述 |
|---|---|---|
| `query` | 字符串 | 搜索片段(不区分大小写,部分匹配) |
| `mode` | 字符串(可选) | `"and"` *(默认)* 或 `"or"` - 参见 [搜索行为](#search-behavior) |
返回:`id`、`first_name`、`last_name`、`email`、`phone_num`.
---
### `search_resumes_by_skill`
查找列出给定徽章技能的简历。返回简历身份和匹配的技能名称 - 比 `list_resumes` 更高效地按技能筛选。
| 参数 | 类型 | 描述 |
|---|---|---|
| `skill` | 字符串 | 技能标题片段(不区分大小写,部分匹配) |
| `mode` | 字符串(可选) | `"and"` *(默认)* 或 `"or"` - 参见 [搜索行为](#search-behavior) |
返回:`id`、`first_name`、`last_name`、`matched_skills`.
---
### `search_skills`
按标题搜索徽章技能(技术、工具、语言)。
| 参数 | 类型 | 描述 |
|---|---|---|
| `query` | 字符串 | 技能标题中的搜索文本(不区分大小写) |
| `mode` | 字符串(可选) | `"and"` *(默认)* 或 `"or"` - 参见 [搜索行为](#search-behavior) |
---
### `search_work_experiences`
按公司名称、职位名称或成就描述搜索工作经验。
每个结果都包含一个 `resume_id` 字段,标识简历属于哪份简历。
| 参数 | 类型 | 描述 |
|---|---|---|
| `query` | 字符串 | 搜索文本(不区分大小写) |
| `mode` | 字符串(可选) | `"and"` *(默认)* 或 `"or"` - 参见 [搜索行为](#search-behavior) |
---
### `list_work_experiences`
列出工作经验条目,可选地限定为单个简历和/或仅限当前角色。
| 参数 | 类型 | 描述 |
|---|---|---|
| `resume_id` | 字符串(可选) | `list_resume_summaries` 返回的简历ID |
| `current_only` | 布尔值(可选) | 如果 `true`,则仅返回 `end_date` 为 `"Present"` 的角色 |
| `limit` | 整数(可选) | 结果的最大数量(默认为 `100`) |
| `offset` | 整数(可选) | 要跳过的结果数量(默认为 `0`) |
返回:分页信封 - `total_count` + `items`.
---
### `get_work_experience`
获取单个工作经验条目及其成就弹。
| 参数 | 类型 | 描述 |
|---|---|---|
| `id` | 字符串 | `list_work_experiences` 返回的工作经验ID |
---
### `list_achievements`
列出所有成就弹,可选地限定为单个简历。
| 参数 | 类型 | 描述 |
|---|---|---|
| `resume_id` | 字符串(可选) | `list_resumes` 返回的简历ID |
| `limit` | 整数(可选) | 结果的最大数量(默认为 `100`) |
| `offset` | 整数(可选) | 要跳过的数量(默认为 `0`) |
返回:分页信封 - `total_count` + `items`.
---
### `get_achievement`
按ID获取单个成就弹。
| 参数 | 类型 | 描述 |
|---|---|---|
| `id` | 字符串 | `list_achievements` 返回的成就ID |
---
### `search_achievements`
直接搜索成就描述,返回仅匹配的弹幕,同时附带最少的父上下文。比 `search_work_experiences` 更高效,当您只需要匹配弹幕。
| 参数 | 类型 | 描述 |
|---|---|---|
| `query` | 字符串 | 在成就描述中搜索的文本(不区分大小写) |
| `resume_id` | 字符串(可选) | 搜索范围限定为单个简历 |
| `mode` | 字符串(可选) | `"and"` *(默认)* 或 `"or"` - 参见 [搜索行为](#search-behavior) |
返回:`id`、`desc`、`company_name`、`position_title`、`work_experience_id`、`resume_id`.
---
### `list_badge_skills`
列出所有徽章技能,可选地限定为单个简历。
| 参数 | 类型 | 描述 |
|---|---|---|
| `resume_id` | 字符串(可选) | `list_resumes` 返回的简历ID |
| `limit` | 整数(可选) | 结果的最大数量(默认为 `100`) |
| `offset` | 整数(可选) | 要跳过的数量(默认为 `0`) |
返回:分页信封 - `total_count` + `items`.
---
### `get_badge_skill`
按ID获取单个徽章技能。
| 参数 | 类型 | 描述 |
|---|---|---|
| `id` | 字符串 | `list_badge_skills` 返回的徽章技能ID |
---
### `list_side_projects`
列出个人/投资组合项目(与工作经验不同),这些项目展示了特定技术的熟练程度,可选地限定为单个简历。
| 参数 | 类型 | 描述 |
|---|---|---|
| `resume_id` | 字符串(可选) | `list_resume_summaries` 返回的简历ID |
| `limit` | 整数(可选) | 结果的最大数量(默认为 `100`) |
| `offset` | 整数(可选) | 要跳过的数量(默认为 `0`) |
返回:分页信封 - `total_count` + `items`.
---
### `get_side_project`
获取单个副项目信息,包括它展示的技术。
| 参数 | 类型 | 描述 |
|---|---|---|
| `id` | 字符串 | `list_side_projects` 返回的副项目ID |
---
### `search_side_projects`
按名称、描述或关联技术搜索副项目。
每个结果都包含一个 `resume_id` 字段,标识该项目属于哪份简历。
| 参数 | 类型 | 描述 |
|---|---|---|
| `query` | 字符串 | 搜索文本(不区分大小写) |
| `resume_id` | 字符串(可选) | 限定搜索范围为单个简历 |
| `mode` | 字符串(可选) | `"and"` *(默认)* 或 `"or"` - 参见 [搜索行为](#search-behavior) |
---
### `search_side_projects_by_technology`
查找展示给定技术熟练程度的副项目。
| 参数 | 类型 | 描述 |
|---|---|---|
| `technology` | 字符串 | 搜索的技术/技能名称片段(不区分大小写,部分匹配) |
| `mode` | 字符串(可选) | `"and"` *(默认)* 或 `"or"` - 参见 [搜索行为](#search-behavior) |
返回:`id`、`name`、`description`、`matched_technologies`、`resume_id`.
---
### `list_education`
列出教育条目(学位、机构、年份和相关课程/能力),可选地限定为单个简历。
| 参数 | 类型 | 描述 |
|---|---|---|
| `resume_id` | 字符串(可选) | `list_resume_summaries` 返回的简历ID |
| `limit` | 整数(可选) | 结果的最大数量(默认为 `100`) |
| `offset` | 整数(可选) | 要跳过的数量(默认为 `0`) |
返回:分页信封 - `total_count` + `items`.
---
### `get_education`
获取单个教育条目,包含其能力。
| 参数 | 类型 | 描述 |
|---|---|---|
| `id` | 字符串 | `list_education` 返回的教育条目ID |
---
### `search_education`
按机构、学位或能力搜索教育条目。每个结果都包含一个 `resume_id` 字段,标识简历属于哪一份。
| 参数 | 类型 | 描述 |
|---|---|---|
| `query` | 字符串 | 搜索文本(不区分大小写) |
| `resume_id` | 字符串(可选) | 限定搜索范围为单个简历 |
| `mode` | 字符串(可选) | `"and"` *(默认)* 或 `"or"` - 参见 [搜索行为](#search-behavior) |
---
### `search_education_by_competency`
查找展示给定技能熟练程度的教育条目 - 有助于将候选人的课程/培训与特定职位的具体要求相匹配。
返回:`id`、`institution`、`degree`、`year`、`matched_competencies`、`resume_id`.
| 参数 | 类型 | 描述 |
|---|---|---|
| `competency` | 字符串 | 技能/能力名称片段(不区分大小写,部分匹配) |
| `mode` | 字符串(可选) | `"and"` *(默认)* 或 `"or"` - 参见 [搜索行为](#search-behavior) |
---
### `get_collection_stats`
返回整个已加载简历集合的聚合计数和平均值。有助于在深入个别记录之前快速概览。
无参数。
返回:`total_resumes`、`total_work_experiences`、`total_unique_skills`、`total_side_projects`、`total_education_entries`、`total_achievements`、`avg_skills_per_resume`、`avg_work_experiences_per_resume`.
---
### `get_skill_frequency`
按简历列出的次数返回徽章技能排名,降序排列。有助于识别所有候选人中最常见的技术。
| 参数 | 类型 | 描述 |
|---|---|---|
| `limit` | 整数(可选) | 返回的技能数量(默认为 `20`) |
返回:`skill_id`、`skill_title`、`resume_count` 的列表.
---
### `search_resumes_by_skills`
查找具有特定技能的简历。使用与 `search_resumes_by_skill` 相同的部分令牌匹配,但接受列表并在技能查询之间应用 AND/OR 逻辑 - 例如查找同时具备 Python 和 Docker 的所有人。
| 参数 | 类型 | 描述 |
|---|---|---|
| `skills` | 字符串列表 | 技能标题片段,用于筛选,例如 `["Python", "Docker"]` |
| `mode` | 字符串(可选) | `"and"` *(默认)* - 简历必须匹配 **每个** 查询; `"or"` - 简历必须匹配 **任何** 查询 |
返回:`id`、`first_name`、`last_name`、`matched_skills`.
MCP 配置
以下是此 MCP Server 的配置信息,可直接复制到 Cursor 或其他 MCP 客户端中使用。
mcp.json
连接信息
猜你喜欢
暂无推荐服务器