Job Search
求职搜索 MCP 技能
此技能使 AI 代理能够通过JobSpy MCP 服务器在多个求职平台上搜索职位。JobSpy 将来自 LinkedIn、Indeed、Glassdoor、ZipRecruiter、Google Jobs、Bayt、Naukri 和 BDJobs 的职位列表聚合到一个统一的界面中。
何时使用此技能
当用户要求您执行以下操作时,请使用此技能:
- 查找符合特定条件(职位、地点、公司等)的职位列表
- 搜索远程或现场职位
- 比较不同平台上的工作机会
- 获取职位发布的薪资信息
- 查找最近发布的职位(在 X 小时内)
- 搜索具有“快速申请”选项的职位
先决条件
- Python 3.10+
- Node.js 16+(适用于某些服务器实现)
- 已安装并配置 JobSpy MCP 服务器
安装与设置
选项 1:Python MCP 服务器(推荐)
# 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
选项二:克隆预构建服务器
# 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桌面端配置
将以下内容添加至您的Claude桌面端配置文件(~/Library/Application Support/Claude/claude_desktop_config.json在macOS系统中):
{
"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"
}
}
}
}
MCP工具架构
1.职位爬取工具(核心工具)
跨多个招聘平台搜索职位,支持全面筛选功能。
参数说明:
| 参数名称 | 类型 | 必填 | 默认值 | 描述 |
|---|---|---|---|---|
搜索关键词 | 字符串 | ✅ 是 | - | 职位关键词(例如:"软件工程师"、"数据科学家") |
工作地点 | 字符串 | 否 | - | 工作地点(例如:"旧金山,加州","远程") |
网站名称 | 数组 | 否 | ["indeed", "linkedin", "zip_recruiter", "google"] | 要搜索的招聘网站 |
所需结果数 | 整数 | 否 | 15 | 结果数量(1-1000) |
工作类型 | 字符串 | 否 | - | 雇佣类型:全职,兼职,实习,合同制 |
是否远程 | 布尔值 | 否 | 假 | 仅筛选远程职位 |
发布时间(小时) | 整数 | 否 | - | 按发布时间(小时)筛选 |
距离 | 整数 | 否 | 50 | 搜索半径(英里)(1-100) |
一键申请 | 布尔值 | 否 | 假 | 筛选带有一键申请选项的职位 |
Indeed/Glassdoor搜索的国家 | 字符串 | 否 | "美国" | Indeed/Glassdoor搜索的国家 |
领英获取描述 | boolean | 不 | 错误 | 获取完整的LinkedIn描述(较慢) |
偏移量 | 整数 | 否 | 0 | 分页偏移量 |
详细程度 | 整数 | 否 | 1 | 日志记录级别(0=错误,1=警告,2=全部) |
支持的站点名称值:
linkedin- 专业社交平台(有速率限制)indeed- 最大的职位搜索引擎(最可靠)glassdoor- 包含公司评论和薪资的职位zip_recruiter- 适用于美国/加拿大的职位匹配google- 汇总的职位列表bayt- 中东地区职位门户naukri- 印度领先的职位门户bdjobs- 孟加拉国职位门户
支持的参数值职位类型:
全职兼职实习合同制
2.获取支持的国家列表
返回支持职位搜索的完整国家列表。无需参数。
3.获取支持的网站信息
返回所有支持的招聘网站详细信息。无需参数。
4.获取职位搜索技巧
返回有效职位搜索的技巧和最佳实践。无需参数。
招聘信息响应模式
当返回招聘信息时,每条招聘信息包含以下字段:
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工具调用:
{
"tool": "scrape_jobs_tool",
"params": {
"search_term": "software engineer",
"location": "San Francisco, CA",
"results_wanted": 10,
"site_name": ["indeed", "linkedin"]
}
}
预期输出:
{
"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工具调用:
{
"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工具调用:
{
"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工具调用:
{
"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上查找德国的软件工作"
示例6:获取帮助信息
用户提示:
{
"tool": "scrape_jobs_tool",
"params": {
"search_term": "software developer",
"location": "Berlin",
"country_indeed": "germany",
"site_name": ["indeed"],
"results_wanted": 15
}
}
"支持哪些求职网站?"
预期输出:
错误处理示例
错误1:速率限制
{
"tool": "get_supported_sites",
"params": {}
}
场景:
{
"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" }
]
}
LinkedIn返回速率限制错误。
错误响应:
如何处理:将
results_wanted
{
"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."
}
减少到较小的数字(10-15)
- 暂时从
site_name中移除 - linkedin
在搜索之间添加延迟如果可用,使用代理配置site_nametemporarily - Add delays between searches
- Use proxy configuration if available
错误2:未找到结果
场景:搜索返回空结果。
错误响应:
{
"jobs": [],
"total_found": 0,
"message": "No jobs found matching your criteria"
}
处理方法:
- 扩大搜索词范围(例如,使用“工程师”而非“高级首席软件工程师”)
- 增加
距离半径 - 移除限制性筛选条件,例如
发布时间或工作类型 - 尝试不同的
网站名称选项 - 检查地点拼写是否正确
错误3:无效的国家代码
场景:用户指定了Indeed不支持的某个国家。
错误响应:
{
"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(一键申请)
处理方法:
- 告知用户此限制
- 优先使用最重要的筛选器
- 如需多个筛选器,请运行单独的搜索
反模式(应避免的做法)
❌ 请勿:请求过多结果
// BAD - Will likely timeout or get rate limited
{
"search_term": "engineer",
"results_wanted": 1000,
"site_name": ["linkedin", "indeed", "glassdoor", "zip_recruiter", "google"]
}
原因:同时从过多网站请求过多结果会触发速率限制并导致超时。
✅ 正确做法:
{
"search_term": "software engineer",
"results_wanted": 20,
"site_name": ["indeed", "linkedin"]
}
❌ 请勿:大量使用LinkedIn
// 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功能
❌ 请勿:使用冲突的筛选条件
// 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.
✅ 应该这样做:
// 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
}
❌ 不要:进行没有上下文的模糊搜索
// BAD - Too generic, will return irrelevant results
{
"search_term": "job"
}
原因:模糊搜索会返回低质量的结果,并浪费API调用次数。
✅ 应该这样做:
- 始终包含具体的职位名称或技能
- 在知道位置时包含地理位置信息
- 使用筛选器来缩小结果范围
❌ 不要:忽略错误响应
原因:速率限制、网络问题和无效参数都需要妥善处理。
✅ 应该这样做:
- 在处理结果前检查错误响应
- 针对速率限制实现带退避的重试逻辑
- 当搜索失败时向用户提供有用的提示信息
❌ 不要:使用错误的国家代码
// BAD - Wrong country code format
{
"search_term": "developer",
"country_indeed": "UK" // Wrong! Use "united kingdom"
}
✅ 应该这样做:
- 使用
`get_supported_countries`来验证有效的国家代码 - 常用代码:"usa"(美国)、"united kingdom"(英国)、"canada"(加拿大)、"germany"(德国)、"india"(印度)
速率限制与最佳实践
平台可靠性排名
- Indeed(求职网站)- 最可靠,适合大规模搜索
- ZipRecruiter(招聘平台)- 在美国/加拿大地区可靠
- Google Jobs(谷歌求职)- 聚合效果好,稳定性强
- Glassdoor(公司点评网站)- 可靠,且提供公司内部洞察
- LinkedIn(领英)- 限制最多,请谨慎使用
推荐方法
- 从小规模开始:先用10-15个结果测试筛选条件
- 优先使用Indeed:获取职位数据最可靠
- 具体化搜索:使用针对性强的搜索关键词
- 明智筛选:在Indeed/LinkedIn上每次仅使用一组筛选条件
- 分页:使用
偏移量来获取更多结果,而非设置过高的所需结果数量
支持的国家
调用get_supported_countries获取完整列表。常见国家包括:
| 国家 | 代码对应country_indeed |
|---|---|
| 美国 | usa |
| 英国 | united kingdom |
| 加拿大 | canada |
| 德国 | germany |
| 法国 | france |
| 印度 | india |
| 澳大利亚 | australia |
| 新加坡 | 新加坡 |
| 日本 | 日本 |
| 荷兰 | 荷兰 |
故障排除
"浏览器/Chromium 未安装"
运行:playwright install chromium(部分爬虫使用 Playwright)
"未找到名为 'jobspy' 的模块"
运行:pip install python-jobspy>=1.1.82
"超出速率限制"
- 减少 results_wanted 参数值
- 从 site_name 中移除 LinkedIn
- 重试前等待 60 秒
- 考虑使用代理
快速参考
| 用户意图 | 关键参数 |
|---|---|
| 查找特定城市的工作 | 搜索词,地点 |
| 仅限远程工作 | 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个之后) |


微信扫一扫,打赏作者吧~