内容
# 工作搜索助手
适用于 **Claude Desktop** 的个人工作搜索助手。你可以询问 Claude 查找工作;它会搜索真正的职位发布板,**为每个职位评分 0-100,以确定其与你的匹配程度**,并在排名板上显示它们,你可以一键进行分类。所有操作都在本地运行 — 无需 API 密钥,也无需账户。
这是一个 [MCP 应用](https://modelcontextprotocol.io):一个小型服务器,Claude Desktop 会与之通信,加上一个内联板,直接在聊天中渲染。

---
## 功能
- **搜索真正的职位发布板** — LinkedIn 以及 8 个 ATS/职位来源(Greenhouse、Lever、Ashby、Workday、SmartRecruiters、Hacker News、RemoteOK、Remotive),使用你的目标角色和地点。
- **为你评分每个职位** — Claude 读取完整的职位描述,并给出 0-100 的匹配评分,附带一行原因,权衡你的技能、经验年限、资历匹配和职位。
- **让你快速分类** — 在每个卡片上“应用”/“跳过”,或批量处理(“dismiss everything under 60”)。
- **记住** — 保留一个运行中的短期列表,一个你已申请职位的跟踪器,不会再次显示同一个职位(6 个月内)。
---
## 安装
**1. 在 Claude Desktop 中关于它。** 打开你的配置文件:
- Windows: `%APPDATA%\Claude\claude_desktop_config.json`
- macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
在 `"mcpServers"` 下添加 — `npx` 为你获取已发布的软件包,无需克隆或构建:
```json
{
"mcpServers": {
"job-search": {
"command": "npx",
"args": ["-y", "@servation/job-search-mcp"]
}
}
}
```
**2. 完全退出并重新打开 Claude Desktop** (在 Windows 上,从系统托盘退出 — 关闭窗口不够)。就这样。
<details>
<summary>从源代码运行</summary>
```bash
npm install
npm run build
```
然后将配置文件指向此文件夹的 `dist/main.js`:
```json
{
"mcpServers": {
"job-search": {
"command": "node",
"args": ["D:\\job-search-mcp\\dist\\main.js"]
}
}
}
```
</details>
---
## 使用方法
只需与 Claude 交谈。例如:
- *"保存我的个人资料"* — 粘贴你的简历;Claude 提取你的技能、角色、年限和地点,以便搜索和评分是为你定制的。
- *"在加利福尼亚州、资深级别、本周发布的后端工程师职位。*
- *"查找申请者较少的职位"* — 添加 LinkedIn 的早期申请者过滤器。
- *"dismiss everything under 60."*
- *"显示我已申请的职位。*
- *"重新评分职位板。*
典型的第一次运行:**保存你的个人资料 → "查找职位" → Claude 评分并显示排名板 → 你应用/跳过。**
---
## 职位板
职位板是一个**运行中的短期列表**。一个职位会留在上面,直到你 **应用** (移动到你的跟踪器)或 **跳过** (永久隐藏)。新的搜索会自动跳过已经在职位板上、你的跟踪器中、已dismiss或最近 6 个月内显示过的职位 — 这样你就不会连续两次看到同一个职位列表。
点击 **已申请** 或 **跳过**,或询问 Claude 执行这些操作。在小部件中分类后,它会保持不变。
---
## 工具(参考)
你很少需要调用这些工具 — Claude 会选择正确的工具 — 但以下是其底层实现:
| 工具 | 功能 |
|---|---|
| `find_jobs` | 为你的角色/地点搜索职位发布板(可选筛选:资历、类型、发布时间、远程、薪水、申请者、来源)。 |
| `evaluate_jobs` | Claude 为找到的职位评分 0-100(在搜索后自动运行)。 |
| `show_board` | 显示排名板(或你的 `saved` 跟踪器)。 |
| `set_status` | 应用 / 跳过 / 保存一个职位(也是卡片按钮)。 |
| `bulk_status` | 按评分或来源批量分类,例如 *dismiss everything under 60*。 |
| `whats_promising` | 以文本形式列出当前职位板(所有评分职位 + 仍未评分的职位)。 |
| `review_saved` | 你的跟踪器 — 你已保存或申请的职位。 |
| `rescore_board` | 从头开始重新评分职位板上的每个职位。 |
| `clear_jobs` | 清理:清除未评分的剩余职位或整个职位板(从不触及已应用/已dismiss的职位)。 |
| `save_profile` | 保存你的简历个人资料(驱动搜索 + 评分)。 |
---
## 数据存储位置
一个 JSON 文件存储在你的本地机器上 — 无云存储,不会向任何地方发送数据,除了你搜索的职位发布板:
- 已安装:`~/.job-search-mcp/jobs.json`
- 从源代码运行:`./data/jobs.json`
- 使用 `JOB_SEARCH_MCP_DATA` 环境变量覆盖。
---
## 可选:LinkedIn 高级模式
默认情况下,LinkedIn 使用其 **公共访客** 端点 — 无需登录,对你的账户无风险,并且你已经可以获得完整的职位描述。如果你想要更丰富的高级数据,可以通过在服务器配置文件中添加一个 `env` 块来使用你的登录账户:
```json
"job-search": {
"command": "npx",
"args": ["-y", "@servation/job-search-mcp"],
"env": {
"LINKEDIN_LI_AT": "<your li_at cookie>",
"LINKEDIN_JSESSIONID": "ajax:1234567890123456789"
}
}
```
从登录的 `linkedin.com` 标签页 → 开发工具 → 应用程序 → Cookie 中获取这两个 Cookie。
> ⚠️ **注意:** 这违反了 LinkedIn 的服务条款,可能会导致你的账户被标记或限制。Cookie 也会过期,大约一个月一次,LinkedIn 的内部端点也会在没有通知的情况下更改。如果出现任何问题,它会自动回落到访客模式。删除 `env` 块以保持完全安全(仅访客模式)。
---
## 评分机制
Claude(主机模型)直接进行评分 — 它读取每个描述并判断匹配程度,这已经过良好的校准。一个确定性公式(`computeMatchScore` in `scoring.ts`)作为任何运行较弱的本地模型时使用的备用方案,以防止过高排名;默认情况下它不活跃。
## 开发
```bash
npm run typecheck # 类型检查 UI + 服务器
npm run build # 构建 UI 包(vite 单文件)+ 编译服务器(tsc)
npm run serve:stdio # 从源代码运行服务器(tsx)进行本地测试
```
服务器仅限 stdio(`main.ts` → `server.ts`);UI 是一个 React 应用,捆绑成一个内联的 HTML 文件(`src/mcp-app.tsx` → `dist/mcp-app.html`),由服务器作为 `ui://` 资源提供。