关于 Ocean of Jobs
Ocean of Jobs 汇集企业招聘系统中的职位,为求职者和 AI 助手提供职位搜索、完整描述及雇主动态查询,并可通过网站、REST API 和 MCP 服务访问。
主要功能
- 01按条件筛选职位
- 02读取完整职位描述
- 03查询公司的招聘动态
- 04跟踪职位新增、变更和关闭
适用场景
- 01按地点或资历寻找远程职位
- 02查看职位详情及申请链接
- 03查看公司最新招聘
MCP 相关
MCP 服务提供只读工具,可搜索职位、读取完整职位信息并查询公司。MCP 客户端可通过 Streamable HTTP 连接 https://oceanofjobs.com/mcp,无需 API 密钥或账户。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://oceanofjobs.com/mcpclaude mcp add --transport http guyvolvo-oceanofjobs https://oceanofjobs.com/mcp{"mcpServers":{"guyvolvo-oceanofjobs":{"type":"http","url":"https://oceanofjobs.com/mcp"}}}在 Cursor 中打开{"servers":{"guyvolvo-oceanofjobs":{"type":"http","url":"https://oceanofjobs.com/mcp"}}}在 VS Code 中打开{"mcpServers":{"guyvolvo-oceanofjobs":{"type":"http","url":"https://oceanofjobs.com/mcp"}}}{"mcpServers":{"guyvolvo-oceanofjobs":{"serverUrl":"https://oceanofjobs.com/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
详细介绍
Ocean of Jobs
Ocean of Jobs 是一个职位招聘平台,直接从公司的招聘系统收集职位信息。它会跟踪职位的新增、变更、关闭或重新发布,并通过网站、公开 REST API 和 MCP 服务提供这些数据。
实时网站: https://oceanofjobs.com
| 资源 | URL |
|---|---|
| 职位招聘平台 | /board |
| 公司目录 | /companies |
| 统计数据 | /stats |
| 文档 | /docs |
| REST API | /docs/api |
| MCP 服务 | /mcp |
| 许可证 | PolyForm Noncommercial 1.0.0 |
使用 MCP 服务
MCP 服务可让 AI 助手搜索职位数据库、获取完整职位描述并查询公司信息。它使用 Streamable HTTP,无需 API 密钥或账号。
服务 URL:https://oceanofjobs.com/mcp
例如,你可以让助手查找本周发布的远程 Kubernetes 职位,或查询某家公司在特拉维夫招聘哪些职位。
请参阅 MCP 文档中的设置指南。
| 客户端 | 设置 |
|---|---|
| Claude Code | claude mcp add --transport http oceanofjobs https://oceanofjobs.com/mcp |
| Claude(网页端和桌面端) | Settings → Customize → Connectors → Add custom connector |
| ChatGPT | Settings → Apps & Connectors → Developer mode → Create |
| Cursor | 一键安装或 ~/.cursor/mcp.json |
| VS Code | 一键安装或 code --add-mcp |
| Gemini CLI | gemini mcp add -s user --transport http oceanofjobs https://oceanofjobs.com/mcp |
| Codex | codex mcp add oceanofjobs --url https://oceanofjobs.com/mcp |
| Hermes Agent | hermes mcp add oceanofjobs --url https://oceanofjobs.com/mcp |
| Kimi Code | /mcp-config 或在 mcp.json 中添加条目 |
任何支持 Streamable HTTP 的客户端都可以使用相同的 URL 连接。
可用工具
该服务提供三个只读工具:
search_jobs搜索职位名称、公司、地点和描述。筛选条件包括公司、城市、国家、资历级别、工作地点类型、发布时间以及以谢克尔计的最低月薪。get_job获取职位的完整描述(最多 6,000 个字符)、申请链接,以及有关同一招聘信息的其他职位的信息。get_company根据公司名称或域名查询公司,并返回其未关闭职位数量、本周新增职位数量、跟踪历史记录和最新职位信息。
每次调用最多返回 25 条结果,偏移量上限为 200。响应可在边缘缓存,最长 5 分钟。每日免费额度耗尽后,请求将返回 JSON-RPC 错误,直到 UTC 时间 00:00。当前限额请参阅 MCP 文档。
批量查询请使用 REST API。
该服务以 Cloudflare Worker 的形式运行于 infra/mcp-worker.mjs,由 scripts/deploy_mcp_worker.py 部署为 otj-mcp。它是无状态的:每次工具调用都会转为对公开 API 的 GET 请求,并按固定顺序传递参数,以便 Cloudflare 缓存相同请求。每个地点都有单独的速率限制,用于控制缓存未命中。MCP 服务使用独立路由,可以禁用而不影响职位招聘平台。
架构
数据管道运行在 AWS 上,路由和缓存由 Cloudflare 处理。SQLite 在单个 EC2 实例上存储职位和公司记录,而抓取任务则分别运行在 Lambda 和 GitHub Actions 上。
完整设计(包括故障模式和运维手册)请参阅 ARCHITECTURE.md。
数据采集与摄取
GitHub Actions ──► S3 ──► EC2 ingestion ──► SQLite
discovery fragment fetcher jobs.db
and applier jobs-fts.db
EventBridge ──► Lambda ──► S3
polling delta fragments
Browser ──► Cloudflare ──► API on EC2
AI client ──► MCP Worker ──► Public API
生产数据库运行在 il-central-1 区域的一台 EC2 t4g.medium 实例上。jobs.db 存储职位列表和公司数据;jobs-fts.db 包含全文搜索索引。两个数据库都通过 Litestream 持续复制到 S3。
抓取与数据库摄取分开处理。Lambda 检查招聘系统端点,并将变更写入 S3;EC2 实例则将这些变更应用到 SQLite 并提供查询服务。大多数轮询都会返回 304 Not Modified,因此检查变更的成本相对较低。
实例上的所有写入密集型操作,包括摄取、发布和快照,都会使用 box/lock.py 中的文件锁,以避免 SQLite 写入争用。
1. 抓取与摄取
probe.py 负责向招聘系统发送条件 HTTP 请求,包括 Greenhouse、Lever、Ashby 和 SmartRecruiters。它使用 If-None-Match 标头,避免下载未发生变化的数据。
scrape_handler.py每五分钟在 Lambda 上运行一次,并将变更数据以片段形式写入 S3。- 自适应轮询每五分钟检查活跃招聘板。非活跃招聘板会按指数间隔延长轮询时间,最长可达四小时;出现新职位后,则恢复为每五分钟轮询一次。
scrape_workday_handler.py每小时运行一次,处理 Workday 以及companies.yml中列出的其他较重或自定义数据源,包括 Oracle 和 Eightfold。box/fetch_fragments.py每 30 秒将片段从 S3 复制到本地暂存区。box/shadow_apply.py分多批应用片段,每批 48 MB。
S3 片段队列将抓取与数据库写入分开,并防止摄取操作与片段删除发生竞争。
2. API 与请求路由
API 是一个位于 api/handler.py 中的 Python WSGI 应用,由 Gunicorn 提供服务,每个工作进程有两个工作线程,共两个工作进程。
请求按如下方式路由:
| 路由 | 目标位置 | 用途 |
|---|---|---|
/api/auth/* | CloudFront → Lambda | 登录流程 |
/api/* | Cloudflare Worker → cloudflared → EC2 | API 请求 |
/mcp | MCP Worker → public API | AI 助手访问 |
/job/*、/company/* | CloudFront → cloudflared → EC2 | 服务端渲染页面 |
/docs/* | CloudFront → S3 | 文档 |
/* | CloudFront → S3 | 静态前端 |
CloudFront 也可作为 /api/* 的备用路由。当 API Worker 达到每天 100,000 次请求的免费套餐限额时,路由会故障转移到 CloudFront,并通过隧道继续访问同一个 EC2 源站。此备用方案的速度大约慢 100 ms,且稳定性较低。
2026 年 9 月 25 日,一个爬虫通过请求 /job/* 页面耗尽了 Worker 配额。现在这些页面会经由 CloudFront 提供服务,其每月免费额度为 1,000 万次请求。
此前基于 Lambda 的 API 部署仍可作为回滚方案。将路由切换回 api-lambda 源站即可恢复该部署方式。
3. 公司发现
GitHub Actions 每天运行一次发现任务,扫描 Common Crawl URL 索引、检查候选招聘端点、将域名收集到 domains.txt 中,并解析公司身份。
已知或特殊的招聘系统也可以在 companies.yml 中显式配置。
4. 搜索引擎页面与 Feed
每个职位都有一个位于 /job/<id> 的服务端渲染页面,其中包含 JobPosting 结构化数据。公司页面位于 /company/<domain>。
职位关闭后,其页面会保留 30 天,并显示关闭状态及 noindex 指令。之后,服务器会返回 HTTP 410。
loader/sitemap.py 会作为发布任务的一部分运行,该任务最多每六小时运行一次。它会生成:
sitemap.xml及其站点地图分片feed.xml,包含最新 100 条职位列表的 RSS Feed- 从
/companies/a到/companies/z的公司目录
公司目录使用普通链接指向公司页面,使爬虫无需执行 JavaScript 即可发现职位列表。
5. 监控和告警
在 infra/alarms.tf 中定义的 CloudWatch 警报会通过 SNS 发送电子邮件,通知数据源过期、快速抓取器失败或运行缓慢,或者片段积压增加。
Grafana 仪表板读取 CloudWatch 指标,用于跟踪数据库增长和搜索活动。用户电子邮件告警通过 Amazon SES 发送。
存储和搜索
职位描述以单独文件的形式存储在 S3 中,并在需要时检索。处理完成后会丢弃原始 JSON 负载。
搜索使用存储在单独的 jobs-fts.db 中的无内容 SQLite FTS5 索引。将索引与 jobs.db 分开,意味着可以重建或清理索引,而不会锁定主数据库。
全文索引约为 1.8 GB,而 jobs.db 约为 0.8 GB。
新职位通常会在发布后约五分钟内出现在网站上。片段到达后,变更通常会在一到两分钟内传至 EC2 数据摄取流程。
身份验证
浏览和搜索公开职位无需账户。
用户可以选择创建账户,以保存筛选条件并接收电子邮件告警。身份验证使用 AWS Cognito 和 Google OAuth、用于 GitHub OAuth 的自定义 Lambda 流程,以及无密码电子邮件 OTP。
仓库结构
| 路径 | 用途 |
|---|---|
probe.py | 带条件 HTTP 请求的招聘系统抓取器 |
companies.yml | Workday、Comeet 和自定义招聘门户的配置 |
domains.txt | 已发现并解析的目标域名 |
db/schema.sql | 数据库架构,包括无内容 FTS5 表 |
loader/ | S3 职位描述存储、增量处理和 SQLite upsert |
box/ | EC2 端的片段抓取、数据摄取、发布和锁定 |
api/ | Python WSGI 应用和 API 端点 |
alerts.py | 已保存搜索的评估和电子邮件发送 |
frontend/ | 静态前端页面、CSS 和 JavaScript |
docs/ | Next.js 和 Fumadocs 文档,导出为静态文件 |
extension/ | 从用户个人资料中填充并提交 Greenhouse 申请的 Chrome 扩展程序 |
infra/ | AWS 资源和 Cloudflare 路由的 Terraform 配置,包括两个 Workers |
scripts/ | 部署、线上检查、源站密钥轮换、DNS、配额检查和本地预览 |
ARCHITECTURE.md | 详细的系统设计、故障模式和运维手册 |
.github/workflows/ | 用于发现、基础设施、API、EC2 服务、抓取器、前端和文档的 CI/CD |
前端使用原生 HTML、CSS 和 JavaScript,不依赖前端框架。其页面涵盖职位板、公司目录、统计信息、账户、联系页面和隐私页面。文档站点使用 Next.js 和 Fumadocs 构建,并导出为静态文件。
许可证
Ocean of Jobs 根据 PolyForm Noncommercial License 1.0.0 提供源代码。
根据许可条款,你可以出于非商业目的查看、修改和分享代码。商业用途需要获得版权持有者的单独许可。
Ocean of Jobs 及其托管服务独立于本源代码许可证运营。完整条款请参阅许可证。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。