介绍
# Job Search MCP Skill
该技能使 AI 代理能够使用 **JobSpy MCP 服务器** 在多个求职板上搜索职位。JobSpy 将来自 LinkedIn、Indeed、Glassdoor、ZipRecruiter、Google Jobs、Bayt、Naukri 和 BDJobs 的招聘信息聚合到一个统一界面中。
## 何时使用此技能
当用户要求你执行以下操作时,请使用此技能: - 查找符合特定条件(职位、地点、公司等)的招聘信息 - 搜索远程或现场职位 - 比较不同平台的求职机会 - 获取职位的薪资信息 - 查找最近发布的职位(X 小时内) - 搜索带有“Easy Apply”(轻松申请)选项的职位
## 先决条件
- **Python 3.10+** - **Node.js 16+**(用于某些服务器实现) - 已安装并配置 JobSpy MCP 服务器
---
## 安装与设置
### 选项 1:Python MCP 服务器(推荐)
```bash # Install with pip pip install mcp>=1.1.0 python-jobspy>=1.1.82 pandas>=2.1.0 pydantic>=2.0.0
# Or install with uv (faster) uv add mcp python-jobspy pandas pydantic ```
### 选项 2:克隆预构建的服务器
```bash # Clone the jobspy-mcp-server repository git clone https://github.com/chinpeerapat/jobspy-mcp-server.git cd jobspy-mcp-server
# Install dependencies uv sync # or pip install -e . ```
### Claude Desktop 配置
将以下内容添加到 Claude Desktop 配置文件中(macOS 上位于 `~/Library/Application Support/Claude/claude_desktop_config.json`):
```json { "mcpServers": { "jobspy": { "command": "uv", "args": ["run", "jobspy-mcp-server"], "env": {} } } } ```
**替代配置(Node.js 服务器):**
```json { "mcpServers": { "jobspy": { "command": "node", "args": ["/path/to/jobspy-mcp-server/src/index.js"], "env": { "ENABLE_SSE": "0" } } } } ```
---
## MCP 工具架构
### 1. `scrape_jobs_tool`(主要工具)
使用综合过滤器在多个求职板上搜索职位。
**参数:**
| 参数 | 类型 | 必填 | 默认值 | 描述 | |-----------|------|----------|---------|-------------| | `search_term` | string | ✅ 是 | - | 职位关键词(例如,“software engineer”、“data scientist”) | | `location` | string | 否 | - | 工作地点(例如,“San Francisco, CA”、“Remote”) | | `site_name` | array | 否 | `["indeed", "linkedin", "zip_recruiter", "google"]` | 要搜索的求职板 | | `results_wanted` | integer | 否 | 15 | 结果数量 (1-1000) | | `job_type` | string | 否 | - | 雇佣类型:`fulltime`、`parttime`、`internship`、`contract` | | `is_remote` | boolean | 否 | false | 仅筛选远程职位 | | `hours_old` | integer | 否 | - | 按发布时间筛选(小时) | | `distance` | integer | 否 | 50 | 搜索半径(英里,1-100) | | `easy_apply` | boolean | 否 | false | 筛选带有轻松申请选项的职位 | | `country_indeed` | string | 否 | "usa" | Indeed/Glassdoor 搜索的国家 | | `linkedin_fetch_description` | boolean | 否 | false | 获取完整的 LinkedIn 描述(较慢) | | `offset` | integer | 否 | 0 | 分页偏移量 | | `verbose` | integer | 否 | 1 | 日志级别(0=错误,1=警告,2=全部) |
**`site_name` 支持的值:** - `linkedin` - 职业社交平台(有速率限制) - `indeed` - 最大的求职搜索引擎(最可靠) - `glassdoor` - 带有公司评论和薪资信息的职位 - `zip_recruiter` - 美国/加拿大的职位匹配 - `google` - 聚合的职位列表 - `bayt` - 中东求职门户网站 - `naukri` - 印度领先的求职门户网站 - `bdjobs` - 孟加拉国求职门户网站
**`job_type` 支持的值:** - `fulltime` - `parttime` - `internship` - `contract`
### 2. `get_supported_countries`
返回支持的国家/地区的完整列表以供职位搜索。无需参数。
### 3. `get_supported_sites`
返回有关所有受支持求职板站点的详细信息。无需参数。
### 4. `get_job_search_tips`
返回有效职位搜索的提示和最佳实践。无需参数。
---
## 职位发布响应架构
当返回职位时,每个职位发布包含以下字段:
```typescript interface JobPost { // Core fields (all platforms) title: string; // Job title company: string; // Company name company_url?: string; // Company website URL job_url: string; // Direct link to job posting location: { country?: string; city?: string; state?: string; }; is_remote: boolean; // Whether job is remote description?: string; // Job description (markdown format) job_type?: "fulltime" | "parttime" | "internship" | "contract"; // Salary information salary?: { interval?: "yearly" | "monthly" | "weekly" | "daily" | "hourly"; min_amount?: number; max_amount?: number; currency?: string; salary_source?: "direct_data" | "description"; // Parsed from posting }; date_posted?: string; // ISO date string emails?: string[]; // Contact emails if available // LinkedIn specific job_level?: string; // Seniority level // LinkedIn & Indeed specific company_industry?: string; // Indeed specific company_country?: string; company_addresses?: string[]; company_employees_label?: string; company_revenue_label?: string; company_description?: string; company_logo?: string; // Naukri specific skills?: string[]; experience_range?: string; company_rating?: number; company_reviews_count?: number; vacancy_count?: number; work_from_home_type?: string; } ```
---
## 示例提示词 → MCP 调用 → 输出
### 示例 1:基本职位搜索
**用户提示词:** > "在旧金山为我找 10 个软件工程师的工作"
**MCP 工具调用:** ```json { "tool": "scrape_jobs_tool", "params": { "search_term": "software engineer", "location": "San Francisco, CA", "results_wanted": 10, "site_name": ["indeed", "linkedin"] } } ```
**预期输出:** ```json { "jobs": [ { "title": "Software Engineer", "company": "TechCorp Inc.", "location": { "city": "San Francisco", "state": "CA" }, "job_url": "https://indeed.com/viewjob?jk=abc123", "salary": { "min_amount": 120000, "max_amount": 180000, "interval": "yearly" }, "job_type": "fulltime", "is_remote": false } // ... more jobs ], "total_found": 10 } ```
---
### 示例 2:远程职位搜索
**用户提示词:** > "从 Indeed 和 ZipRecruiter 搜索远程 Python 开发人员职位"
**MCP 工具调用:** ```json { "tool": "scrape_jobs_tool", "params": { "search_term": "Python developer", "location": "Remote", "is_remote": true, "site_name": ["indeed", "zip_recruiter"], "results_wanted": 20 } } ```
---
### 示例 3:带有筛选条件的最近职位
**用户提示词:** > "查找波士顿过去 24 小时内发布的数据科学家职位"
**MCP 工具调用:** ```json { "tool": "scrape_jobs_tool", "params": { "search_term": "data scientist", "location": "Boston, MA", "hours_old": 24, "site_name": ["linkedin", "glassdoor", "indeed"], "linkedin_fetch_description": true } } ```
---
### 示例 4:带有轻松申请选项的入门级职位
**用户提示词:** > "在纽约寻找带有轻松申请选项的入门级市场营销工作"
**MCP 工具调用:** ```json { "tool": "scrape_jobs_tool", "params": { "search_term": "junior marketing", "location": "New York, NY", "job_type": "fulltime", "easy_apply": true, "site_name": ["indeed", "zip_recruiter"], "results_wanted": 30 } } ```
---
### 示例 5:国际职位搜索
**用户提示词:** > "在 Indeed 上查找德国的软件职位"
**MCP 工具调用:** ```json { "tool": "scrape_jobs_tool", "params": { "search_term": "software developer", "location": "Berlin", "country_indeed": "germany", "site_name": ["indeed"], "results_wanted": 15 } } ```
---
### 示例 6:获取帮助信息
**用户提示词:** > "支持哪些求职网站?"
**MCP 工具调用:** ```json { "tool": "get_supported_sites", "params": {} } ```
**预期输出:** ```json { "sites": [ { "name": "indeed", "description": "Largest job search engine, most reliable" }, { "name": "linkedin", "description": "Professional networking platform, rate limited" }, { "name": "glassdoor", "description": "Jobs with company reviews and salaries" }, { "name": "zip_recruiter", "description": "Job matching for US/Canada" }, { "name": "google", "description": "Aggregated job listings" }, { "name": "bayt", "description": "Middle East job portal" }, { "name": "naukri", "description": "India's leading job portal" }, { "name": "bdjobs", "description": "Bangladesh job portal" } ] } ```
---
## 错误处理示例
### 错误 1:速率限制
**场景:** LinkedIn 返回速率限制错误。
**错误响应:** ```json { "error": "RateLimitError", "message": "LinkedIn rate limit exceeded. Try again later or use different sites.", "suggestion": "Switch to Indeed or ZipRecruiter which have more lenient rate limits." } ```
**处理方法:** - 将 `results_wanted` 减少到较小的数字(10-15) - 暂时从 `site_name` 中移除 `linkedin` - 在搜索之间添加延迟 - 如果可用,使用代理配置
---
### 错误 2:未找到结果
**场景:** 搜索返回空结果。
**错误响应:** ```json { "jobs": [], "total_found": 0, "message": "No jobs found matching your criteria" } ```
**处理方法:** - 扩大搜索词范围(例如,用“engineer”代替“senior principal software engineer”) - 增加 `distance` 半径 - 移除限制性筛选器,如 `hours_old` 或 `job_type` - 尝试不同的 `site_name` 选项 - 检查地点拼写是否正确
---
### 错误 3:无效的国家代码
**场景:** 用户为 Indeed 指定了不支持的国家。
**错误响应:** ```json { "error": "ValidationError", "message": "Invalid country_indeed value. Use get_supported_countries to see valid options." } ```
**处理方法:** - 调用 `get_supported_countries` 以获取有效的国家代码 - 使用确切的国家名称(例如,"usa" 而非 "US","united kingdom" 而非 "UK")
---
### 错误 4:平台特定限制冲突
**场景:** 用户尝试使用冲突的筛选器。
**已知限制:** - **Indeed:** 这些选项中只能使用一个:`hours_old`、`job_type & is_remote`、`easy_apply` - **LinkedIn:** 这些选项中只能使用一个:`hours_old`、`easy_apply`
**处理方法:** - 通知用户该限制 - 优先考虑最重要的筛选器 - 如果需要多个筛选器,请分别运行搜索
---
## 反面模式(不要做什么)
### ❌ 不要:请求过多结果
```json // BAD - Will likely timeout or get rate limited { "search_term": "engineer", "results_wanted": 1000, "site_name": ["linkedin", "indeed", "glassdoor", "zip_recruiter", "google"] } ```
**原因:** 同时从太多站点请求太多结果将触发速率限制并导致超时。
**✅ 应改为:** ```json { "search_term": "software engineer", "results_wanted": 20, "site_name": ["indeed", "linkedin"] } ```
---
### ❌ 不要:大量使用 LinkedIn
```json // BAD - LinkedIn is heavily rate limited { "search_term": "developer", "site_name": ["linkedin"], "results_wanted": 100, "linkedin_fetch_description": true } ```
**原因:** LinkedIn 的速率限制最严格。使用 `linkedin_fetch_description: true` 会增加请求量。
**✅ 应改为:** - 使用 Indeed 作为主要来源 - 将 LinkedIn 限制在 10-15 个结果 - 仅在特别需要时启用 `linkedin_fetch_description`
---
### ❌ 不要:使用冲突的筛选器
```json // BAD - Indeed limitation: only one filter group allowed { "search_term": "developer", "site_name": ["indeed"], "hours_old": 24, "job_type": "fulltime", "is_remote": true } ```
**原因:** Indeed 仅支持以下选项之一:`hours_old`、`job_type & is_remote` 或 `easy_apply`。
**✅ 应改为:** ```json // Either filter by recency { "search_term": "developer", "site_name": ["indeed"], "hours_old": 24 }
// OR filter by job type { "search_term": "developer", "site_name": ["indeed"], "job_type": "fulltime", "is_remote": true } ```
---
### ❌ 不要:在没有上下文的情况下进行模糊搜索
```json // BAD - Too generic, will return irrelevant results { "search_term": "job" } ```
**原因:** 模糊搜索返回质量较差的结果,并浪费 API 调用。
**✅ 应改为:** - 始终包含具体的职位名称或技能 - 在已知情况下包含地点 - 使用筛选器缩小结果范围
---
### ❌ 不要:忽略错误响应
**原因:** 速率限制、网络问题和无效参数需要适当的处理。
**✅ 应改为:** - 在处理结果之前检查错误响应 - 针对速率限制实施带退避的重试逻辑 - 当搜索失败时向用户提供有用的消息
---
### ❌ 不要:使用错误的国家代码
```json // BAD - Wrong country code format { "search_term": "developer", "country_indeed": "UK" // Wrong! Use "united kingdom" } ```
**✅ 应改为:** - 使用 `get_supported_countries` 验证有效的国家代码 - 常见代码:"usa"、"united kingdom"、"canada"、"germany"、"india"
---
## 速率限制与最佳实践
### 平台可靠性排名
1. **Indeed** - 最可靠,适合大量搜索 2. **ZipRecruiter** - 对于美国/加拿大很可靠 3. **Google Jobs** - 良好的聚合,稳定 4. **Glassdoor** - 可靠,提供公司洞察 5. **LinkedIn** - 限制最多,请谨慎使用
### 推荐方法
1. **从小处开始:** 首先以 10-15 个结果开始来测试筛选器 2. **首先使用 Indeed:** 对于职位数据最可靠 3. **具体明确:** 使用有针对性的搜索词 4. **明智筛选:** 对于 Indeed/LinkedIn,一次使用一个筛选器组 5. **分页:** 使用 `offset` 获取更多结果,而不是使用高 `results_wanted`
---
## 支持的国家/地区
调用 `get_supported_countries` 获取完整列表。常见国家/地区包括:
| 国家/地区 | `country_indeed` 的代码 | |---------|---------------------------| | 美国 | `usa` | | 英国 | `united kingdom` | | 加拿大 | `canada` | | 德国 | `germany` | | 法国 | `france` | | 印度 | `india` | | 澳大利亚 | `australia` | | 新加坡 | `singapore` | | 日本 | `japan` | | 荷兰 | `netherlands` |
---
## 故障排除
### "未安装浏览器/Chromium"
运行:`playwright install chromium`(某些爬虫使用 Playwright)
### "没有名为 'jobspy' 的模块"
运行:`pip install python-jobspy>=1.1.82`
### "超过速率限制"
- 减少 results_wanted - 从 site_name 中移除 LinkedIn - 重试前等待 60 秒 - 考虑使用代理
---
## 快速参考
| 用户意图 | 关键参数 | |-------------|----------------| | 在特定城市查找职位 | `search_term`、`location` | | 仅限远程职位 | `is_remote: true` | | 最近发布的职位 | `hours_old: 24`(或 48、72) | | 仅限全职 | `job_type: "fulltime"` | | 快速申请职位 | `easy_apply: true` | | 搜索特定平台 | `site_name: ["indeed"]` | | 国际搜索 | `country_indeed: "germany"` | | 更多结果 | `results_wanted: 25` | | 分页结果 | `offset: 25`(前 25 个之后) |