mcpField
O
OpenHire · 哨兵

OpenHire · 哨兵

本地服务
github.com/gzchenhao商业与营销14今天更新

关于 OpenHire · 哨兵

OpenHire 是面向求职者的 MCP 招聘搜索服务,索引雇主自有招聘页和 ATS 职位,并以雇主报告的原始发布日期呈现岗位时长。简历保留在本机,匹配在本机运行;服务不代为申请,排序由匹配度和新鲜度决定。

主要功能

  1. 01搜索雇主自有招聘职位
  2. 02显示原始发布日期与在架天数
  3. 03依据匹配度和新鲜度排序
  4. 04本机执行简历匹配,不上传简历
  5. 05提供雇主投递页链接
  6. 06支持 MCP 搜索及 CLI 查询

适用场景

  1. 01按城市、技能和岗位方向找工作
  2. 02筛除长期在架或过时职位
  3. 03跟踪某家公司的新招聘岗位
  4. 04用 CLI 刷新索引并查询职位

MCP 相关

此 MCP 服务向助手提供职位搜索工具,结果含职位日期、在架天数及雇主投递链接。服务下载公开索引;匹配在本机执行,协议不接收简历,也不提交求职申请。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"gzchenhao-openhire": {
"command": "uvx",
"args": [
"openhire"
],
"env": {
"OPENHIRE_DATABASE_URL": "<OPENHIRE_DATABASE_URL>"
}
}
}
}
启动命令uvx openhire
需要配置的环境变量
OPENHIRE_DATABASE_URLOptional. Postgres URL (postgresql+psycopg://…); omit to use the local SQLite index.

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypiopenhire0.8.31

工具

8

收录的工具列表 · 更新于 今天

参数类型必填说明
limitinteger否
titleany否
offsetinteger否
remoteany否
skillsany否
companyany否
currencyany否
locationany否
min_salaryany否
role_familyany否
remote_scopeany否
required_skillsany否
collapse_role_groupboolean否
require_stated_salaryboolean否

详细介绍

OpenHire · 开聘

为你的 AI 助手打造的求职雷达——一手职位,每个岗位的实际在架时长一目了然,简历绝不经过我们的服务器。 让 AI 助手替你盯岗的求职雷达:一手职位、岗位在架时长打分,简历不经过我们的服务器。

MCP 1.0 privacy: local-first python ≥ 3.11 license: MIT 143 employers hiring OpenHire on Glama

30 秒快速开始:pipx install openhire、ohp bootstrap、ohp search

真实终端输出——从 PyPI 安装,下载公开索引,开始搜索。无需账户,无需注册。

这里的每个数字都可核查。 岗位在架时长报告 (按雇主统计中位数,列出雇主名称,按月更新) · numbers.json (我们引用的每个数字的来源,每次刷新时重新生成) · 原始报告数据。 我们引用的每个数字都能核:岗位在架时长月报 · numbers.json

这里收录了贵公司的职位,但这些职位不是贵公司提交的吗? 这些职位会出现在索引中,是因为贵公司自己的招聘页面公开提供了这些信息。我们 可以测量职位开放了多久;但无法知道原因,开放时间长只是一个疑问,不是定论。认领贵公司——免费, 永不收费——用自己的话说明原因,或者要求我们将贵公司移除,我们会照办, 不会争辩。 贵公司被收录了、而且不是贵公司提交的?点这里认领,免费, 可以用自己的话解释,也可以直接要求我们移除。

三不原则 · OpenHire 绝不做的三件事

  1. 不存简历 · 绝不保存简历。 简历留在你的电脑上。过网的只有一个你自己生成的匿名指纹和岗位号;协议里没有简历字段,多传一个 resume 参数会被拒绝,CI 测试钉死。 Your résumé stays on your machine. Only an anonymous, client-generated fingerprint and a job id ever cross the wire; the protocol has no résumé field, an extra resume argument is refused, and CI pins it.
  2. 不刷假单 · 绝不代你申请。 它只把你送到雇主自己的投递页,从不向任何 ATS 提交申请;连表单长什么样,我们的测试也只用一次普通 GET 看,到此为止。 It hands you the employer's own apply page and never submits anything to any ATS. Even our own tests only GET the form once and stop.
  3. 不追踪 · 绝不追踪。 不埋点、不统计谁看了什么。服务器只记一条匿名授权(指纹 + 岗位号),没有你是谁;索引本身跑在你自己的机器上。 No analytics, no view counting, no telemetry. The server keeps one anonymous authorization record (fingerprint + job id) and nothing about who you are; the index itself runs on your machine.

还有一条不在这三条里,但同样锁死:排序买不到,它是(匹配度,新鲜度)的纯函数,见下文三条隐私红线。 One more that is locked the same way: ranking cannot be bought; it is a pure function of (match, freshness). See the three red lines below.

你的 Agent 实际看到的内容

你用自然语言向助手提问。它会调用 search_jobs,返回的每一条职位信息都附带雇主的真实发布日期——这样 Agent 就能判断职位是否过时,而不是靠猜。

你: 有没有仍在招聘的高级 Python 职位?跳过过时的。

// one row from search_jobs — trimmed to the fields that matter here
{
  "title":        "Senior Python Engineer",
  "company":      "MongoDB",
  "datePosted":   "2026-03-31",   // from the employer's ATS, not a board's refreshed label
  "days_open":    166,
  "ghost_score":  0.61,           // pure f(relist_count, datePosted) — frozen by a test
  "apply_channel":"https://boards.greenhouse.io/…",   // straight to the employer
  "verified_at":  "2026-09-02T09:47:10Z"
}

助手: 这个职位已开放 166 天,ghost_score 为 0.61——我会降低它的优先级。 以下是四个过去三周内发布的职位……

ghost_score 衡量的是职位开放了多久,而不是雇主是否仍打算招聘。职位长期开放也可能意味着「难以招满」。把它视为一个值得询问的理由,而不是定论。


一个 MCP 服务,可将任何使用 MCP 通信的助手——Claude、豆包 Doubao、DeepSeek(通过 Cherry Studio 或 Chatbox 等 MCP 客户端)、Cursor、腾讯 WorkBuddy、TRAE、Windsurf、Cline、ChatGPT(通过下方托管端点)——变成专属雷达,帮你搜索AI / Infra、自动驾驶和具身 AI 职位。职位直接来自173 家雇主自己的招聘网站和公开 ATS API(Greenhouse / Lever / Ashby / 北森 Beisen / Moka,以及理想汽车等雇主自有招聘网站),覆盖美国、欧洲和中国(Waymo、Figure、Zoox,以及宇树、XPeng、UBTECH、Mech-Mind……)。 无需账户、无需注册、无需上传简历,永远如此。

招聘网站做不到的三件事:

  • 显示每个职位实际开放了多久。 每条职位信息都会根据雇主的真实发布日期计算 ghost_score;如果雇主系统没有提供发布日期,则使用本索引首次发现该职位的日期,并标记为 date_signal:招聘网站显示的「2 天前」在 ATS 中可能已是 300 天前。
  • 结构性隐私保障,而非口头承诺。 协议中没有简历字段;如果有人添加简历字段,CI 测试就会导致构建失败。匹配在你的设备上进行——只有匿名指纹会发送到服务端。
  • 无法花钱操控的排名。 排序是(匹配度、新鲜度)的固定纯函数。没有赞助位,也不接受竞价——其签名由测试锁定。

这是「哨兵 / Sentinel」参考实现——完整的协议规范请参见 design_handoff_openhire_v01/README.md。

快速开始 — 不到一分钟

无需安装,也无需等待爬取。 将以下内容添加到 MCP 客户端的配置中:

{ "mcpServers": { "openhire": { "command": "uvx", "args": ["openhire@latest", "serve"] } } }

然后让助手帮你找工作。全部设置就这些。服务会在首次启动时自动于后台下载约 30 MB 的公开索引,因此几分钟内搜索结果就会逐渐完善,而你已经可以开始和它对话了。无需账号、无需注册,也无需上传简历。

或者,粘贴这段内容,让助手完成安装并进行首次搜索(中间的检查很重要:助手刚添加服务后,通常要等重启后才能使用;如果不加提醒,它可能会用网页搜索伪造结果):

帮我装一个 MCP 服务:名字 openhire,启动命令 uvx openhire@latest serve。如果电脑上没有 uv,先帮我装 uv。

装好后检查:你现在能不能调用 openhire 的工具(比如 search_jobs)?
- 如果能,直接接着做下面的找工作任务。
- 如果不能(需要重启或开新对话才能加载),就停下来,告诉我该怎么重启,不要用网页搜索或别的办法代替。我重启后会把这整段再贴一次。

找工作任务:我的情况:[目标城市],想做[岗位方向,例如 AI 产品经理 / 感知算法 / 机器人运营],[几年]经验,会[3 到 5 个技能],不考虑[不要的方向]。
1. 用 OpenHire 搜索匹配的在架岗位,每条带公司、地点、原始发布日期、在架天数和投递链接,最近发布的排前面。
2. 在架时间特别长的岗位单独列出来提醒我,但不要替我下结论说它不招了。
3. 搜不到的公司,用门户目录告诉我它们的招聘页在哪里。
4. 帮我把这个求职意向设成盯岗,以后我说「检查一下」,就告诉我新出现了哪些岗位。
5. 我挑中哪家,就用企业背景查证帮我把这家公司查一遍。

我的简历只留在我电脑上,不要发给任何服务器。投递由我自己点链接去做。
Install an MCP server for me: name openhire, command uvx openhire@latest serve. If uv is missing on this machine, install uv first.

Then check: can you call openhire's tools right now (search_jobs, for example)?
- If yes, go straight on to the job-search task below.
- If not (a restart or a new chat is needed to load it), stop and tell me how to restart. Do not substitute a web search or anything else. I will paste this whole block again after restarting.

Job-search task. About me: [city], looking for [role, e.g. AI product manager / perception / robotics operations], [N] years, skills [3 to 5], not interested in [what to exclude].
1. Search OpenHire for matching live postings: company, location, original posting date, days open and apply link, newest first.
2. List the postings that have been open unusually long separately, without concluding they are no longer hiring.
3. For employers it cannot find, use the portal directory to tell me where their careers pages are.
4. Register this intent as a watch; when I say "check", tell me what is new.
5. When I pick one, run the employer check on it.

My résumé stays on my machine; never send it to any server. I apply by clicking the links myself.

可以对它说什么。 无需知道工具名称,直接用普通句子即可。可粘贴以下任意内容:

帮我找上海的感知算法岗,列出原始发布日期和在架天数
盯住 OKX 的招聘页,有新岗告诉我
把 https://jobs.lever.co/<公司> 加进我的索引,以后每周帮我刷新
哪些具身公司的岗位在飞书上?把它们的招聘页给我
查一下这家公司靠不靠谱:<公司名>
智驾和具身公司现在在招哪些 HR 和招聘岗?列出公司、城市和发布日期

Find perception roles in Shanghai with their original posting dates
Watch OKX's careers page and tell me when something new appears
Which embodied-AI employers post on Feishu? Give me their careers pages

支持显示 MCP 提示词的客户端(Claude Desktop 的“+”菜单、Claude Code 或 VS Code 中的斜杠命令)还会列出 6 个现成提示词:求职清单 · Job-search checklist、找工作雷达 · Job radar、盯一家公司 · Track one employer、查这家公司靠不靠谱 · Check an employer、看看我的雷达 · What's new on my radar,以及本周新岗 · New this week。在其中输入中文时,每个提示词都会以中文呈现。

首次使用时,无需询问即可获得以下三项内容:

  • 免费的求职清单:从确定目标到拿到 offer 的每一步、AI 能帮你做什么、哪些事情需要你自己完成,以及三项防诈骗检查,并附上官网地址。建议收藏:地址会变,诈骗手法也会变,这个页面会持续更新。支持中文和英文,可在右上角切换。 gzchenhao.github.io/openhire/checklist.html 找工作每一步该做什么、哪步能让 AI 替你做、查公司和防骗去哪个官网,一页写全,免费,不用注册: openhire-vlny.onrender.com/checklist(国内直接开)
  • HR 和招聘岗位有自己的类别(role_family: hr):招聘人员、HRBP 或人力运营人员可以搜索自己的领域,无需在“运营”类别中翻找。 HR、招聘岗单独成类,做 HR 的人也能直接搜自己的岗。
  • 在中国大陆无需代理即可使用: GitHub 无法访问时,索引会自动从 CNB(腾讯)镜像下载;文件相同,校验方式也相同。 国内网络不用代理:GitHub 不通时自动从腾讯 CNB 镜像拿索引,同一份数据。

唯一的前置要求是 uv(它提供 uvx)。如果没有它,上面的配置只会报“server failed to start”,所以请先安装:

curl -LsSf https://astral.sh/uv/install.sh | sh     # macOS / Linux
irm https://astral.sh/uv/install.ps1 | iex          # Windows PowerShell

使用 Claude Desktop 时,连这一步都可以跳过 — 下载 openhire-0.8.28.mcpb 并双击即可。无需终端、无需 Python,也无需 uv。

在 Cursor 中,只需点击一次(但仍需将 uv 添加到 PATH):在 Cursor 中安装 MCP 服务

各客户端的配置路径,以及 uvx 与一次性安装的利弊,见下方的 支持的客户端。

更喜欢使用终端? 通过命令行使用同一份索引。
pipx install openhire      # keeps it isolated and puts `ohp` on your PATH
ohp bootstrap              # 173 employers · ~20k live postings · no account

ohp search --required-skills rust,k8s --remote --role-family engineering
ohp search --currency CNY --role-family engineering   # e.g. CN 智驾 / robotics roles

ohp bootstrap 会下载公开快照(约 30 MB,无需账号),然后运行一次增量爬取,以更新 verified_at 并捕获已下架的职位。爬取是耗时的部分 — 冷启动索引时,每家雇主需占一行,耗时超过 20 分钟 — 快照下载完成后即可停止爬取;索引已经可以使用,只是验证时间停留在上次每周更新的时间,而不是今天。上面的 MCP 使用方式无需这些操作:serve 会在后台自动获取快照。


支持的客户端

所有客户端使用相同的 MCP 入口。以下配置适用于所有 MCP 客户端,并会按需拉取软件包 — 但需要先安装 uv。

刚接触 MCP?先看下面这两种快捷方式,再配置。 Claude Desktop:下载 openhire-0.8.28.mcpb 并双击即可。无需终端,也无需 Python。 Cursor — 在 Cursor 中安装 MCP 服务(需要安装 uv)。 腾讯 WorkBuddy / Cursor / Claude Code / TRAE — 粘贴上方快速入门中的单段提示词, 它会安装并检查工具是否可调用,然后执行首次搜索。 ChatGPT(付费方案)— 设置 → 连接器 → 高级 → 开发者模式 → 创建,名称填 OpenHire,URL 填 https://openhire-vlny.onrender.com/mcp,无需身份验证。无需安装任何内容; 该主机只能看到工具参数,看不到简历(参见 docs/PRIVACY.md §3)。 豆包(豆包工作) — 它的自定义连接器需要 HTTP 地址,而不是命令:在你的机器上运行 ohp serve --transport streamable-http --port 8000,然后添加 http://127.0.0.1:8000/mcp 作为自定义连接器(参见「Works with」下的豆包条目)。 DeepSeek — DeepSeek 应用没有 MCP 接入位;请在 MCP 客户端 (Cherry Studio、Chatbox、Cline、WorkBuddy、TRAE)中使用 DeepSeek,并向该客户端提供以下配置。

前提条件: uvx 随 uv 一起提供。若没有它,以下配置 会失败,而客户端只会显示“server failed to start”——请先安装 uv:

curl -LsSf https://astral.sh/uv/install.sh | sh     # macOS / Linux
irm https://astral.sh/uv/install.ps1 | iex          # Windows PowerShell
{ "mcpServers": { "openhire": { "command": "uvx", "args": ["openhire@latest", "serve"] } } }

首次启动时会在后台下载约 30 MB 的索引;几分钟内即可开始搜索。

遇到问题?运行 ohp doctor。 它会检查聊天窗口里看起来完全相同的三种情况——缺少 uv、尚无索引、已配置但未启用服务——并读取它能找到的所有客户端配置。它会在终端中运行,这一点很重要:如果客户端从未启动我们的服务,我们写在客户端里的任何内容都无法触达你。

修改配置可能还不是最后一步。 有些客户端要求你先启用或信任新添加的服务,工具才会加载——配置虽然已保存,但服务始终未启动,唯一的迹象就是助手似乎不知道这些工具。如果搜索没有任何反应,请打开客户端的 MCP/连接器面板,检查是否列出了 openhire,并且已将其启用。(Claude Desktop 需要完全退出后重新打开;Cursor 和 Windsurf 会在重新加载时识别;有些客户端会显示每个服务各自的开关。) 改完配置不一定就完事:部分客户端需要你在设置里手动「信任 / 启用」这个服务, 工具才会加载。症状是配置明明在、助手却完全不知道有这些工具。

每次运行 uvx 都要付出的代价。 uvx 每次调用都会解析软件包——即使缓存已热,实测每次也需要 7–8 秒。每次 MCP 会话启动和每条 CLI 命令都要付出这段时间。这样做的好处是无需管理安装。如果你宁愿一次性付出代价:

pipx install openhire     # then use "command": "ohp", "args": ["serve"] — process-start latency

@latest 也意味着工具集可能在你不知情的情况下发生变化。需要稳定时请固定版本:"args": ["openhire==0.8.28", "serve"]。

如果索引为空,服务会在首次运行时自动下载公开职位快照,因此 ohp bootstrap 是可选的。如果你运行过 pipx install openhire,"command": "ohp" 也可以使用。

Claude Desktop — %APPDATA%\Claude\claude_desktop_config.json(macOS:~/Library/Application Support/Claude/);编辑后请退出并重新打开:

{ "mcpServers": { "openhire": { "command": "ohp", "args": ["serve"] } } }

Cursor — ~/.cursor/mcp.json(或项目中的 .cursor/mcp.json):

{ "mcpServers": { "openhire": { "command": "uvx", "args": ["openhire", "serve"] } } }

Windsurf — ~/.codeium/windsurf/mcp_config.json:

{ "mcpServers": { "openhire": { "command": "uvx", "args": ["openhire", "serve"] } } }

Claude Code — 本仓库也是一个插件市场,因此在 Claude Code 中运行两条命令即可完成全部设置(仍需将 uv 加入 PATH):

/plugin marketplace add gzchenhao/openhire
/plugin install openhire@openhire

Cursor 插件 / Agent Plugins — 仓库包含 .cursor-plugin/plugin.json 和通用的 plugin.json + mcp.json(agent-plugins.org),因此任何支持加载 Agent Plugins 的客户端都可以通过仓库 URL 安装。 TRAE(字节) — 一键导入链接(TRAE 会先让你确认配置再添加): TraeCode 国内版 · TRAE 国际版。 或者手动将上面的 uvx 配置粘贴到 TRAE 的 MCP 设置中。

腾讯 WorkBuddy — ~/.workbuddy/mcp.json,使用相同的 mcpServers 结构。WorkBuddy 会在启动时读取该文件,因此编辑后请退出并重新打开应用(或者通过应用中的专家·技能·连接器 → 自定义连接器按钮添加服务);在此之前,手动编写的条目不会显示在列表中。机器上没有 uv?在任意 Python ≥ 3.11 环境中运行 pip install openhire,并将 command 指向该环境中的 ohp 可执行文件,设置 "args": ["serve"]。

豆包 · 豆包工作(字节) — 豆包的「技能·连接器·伙伴 → 新建 → 新建自定义连接器」只接受 HTTP 地址,不接受命令行。先在本机启动一个 HTTP 端:

pipx install openhire
ohp serve --transport streamable-http --port 8000      # 本机 http://127.0.0.1:8000/mcp

然后在豆包中新建自定义连接器:传输类型选 HTTP,服务器 URL 填写 http://127.0.0.1:8000/mcp,Headers 留空,保存后打开开关。 索引、指纹和匹配都在你自己的电脑上,豆包只是通过本机端口调用它。 (2026-10-12 在豆包工作中实测通过:新建连接器后直接问「用 openhire 搜香港的岗位」即可获得结果。)

DeepSeek — DeepSeek 自己的 App 没有 MCP 入口。将 DeepSeek 作为模型用于任何支持 MCP 的客户端(Cherry Studio、Chatbox、Cline、腾讯 WorkBuddy、TRAE 均可),然后将上面的 uvx 配置填入该客户端的 MCP 设置即可;在 Cherry Studio 中,操作路径为「设置 → MCP 服务器 → 添加 → 类型 STDIO,命令 uvx,参数 openhire@latest serve」。

首次启动时会下载约 30 MB 的公开快照(仅包含职位和公司)——请稍等片刻。 之后要刷新,请运行 ohp bootstrap --force 或 ohp ingest。对于 Microsoft Store 版的 Windows Claude Desktop,配置文件位于 …\Packages\<Claude package>\LocalCache\Roaming\Claude\。

托管端点,适用于 ChatGPT 和任何只接受 URL 的客户端(自 0.8.11 起): 维护者在 https://openhire-vlny.onrender.com/mcp 运行着此服务的一个副本 (streamable HTTP,无需身份验证;通过 render.yaml 从 hosted/ 构建的 Render Web 服务, 使用相同的 package 和公开索引;/healthz 会告知服务是否运行及其版本。这是免费实例:闲置一段时间后, 首次请求可能需要最多一分钟)。 ChatGPT(付费套餐):依次进入“设置”→“连接器”→“高级”→开启 开发者模式 → “创建”:名称填 OpenHire,URL 填上方地址,身份验证选 无;然后在启用了该连接器的新聊天中提问。该主机接收的内容仅限工具所需的信息(搜索筛选条件、 公司名称或域名、招聘页面 URL、匿名指纹),绝不会接收简历;它不保留查询日志;收藏职位会存储在其索引中,并以你的指纹为键。上面的本地安装方式 仍是推荐方案,因为使用它时,搜索内容不会离开你的设备。详情见 docs/PRIVACY.md §3。

自托管同一服务: OPENHIRE_HOSTED=1 ohp serve --transport streamable-http --host 0.0.0.0 --port 8000 会开放 http://host:8000/mcp 和一个首页、/healthz、按地址限流功能,以及一个负责获取每周快照的工作进程(也支持 --transport sse)。其中包含一个 Dockerfile。

无法从你的网络访问 GitHub(中国大陆无代理,或某些沙盒环境)? 当 GitHub 上的索引快照下载失败时,服务和 ohp bootstrap 会尝试使用 CNB(腾讯代码托管平台)上的副本,并执行相同的校验(仓库的 .cnb.yml 每 6 小时从 GitHub 刷新一次副本;直链为 https://cnb.cool/gzchenhao/openhire/-/releases/download/snapshot/openhire-index.db.gz;将 OPENHIRE_SNAPSHOT_URL 设为该链接即可完全跳过 GitHub)。软件包本身来自 PyPI;使用 PyPI 镜像可加快安装速度,例如在服务的配置中添加 "env": {"UV_DEFAULT_INDEX": "https://pypi.tuna.tsinghua.edu.cn/simple"}(较旧版本的 uv 使用 UV_INDEX_URL),或运行 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple openhire。 代码镜像位于 https://cnb.cool/gzchenhao/openhire 。ohp bootstrap --fresh 会完全跳过快照,直接抓取雇主自己的 ATS(耗时 20 分钟以上,不需要 GitHub)。 如果下载失败导致索引为空,工具结果会说明原因(bootstrap_error),而不是看起来像“没有匹配项”。 国内网络:GitHub 下载快照失败时,服务器和 ohp bootstrap 会改试国内镜像 CNB 上的副本(每 6 小时与 GitHub 同步,校验相同)。 镜像直链:https://cnb.cool/gzchenhao/openhire/-/releases/download/snapshot/openhire-index.db.gz;在 MCP 配置的 env 里把 OPENHIRE_SNAPSHOT_URL 设成它,就完全不走 GitHub。 装包慢就用 PyPI 镜像:在 MCP 配置里加 "env": {"UV_DEFAULT_INDEX": "https://pypi.tuna.tsinghua.edu.cn/simple"} (旧版 uv 用 UV_INDEX_URL),或 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple openhire。 代码镜像:https://cnb.cool/gzchenhao/openhire 。


功能

工具提供的信息
search_jobs对实时索引进行严格筛选;每条结果都包含 verified_at、datePosted、days_open、ghost_score、remote_scope、eligible_regions、apply_channel。可按 required_skills(AND)、role_family(engineering、data、product、design、marketing、sales、招聘 / HRBP / 人事岗位用 hr、ops、other)、remote_scope、min_salary + currency、company、location(支持双语城市别名:香港 = Hong Kong,广州可匹配天河区)和 title(职位名称中的词语,例如 招聘 / recruit;HR、财务及其他岗位不依赖技能标签名称筛选)筛选。
watch_intent注册一次长期意向;下次检查时即可查看新匹配的职位,即使你已关闭终端也不例外。接受 required_skills / role_family / location / title,可排除销售 / 解决方案岗位。
check_watches拉取自上次检查后新增的匹配项(由客户端拉取;stdio 不支持推送)。
authorize_application每个职位都需要一次明确确认。它会记录你的授权,并返回雇主自己的申请网址——由你以本人身份申请。它不能接收简历。
get_company_info汇总某个雇主的匿名可信度信号(ghost_score_avg、active_jobs、index_built_at)。绝不包含候选人数据。
check_employer提供某个雇主的事实信息及来源和时间:其自有系统是否已被纳入索引、域名年龄(RDAP)、网站历史(Wayback)、其主页上的 ICP 备案、粘贴的职位信息中是否有诈骗危险信号、OFAC 制裁名单、EarlyTip 公共记录中的组织和融资事件,以及使用你自己的天眼查密钥(TIANYANCHA_API_KEY,绝非我们的密钥)查询企业登记信息。这是一份核对清单,而非评分。
read_board从任意雇主的招聘网址实时读取其公开职位列表(Greenhouse、Lever、Ashby、Moka、北森、Workable、SmartRecruiters;适用于任何行业,无论是否已编入索引):职位列表自身的日期、直接申请链接,以及 location / title 筛选。不会存储任何内容;对于已关闭的招聘门户,会说明原因并拒绝访问。

可选,完全在本地运行:ohp init --scan <dir> 会从你自己的代码仓库中提取技能指纹。你无需填写简历;代码不会离开你的设备——只有匿名向量会离开。

对雇主:认领你的企业信息

如果你的公司出现在此索引中,招聘信息来自你们自己的公开 ATS——我们没有征求许可,因为没有必要。我们无法了解的是你们这边的情况:某个职位是长期开放的人才库,而不是过时的招聘需求,还是你们实际回复得有多快。

认领 (中文表单)。 免费,通过企业身份核验——GitHub 组织成员身份或来自企业域名的回复均可——绝不收取费用。我们会在 3 个工作日内回复,认领不会带来任何形式的付费跟进,你提供的证明只用于核验,不作其他用途。

没有 GitHub 账号?发邮件到 [email protected],主题写“Employer claim”和公司名称——使用企业域名发送邮件即可开始核验(足以完成认领;自报的岗位清单还会与企业登记信息、ICP备案记录进行核对,并拨打你们公开的联系电话确认)——也可以请任何人代你提交表单,因为我们核验的是公司,而不是提交者。 没有 GitHub 账号?直接发邮件到 [email protected],用贵公司企业邮箱发出来即完成身份核验。

没有 ATS,或者使用飞书招聘?那么你们的招聘信息目前还不在索引中,也就无从认领:索引只读取雇主自己的系统。有 3 种只读、免费的接入方式,都不会影响排名。最简单的方式不需要 IT 人员:填写一张表格,并使用企业域名发送邮件(之后我们会核对企业登记信息、ICP备案记录和域名注册时间,并拨打你们官网上的公开联系电话);每条招聘信息都会标记为 employer_self_reported,带有 date_signal: self_reported,并在 90 天后过期,除非你们重新发送表格。另外两种方式是:授权两个飞书只读权限(hire:site:readonly、hire:site_job_post:readonly),或在你们自己的招聘页面提供机器可读的招聘信息(schema.org JobPosting JSON-LD 或静态 JSON 文件)。认领表单里有字段可填写哪种方式适合你们,雇主页面也介绍了全部三种方式。 没有招聘系统或用飞书招聘?最简单的一条:填一张岗位表,用企业邮箱发给我们,不需要 IT 人员;另外两条是飞书只读授权和官网机器可读岗位页,都写在认领表单和雇主页里。

认领后,你可以:

  • **在你指定的职位旁添加一条注明来源为你们的说明。**我们能看到职位开放了多久,却看不到原因。长期开放的人才库、确实难以招满的职位和无人维护的职位,从外部看起来一模一样,只有你们能分辨。
  • 为具体职位设置 evergreen/hard to fill/closed 状态。只要你们的 ATS 仍在提供 closed 职位,它就会继续显示——我们不会隐藏你们自己网站返回的内容——但会根据你们的说明将其标记为已关闭,以免其他人申请。
  • 如果你们的 ATS 日期字段表示“招聘需求创建时间”,而不是“职位上线时间”,可以进行更正。这种误读会让你们的每个职位看起来都已发布多年,但这不是你们的错。
  • 为你们的每条招聘信息(包括之后发布的信息)添加 response_sla_days
  • 在公司信息中添加 claimed: true 和认领日期

认领不会提升排名,也不会降低你们的 ghost_score。排序是仅由(匹配度、新鲜度)决定的固定纯函数,评分则是仅由(重复发布次数、职位发布时间)决定的纯函数;测试会固定这两项,并断言认领流程不会触及它们。你们的说明会与分数并列显示,用来解释分数。相比一个无人解释的低分,我们宁愿显示高分并附上你们的说明。

如果希望完全移除相关信息,也完全没问题,我们不会争辩。

已核验的认领信息存放在 src/openhire/seed/claims.py 中——就在代码仓库里,而非私有数据库——因此每条记录都有可审查的差异;每周重建时也会重新应用这些认领信息,而不会悄悄将其丢弃。

保持内容最新

索引每周刷新一次,因此搜索结果最多可能滞后 7 天。如果用户即将针对某个雇主采取行动,并想了解今天的真实情况:

ohp refresh unitree          # ~1 minute · at most one crawl per employer per 6 hours

在 MCP 中,这是 refresh_index 工具。它内置了三条规则,而非仅供参考:

  • 每次调用只针对一家雇主。 完整抓取需要 20 分钟以上,没有客户端会愿意等这么久。遇到含义模糊的词(robot → 11 个匹配结果)时,会拒绝请求并返回候选列表,不会扩展为多次调用。
  • 每家雇主每 6 小时限流一次,并且会在任何网络调用 之前 检查,因此,间隔太短的请求不会给 ATS 带来任何开销,而是返回 last_refreshed_at,不会报错。
  • 不得用于试探性或循环调用。 每次调用都会访问他人的公共端点。

最后这一点是整个设计的约束:我们自行控制每周批量抓取;而把刷新交给调用方,就会变成 我们的用户 代表我们访问 他们的端点。限流机制让这条边界由我们来守,而不是由我们来消耗。

解读这三个日期

每一行都带有三个时间戳,分别回答三个不同的问题。结合起来看,它们能区分已被弃置的职位需求和仍有人维护的职位需求:

字段回答的问题
verified_at我们上次查看时,雇主的 ATS 是否仍返回了这条记录?
datePosted / days_open这条职位开放了多久?ghost_score 会根据此项随时间增长。若系统有报告日期,则使用雇主自己的日期;否则使用此索引首次发现该职位的日期,并在该行中标记 date_signal: "not_reported_by_ats"(Li Auto 的第一方镜像没有报告日期),因此应将其视为下限
updated_at / days_since_update雇主最近一次更新是什么时候?如果其 ATS 没有报告此信息,则为 Null(Ashby、Lever 和 Beisen 不报告;Greenhouse 和 Moka 会报告)——应将 null 解读为“未知”,绝不能解读为“已弃置”

单凭 ghost_score = 1.0 不能下结论。职位开放了 367 天且 367 天没有更新,说明它可能已被弃置;职位开放了 327 天,但 13 天前才更新,则说明这可能是仍在维护的常设职位需求。在 ATS 确实报告了最近更新时间的职位中,ghost_score >= 0.99 的职位有 67% 是雇主在最近 30 天内更新的(测量日期为 2026-09-19;实时数据见 docs/numbers.json 中的 pct_ghost_hi_touched_within_30d,该文件会在每次刷新时重新生成)。 ghost_reason 会说明哪些输入影响了评分(“仅依据时间:开放 367 天,从未重新发布”)。

这些指标都无法衡量雇主的意图。职位长期开放也可能意味着很难招到合适的人——应将这些数字视为提出问题的理由,而不是结论。

这家雇主名副其实吗?

check_employer(CLI:ohp check-company 宇树 --domain unitree.com --jd posting.txt)会返回一份清单,每项标记为 verified / not_verified / unavailable / not_applicable / pending_user,并附上来源和时间:雇主自己的系统是否在索引中,以及其中显示的内容;域名注册日期;最早的 Wayback 快照;首页上的 ICP 备案号;以及你粘贴的招聘信息中是否存在招聘诈骗的危险信号(或者,如果提供了 job_id,则检查索引中保存的招聘信息,这样助手就能检查刚找到的职位,无需复制文本)。查询企业登记信息(成立日期、经营状态、参保人数)需要付费:在你自己的机器上设置 TIANYANCHA_API_KEY,工具便会使用你的天眼查账号获取信息;你也可以使用它列出的免费手动查询链接。对于香港或海外雇主,这些链接包括香港公司注册处电子服务的搜索、香港警方 Scameter(通过警方诈骗数据库查询电话号码、URL 或收款账号)以及 OpenCorporates。

该工具还会将名称与 OFAC 的 SDN 和综合制裁名单进行比对。名单每天下载到你的机器上,并在本地进行匹配,因为仅凭实时登记信息无法说明多少问题:Prince Group 的香港公司在受到制裁的当天仍登记在册。

从 0.8.8 起,该工具还会读取 EarlyTip 公开导出的组织和融资事件数据(高管离职、重组、融资轮次、收购、破产;earlytip.com/data/org_events.json),每天将完整数据下载到你的机器上,并根据导出文件自行公布的 company_key 在本地匹配。它会列出该雇主有记录的事件类型、日期、有记录时的金额、来源域名和普通链接:绝不显示标题;如果来源网站的条款将添加链接列为禁止行为,则完全不提供链接;已撤回的事件会被剔除;并注明 EarlyTip 是根据其自行公布的标题和摘要核对数据,而非根据来源文章核对。

该工具有意不提供总分或结论:域名较新或缺少 ICP 备案记录,都是需要权衡的事实,而非定论。unavailable 项会说明是已访问来源但未找到记录,还是本次查询根本没有访问来源(reason: network),因为未能运行的检查并不能说明雇主的情况。

索引之外的雇主

read_board(CLI:ohp read-board https://jobs.ashbyhq.com/uipath --location "Hong Kong") 可实时读取单个雇主的公开职位列表,不论该雇主是否在索引中,也不论其所属行业,只要职位列表托管在适配器已支持的平台上: Greenhouse、Lever、Ashby、Moka、北森、Workable、SmartRecruiters 或 Workday。助手粘贴招聘页面 URL 后,即可获取该职位列表上的职位、职位列表提供的发布日期,以及在其提供时的 days_open(否则为 date_signal: not_reported_by_ats)、雇主自有租户上的直接申请链接和职位描述摘录。不会提供技能、ghost_score、重新发布历史或监控项,因为这些都需要重复观察,而且不会存储任何内容。如果是飞书招聘门户、SuccessFactors、LinkedIn 或招聘网站,则会拒绝读取并说明原因:这些涉及访问控制或属于他人运营的网站,而本索引绝不会另寻入口。每个服务进程每 15 分钟只能实时读取每个职位列表一次;重复请求会从内存中返回结果。

你自己的雇主(0.8.13)。 公开索引是为三个行业整理的精选列表;个人目标雇主的范围更广。add_employer(url)(CLI ohp add-employer)会将适配器可读取的任意职位列表添加到你自己的设备上的索引中,并立即抓取:此后,search_jobs(company=...)、watch_intent、refresh_index 和 ghost_score 都会像处理预置雇主一样处理它,且每周刷新会保留它们。这类雇主会标记为 user_added,绝不会进入公开快照(因为这会暴露你的求职目标);remove_employer 可将其移除。结果还会附带一个已预填内容的 GitHub issue 链接,用于建议将该雇主加入公开索引;除非你打开链接,否则不会发送任何内容。 也可以监控职位列表:使用 board_url(以及 location / title)调用 watch_intent,即可让 check_watches 在每次拉取时实时读取该列表,并报告自上次拉取后新增和消失的职位。

OpenHire 无法读取的雇主(0.8.14)。 这些行业中的部分雇主会在适配器无法读取的平台发布职位:飞书招聘(飞书招聘,一个需要签名的列表 API)、仅使用 BOSS直聘,或没有职位列表的招聘页面。list_portals(CLI ohp portals)会列出这些雇主,附上各自招聘门户的链接、无需登录时浏览器显示的内容,以及最近一次检查的日期。同一列表也可通过网页浏览: gzchenhao.github.io/openhire/portals.html。 索引能够读取、但也会在此类门户发布职位的雇主(星动纪元可通过 Moka 读取,也会在飞书上发布职位)会在 get_company_info 中带有 also_posts_on,因为只在这些门户发布的职位不会出现在搜索结果中。

查询单个雇主

search_jobs(company=...) 会接受用户实际输入的内容——ID(unitree),或任一语言的部分名称(宇树、Unitree、XPeng)。如果索引中没有该名称,则会返回一个注明雇主名称的空结果对象,绝不会执行无筛选搜索。

ohp search --company 宇树 --role-family engineering
ohp search --company waymo --distinct          # one row per role, not one per city

--distinct(MCP 中的 collapse_role_group)会为每个 role_group 保留一条记录,并添加 role_group_size。一页结果中约有 20% 是同一职位按城市分别列出的记录;此功能默认关闭,因为每个城市的记录都有各自的 job_id 和 apply_channel,这在受地点或签证条件限制时很重要。

五个协议字段

每条招聘信息都是有效的 schema.org/JobPosting,此外还包含:

  • verified_at — 上次在雇主官网确认招聘信息仍有效的时间
  • source — employer_site | ats_public_api(绝不是招聘网站)
  • ghost_score — 0–1 的招聘信息活跃度信号,依据真实发布日期随时间衰减(分数越低 = 越新)。这是噪声过滤器,并非指责:长期开放的招聘信息通常是长期人才库或招聘流程缓慢——该分数只是让 Agent 可以降低低活跃度噪声的排序
  • response_sla_days — 雇主自行承诺的回复时限。几乎每条记录都为 Null,而且这个 Null 有意义:只有雇主认领其租户后才会设置。我们绝不会推断或估算,因为原则上我们无法观察回复情况——申请链接会直接跳转到雇主页面,不会经过此服务。Null 应理解为“尚无雇主认领此租户”,而不是“缺失”或“缓慢”。 雇主:认领您的租户 — 免费,通过企业身份验证,绝不通过付费验证。认领后可获得认证徽章、修正招聘信息状态的权限(例如,长期有效的人才库被不公平地赋予了过时分数),以及此字段。但认领不能购买排名:排序是 (match, freshness) 的锁定纯函数,且有测试会固定其签名。
  • apply_channel — 始终是雇主自己的申请 URL,并直接链接到具体职位

隐私政策

简而言之:协议中没有简历字段,匹配在您的设备上运行,服务器存储的唯一用户来源值是由客户端生成的匿名指纹。没有分析、没有遥测、不会与第三方共享。完整政策: docs/PRIVACY.md。

隐私模型

简历 / 个人身份信息上传绝不会 — 匹配在本地运行;简历不会经过服务器,我们也绝不存储简历
服务器可见的信息一个由客户端生成的匿名指纹 + 硬性筛选条件
代码库扫描仅限本地 · 个人项目 · 明确同意 · 可随时选择退出
职位来源仅限一手来源:雇主招聘页面 + 公开 ATS API(Greenhouse / Lever / Ashby)

首次运行数据——快照与最新数据

ohp bootstrap(默认)会下载一个精简的公开索引快照(GitHub Release 资源——仅包含 companies + jobs,不含任何用户数据),然后运行一次增量抓取,以刷新 verified_at / 下架状态。--fresh 会跳过快照,从头开始抓取公开 ATS 数据,并使用免费的离线启发式提取器。无论哪种方式,都无需账户,也不涉及个人身份信息。

有两点可能会让人意外:

  • 增量抓取很慢,而且不会显示进度。 在尚未建立索引时,抓取可能运行 20 多分钟且没有任何输出。它仍在运行,并非卡住。如果您只需要数据,ohp serve 会完全跳过抓取——服务器会在首次启动时下载快照,并在几秒内开始响应。
  • 快照 URL 特意固定到 v0.1.0 标签。 看起来过时了,但其实并非如此。该资源会由定时工作流每周一原位覆盖,因此这个 URL 是始终指向最新数据的稳定地址。如果将其固定到最新标签,每次发布时都会导致所有客户端失效。

本项目绝不会打破的三条规则

  1. 您的简历始终留在您的设备上——不会经过服务器,我们也绝不存储简历。
  2. 排名不可出售——排名只取决于 f(match_quality, freshness),这是一个锁定的纯函数。
  3. 雇主只为已授权且已交付的结果付费——绝不为曝光付费。(v0.1 完全没有计费功能。)

这些规则由 CI 强制执行(tests/test_privacy.py、tests/test_ranking.py、 tests/test_snapshot.py)。

开发

python -m venv .venv && . .venv/Scripts/activate   # Windows
pip install -e ".[dev]"
pytest        # privacy red lines + ranking + snapshot must be green

设置 OPENHIRE_DATABASE_URL=postgresql+psycopg://…,即可使用 Postgres,而不是默认的本地 SQLite 文件(~/.openhire/openhire.db)。

路线图

  • v0.2 – v0.3(已发布) — 中国 ATS 适配器(北森 Beisen + Moka)· 每周自动刷新的 公开快照 · ghost_score 公测 · 覆盖美国 / 欧盟 / 中国的 173 家雇主
  • 下一步 — 雇主认领 + 已验证徽章 — 雇主今天即可通过提交企业身份 GitHub issue 来预留认领 资格(目前零成本; 徽章 + 职位列表状态控制将于下一阶段上线)· 响应 SLA 执行(7 天后自动下架)· 脱敏的契合度证明 — 随申请一同提交的匿名、经候选人授权的匹配摘要(仅包含技能重合度; 绝不包含身份信息,简历仍绝不会经过服务端)
  • v1.0 — 面向 AI 可读职位发布的开放式、厂商中立架构扩展

常见问题

职位数据来自哪里? 直接来自 173 家雇主自己的公开 ATS API(Greenhouse、Lever、Ashby、北森 Beisen、Moka、Workable、SmartRecruiters,以及像 Li Auto 这样由雇主运营的一方职业网站),也就是为其招聘页面提供支持的同一批端点。不使用第三方招聘网站。source 始终为 ats_public_api,而 verified_at 记录我们最近一次确认每条职位仍在线的时间。 公开索引每周自动刷新,因此全新的 ohp bootstrap 会从近期数据开始。

为什么我应该信任 ghost_score? 它是一个纯粹、开放、无法付费操纵的函数 — min(1, 0.15·relist_count + staleness),根据真实 ATS 职位发布日期计算时效,而不是我们的抓取日期。公式位于 pipeline/ghost_score.py,经过单元测试,且不会将资金作为输入(红线 #2)。长期开放、反复重新发布的 职位得分更高;你始终可以在客户端重新排序。请将其视为信号与噪声的比值,而非恶意行为:许多高分职位都是合法的常年人才储备岗位。希望职位活动情况得到准确呈现的雇主可以认领其租户(见路线图)。

我的简历真的会经过服务端吗?真的不会吗? 不会。协议中完全没有简历。authorize_application 没有简历 / 文件参数(从结构上就无法接收),匹配在你的设备上运行,而唯一会经过服务端的内容,是客户端生成的匿名指纹,例如 #a3f9-k2p7-x8q1。这一点由 tests/test_privacy.py 强制保障,发布的快照不包含任何用户数据(tests/test_snapshot.py)。

支持中国区吗? 支持 — 这正是 OpenHire 与众不同之处。已收录使用 北森 Beisen(<tenant>.zhiye.com)和 Moka(app.mokahr.com)的雇主:20 多家自动驾驶 / 机器人 / 具身 AI 公司,包括宇树 Unitree、小鹏 XPeng、优必选 UBTECH、梅卡曼德 Mech-Mind、速腾聚创 RoboSense、 元戎启行 DeepRoute、星海图 Galaxea、傅利叶 Fourier、普渡 Pudu。以月薪形式发布的薪资会保留其真实 周期(salary_period),因此设置薪资下限时不再会悄悄过滤掉中国职位。

不支持飞书招聘(Feishu Hire),今后也不会支持:它通过 ByteDance _signature 对职位列表请求进行签名,并用验证码 SDK 加以限制,因此其职位信息无法公开读取。我们不会绕过反爬措施。

如何申请添加一家公司? 请提交 Company inclusion request issue(标题中注明公司名称 + ATS URL)——这是最好的贡献方式。如果你会编程,可以将公司添加到 src/openhire/seed/candidates.py(公司 slug + ATS 厂商 / 租户),然后提交 PR;种子程序会通过实时 API 验证租户。

许可证

MIT © OpenHire Protocol · 欢迎提交 PR。


由一位不会编程的深科技猎头与 Claude Code 结对编程构建。完整验收报告(包括失误)见 reports/。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。