Ocean of Jobs について
Ocean of Jobsは企業の採用システムから求人を集約する求人検索サービスです。求職者やAIアシスタントは、ウェブサイト、REST API、MCPサーバーから求人情報や企業の採用状況を調べられます。
主な機能
- 01条件を指定した求人検索
- 02求人の詳細説明の取得
- 03企業の採用状況の確認
- 04求人の追加・変更・終了の追跡
活用シーン
- 01勤務地や職位でリモート求人を探す
- 02求人内容と応募リンクを確認する
- 03企業の最新求人を調べる
MCP 対応
MCPサーバーは、求人検索、求人詳細の取得、企業検索を行う読み取り専用ツールを提供します。MCPクライアントはAPIキーやアカウントなしで、Streamable HTTP経由で https://oceanofjobs.com/mcp に接続できます。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
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 を使って接続できます。
利用可能なツール
サーバーは、読み取り専用のツールを3つ公開しています。
search_jobsは、職種名、企業、勤務地、説明文を検索します。企業、都市、国、経験レベル、勤務形態、掲載日、最低月給(シェケル単位)で絞り込めます。get_jobは、求人の詳細な説明(最大6,000文字)、応募リンク、同じ求人掲載に関連するほかの求人情報を取得します。get_companyは、企業名またはドメインで企業を検索し、募集中の求人数、今週追加された求人、追跡履歴、最新の求人情報を返します。
各呼び出しで最大25件の結果が返され、オフセットの上限は200です。レスポンスはエッジで最大5分間キャッシュされます。1日の無料利用枠を使い切ると、00:00 UTC までリクエストは JSON-RPC エラーを返します。最新の上限についてはMCP ドキュメントを参照してください。
一括クエリにはREST APIを使用してください。
サーバーは Cloudflare Worker として infra/mcp-worker.mjs で実行され、scripts/deploy_mcp_worker.py により otj-mcp としてデプロイされます。ステートレスな構成で、各ツール呼び出しは公開 API への GET リクエストになります。Cloudflare が同一のリクエストをキャッシュできるよう、パラメーターは一貫した順序で指定されます。キャッシュミスは、場所ごとのレート制限によって制御されます。MCP サーバーには独自のルートがあり、求人掲示板に影響を与えることなく無効化できます。
アーキテクチャ
データパイプラインは AWS 上で実行され、ルーティングとキャッシュは Cloudflare が担います。求人および企業のレコードは単一の EC2 インスタンス上の SQLite に保存され、スクレイピングは 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 が返されるため、変更の確認にかかるコストは比較的低く抑えられます。
取り込み、公開、スナップショットなど、インスタンス上で書き込みが多く発生する操作では、SQLite への書き込みの競合を避けるため、box/lock.py のファイルロックを使用します。
1. スクレイピングと取り込み
probe.py は、Greenhouse、Lever、Ashby、SmartRecruiters などの採用システムに対する条件付き HTTP リクエストを処理します。変更のないデータをダウンロードしないよう、If-None-Match ヘッダーを使用します。
scrape_handler.pyは Lambda 上で 5 分ごとに実行され、変更されたデータをフラグメントとして S3 に書き込みます。- 適応型ポーリングでは、アクティブな採用ボードを 5 分ごとに確認します。非アクティブなボードは最大 4 時間まで指数関数的に間隔を延ばし、新しい求人が見つかると 5 分ごとのポーリングに戻ります。
scrape_workday_handler.pyは、companies.ymlに記載された Workday や Oracle、Eightfold などの負荷が高い、またはカスタムのソースを対象に、1 時間ごとに実行されます。box/fetch_fragments.pyは 30 秒ごとに S3 からローカルのスプールにフラグメントをコピーします。box/shadow_apply.pyはフラグメントを 48 MB ずつ適用します。
S3 のフラグメントキューにより、スクレイピングとデータベースへの書き込みが分離され、フラグメントの削除と取り込みが競合するのを防ぎます。
2. API とリクエストのルーティング
API は api/handler.py にある Python の WSGI アプリケーションで、ワーカー 2 つ、各ワーカー 4 スレッドの Gunicorn によって提供されます。
リクエストは次のようにルーティングされます。
| ルート | 送信先 | 用途 |
|---|---|---|
/api/auth/* | CloudFront → Lambda | サインインフロー |
/api/* | Cloudflare Worker → cloudflared → EC2 | API リクエスト |
/mcp | MCP Worker → パブリック API | AI アシスタントからのアクセス |
/job/*、/company/* | CloudFront → cloudflared → EC2 | サーバー側でレンダリングされるページ |
/docs/* | CloudFront → S3 | ドキュメント |
/* | CloudFront → S3 | 静的フロントエンド |
CloudFront は /api/* のフォールバックとしても機能します。API Worker が無料プランの 1 日あたり 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. 検索エンジン向けページとフィード
各求人には、JobPosting 構造化データを含む /job/<id> のサーバーレンダリングページがあります。企業ページは /company/<domain> で利用できます。
求人が終了した後も、そのページは終了ステータスと noindex ディレクティブを付けた状態で 30 日間利用できます。その後、サーバーは HTTP 410 を返します。
loader/sitemap.py は、最長でも 6 時間ごとに実行される公開ジョブの一部として実行されます。次のものを生成します。
sitemap.xmlとそのサイトマップ分割ファイル- 最新の求人情報 100 件を含む RSS フィード
feed.xml /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 と比べて大きくなっています。
新しい求人情報は通常、掲載から約 5 分以内にサイトに表示されます。変更は通常、フラグメントが到着してから 1~2 分以内に EC2 の取り込みプロセスに反映されます。
認証
公開求人情報の閲覧と検索にアカウントは必要ありません。
ユーザーは任意でアカウントを作成し、フィルターを保存したり、メールアラートを受信したりできます。認証には、Google OAuth を使用する AWS Cognito、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/ | Workers 2 つを含む、AWS リソースと Cloudflare ルーティング用 Terraform |
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 サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。