关于 jd-intel-mcp
jd-intel-mcp 让支持 MCP 的 AI 客户端从九种 ATS 平台获取并筛选完整职位描述。它将职位整理为统一结构,包含清晰的 Markdown 描述及可用的薪资和地点信息。
主要功能
- 01从九种 ATS 平台获取职位
- 02按职位、主题、地点和发布时间筛选
- 03将职位整理为统一结构
- 04以清晰 Markdown 返回完整描述
- 05搜索公司注册表并识别 ATS
适用场景
- 01查找公司的当前职位
- 02根据候选人背景比较岗位
- 03批量查看某行业的职位描述
- 04识别公司的招聘平台
MCP 相关
MCP 服务提供 fetch_jobs、search_registry 和 detect_ats 工具,以及 registry://jd-intel/all 资源。它在本地运行,通过公开 ATS API 获取数据,无需 API 密钥。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
3收录的工具列表 · 更新于 2 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| limit | integer | 否 | 每页最多返回的职位数(默认值为 100)。通常 max_tokens 会先限制输出。 |
| order | enum | 否 | "newest"(默认值):按 postedAt 排序,未标注日期的排在最后。"board":按 ATS 自身的顺序。newest | board |
| filter | string | 否 | 在标题、部门和描述中匹配正则表达式:主题/范围 |
| offset | integer | 否 | 排序后跳过的匹配项数(默认值为 0)。传入上一次响应中的 next_offset 以获取下一页。 |
| company | string | 是 | 公司 slug 或名称(例如 "stripe") |
| workday | object | 否 | 为未编入索引的 Workday 招聘板覆盖注册表配置。根据招聘页面 URL https://{tenant}.{env}.myworkdayjobs.com/{site} 推导这三个值。切勿猜测。 |
| workday.env | string | 是 | Workday 环境/数据中心,例如 "wd108"、"wd5" |
| workday.site | string | 是 | Workday 招聘网站路径,例如 "search"、"Cisco_Careers" |
| workday.tenant | string | 是 | Workday 租户,即 URL 中的第一个标签,例如 "expedia" |
| max_tokens | integer | 否 | 响应的 token 预算,按文本块字符数的 1/4 计算(默认值为 12000,最小值为 1 的任意整数)。只返回完整职位;始终至少返回一个。较大的值可让每次调用返回更多完整招聘信息;较小的值适合快速浏览。 |
| title_filter | string | 否 | 仅针对标题匹配正则表达式:职位身份 |
| location_excludes | array | 否 | 仅当职位列出的所有地点都包含某个关键词时才排除该职位 |
| location_includes | array | 否 | 保留列出的任一地点包含任一关键词的职位 |
| posted_within_days | integer | 否 | 仅返回过去 N 天内发布的职位 |
详细介绍
jd-intel
别再把职位描述粘贴到 AI 助手中,让你的 AI 直接获取。
完整文本。结构清晰。覆盖九大主流 ATS。无需复制粘贴,不会丢失上下文。
为什么要做这个
你的 AI 助手已经很了解你。它的记忆里有你的简历、目标职位、过往项目和背景。只要你提供职位描述,它就能立即帮上忙。
于是你开始复制粘贴。
一家公司的职位描述,下一家公司的职位描述,还有目标清单里的十几份。其中一半 HTML 格式错乱。薪资信息在转换时丢失。链接被去掉。每看一个职位,都得从头来一遍。
你可以等招聘平台推出自己的 MCP。它们迟早会做到,但要按它们自己的时间表,受它们的优先事项影响,而不是为你着想,还得依赖它们的查询抽象。
jd-intel 不必等。让你的 AI 按你的方式直接获取原始职位描述,比精挑细选后的信息更接近源头。
试着问问你的 AI:
“查找本周发布的 AI/ML 工程职位。” “现在有哪些金融科技公司的产品设计师职位在招聘?” “查找过去 7 天发布的高级产品经理职位。”
搞定。
为什么不直接抓取网页?
因为网页抓取会在 jd-intel 不会出问题的地方出问题:
- 浏览失败时也能获取完整职位描述。 单页应用渲染的招聘页面、加载缓慢、身份验证墙和地理限制都会阻止浏览器访问,但不会阻止公开 API 调用。
- 结构化数据,而不是一团 HTML。 薪资、工作地点类型、部门和整洁的 Markdown 格式,均已在九种 ATS 之间统一规范。
- 无需密钥,无需浏览器。 仅使用公开 API,可在你的 AI 能运行的任何地方运行。
- 一个架构,适用于所有平台。 Greenhouse、Lever、Ashby、SmartRecruiters、Teamtailor、Recruitee、Personio、Workable 和 Workday 返回相同的数据结构。
你可以用它做什么
- 让 AI 直接查询任意公司的开放职位,无需复制粘贴
- 在一次对话中针对十个职位调整简历
- 根据你的背景为开放职位匹配度排名
- 扫描整个行业:“查找本周发布的金融科技公司开放职位”
- 批量阅读职位描述,调研各个团队
工具负责获取信息,AI 负责思考。
安装
适用于支持 MCP 的 AI 客户端:Claude Desktop、Claude Code、Cursor、Windsurf、VS Code。ChatGPT、Gemini 和其他不支持 MCP 的客户端目前还不支持这一功能。它们使用不同的工具调用系统。(我们也希望它们支持。无论你使用哪种 AI,对话方式都不影响协议的工作方式。)
所有操作都在你的本地计算机上运行。这也意味着仅支持桌面端:移动应用无法运行本地 MCP 服务,因此 jd-intel 无法在手机或平板电脑上使用。
Claude Desktop(单文件安装,无需终端)
最简单的方式。无需 Node.js 或终端:Claude Desktop 使用自带的运行时运行服务。
- 下载扩展:jd-intel.mcpb。
- 在 Claude Desktop 中,打开设置,然后依次打开扩展、高级设置,再点击安装扩展。选择下载的文件。
- 查看访问权限摘要,点击安装,然后开始新的聊天。工具会自动显示。
快捷方式:将 .mcpb 拖到设置窗口中,或在系统设置为用 Claude Desktop 打开 .mcpb 文件时双击该文件。此扩展是开源且未经签名的,因此 Claude Desktop 会显示“未经验证”提示。选择仍要安装。
更喜欢使用终端,或使用较旧版本的 Claude Desktop?安装 Node.js 18+,运行 npx jd-intel-mcp install,然后重新打开 Claude Desktop。或者直接编辑配置文件,参见手动安装(备用方式)。
其他客户端(Claude Code、Cursor、Windsurf、VS Code)
单文件 .mcpb 安装是 Claude Desktop 的专属功能;这些客户端通过 npx 运行同一服务,并需要 Node.js 18+。
Claude Code
claude mcp add jd-intel -- npx -y jd-intel-mcp
Cursor(依次打开设置、工具与 MCP、新建 MCP 服务,或编辑 ~/.cursor/mcp.json):
{
"mcpServers": {
"jd-intel": { "command": "npx", "args": ["-y", "jd-intel-mcp"] }
}
}
Windsurf(依次打开设置、工具、Windsurf 设置、添加服务,或打开查看原始配置以编辑 mcp_config.json)。使用与 Cursor 相同的 mcpServers 块,然后点击刷新。
VS Code(Copilot Agent 模式):运行 MCP: Add Server 命令,或创建 .vscode/mcp.json。键为 servers,类型为 stdio:
{
"servers": {
"jd-intel": { "type": "stdio", "command": "npx", "args": ["-y", "jd-intel-mcp"] }
}
}
确认运行正常
开始新的聊天并询问:“jd-intel 注册表中有哪些金融科技公司?” 如果它列出了公司,就说明已配置完成。然后试试实际需求:“查找目前正在招聘、且适合我的高级 PM 职位。”
工具没有显示?
- 完全退出并重新打开客户端(请退出,不要只关闭窗口)。Claude Desktop:打开系统托盘,然后选择退出(Windows);或按 ⌘Q(macOS)。
- 对于使用 npx 的客户端(Claude Code、Cursor、Windsurf、VS Code),运行
npx clear-npx-cache,然后重启。 - 确认 npx 安装方式使用的
node --version为 18 或更高版本。一键.mcpb安装无需 Node。
面向开发者
npm install jd-intel
import { fetchJobs } from 'jd-intel';
const jobs = await fetchJobs({
company: '<your-target-company>',
titleFilter: 'designer',
postedWithinDays: 14,
limit: 50,
});
结果按 postedAt 从新到旧返回,未注明日期的排在最后(order: 'board' 会保留 ATS 自身的顺序)。fetchJobs 以数组形式返回当前页。fetchJobsDetailed 返回相同页面,并附带 total_matched,即应用 offset 和 limit 前的匹配数量,因此你可以判断职位列表较少还是结果被截断,并继续翻页查看其余结果:
import { fetchJobsDetailed } from 'jd-intel';
const { jobs, total_matched } = await fetchJobsDetailed({
company: '<your-target-company>',
titleFilter: 'engineer',
limit: 20,
offset: 20, // second page
});
相同的结果还会说明公司是如何解析的,以及哪些职位板块作出了响应:
match:registry(已知公司,调用一个适配器)、probe(不在注册表中,询问所有适配器)或workday_override(显式的 Workday 配置)。company:匹配注册表时,取自注册表条目的{ key, name };否则为 null。boards:每个作出响应的职位板块对应一个条目,格式为{ ats, slug, name, site, board_url, org_name, org_url, jobs_found, matched, selected, scan }。jobs_found统计职位板块在应用任何筛选条件前列出的行数。Workday 和 SmartRecruiters 会在获取详细信息前筛选列表,因此对这两个平台而言,该值是列表数量,而不是实际返回的行数(当列表扫描达到上限时,这是一个下限)。matched是应用筛选条件后、应用offset和limit前剩余的行数,因此即使某个职位板块的所有行都被排除在当前页面之外,它仍会显示。board_url根据 slug 构建。org_name和org_url是职位板块对自身的描述:ATS 响应中的组织名称,以及其链接指向的招聘或公司域名;平台未提供这些信息时则为 null(Lever 和 Ashby 均不提供)。不会根据 slug 或注册表中的名称补全信息。probe匹配仅表示 slug 匹配,并不代表已确认身份:在将职位视为该公司的职位之前,请将org_name和org_url与目标公司进行核对;如果它们为 null,请打开board_url核实。failed:发现过程中发生异常的适配器,格式为{ ats, slug, name, code, message },其中code为rate_limited或ats_unreachable。如果没有任何职位板块作出响应,且检查过程中发生错误,fetchJobs会抛出该错误,而不是返回[],因此服务中断不会被误判为“未找到”。total_before_filters:jobs_found的总和。如果匹配数为 0,但total_before_filters大于 0,说明该公司正在招聘,但所有 ATS 上的职位都未通过筛选条件。
detectAtsDetailed(company) 返回 { boards, failed }:先列出注册表条目(source: 'registry',不会进行探测),然后按平台顺序列出所有作出响应的实时探测结果(source: 'probe');failed 列出无法检查的探测结果,错误代码相同。detectAts 仍返回 [{ ats, slug }]。
如果库无法执行某项调用,会抛出 ArgumentError(code: 'invalid_args'):未提供公司、ats 未知,或 titleFilter 或 filter 无法编译为正则表达式。该错误会在发出任何请求前抛出。
CLI 用法:npx jd-intel fetch <company-slug> --title-filter "engineer" --posted-within-days 14。完整筛选条件参考见下文。
每个 ATS 请求最多等待服务器 10 秒开始响应。遇到 429、5xx 或网络错误时,最多重试 3 次,并采用退避策略(1s、2s);如果 ATS 提供 Retry-After,则遵循该值。每个主机同时最多运行 4 个请求。重试后仍失败时,会抛出 AtsError,其 code 为 rate_limited 或 ats_unreachable。
Node.js 18+。无需 API 密钥。无需配置。
手动安装(备用方案)
如果 npx jd-intel-mcp install 失败,请直接编辑配置。
配置文件位置:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"jd-intel": {
"command": "npx",
"args": ["-y", "jd-intel-mcp"]
}
}
}
重启 Claude Desktop。
更新
- Claude Desktop 扩展(
.mcpb): 安装较新的.mcpb覆盖当前版本,或前往 Settings,再进入 Extensions 进行管理。删除并重新安装即可重置。 - npx 客户端(Claude Code、Cursor、Windsurf、VS Code):
npx -y jd-intel-mcp会从 npm 缓存获取新版本(约 24 小时内)。如需立即强制更新,请运行npx clear-npx-cache,然后重启客户端。 - 库或 CLI:
npm install jd-intel@latest(强制安装最新版本),或npm update jd-intel(遵循 semver)。
公司注册表会自动刷新:jd-intel 启动时会获取当前列表,离线时则回退到内置副本,因此无需重新安装即可显示新公司。
MCP 工具
| 工具 | 用途 |
|---|---|
fetch_jobs | 获取公司的开放职位,并按职位类型、主题、地点和发布时间筛选 |
search_registry | 按名称或行业查找公司 |
detect_ats | 识别公司使用的 ATS 平台 |
此外还有一个资源:registry://jd-intel/all。完整公司注册表,按 ATS 分组。进行广泛目录调查时会按需获取。
返回内容
每个职位都会规范化为统一的架构,适用于所有平台:
{
"id": "a1b2c3d4e5f6",
"company": "Example Co",
"title": "Senior Software Engineer, Platform",
"department": "Engineering",
"location": "Remote - US",
"locations": ["Remote - US", "Toronto, Canada"],
"locationType": "remote",
"workplace": { "type": "remote", "source": "ats" },
"salary": { "min": 180000, "max": 240000, "currency": "USD", "period": "year", "source": "text" },
"description": "Design and build the API surface our customers integrate against...",
"url": "https://boards.example.com/jobs/12345",
"postedAt": "2026-04-10T14:30:00Z"
}
无需针对每家公司自定义解析。
数据模型
| 字段 | 说明 |
|---|---|
title | 完整职位名称 |
company | 规范化后的公司名称 |
department | 团队或部门(如有提供) |
location | 主要地点:城市、州、国家或远程 |
locations | 招聘启事开放的所有地点,主要地点排在首位。地点筛选器会检查每个条目 |
locationType | remote、hybrid、onsite;如果平台和地点文本均未说明,则为 unknown |
workplace | { type, source }。type 与 locationType 相同;如果平台有说明,source 为 ats;如果从地点字符串中读取,则为 text;未知时为 null |
salary | 含 currency 的最低至最高薪资范围,以及 period(year、month、hour 或 null)和 source(平台提供时为 ats,从招聘启事解析时为 text)。未说明时为 null |
description | 格式整洁的完整 JD Markdown。若 content.status 为 missing,则为空 |
content | { status, reason }。读取到招聘启事时为 complete。如果 Workday 或 SmartRecruiters 列出了职位,但职位详情请求失败,则为 missing(reason:http_503、http_429、network_error),此时 description 和 salary 未知 |
url | 招聘启事的直接链接 |
postedAt | 发布日期(如有提供) |
支持的平台
| 平台 | 状态 | 常见用途 |
|---|---|---|
| Greenhouse | 已发布 | 科技行业使用最广泛的 ATS |
| Ashby | 已发布 | 在初创公司中快速普及 |
| Lever | 已发布 | 中型公司常用 |
| SmartRecruiters | 已发布 | 大型企业和中端市场 |
| Teamtailor | 已发布 | 欧洲初创公司和规模扩张型公司 |
| Recruitee | 已发布 | 荷兰 / 欧盟中小企业和规模扩张型公司 |
| Personio | 已发布 | 德国 / 欧盟中端市场 |
| Workable | 已发布 | 全球中小企业 |
| Workday | 已发布 | 大型企业(按注册表键值索引) |
新增 ATS 只需一个适配器文件。请参阅贡献指南。
筛选器(快速参考)
| 标志 | 匹配内容 | 用途 |
|---|---|---|
--title-filter | 仅职位名称 | 职位身份(PM、工程师、设计师) |
--filter | 职位名称 + 部门 + 描述 | 主题或范围(集成、增长) |
--posted-within-days | 最近发布的招聘启事 | 筛选近期职位 |
--location-include | 地点包含任一关键词 | 定位地区 |
--location-exclude | 地点不包含任何关键词 | 排除地理噪声 |
--limit | 前 N 条结果 | 限制输出大小 |
所有筛选条件按 AND 组合。有关模式和注意事项的深入说明:docs/filters.md。
路线图
已交付
- 库、CLI 和 MCP 服务(同一工具包的三个入口)
- Greenhouse、Ashby、Lever、SmartRecruiters、Teamtailor、Recruitee、Personio、Workable、Workday 适配器
- 职位名称、主题、地点和日期筛选条件
- 从 JD 文本中提取薪资
- 已验证的公司注册表(1,100 多家公司)
下一步
- 提交至 Anthropic MCP marketplace
计划中
- 时间追踪(职位何时开放、关闭、重新开放)
- 变更检测
- 基于简历的匹配度评分
参与贡献
详情请参阅 CONTRIBUTING.md。简而言之:
**向注册表添加公司:**不要手动编辑 registry/*.json。将候选公司放入 tmp/candidates.json,然后运行实时检查。该检查会实际调用每个招聘平台,并仅保留有正在招聘职位的平台:
node scripts/verify-registry.mjs --candidates tmp/candidates.json --limit 50
node scripts/append-registry.mjs
npm run sync:registry-pages
node --test test/*.test.js
未通过检查的条目无法合并。看起来没问题、实际却没有返回任何结果的招聘平台,会在某人的搜索中悄无声息地失效,这比完全没有这家公司更糟。Workday 需要一个 {tenant, env, site} 格式的 config,从公司的真实招聘网址中读取,绝不能按模式构造。CONTRIBUTING.md 介绍了如何查找并确认这些信息。
**添加 ATS 适配器:**在 src/adapters/ 中新建文件。一个适配器对应一个文件。遵循现有适配器的模式。
申请添加公司:提交 issue。告诉我缺少了哪些公司。单是这一点就很有帮助。
构建者
Prashant R。一位动手实践的 PM。我会在 AI 炒作之下,尝试并构建真正重要的东西。
- 作品集和文章:prashantrana.xyz
许可证
MIT
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。