名称: 职位搜索 MCP
描述: 通过 JobSpy MCP 服务器,在 LinkedIn、Indeed、Glassdoor、ZipRecruiter、Google Jobs、Bayt、Naukri 和 BDJobs 等多个平台搜索职位。
slug: job-search-mcp
标签:
- 职位搜索
- 职业
- mcp
- jobspy
此技能使 AI 助手能够通过 JobSpy MCP 服务器 在多个招聘网站搜索职位。JobSpy 将来自 LinkedIn、Indeed、Glassdoor、ZipRecruiter、Google Jobs、Bayt、Naukri 和 BDJobs 的职位信息聚合到一个统一的接口中。
当用户提出以下请求时,可使用此技能:
- 查找符合特定条件(职位、地点、公司等)的职位列表
- 搜索远程或现场职位
- 比较不同平台的职位机会
- 获取职位发布的薪资信息
- 查找近期发布的职位(X 小时内)
- 搜索支持“快速申请”的职位
# 使用 pip 安装
pip install mcp>=1.1.0 python-jobspy>=1.1.82 pandas>=2.1.0 pydantic>=2.0.0
# 或使用 uv 安装(更快)
uv add mcp python-jobspy pandas pydantic
# 克隆 jobspy-mcp-server 仓库
git clone https://github.com/chinpeerapat/jobspy-mcp-server.git
cd jobspy-mcp-server
# 安装依赖
uv sync
# 或
pip install -e .
将以下内容添加到 Claude Desktop 配置文件(macOS 上为 ~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"jobspy": {
"command": "uv",
"args": ["run", "jobspy-mcp-server"],
"env": {}
}
}
}
替代配置(Node.js 服务器):
{
"mcpServers": {
"jobspy": {
"command": "node",
"args": ["/path/to/jobspy-mcp-server/src/index.js"],
"env": {
"ENABLE_SSE": "0"
}
}
}
}
scrape_jobs_tool(主要工具)在多个招聘网站搜索职位,支持全面的筛选功能。
参数:
| 参数 | 类型 | 必填 | 默认值 | 描述 |
|---|---|---|---|---|
search_term |
字符串 | ✅ 是 | - | 职位关键词(例如:“软件工程师”、“数据科学家”) |
location |
字符串 | 否 | - | 工作地点(例如:“旧金山, CA”、“远程”) |
site_name |
数组 | 否 | ["indeed", "linkedin", "zip_recruiter", "google"] |
要搜索的招聘网站 |
results_wanted |
整数 | 否 | 15 | 结果数量(1-1000) |
job_type |
字符串 | 否 | - | 雇佣类型:fulltime、parttime、internship、contract |
is_remote |
布尔值 | 否 | false | 仅筛选远程职位 |
hours_old |
整数 | 否 | - | 按发布时间筛选(小时数) |
distance |
整数 | 否 | 50 | 搜索半径(英里,1-100) |
easy_apply |
布尔值 | 否 | false | 筛选支持快速申请的职位 |
country_indeed |
字符串 | 否 | "usa" | Indeed/Glassdoor 搜索的国家 |
linkedin_fetch_description |
布尔值 | 否 | false | 获取完整的 LinkedIn 职位描述(较慢) |
offset |
整数 | 否 | 0 | 分页偏移量 |
verbose |
整数 | 否 | 1 | 日志级别(0=错误,1=警告,2=全部) |
site_name 支持的值:
- linkedin - 专业社交平台(有速率限制)
- indeed - 最大的职位搜索引擎(最可靠)
- glassdoor - 附带公司评价和薪资的职位
- zip_recruiter - 适用于美国/加拿大的职位匹配
- google - 聚合的职位列表
- bayt - 中东职位门户
- naukri - 印度领先的职位门户
- bdjobs - 孟加拉国职位门户
job_type 支持的值:
- fulltime(全职)
- parttime(兼职)
- internship(实习)
- contract(合同)
get_supported_countries返回职位搜索支持的国家完整列表。无需参数。
get_supported_sites返回所有支持的招聘网站的详细信息。无需参数。
get_job_search_tips返回有效职位搜索的技巧和最佳实践。无需参数。
返回的每个职位包含以下字段:
interface JobPost {
// 核心字段(所有平台)
title: string; // 职位标题
company: string; // 公司名称
company_url?: string; // 公司网站 URL
job_url: string; // 职位发布直接链接
location: {
country?: string;
city?: string;
state?: string;
};
is_remote: boolean; // 是否为远程职位
description?: string; // 职位描述(Markdown 格式)
job_type?: "fulltime" | "parttime" | "internship" | "contract";
// 薪资信息
salary?: {
interval?: "yearly" | "monthly" | "weekly" | "daily" | "hourly";
min_amount?: number;
max_amount?: number;
currency?: string;
salary_source?: "direct_data" | "description"; // 从发布信息中解析
};
date_posted?: string; // ISO 日期字符串
emails?: string[]; // 可用的联系邮箱
// LinkedIn 特定
job_level?: string; // 职级
// LinkedIn 和 Indeed 特定
company_industry?: string; // 公司行业
// Indeed 特定
company_country?: string;
company_addresses?: string[];
company_employees_label?: string;
company_revenue_label?: string;
company_description?: string;
company_logo?: string;
// Naukri 特定
skills?: string[];
experience_range?: string;
company_rating?: number;
company_reviews_count?: number;
vacancy_count?: number;
work_from_home_type?: string;
}
用户请求:
“帮我找 10 个旧金山的软件工程师职位”
MCP 工具调用:
{
"tool": "scrape_jobs_tool",
"params": {
"search_term": "软件工程师",
"location": "旧金山, CA",
"results_wanted": 10,
"site_name": ["indeed", "linkedin"]
}
}
预期输出:
{
"jobs": [
{
"title": "软件工程师",
"company": "TechCorp Inc.",
"location": { "city": "旧金山", "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
}
// ... 更多职位
],
"total_found": 10
}
用户请求:
“在 Indeed 和 ZipRecruiter 上搜索远程 Python 开发职位”
MCP 工具调用:
{
"tool": "scrape_jobs_tool",
"params": {
"search_term": "Python 开发",
"location": "远程",
"is_remote": true,
"site_name": ["indeed", "zip_recruiter"],
"results_wanted": 20
}
}
用户请求:
“查找过去 24 小时内发布的波士顿数据科学家职位”
MCP 工具调用:
{
"tool": "scrape_jobs_tool",
"params": {
"search_term": "数据科学家",
"location": "波士顿, MA",
"hours_old": 24,
"site_name": ["linkedin", "glassdoor", "indeed"],
"linkedin_fetch_description": true
}
}
用户请求:
“寻找纽约的入门级营销职位,要求支持快速申请”
MCP 工具调用:
{
"tool": "scrape_jobs_tool",
"params": {
"search_term": "初级营销",
"location": "纽约, NY",
"job_type": "fulltime",
"easy_apply": true,
"site_name": ["indeed", "zip_recruiter"],
"results_wanted": 30
}
}
用户请求:
“在 Indeed 上查找德国的软件职位”
MCP 工具调用:
{
"tool": "scrape_jobs_tool",
"params": {
"search_term": "软件开发",
"location": "柏林",
"country_indeed": "germany",
"site_name": ["indeed"],
"results_wanted": 15
}
}
用户请求:
“支持哪些招聘网站?”
MCP 工具调用:
{
"tool": "get_supported_sites",
"params": {}
}
预期输出:
{
"sites": [
{ "name": "indeed", "description": "最大的职位搜索引擎,最可靠" },
{ "name": "linkedin", "description": "专业社交平台,有速率限制" },
{ "name": "glassdoor", "description": "附带公司评价和薪资的职位" },
{ "name": "zip_recruiter", "description": "适用于美国/加拿大的职位匹配" },
{ "name": "google", "description": "聚合的职位列表" },
{ "name": "bayt", "description": "中东职位门户" },
{ "name": "naukri", "description": "印度领先的职位门户" },
{ "name": "bdjobs", "description": "孟加拉国职位门户" }
]
}
场景: LinkedIn 返回速率限制错误。
错误响应:
{
"error": "RateLimitError",
"message": "LinkedIn 速率限制已超。请稍后重试或使用其他网站。",
"suggestion": "切换到 Indeed 或 ZipRecruiter,它们的速率限制更宽松。"
}
处理方法:
- 将 results_wanted 减少到较小数值(10-15)
- 暂时从 site_name 中移除 linkedin
- 在搜索之间添加延迟
- 如果可用,考虑使用代理配置
场景: 搜索返回空结果。
错误响应:
{
"jobs": [],
"total_found": 0,
"message": "未找到符合您条件的职位"
}
处理方法:
- 扩大搜索词范围(例如,用“工程师”代替“高级首席软件工程师”)
- 增加 distance 半径
- 移除限制性筛选条件,如 hours_old 或 job_type
- 尝试不同的 site_name 选项
- 检查地点拼写是否正确
场景: 用户为 Indeed 指定了不支持的国家。
错误响应:
{
"error": "ValidationError",
"message": "无效的 country_indeed 值。请使用 get_supported_countries 查看有效选项。"
}
处理方法:
- 调用 get_supported_countries 获取有效的国家代码
- 使用确切的国家名称(例如,用“usa”而不是“US”,用“united kingdom”而不是“UK”)
场景: 用户尝试使用冲突的筛选条件。
已知限制:
- Indeed: 只能使用以下之一:hours_old、job_type & is_remote、easy_apply
- LinkedIn: 只能使用以下之一:hours_old、easy_apply
处理方法:
- 告知用户此限制
- 优先考虑最重要的筛选条件
- 如果需要多个筛选条件,则运行单独的搜索
// 错误 - 可能导致超时或触发速率限制
{
"search_term": "工程师",
"results_wanted": 1000,
"site_name": ["linkedin", "indeed", "glassdoor", "zip_recruiter", "google"]
}
原因: 同时从过多网站请求过多结果会触发速率限制并导致超时。
✅ 正确做法:
{
"search_term": "软件工程师",
"results_wanted": 20,
"site_name": ["indeed", "linkedin"]
}
// 错误 - LinkedIn 有严格的速率限制
{
"search_term": "开发",
"site_name": ["linkedin"],
"results_wanted": 100,
"linkedin_fetch_description": true
}
原因: LinkedIn 有最严格的速率限制。使用 linkedin_fetch_description: true 会倍增请求数。
✅ 正确做法:
- 使用 Indeed 作为主要来源
- 将 LinkedIn 限制在 10-15 个结果
- 仅在确实需要时启用 linkedin_fetch_description
// 错误 - Indeed 限制:只能使用一组筛选条件
{
"search_term": "开发",
"site_name": ["indeed"],
"hours_old": 24,
"job_type": "fulltime",
"is_remote": true
}
原因: Indeed 仅支持以下之一:hours_old、job_type & is_remote 或 easy_apply。
✅ 正确做法:
// 要么按发布时间筛选
{
"search_term": "开发",
"site_name": ["indeed"],
"hours_old": 24
}
// 要么按职位类型筛选
{
"search_term": "开发",
"site_name": ["indeed"],
"job_type": "fulltime",
"is_remote": true
}
// 错误 - 过于宽泛,将返回不相关的结果
{
"search_term": "工作"
}
原因: 模糊搜索会返回低质量结果并浪费 API 调用。
✅ 正确做法:
- 始终包含具体的职位名称或技能
- 在已知时包含地点
- 使用筛选条件缩小结果范围
原因: 速率限制、网络问题和无效参数需要适当处理。
✅ 正确做法:
- 在处理结果前检查错误响应
- 为速率限制实现带退避的重试逻辑
- 当搜索失败时向用户提供有用的信息
// 错误 - 国家代码格式错误
{
"search_term": "开发",
"country_indeed": "UK" // 错误!应使用 "united kingdom"
}
✅ 正确做法:
- 使用 get_supported_countries 验证有效的国家代码
- 常见代码:"usa"、"united kingdom"、"canada"、"germany"、"india"
offset 获取更多结果,而不是设置高 results_wanted调用 `get