Job Search MCP
Поисковая система вакансий
Быстрый и надёжный поиск вакансий по 5 крупным фармацевтическим компаниям.
Ищите вакансии напрямую на сайтах карьеры Amgen, Bayer, GSK, Novartis и Pfizer. Мгновенно извлекайте названия вакансий, описания, требования и ссылки для отклика.
Демо: https://[your-vercel-app].vercel.app/
Возможности
✅ Поиск по 5 компаниям одновременно
✅ Извлечение подробной информации о вакансии (название, описание, требования, срок действия)
✅ Отслеживание неудачных извлечений с кодами ошибок (404, таймауты и т.д.)
✅ Генерация CSV-отчётов с результатами
✅ Ноль внешних зависимостей, быстрый парсинг на основе регулярных выражений
✅ TypeScript + строгая типизация
✅ Всесторонняя обработка и классификация ошибок
✅ API с ограничением частоты запросов (5 поисков/день/IP)
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 — это источник истины для компаний, поддерживаемых проектом.
Пример:
{
"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
workerSubTypeMCP не должен предполагать, что каждая компания поддерживает одинаковые параметры.
Экстракторы вакансий
Проект включает специфичные для сайтов экстракторы вакансий, которые анализируют отдельные URL-адреса вакансий и извлекают подробную информацию.
Извлекаемые данные
Каждый экстрактор получает:
Название вакансии — наименование должности
Описание вакансии — полное описание/обязанности (без верхних и нижних колонтитулов)
Требования — требования, квалификация и навыки
Дата окончания — дата закрытия приёма заявок (формат ГГГГ-ММ-ДД, пусто, если недоступно)
Ссылка для отклика — прямой 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Назначение: проверяет извлечение названия, описания и требований вакансии Результат: процент успешных извлечений и детализация полей Примечание: требуются реальные URL вакансий из вывода test-search.ts
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 из конфигураций компаний.
Процесс сборки должен:
Прочитать
src/config.json.Обработать каждую компанию, указанную в
sites.Посетить/проанализировать предоставленный URL поиска.
Определить фактическую структуру карьеры/поиска компании.
Обнаружить доступные параметры поиска и их значения.
Сгенерировать или обновить соответствующий файл
sites/<company>.json.Убедиться, что сгенерированный файл соответствует структуре, определённой в
test/sample.json.Собрать/обновить общую реализацию MCP.
Проверить, что все настроенные сайты можно искать.
UPDATE.md
См. ai/UPDATE.md для инструкций по пересборке проекта при выпуске новой версии.
Когда изменяется src/config.json, ИИ должен пересобрать все определения компаний, а не только вновь добавленные.
Это сделано намеренно.
Существующие сайты карьеры могут изменять:
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: официальный TypeScript SDK протокола Model Context Protocol Конфигурация: 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 configurationMCP не должен содержать жёстко заданных предположений о таких параметрах, как location, remote, full_time или job_type.
Параметр существует для компании только в том случае, если сайт карьеры этой компании действительно его поддерживает или предоставляет информацию, требуемую конфигурацией.
Цель
Цель — создать переиспользуемый MCP для поиска вакансий, в котором добавление компаний сводится в основном к добавлению их URL поиска в config.json, что позволяет процессу сборки на основе ИИ автоматически обнаруживать и поддерживать конфигурации, специфичные для сайтов.
This server cannot be deployed
Maintenance
Related MCP Connectors
Public MCP server for discovering open jobs. Search, filter, and get application links.
GetJobzi MCP server for job search, application tracking, and career forecasting.
JobsPipe — data pipeline of every job posting on the web. Search live, normalized job postings from 30+ ATS feeds and job boards for AI agents via MCP.
AI job search MCP — fact-checked jobs, application tracker, alerts. ChatGPT, Claude, Cursor.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceMCP server that exposes job search data from multiple boards, enabling clients to query and manage job listings via natural language.7MIT

trackly-cliofficial
AlicenseNot gradedqualityAmaintenanceMCP 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 npm3MIT- AlicenseCqualityCmaintenanceAn 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.8342 npm1AGPL 3.0
- AlicenseNot gradedqualityDmaintenanceA 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