Job Search MCP
Allows searching GSK's career website and extracting detailed job listings, including job titles, descriptions, requirements, expiry dates, and apply links.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Job Search MCPFind me data scientist jobs at Novartis and Bayer"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Job Search Engine
Fast, reliable job search across 5 major pharmaceutical companies.
Search for jobs directly from Amgen, Bayer, GSK, Novartis, and Pfizer career websites. Extract job titles, descriptions, requirements, and apply links instantly.
Demo: https://[your-vercel-app].vercel.app/
Features
✅ Search across 5 companies simultaneously
✅ Extract detailed job information (title, description, requirements, expiry)
✅ Track failed extractions with error codes (404s, timeouts, etc.)
✅ Generate CSV reports with results
✅ Zero external dependencies, fast regex-based parsing
✅ TypeScript + strict type safety
✅ Comprehensive error handling and classification
✅ Rate-limited API (5 searches/day/IP)
Related MCP server: trackly-cli
Technology Stack
Frontend: React + TypeScript + Tailwind CSS
Backend: Next.js + Node.js
Parsing: Regex-based HTML extraction (no heavy dependencies)
Runtime: Node.js (v18+)
Language: TypeScript 5.3+
Build: TypeScript Compiler (tsc)
Deployment: Vercel (recommended) or AWS Lambda
Quick Start
Try the Demo
Visit: https://[your-vercel-app].vercel.app/
You'll be redirected to the job search interface. Enter a job title, select companies, and browse results instantly.
Local Development
# 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 devProduction Deployment
# Deploy to Vercel (recommended)
npm install -g vercel
vercel
# Or deploy to AWS
# See docs/DEPLOYMENT.md for AWS Lambda setupProject Architecture
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 buttonsConfiguration
src/config.json is the source of truth for the companies that the project supports.
Example:
{
"projectname": "Job Search MCP",
"sites": [
{
"name": "Amgen",
"search_url": "https://amgen.wd1.myworkdayjobs.com/Careers?q=Engineer"
},
{
"name": "Pfizer",
"search_url": "..."
}
]
}Only the company name and a usable search URL need to be supplied when adding a new company.
Site Definitions
Each company is represented by a separate file under sites/.
For example:
sites/amgen.jsonThe structure must follow test/sample.json.
A site definition contains:
company name
career URL
search URL
supported search parameters
parameter labels
parameter types
available parameter values
The parameter structure is intentionally an array rather than fixed JSON keys because different career websites expose different search parameters.
For example, one site may expose:
location
country
jobTypewhile another may expose:
location
timeType
LocationCountry
jobFamilyGroup
workerSubTypeThe MCP must not assume that every company supports the same parameters.
Job Extractors
The project includes site-specific job extractors that parse individual job posting URLs and extract detailed information.
Extracted Data
Each extractor retrieves:
Job Title - Position name
Job Description - Full job description/responsibilities (excludes headers/footers)
Eligibility - Requirements, qualifications, and skills
Expiry Date - Application closing date (YYYY-MM-DD format, blank if not available)
Apply Link - Direct URL to apply (may differ from job posting URL)
Available Extractors
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 # ExtractorRegistryUsage Example
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);
}Testing
The project includes a comprehensive test suite for validating search and extraction functionality.
Test Suite Overview
All tests are self-contained TypeScript files that can be run independently:
npm run build
node dist/test/[test-name].jsAvailable Tests
1. test-config.ts - Configuration Loading Test
Tests that company configurations load correctly from src/config.json.
node dist/test/test-config.jsPurpose: Validates configuration structure and company discovery Output: Lists available companies and their search URLs
2. test-search.ts - Job Search Test
Tests the search functionality across all companies.
node dist/test/test-search.jsPurpose: Verifies that searches return valid job URLs Output: Search results for "Manager" jobs from each company Note: Requires internet connectivity to actual career sites
3. test-extractors.ts - Job Extraction Test
Tests that job detail extraction works for each company's job URLs.
node dist/test/test-extractors.jsPurpose: Validates job title, description, and eligibility extraction Output: Extraction success rate and field details Note: Requires real job URLs from test-search.ts output
4. test-manager-jobs.ts - End-to-End Integration Test
Complete pipeline test: searches for jobs → extracts details → generates reports
node dist/test/test-manager-jobs.jsPurpose: Full integration test with error tracking and CSV report generation Output:
test/manager-jobs-success.csv- Successfully extracted job datatest/manager-jobs-errors.csv- Extraction errors (404s, timeouts, etc.)Console summary showing success rate and error breakdown
Running All Tests
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.jsTest Output Files
Generated CSV reports are stored in the test/ folder:
manager-jobs-success.csv- Successful job extractionsmanager-jobs-errors.csv- Failed extraction attempts with error codesSample HTML files for debugging
These files are generated during test runs and can be safely deleted. They are in .gitignore.
test/sample.json
test/sample.json defines the expected structure for individual company files.
It is a schema-by-example/template rather than a company registry.
The current example uses parameters such as location, timeType, LocationCountry, jobFamilyGroup, and workerSubType.
BUILD.md
BUILD.md contains instructions for the AI/development process that builds the MCP from the company configurations.
The build process should:
Read
src/config.json.Process every company listed in
sites.Visit/analyze the supplied search URL.
Determine the company's actual career/search structure.
Discover the available search parameters and their values.
Generate or update the corresponding
sites/<company>.json.Ensure the generated file follows the structure defined by
test/sample.json.Build/update the common MCP implementation.
Validate that all configured sites can be searched.
UPDATE.md
See ai/UPDATE.md for instructions for rebuilding the project when a new release is created.
When src/config.json changes, the AI must rebuild all company definitions, not only newly added companies.
This is intentional.
Existing career sites can change their:
search URLs
query parameters
filter names
filter values
career-site structure
ATS implementation
Therefore, every release should re-check existing sites/*.json files against the current live career sites.
src/config.json updated
│
▼
Rebuild ALL sites
│
├── New company → create site JSON
│
└── Existing company → re-analyze and update
│
▼
Rebuild common MCP
│
▼
Validate
Project Structure
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 fileTechnology
Runtime: Node.js Language: TypeScript MCP SDK: Official Model Context Protocol TypeScript SDK Configuration: JSON
Design Principle
The project separates site-specific knowledge from common MCP logic.
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 configurationThe MCP should not contain hard-coded assumptions about parameters such as location, remote, full_time, or job_type.
A parameter only exists for a company if that company's career site actually supports it or exposes the information required by the configuration.
Goal
The goal is to create a reusable job-search MCP where adding companies is primarily a matter of adding their search URLs to config.json, allowing the AI build process to discover and maintain the site-specific configurations automatically.
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.
AI job search MCP — fact-checked jobs, application tracker, alerts. ChatGPT, Claude, Cursor.
SAP SuccessFactors public career-site jobs via an Apify Actor, hosted MCP.
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.638 npm3MIT- AlicenseCqualityDmaintenanceAn 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.8312 npm1AGPL 3.0
- AlicenseNot gradedqualityBmaintenanceA 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