关于 mcp-lever
mcp-lever 将聊天客户端连接到指定公司的公开 Lever 招聘板。它可解析公司站点名、搜索和筛选职位,并读取完整职位描述,无需 API 密钥或账户。
主要功能
- 01解析公司招聘板名称
- 02搜索多家公司的职位
- 03按职位信息筛选招聘
- 04读取完整职位描述
- 05列出公司筛选词
适用场景
- 01比较多家公司的职位空缺
- 02按地点和团队寻找远程职位
- 03查看职位完整描述和薪资
MCP 相关
向 MCP 客户端提供解析 Lever 招聘板、搜索和筛选职位、读取职位详情及列出公司筛选词的工具。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
4收录的工具列表 · 更新于 2 天前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| names | array | 是 | 公司名称或已知的 Lever 站点名称列表,1 至 25 个。 |
详细介绍
mcp-lever
Lever 是一款招聘软件,数千家公司用它来管理招聘流程,每位客户都会获得一个配套的公开职位板。每个职位板都列出该公司的空缺职位,包括职位名称、地点、所属团队和部门、用工承诺、完整招聘广告,以及公司选择公开的薪资范围。Lever 为每家公司托管一个职位板,使用其全球或欧洲实例之一,并且不会对这些职位板建立统一索引。
此服务可将聊天客户端连接到这些职位板。只需指定你感兴趣的公司,它就会将每个公司名称转换为用于访问其职位板的网站名称,搜索职位空缺,并按地点、团队、工作场所类型、国家/地区、薪资或发布时间筛选;查看单个职位的完整信息;还可列出各公司用于筛选的措辞。无需 API 密钥或账户。
安装
一键安装
Claude Code
claude mcp add lever -- npx -y mcp-lever
Claude Desktop、Cursor 及任何使用标准配置格式的客户端
{
"mcpServers": {
"lever": {
"command": "npx",
"args": ["-y", "mcp-lever"]
}
}
}
需要 Node 24 或更高版本,无需设置环境变量。
使用 Docker
{
"mcpServers": {
"lever": {
"command": "docker",
"args": ["run", "-i", "--rm", "ghcr.io/smeet666/mcp-lever:2.0.1"]
}
}
}
-i 会保持标准输入打开,协议通过该输入传输;省略 -t,因为 TTY 会改写数据流。容器只需通过 HTTPS 访问 api.lever.co 和 api.eu.lever.co,无需其他任何内容:不需要卷、端口或凭据。
使用 Bundle,无需 npm
从最新版本下载 mcp-lever-2.0.1.mcpb 并打开。支持 MCP bundles 的客户端会自动安装,无需 npm,也无需编辑配置文件。Bundle 已包含其依赖项,因此安装时不会获取任何内容。
可以询问的内容
- “Included Health、Netlify 和 Ramp 中,哪些公司正在 Lever 上招聘?”
- “帮我查找这三家公司的远程工程岗位。”
- “把那个职位的完整内容读给我听。”
- “Included Health 将哪些地点列为其职位所在地?”
- “Netlify 过去两周发布了什么职位吗?”
每个问题都从公司开始,因为 Lever 不支持跨招聘网站搜索。
search_jobs 会解析你提供的名称,因此无需提前准备:
resolve_company(["Included Health"]) -> includedhealth, global instance, publishing
search_jobs(["Included Health"], keyword: "therapist")
get_job("includedhealth", "6f97a19f-…")
工具
| 工具 | 功能 |
|---|---|
resolve_company | 将公司名称转换为其招聘网站的 Lever 站点名称。 |
search_jobs | 搜索你指定公司的职位。 |
get_job | 读取一个职位的完整内容,包括招聘启事。 |
list_filter_values | 列出一家公司为其职位归类时使用的用语。 |
Lever 站点名称区分大小写,因此 Flex 有结果,而 flex 没有。
每个名称在两个实例上都会尝试四种拼写,结果会列出实际发送的拼写,因此没有找到结果并不能证明该公司不在 Lever 上。
resolve_company
将公司名称转换为 Lever 站点名称,并报告所有有响应的实例。该工具接受一个列表。
| 参数 | 类型 | 必填 | 功能 |
|---|---|---|---|
names | 1 到 25 个字符串组成的数组 | 是 | 公司名称,或你已知的 Lever 站点名称。 |
返回内容: 每个名称对应一条结果,包含 input;found,一个由 { slug, instance, publishes } 组成的列表,其中,如果某个站点存在但今天没有发布任何内容,publishes 为 false;tried,按顺序发送的拼写;以及 cached,如果本次会话已解析过该名称,则为 true。如果某个名称在两个实例上都有结果,返回内容会包含两者,且不会自动选择其中一个:请将你要使用的那个传给其他工具。
search_jobs
搜索指定公司的职位空缺。Lever 会按照其支持的原始措辞应用筛选条件,本服务则会对读取到的职位空缺应用其余筛选条件。
| Argument | Type | Required | What it does |
|---|---|---|---|
companies | array of 1 to 25 strings | yes | 公司名称或 Lever 站点名称。每个名称都在此解析。 |
keyword | string | no | 在职位名称和招聘信息中查找的词语。 |
location | array of 1 to 20 strings | no | 地点,必须与 Lever 中的写法完全一致。 |
team | array of 1 to 20 strings | no | 团队,必须与 Lever 中的写法完全一致。 |
department | array of 1 to 20 strings | no | 部门,必须与 Lever 中的写法完全一致。 |
commitment | array of 1 to 20 strings | no | 用工类型,必须与 Lever 中的写法完全一致。 |
workplace_type | array of 1 to 4 strings | no | remote、hybrid、onsite 或 unspecified。 |
country | array of 1 to 20 two-letter codes | no | 国家/地区的 ISO 代码,例如 FR 或 US。 |
salary_min | number, 0 or more | no | 保留职位所需的薪资范围最低上限。 |
salary_interval | string | no | salary_min 使用的周期,例如 per-year-salary。 |
currency | three-letter code | no | salary_min 使用的货币,例如 EUR。 |
posted_within_days | integer, 1 to 3650 | no | 职位发布的最长期限。 |
limit | integer, 1 to 100, default 25 | no | 每家公司读取的职位空缺数。 |
skip | integer, 0 to 100000, default 0 | no | 每家公司跳过的职位空缺数。 |
Lever 自身会应用 location、team、department 和 commitment;本服务会对读取到的职位空缺应用 keyword、workplace_type、country、salary_min、salary_interval、currency 和 posted_within_days。list_filter_values 会列出前四项可接受的措辞;如果 Lever 不认识某种措辞,就会返回空列表。
返回内容: jobs,其中每项都包含 id 和 company_slug,供 get_job 使用,还包含 title、location、all_locations、country、workplace_type、team、posted_at、url 和 apply_url。如果公司记录中没有 commitment 或 department,则不会返回这些字段。对于未公布薪资的职位,salary 为 null,这绝不等同于零;它还包含 Lever 记录的 interval,不会转换或折算成年薪。per_company 会为每家公司提供一个结果,其 status 为 read、unresolved、empty 或 failed,这四种状态含义各不相同;还会提供筛选前后的 read 和 returned 数量。total_available 始终为 null:Lever 不会公布结果总数。结果不包含招聘信息正文,因为有些公司的职位板内容可能达到数 MB。
limit 按公司分别生效;如果某公司的职位空缺达到此上限,该公司可能还有更多职位。本服务会在备注中说明是否发生这种情况,并指出在该范围内统计的数量只反映此范围。posted_within_days 会遍历每家公司最多 5 页;Lever 按职位名称分页,因此昨天发布的职位可能出现在职位板的任何位置。
get_job
完整读取一个职位:招聘广告、命名的各个部分,以及发布的薪资。
| Argument | Type | Required | What it does |
|---|---|---|---|
company_slug | string | yes | Lever 站点名称,与 resolve_company 返回的值相同。 |
job_id | string | yes | 一个职位的标识符,与搜索返回的值相同。 |
instance | global or eu | no | 该条记录来自哪个实例。默认使用 global 实例。 |
返回内容: job,包含搜索结果行中的字段,以及 description、格式为 { heading, items } 的 sections、记录公司在薪资范围旁所写内容的 salary_note,以及包含检索来源地址的 source。
list_filter_values
列出一家公司使用的团队、地点和雇佣类型表述。筛选前请先读取:Lever 会匹配其自身的表述,而每家公司的用词各不相同;一家写 Full-time,另一家可能写 EE Full-Time。
| Argument | Type | Required | What it does |
|---|---|---|---|
company_slug | string | yes | Lever 站点名称,与 resolve_company 返回的值相同。 |
instance | global or eu | no | 该站点所在的实例。默认使用 global 实例。 |
fields | array of 1 to 3 of team, location, commitment | no | 要读取哪些词汇表。每项会消耗一次请求,默认读取全部三项。 |
返回内容: company_slug、instance 和 fields,其中包含所请求的每个词汇表对应的 { value, count } 列表。如果 Lever 未发布类别对应的数量,count 则为 null。
配置
无需进行任何配置。服务不会读取环境变量,上面的 mcpServers 块已完整可用。
请求间隔、超时和缓存均由客户端层设置,作为库使用部分介绍了如何传入这些设置。可以在此处延长两次请求之间的间隔,但不能缩短。
错误
每种失败都会附带六种代码之一、一条消息,以及在有帮助时附上原本可接受的值。
| Code | What happened | What to do |
|---|---|---|
not_found | Lever 已响应,但不存在此站点或职位。 | 使用 resolve_company 检查站点名称。 |
invalid_input | 请求发出前,参数已被拒绝。 | 阅读消息,其中会指出参数及其接受的值。 |
rate_limited | Lever 要求此客户端放慢请求速度。 | 等待后使用相同的参数再次调用。该职位仍在招聘列表中。 |
parse_failure | Lever 已响应,但返回的数据格式无法由此客户端读取。 | 在问题跟踪器中报告。 |
network_error | 请求未能完成。 | 稍后重试。 |
timeout | 请求超过了截止时间。 | 减少公司数量,或使用更小的 limit。 |
作为库
读取 Lever 的这一层单独发布,拥有自己的节流机制、缓存和错误处理,且不附带任何协议。
import { Client } from "mcp-lever/client";
const client = new Client({ minIntervalMs: 2000 });
const resolved = await client.resolveCompany("Included Health");
const jobs = await client.listPostings(resolved.found[0], { limit: 10 });
console.log(jobs.length);
ClientOptions 接受 minIntervalMs、timeoutMs、cacheTtlMs 和 fetchImpl。
低于已公布下限的间隔会被忽略,因此这里同样遵守该下限。
节流与署名
两个 API 主机都公布了 Crawl-delay: 1,因此请求会逐个发出,且两次请求之间至少间隔 1 秒;无论如何配置客户端,这一下限都始终有效。User-Agent 中包含项目名称和一个可联系到项目维护者的地址,且不会伪装成浏览器。
读取请求会发送到 api.lever.co 和 api.eu.lever.co,这是 Lever 为其职位数据指定的主机。jobs.lever.co 招聘页面不会被访问。
每个职位都会附带其 Lever 页面地址和申请 URL。展示职位时,请注明所属公司并链接到该页面。
此 MCP 服务是一个非官方项目,与 Lever 以及其读取招聘信息的公司均无关联。
隐私
此服务不会收集任何关于你的信息,也不会向作者发送任何内容。它在你的计算机上运行,只会联系 api.lever.co 和 api.eu.lever.co,并在运行期间将响应保存在内存中,不会向磁盘写入任何内容。
PRIVACY.md 说明了请求会携带哪些信息,以及哪些设置会改变这些信息。
开发
npm install
npm run build:fixtures
npm test
npm run check
测试使用生成的夹具运行,不会发出网络请求。实时测试套件 npm run test:live 会对每条路由发出一个请求,并在每晚直接针对服务运行。
贡献
错误报告、问题和想法请提交到问题跟踪器。欢迎提交拉取请求;先创建问题有助于就改动方案达成一致。请参阅 CONTRIBUTING.md。
许可证
MIT,详见 LICENSE。职位信息归发布它们的公司所有。
mcp-lever(法语版)
Lever 是一款招聘软件,数千家公司使用它开展招聘;每位客户都会获得一个公开的职位网站。每个网站列出该公司的空缺职位及其名称、地点、所属团队和部门、所需合同类型、完整招聘信息,以及公司选择公布的薪资范围。Lever 为每家公司托管一个网站,位于其全球实例或欧洲实例上,并且不发布任何跨站点索引。
此服务将对话客户端连接到这些网站。你指定感兴趣的公司,服务会将每个名称转换为用于访问其网站的标识符,在职位信息中搜索,按地点、团队、工作模式、国家/地区、薪资或发布时间筛选,读取完整职位信息,并列出每家公司对职位进行分类时使用的字段。无需 API 密钥,也无需帐户。
安装
一键安装
Claude Code
claude mcp add lever -- npx -y mcp-lever
Claude Desktop、Cursor 及所有采用标准配置格式的客户端
{
"mcpServers": {
"lever": {
"command": "npx",
"args": ["-y", "mcp-lever"]
}
}
}
需要 Node 24 或更高版本,无需设置任何环境变量。
使用 Docker
{
"mcpServers": {
"lever": {
"command": "docker",
"args": ["run", "-i", "--rm", "ghcr.io/smeet666/mcp-lever:2.0.1"]
}
}
}
-i 会保持标准输入打开,这是协议的通道;省略 -t,因为 TTY 会重写数据流。容器只需能够通过 HTTPS 访问 api.lever.co 和 api.eu.lever.co,除此之外不需要任何东西:无需卷、无需端口、无需凭据。
Bundle,无需 npm
从最新发布版本
下载 mcp-lever-2.0.1.mcpb 并打开。支持 MCP bundle 的客户端会自动安装,无需 npm,也无需修改配置文件。bundle 包含其依赖项,因此安装时不会下载任何内容。
可以询问什么
- “Included Health、Netlify 和 Ramp 中,哪些公司正在 Lever 上招聘?”
- “帮我找找这三家公司有哪些远程工程岗位。”
- “把这份职位完整读给我听。”
- “Included Health 按哪些地点对职位进行分类?”
- “Netlify 最近十五天发布了什么职位?”
每个问题都要从一家公司开始,因为 Lever 不支持跨站点搜索。search_jobs 会自行解析提供的名称,因此无需提前准备:
resolve_company(["Included Health"]) -> includedhealth, instance mondiale, publie
search_jobs(["Included Health"], keyword: "therapist")
get_job("includedhealth", "6f97a19f-…")
工具
| 工具 | 功能 |
|---|---|
resolve_company | 将公司名称转换为 Lever 站点标识符。 |
search_jobs | 搜索指定公司的职位。 |
get_job | 完整读取一份职位信息,包括招聘公告。 |
list_filter_values | 列出公司用于分类的选项。 |
Lever 站点标识符区分大小写,因此 Flex 有结果,而 flex 则没有。每个名称都会在两个实例上尝试四种拼写,响应中会列出尝试过的拼写:搜索不到结果,并不能证明某家公司不在 Lever 上。
resolve_company
将公司名称转换为 Lever 站点标识符,并标明每个有响应的实例。该工具接受一个列表。
| 参数 | 类型 | 必需 | 功能 |
|---|---|---|---|
names | 1 至 25 个字符串组成的数组 | 是 | 公司名称或已知标识符。 |
返回内容: 每个名称对应一条记录,包含 input;found,一个由 { slug, instance, publishes } 组成的列表,其中对于存在但当前没有列出任何职位的站点,publishes 为 false;tried,按顺序尝试过的拼写;以及 cached,当本次会话已解析过此名称时为 true。如果一个名称在两个实例上都有结果,则会同时返回两项,不会选择其中任何一项:请将你要查询的那一项传给其他工具。
search_jobs
搜索指定公司的职位。Lever 会按其管理的精确选项应用筛选条件;此服务则会对已读取的职位应用其他筛选条件。
| 参数 | 类型 | 必填 | 作用 |
|---|---|---|---|
companies | 1 到 25 个字符串的数组 | 是 | 公司名称或标识符。每个值都会在此解析。 |
keyword | 字符串 | 否 | 在职位名称和招聘信息中搜索的词语。 |
location | 1 到 20 个字符串的数组 | 否 | 地点,必须与 Lever 中的写法完全一致。 |
team | 1 到 20 个字符串的数组 | 否 | 团队,必须与 Lever 中的写法完全一致。 |
department | 1 到 20 个字符串的数组 | 否 | 部门,必须与 Lever 中的写法完全一致。 |
commitment | 1 到 20 个字符串的数组 | 否 | 合同类型,必须与 Lever 中的写法完全一致。 |
workplace_type | 1 到 4 个字符串的数组 | 否 | remote、hybrid、onsite 或 unspecified。 |
country | 1 到 20 个双字母代码的数组 | 否 | ISO 国家代码,例如 FR 或 US。 |
salary_min | 大于或等于 0 的数字 | 否 | 保留职位的最低薪资范围上限。 |
salary_interval | 字符串 | 否 | salary_min 使用的薪资周期,例如 per-year-salary。 |
currency | 三字母代码 | 否 | salary_min 使用的货币,例如 EUR。 |
posted_within_days | 1 到 3650 的整数 | 否 | 职位发布的最长期限。 |
limit | 1 到 100 的整数,默认值为 25 | 否 | 每家公司读取的职位数。 |
skip | 0 到 100000 的整数,默认值为 0 | 否 | 每家公司跳过的职位数。 |
Lever 会自行应用 location、team、department 和 commitment;此
服务会对读取到的职位应用 keyword、workplace_type、country、salary_min、
salary_interval、currency 和 posted_within_days。
list_filter_values 会提供前四个筛选项所采用的写法;Lever 忽略的写法会返回空列表。
返回值: jobs,其中每项都带有 id 和 company_slug,可供 get_job
使用;此外还包括 title、location、all_locations、country、workplace_type、
team、posted_at、url 和 apply_url。公司未提供时,不会包含 commitment 和 department。
对于已发布但未提供薪资范围的职位,salary 为 null,这绝不表示零;它会保留
Lever 使用的 interval,不会转换或折算为年薪。per_company 会为每家公司提供
一个结果,其 status 为 read、unresolved、empty 或 failed,这代表四种不同的情况;
并提供筛选前后的 read 和 returned 计数。total_available 始终为
null:Lever 不会公布结果总数。职位条目不包含招聘信息,因为公司网站的内容可能达到数 MB。
limit 按公司计算,如果某家公司的职位数量达到该上限,实际发布的职位可能更多:备注会说明这一点,并指出在此范围内获取的账号所测量的就是该范围。posted_within_days 会为每家公司遍历最多 5 页,而 Lever 按职位名称分页,因此昨天发布的职位可能出现在网站的任何位置。
get_job
读取完整职位信息:招聘启事、命名版块,以及发布的薪资信息。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
company_slug | 字符串 | 是 | 网站标识符,由 resolve_company 返回。 |
job_id | 字符串 | 是 | 职位标识符,由搜索返回。 |
instance | global 或 eu | 否 | 职位所在的实例。默认为全球实例。 |
返回: job,包含搜索结果行的字段,以及 description、格式为 { heading, items } 的 sections、公司在薪资范围旁填写的 salary_note,以及记录职位读取来源地址的 source。
list_filter_values
列出公司使用的团队、地点和合同类型表述。
筛选前请先读取:Lever 会匹配其自身的表述,而各公司的用词各不相同;一家使用 Full-time,另一家则使用 EE Full-Time。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
company_slug | 字符串 | 是 | 网站标识符,由 resolve_company 返回。 |
instance | global 或 eu | 否 | 该网站所在的实例。默认为全球实例。 |
fields | team、location、commitment 中的 1 至 3 项组成的数组 | 否 | 要读取的词汇。每项需一次请求;默认读取全部三项。 |
返回: company_slug、instance,以及 fields;其中每个请求的词汇都对应一个 { value, count } 列表。如果 Lever 未在类别旁发布数字,count 就是 null。
配置
无需进行任何配置。服务不会读取任何环境变量,上面的 mcpServers 代码块无需修改即可使用。
请求频率、延迟和缓存均由客户端层配置,作为库使用会展示如何传入这些设置。可以扩大两次请求之间的间隔,但不能缩短。
错误
每次失败都会带有六种代码之一、一条消息,以及在有帮助时说明哪些值会被接受。
| 代码 | 发生了什么 | 该怎么做 |
|---|---|---|
not_found | Lever 已响应,但没有这个站点或职位。 | 使用 resolve_company 检查标识符。 |
invalid_input | 请求发出前,参数就已被拒绝。 | 阅读消息,其中会指出参数及其接受的内容。 |
rate_limited | Lever 要求此客户端放慢速度。 | 等待后使用相同参数重试。职位仍在线。 |
parse_failure | Lever 的响应格式无法被此客户端读取。 | 请在问题跟踪页报告。 |
network_error | 请求未能完成。 | 稍后重试。 |
timeout | 请求超时。 | 减少企业数量,或使用更小的 limit。 |
作为库使用
读取 Lever 的部分单独发布,包含自己的节奏、缓存和错误处理,且不绑定任何协议。
import { Client } from "mcp-lever/client";
const client = new Client({ minIntervalMs: 2000 });
const resolved = await client.resolveCompany("Included Health");
const jobs = await client.listPostings(resolved.found[0], { limit: 10 });
console.log(jobs.length);
ClientOptions 接受 minIntervalMs、timeoutMs、cacheTtlMs 和 fetchImpl。
低于已公布下限的间隔会被忽略,因此此处同样会遵守该下限。
请求节奏与归属信息
两个 API 主机都发布了 Crawl-delay: 1,因此请求会逐个发出,且间隔至少为一秒;无论客户端如何配置,都会遵守此下限。User-Agent 会注明项目和可联系到相关人员的地址,不会伪装成浏览器。
读取请求会发送到 Lever 为职位数据指定的主机 api.lever.co 和 api.eu.lever.co。不会访问招聘页面 jobs.lever.co。
每个职位都带有其 Lever 页面地址和申请地址。展示职位时,请注明所属企业并链接到该页面。
此 MCP 项目为非官方项目,与 Lever 及其读取网站的企业均无关联。
隐私
此服务不会收集你的任何信息,也不会向其作者发送任何内容。它在你的计算机上运行,只连接 api.lever.co 和 api.eu.lever.co,会在运行期间将响应保留在内存中,也不会写入磁盘。PRIVACY.md 说明了请求会携带哪些信息,以及哪些设置会改变这些信息。
开发
npm install
npm run build:fixtures
npm test
npm run check
测试使用生成的 fixtures 运行,不会发出任何请求。实时测试套件 npm run test:live 会为每个路由发出一个请求,并且每晚针对服务本身运行。
贡献
问题、疑问和想法都可以提交到问题跟踪页。欢迎提出修改建议;先创建议题有助于就修改方案达成一致。请参阅 CONTRIBUTING.md。
许可证
MIT,详见 LICENSE。职位信息归发布它们的企业所有。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。