Skip to main content
Glama
saurabhgayali

Job Search MCP

求人検索エンジン

5大製薬企業を横断して、高速かつ信頼性の高い求人検索を実現します。

Amgen、Bayer、GSK、Novartis、Pfizerのキャリアサイトから直接求人を検索できます。職種名、説明、応募要件、応募リンクを即座に抽出します。

デモ: https://[your-vercel-app].vercel.app/

特徴

  • ✅ 5社を同時に横断検索

  • ✅ 詳細な求人情報の抽出(職種名、説明、応募要件、締切)

  • ✅ エラーコード(404、タイムアウトなど)による抽出失敗の追跡

  • ✅ CSVレポートの生成

  • ✅ 外部依存ゼロ、高速な正規表現ベースのパース

  • ✅ TypeScript + 厳格な型安全性

  • ✅ 包括的なエラー処理と分類

  • ✅ レート制限付きAPI(IPあたり1日5回の検索)

Related MCP server: trackly-cli

技術スタック

  • フロントエンド: React + TypeScript + Tailwind CSS

  • バックエンド: Next.js + Node.js

  • パース: 正規表現ベースのHTML抽出(重い依存関係なし)

  • ランタイム: Node.js(v18+)

  • 言語: TypeScript 5.3+

  • ビルド: TypeScript Compiler(tsc)

  • デプロイ: Vercel(推奨)または AWS Lambda

クイックスタート

デモを試す

アクセス先: https://[your-vercel-app].vercel.app/

求人検索インターフェースにリダイレクトされます。職種名を入力し、企業を選択して、結果を即座に閲覧できます。

ローカル開発

# Install dependencies
npm install

# Build TypeScript
npm run build

# Run a test
node dist/test/test-manager-jobs.js

# Start development server (requires Next.js setup)
npm run dev

本番デプロイ

# Deploy to Vercel (recommended)
npm install -g vercel
vercel

# Or deploy to AWS
# See docs/DEPLOYMENT.md for AWS Lambda setup

プロジェクトアーキテクチャ

User searches for jobs → Demo page (/app/demo/page.tsx)
                          ↓
                    React UI Component
                    - Search input
                    - Company multi-select
                    - Sortable results tables
                    ↓
                   REST API (/api/search-jobs)
                    ↓
    ┌───────────────┬────────────────┬────────────────┐
    │               │                │                │
  Amgen          Bayer            GSK           Novartis  Pfizer
(Workday)   (Eightfold AI)    (Workday)      (Drupal)   (Workday)
    │               │                │                │
    └───────────────┴────────────────┴────────────────┘
                    ↓
          Search Executor (src/search-executor.ts)
          - Fetches job URLs from each site
          - Parses HTML for job listings
          ↓
    Extractor Registry (src/extractors/)
    - Extracts job details from each URL
    - Company-specific parsers
    - Error tracking & classification
          ↓
    Extraction Helpers (src/extraction-helpers.ts)
    - CSV report generation
    - Error aggregation
          ↓
    REST API Response (JSON)
          ↓
    Demo Page displays results
    - Success table: Jobs with details
    - Error table: Failed extractions
    - Download CSV buttons

設定

src/config.json は、プロジェクトがサポートする企業の情報源(source of truth)です。

例:

{
  "projectname": "Job Search MCP",
  "sites": [
    {
      "name": "Amgen",
      "search_url": "https://amgen.wd1.myworkdayjobs.com/Careers?q=Engineer"
    },
    {
      "name": "Pfizer",
      "search_url": "..."
    }
  ]
}

新しい企業を追加する際は、企業名と利用可能な検索URLを指定するだけで済みます。

サイト定義

各企業は sites/ 配下の個別ファイルで表されます。

例:

sites/amgen.json

構造は test/sample.json に従う必要があります。

サイト定義には以下が含まれます:

  • 企業名

  • キャリアURL

  • 検索URL

  • サポートされている検索パラメータ

  • パラメータのラベル

  • パラメータの型

  • 利用可能なパラメータ値

パラメータ構造は、固定のJSONキーではなく意図的に配列として設計されています。これは、キャリアサイトごとに公開されている検索パラメータが異なるためです。

例えば、あるサイトでは次のようなパラメータを公開している場合があります:

location
country
jobType

一方、別のサイトでは次のようなパラメータを公開している場合もあります:

location
timeType
LocationCountry
jobFamilyGroup
workerSubType

MCPは、すべての企業が同じパラメータをサポートしていると想定してはなりません。

求人抽出器

このプロジェクトにはサイト固有の求人抽出器が含まれており、個々の求人掲載URLを解析して詳細情報を抽出します。

抽出されるデータ

各抽出器は以下を取得します:

  • 職種名 - ポジション名

  • 職務内容 - 完全な職務内容・責任範囲(ヘッダー/フッターは除外)

  • 応募資格 - 要件、資格、スキル

  • 締切日 - 応募受付終了日(YYYY-MM-DD形式、不明な場合は空白)

  • 応募リンク - 応募用の直接URL(求人掲載URLとは異なる場合があります)

利用可能な抽出器

src/extractors/
├── types.ts                  # JobExtractor interface & types
├── amgen.ts                  # Amgen (Workday-based)
├── pfizer.ts                 # Pfizer (Workday-based)
├── bayer.ts                  # Bayer (Eightfold AI)
├── gsk.ts                    # GSK (Workday-based)
├── novartis.ts               # Novartis (Drupal)
└── index.ts                  # ExtractorRegistry

使用例

import { ExtractorRegistry } from './src/extractors/index.js';

const registry = new ExtractorRegistry();
const amgenExtractor = registry.getExtractor('amgen');

const result = await amgenExtractor?.extract(
  'https://amgen.wd1.myworkdayjobs.com/job/India---Hyderabad/Assoc-Director---Data-Product-Mgmt_R-219150'
);

if (result?.success && result.data) {
  console.log(result.data.jobTitle);
  console.log(result.data.jobDescription);
  console.log(result.data.eligibility);
}

テスト

このプロジェクトには、検索および抽出機能を検証するための包括的なテストスイートが含まれています。

テストスイート概要

すべてのテストは自己完結型のTypeScriptファイルであり、個別に実行できます:

npm run build
node dist/test/[test-name].js

利用可能なテスト

1. test-config.ts - 設定読み込みテスト

企業設定が src/config.json から正しく読み込まれることをテストします。

node dist/test/test-config.js

目的: 設定構造と企業の発見を検証する 出力: 利用可能な企業とその検索URLの一覧


2. test-search.ts - 求人検索テスト

全企業を横断した検索機能をテストします。

node dist/test/test-search.js

目的: 検索が有効な求人URLを返すことを検証する 出力: 各企業の「Manager」求人の検索結果 注意: 実際のキャリアサイトへのインターネット接続が必要です


3. test-extractors.ts - 求人抽出テスト

各企業の求人URLに対して求人詳細の抽出が機能することをテストします。

node dist/test/test-extractors.js

目的: 職種名、職務内容、応募資格の抽出を検証する 出力: 抽出成功率とフィールド詳細 注意: test-search.ts の出力からの実在する求人URLが必要です


4. test-manager-jobs.ts - エンドツーエンド統合テスト

完全なパイプラインテスト: 求人の検索 → 詳細の抽出 → レポートの生成

node dist/test/test-manager-jobs.js

目的: エラー追跡とCSVレポート生成を含む完全な統合テスト 出力:

  • test/manager-jobs-success.csv - 正常に抽出された求人データ

  • test/manager-jobs-errors.csv - 抽出エラー(404、タイムアウトなど)

  • 成功率とエラー内訳を示すコンソールサマリー

全テストの実行

npm run build
node dist/test/test-config.js
node dist/test/test-search.js
node dist/test/test-extractors.js
node dist/test/test-manager-jobs.js

テスト出力ファイル

生成されたCSVレポートは test/ フォルダに保存されます:

  • manager-jobs-success.csv - 正常に抽出された求人

  • manager-jobs-errors.csv - エラーコード付きの抽出失敗試行

  • デバッグ用のサンプルHTMLファイル

これらのファイルはテスト実行中に生成され、安全に削除できます。.gitignore に含まれています。

test/sample.json

test/sample.json は、個々の企業ファイルの期待される構造を定義します。

これは企業レジストリではなく、スキーマの例/テンプレートです。

現在の例では、location、timeType、LocationCountry、jobFamilyGroup、workerSubType などのパラメータを使用しています。

BUILD.md

BUILD.md には、企業設定からMCPを構築するAI/開発プロセスの手順が含まれています。

ビルドプロセスは以下のことを行う必要があります:

  1. src/config.json を読み取る。

  2. sites にリストされているすべての企業を処理する。

  3. 提供された検索URLにアクセス/分析する。

  4. 企業の実際のキャリア/検索構造を特定する。

  5. 利用可能な検索パラメータとその値を発見する。

  6. 対応する sites/<company>.json を生成または更新する。

  7. 生成されたファイルが test/sample.json で定義された構造に従っていることを確認する。

  8. 共通のMCP実装をビルド/更新する。

  9. 設定されたすべてのサイトが検索可能であることを検証する。

UPDATE.md

新規リリース作成時にプロジェクトを再構築する手順については、ai/UPDATE.md を参照してください。

src/config.json が変更された場合、AIは新しく追加された企業だけでなく、すべての企業定義を再構築する必要があります。

これは意図的な設計です。

既存のキャリアサイトは以下を変更する可能性があります:

  • 検索URL

  • クエリパラメータ

  • フィルター名

  • フィルター値

  • キャリアサイトの構造

  • ATS実装

したがって、すべてのリリースで、既存の sites/*.json ファイルを現在のライブキャリアサイトと照合して再確認する必要があります。

src/config.json updated
       │
       ▼
Rebuild ALL sites
       │
       ├── New company → create site JSON
       │
       └── Existing company → re-analyze and update
       │
       ▼
Rebuild common MCP
       │
       ▼
Validate

プロジェクト構造

JobSearchMCP/
├── src/                      # Source code & configs
│   ├── server.ts             # MCP server entry point
│   ├── search-executor.ts    # Search execution & parsing
│   ├── config-loader.ts      # Configuration loader
│   ├── types.ts              # TypeScript types
│   ├── config.json           # Company registry
│   ├── site_configurations.json
│   └── site_analysis.json
├── sites/                    # Company-specific configs
│   ├── amgen.json
│   ├── pfizer.json
│   ├── novartis.json
│   ├── bayer.json
│   └── gsk.json
├── test/                     # Tests & test data
│   ├── test-*.js             # Test scripts
│   ├── sample.json           # Configuration template
│   └── *.html                # Sample HTML files
├── ai/                       # AI development notes (Gitignored)
│   ├── AI.md
│   └── UPDATE.md
├── reports/                  # Documentation
│   ├── IMPLEMENTATION.md
│   ├── ANALYSIS_GUIDE.md
│   ├── MCP_USAGE.md
│   └── MIGRATION.md
├── dist/                     # Compiled JavaScript
├── package.json              # Dependencies & scripts
├── tsconfig.json             # TypeScript config
└── README.md                 # This file

技術

ランタイム: Node.js 言語: TypeScript MCP SDK: 公式 Model Context Protocol TypeScript SDK 設定: JSON

設計原則

このプロジェクトはサイト固有の知識と共通のMCPロジックを分離しています。

sites/*.json
    = How a particular company career site works

MCP implementation
    = How to search any configured company

AI
    = Understand the user's request and select/use the appropriate
      company search configuration

MCPには、location、remote、full_time、job_type などのパラメータに関するハードコードされた想定を含めてはなりません。

パラメータは、その企業のキャリアサイトが実際にサポートしているか、設定に必要な情報を公開している場合にのみ、その企業に対して存在します。

目標

目標は、再利用可能な求人検索MCPを作成することです。企業の追加は主に config.json に検索URLを追加するだけで済み、AIビルドプロセスがサイト固有の設定を自動的に発見・維持できるようにします。

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    MCP server that exposes job search data from multiple boards, enabling clients to query and manage job listings via natural language.
    7
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    MCP server for job search and application tracking, enabling AI agents to search jobs, get details, manage applications, and find contacts across 128K+ jobs and 1,900+ companies.
    258 npm
    3
    MIT
  • A
    license
    C
    quality
    C
    maintenance
    An MCP server that enables AI-assisted job search workflows including job discovery, application tracking, resume evaluation, and cover letter generation, with support for multiple job sources and scheduled scraping.
    83
    42 npm
    1
    AGPL 3.0
  • A
    license
    Not graded
    quality
    D
    maintenance
    A custom MCP server that exposes a jobs database to any MCP-compatible LLM client, allowing users to ask in plain English to search, filter, and match job openings.
    MIT