Skip to main content
Glama
Snseam
by Snseam
README.md
# BOSS 直聘 MCP Server

> 用 AI 自动化 BOSS 直聘招聘流程 — 批量搜索、自动获取链接、智能筛选评分、一键导出报告

[![MCP](https://img.shields.io/badge/MCP-Compatible-blue)](https://modelcontextprotocol.io)
[![Python](https://img.shields.io/badge/Python-3.12+-green)](https://python.org)
[![License](https://img.shields.io/badge/License-MIT-yellow)](LICENSE)

**BOSS 直聘 (zhipin.com)** 招聘者端自动化工具,基于 [Model Context Protocol (MCP)](https://modelcontextprotocol.io),让 Claude Code / Claude Desktop 等 AI 助手直接操作 BOSS 直聘招聘后台。

## 功能特性

- **候选人搜索** — 在 BOSS 直聘「找人才」页面搜索,支持滚动加载 100+ 候选人
- **多关键词批量搜索** — 12+ 关键词自动轮询 + 跨关键词去重 + **每个关键词搜索后自动获取分享链接**
- **候选人数据库** — 搜索结果自动持久化到本地 JSON 数据库,中断可恢复,数据不丢失
- **简历查看** — 点击候选人卡片,自动截图 Canvas 渲染的简历(绕过防爬)
- **分享链接提取** — 自动点击转发按钮,解码 QR 码获取 `zpurl.cn` 永久链接
- **一键打招呼** — 在搜索结果中直接对候选人发起沟通,进入 BOSS 聊天列表
- **自动筛选评分** — 按 YAML 配置的条件(年龄/薪资/状态)过滤 + 多维度评分
- **报告导出** — 一键生成 Markdown 候选人报告(表格 + 跟进表 + 详情卡片)
- **浏览器自动启动** — 未检测到 Chrome debug 端口时,自动启动系统 Chrome
- **YAML 配置** — 公司信息、JD、搜索关键词、筛选条件全部可配置

## 工作原理

```
Claude Code / Claude Desktop
    ↓ MCP (stdio)
boss-zhipin-mcp (FastMCP Server)
    ↓ CDP (Chrome DevTools Protocol)
Chrome 浏览器 (已登录 BOSS 直聘)
    ↓
BOSS 直聘招聘者后台 (zhipin.com)
```

通过 Playwright 连接你已登录的 Chrome 浏览器,在 BOSS 直聘的 SPA 页面内操作搜索、查看、发消息等功能。

## 完整招聘流水线

```
boss_multi_search(auto_view=True)
│
│  ┌─── 关键词循环 (12次) ────────────────────────┐
│  │  1. 搜索关键词 → 页面加载候选人卡片           │
│  │  2. 去重 + 存入数据库                         │
│  │  3. 全量 view 所有新候选人 → 获取 share_url   │
│  │  4. 切换下一个关键词                          │
│  └──────────────────────────────────────────────┘
│  结果: 所有候选人有 share_url + 完整数据在 DB
▼
boss_filter_and_score(top_n=15)     ← 自动筛选+评分
▼
boss_export_report(top_n=15)        ← 生成 Markdown 报告
▼
boss_greet_by_index() / boss_send_greeting()  ← 联系候选人
```

## 快速开始

### 1. 安装

```bash
git clone https://github.com/Snseam/boss-zhipin-mcp.git
cd boss-zhipin-mcp
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
playwright install chromium
```

### 2. 配置搜索条件

```bash
cp search_profile.example.yaml search_profile.yaml
```

编辑 `search_profile.yaml`,填入你的岗位信息和搜索关键词:

```yaml
job:
  title: "AI 产品经理"
  salary: "20-30K"
  city: "北京"

keywords:
  - "AI产品经理"
  - "AIGC产品经理"
  - "大模型 产品"

filter:
  max_age: 35
  max_salary_k: 40
  exclude_status: ["暂不考虑"]

scoring:
  domain_keywords: ["教育", "学术", "科研"]
  tech_keywords: ["大模型", "llm", "rag", "agent"]
```

### 3. 启动 Chrome(可选,MCP 会自动启动)

```bash
# macOS — MCP 未检测到 debug 端口时会自动启动系统 Chrome
# 如需手动启动:
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --remote-debugging-port=9222
```

在浏览器中打开 [zhipin.com](https://www.zhipin.com) 并登录你的招聘者账号。

### 4. 连接 Claude Code

在项目根目录创建 `.mcp.json`:

```json
{
  "mcpServers": {
    "boss-recruiter": {
      "command": "/path/to/boss-zhipin-mcp/.venv/bin/python",
      "args": ["/path/to/boss-zhipin-mcp/server.py"],
      "env": {
        "NO_PROXY": "localhost,127.0.0.1"
      }
    }
  }
}
```

### 5. 开始使用

```
你: 帮我搜索北京的 AI 产品经理

Claude: boss_multi_search(auto_view=True)
  → 12 关键词搜索,537 新候选人,全部获取 share_url
  → boss_filter_and_score(top_n=15)
  → boss_export_report(top_n=15)
  → 生成候选人报告文档
```

## MCP Tools

### 搜索与查看

| Tool                     | 说明                                                               |
| ------------------------ | ------------------------------------------------------------------ |
| `boss_login`             | 登录 BOSS 直聘(检查 Cookie,失效则等待手动登录)                  |
| `boss_search_candidates` | 单关键词搜索候选人(支持滚动加载、自动去重、自动存入数据库)       |
| `boss_multi_search`      | **多关键词批量搜索**(自动去重 + 自动 view 获取链接,`auto_view`) |
| `boss_view_by_index`     | 点击候选人查看简历(截图 + 提取分享链接 + 自动存入数据库)         |
| `boss_view_by_expect_id` | 通过 expectId 在当前页面查找并查看候选人                           |
| `boss_greet_by_index`    | 在搜索结果中直接打招呼(候选人进入沟通列表)                       |
| `boss_send_greeting`     | 向候选人发送打招呼消息(通过 URL)                                 |

### 数据库与筛选

| Tool                    | 说明                                                              |
| ----------------------- | ----------------------------------------------------------------- |
| `boss_query_db`         | 查询候选人数据库(按状态/链接/关键词/日期筛选,无需浏览器)       |
| `boss_update_candidate` | 更新候选人状态/评分/备注                                          |
| `boss_filter_and_score` | **自动筛选+评分**(按 YAML 条件过滤,多维度评分,Top N 标记入库) |
| `boss_export_report`    | **导出 Markdown 报告**(表格 + 跟进表 + 详情卡片)                |
| `boss_pipeline_status`  | 查看招聘流水线进度(统计 + 恢复建议)                             |
| `boss_clear_dedup`      | **选择性**清除去重记录(按 ID/状态/日期,或全量清除)             |

### 工具

| Tool                      | 说明                                               |
| ------------------------- | -------------------------------------------------- |
| `boss_evaluate_candidate` | 简易关键词匹配评估(建议直接在 Claude 对话中评估) |
| `boss_reload`             | 热重载代码,修改后无需重启 server                  |
| `boss_debug_page`         | 调试工具,扫描当前页面 DOM 结构                    |

## 候选人数据库

搜索结果自动持久化到 `candidates_db.json`,不再丢失数据:

```json
{
  "candidates": {
    "<expectId>": {
      "name": "张**",
      "age": "27岁",
      "salary": "20-25K",
      "company": "某公司",
      "school": "某大学",
      "fullText": "...",
      "share_url": "https://zpurl.cn/...",
      "status": "shortlisted",
      "score": 95,
      "first_seen": "2026-03-30"
    }
  }
}
```

**状态流转**: `new` → `shortlisted`(评分后)→ `viewed`(获取链接后)→ `greeted`(打招呼后)

**中断恢复**: 任意步骤中断后,`boss_pipeline_status()` 显示进度和恢复建议。

## 搜索配置

`search_profile.yaml` 支持完整的搜索策略配置:

```yaml
job:
  title: "岗位名称"
  salary: "薪资范围"
  city: "城市"
  experience: "经验要求"

company:
  name: "公司名"
  description: "公司简介"

requirements:
  must_have: [...] # 硬性要求
  nice_to_have: [...] # 加分项

filter:
  max_age: 35 # 年龄上限
  max_salary_k: 40 # 薪资上限(K)
  exclude_status: ["暂不考虑"]

keywords: # 搜索关键词列表
  - "关键词1"
  - "关键词2"

scoring: # 评分关键词
  domain_keywords: ["教育", "学术"]
  tech_keywords: ["大模型", "llm", "rag"]
  bonus_keywords: ["0-1", "从0到1"]
```

## 技术细节

- **浏览器连接**:CDP → 已登录 Chrome。未检测到 debug 端口时自动启动系统 Chrome
- **SPA 适配**:搜索页在 iframe 中渲染,自动导航到招聘者后台
- **Canvas 简历**:截图 + QR 码解码获取永久链接
- **候选人数据库**:JSON 文件,原子写入,基于 `expectId` 去重
- **反检测**:随机延迟(2-5s)模拟人类操作节奏

## 项目结构

```
boss-zhipin-mcp/
├── server.py                  # MCP Server 入口,注册所有 tools
├── scraper.py                 # BOSS 直聘页面抓取(SPA + iframe)
├── browser.py                 # Playwright CDP 浏览器管理 + 自动启动 Chrome
├── candidate_db.py            # 候选人数据库(持久化 + 去重 + 查询)
├── evaluator.py               # 候选人评估(关键词匹配)
├── config.py                  # 配置加载
├── search_profile.example.yaml # 搜索配置示例
├── candidates_db.json         # 候选人数据库文件(自动生成)
├── requirements.txt
└── README.md
```

## 常见问题

### 连接失败 `Unexpected status 400`

系统有代理(如 Clash),localhost 请求被代理拦截。在 MCP 配置中添加:

```json
"env": { "NO_PROXY": "localhost,127.0.0.1" }
```

### 搜索返回空结果

1. 确认 Chrome 已登录 BOSS 直聘招聘者账号
2. 确认 Chrome 启动时带了 `--remote-debugging-port=9222`(或让 MCP 自动启动)
3. 检查 `curl http://localhost:9222/json/version` 是否有响应

### 简历内容为空

BOSS 直聘用 Canvas 渲染简历,无法直接提取文字。使用 `boss_view_by_index` 截图后,让 Claude 直接看图识别。

## License

MIT