job-mcp
Israeli Multi-Source Tech Job FastMCP Server (TechJobMCP)
An enterprise-grade, privacy-first FastMCP server providing intelligent, multi-source tech job aggregation, smart deduplication, dynamic CV skill & target role extraction, requirement coverage scoring, zero-guesswork Universal DOM form automation, and autonomous job scouting workflows across HireMeTech, Comeet ATS, Workday Enterprise, Eightfold.ai, DirectTech (Google, Apple, Amazon, IBM), and LinkedIn.
๐ Documentation Guides
๐ Setup & Candidate Profile Configuration Guide โ Dynamic CV extraction, target roles, environment config, Docker & Python local run.
๐ Cloudflare Tunnel & Port Export Guide โ Exposing port 8000 via
cloudflaredfor remote AI clients.๐ค AI Client Integrations Guide โ Complete setup for Gemini Spark (autonomous scheduled scout), Claude Desktop / CoWork, ChatGPT / Codex, and Cursor / Antigravity.
๐ ๏ธ Spark Prompts & Skills โ System prompt and skill instructions for autonomous scouting agents.
๐๏ธ Architecture Overview
graph TD
Client([MCP Client: Gemini Spark / Claude / Cursor / ChatGPT]) --> Tools[FastMCP Server Layer]
Tools --> Aggregator[JobAggregator]
Aggregator --> Registry[SourceRegistry]
subgraph Parallel Pluggable Sources Layer
Registry --> S1[HireMeTechSource<br/>Direct REST API + DOM Fallback]
Registry --> S2[ComeetSource<br/>Direct ATS API + Concurrency Semaphore]
Registry --> S3[WorkdaySource<br/>Enterprise Workday CXS Direct API]
Registry --> S4[EightfoldSource<br/>PCSX Search API]
Registry --> S5[DirectTechSource<br/>Google, Apple, Amazon, IBM Feeds]
Registry --> S6[LinkedInSource<br/>Job Guest Search API]
end
subgraph Processing & Normalization Engine
S1 --> Dedup[Deduplication & Entity Merger]
S2 --> Dedup
S3 --> Dedup
S4 --> Dedup
S5 --> Dedup
S6 --> Dedup
Dedup --> NormKey["Key = slug(title) + '@' + slug(company)"]
NormKey --> Merge[Metadata & Links Merger]
Merge --> Scorer[Unified CV / Skill Matcher]
end
subgraph Dynamic Candidate Engine
CV["Candidate CV (.pdf / .docx / .txt)"] --> Extractor[Dynamic CV & Profile Extractor]
Extractor --> Skills["Extracted Skills (40+ tokens)"]
Extractor --> Stack["Primary Tech Stack (Top Skills)"]
Extractor --> Seniority["Inferred Seniority & Exclusions"]
Extractor --> Roles["Dynamic Target Roles"]
Skills --> Scorer
Stack --> Scorer
Seniority --> Scorer
Roles --> Scorer
end
subgraph Autonomous Application Engine
Tools --> Dispatcher["HybridApplicationDispatcher"]
Dispatcher --> Guardrails{"Safety Guardrails<br/>Cap / Dups / Score / IL"}
Guardrails --> StrategyRouter["Strategy Selector"]
StrategyRouter --> BrowserStrategy["BrowserPlaywrightStrategy"]
StrategyRouter --> ApiStrategy["ApiPostStrategy"]
StrategyRouter --> EasyApply["EasyApplyStrategy"]
BrowserStrategy --> DOMInspector["Universal DOMInspector<br/>Recursive Frames & Zero-Guesswork"]
BrowserStrategy --> FormMapper["SemanticFormMapper<br/>Regex + Free-Tier LLM Gateway"]
Dispatcher --> Ledger[("ApplicationLedger (SQLite)")]
end
Scorer --> Cache[Unified JobCache - 2h TTL]
Cache --> Tools๐ Key Features
Dynamic Candidate Extraction:
Ingests
.pdf,.docx, and.txtresumes for any engineering specialty (Java, Python, Frontend, DevOps, AI, Web3).Automatically derives candidate
primary_stackandtarget_roleswithout hardcoded assumptions.Detects seniority level (Student, Junior, Mid, Senior, Lead) and generates tailored negative keywords.
Calibrated Match Scoring (0โ100):
Primary Stack Affinity: Heavily weights candidate's core technologies (+35 pts).
Skill Volume Scaling: Scales with absolute count of matched core competencies (4+ skills = 30 pts; 1 generic skill = 8 pts max).
Target Role Semantic Fit: Awards +15 pts for developer titles matching target roles; caps non-engineering/administrative positions at 65 pts.
Commute & Location Normalization: Normalizes country codes (
", IL",Israel,ืืฉืจืื) and handles peripheral on-site roles.
Universal Dynamic DOM Form Solver:
Zero-Guesswork DOM Inspection: In-browser JS evaluation traverses main documents and recursive
iframes(e.g., Comeet embedded forms, Workday modal overlays).11-Tier Contextual Label Resolution: Matches labels using
aria-label,<label for>, preceding text, fieldsets, and placeholders.Deterministic & AI-Assisted Submission: Deterministic keyword scoring (+65 to +100 for submit buttons, -100 for negative/cancel actions) with LLM disambiguation fallback.
Resilient Free-Tier LLM Gateway & Caching:
Multi-provider fallback chain (Gemini Flash Lite -> OpenRouter -> Ollama -> Heuristic Mock).
Token-bucket rate limiting (15 RPM) and jittered exponential backoff retries.
Zero-cost SQLite semantic caching (
llm_cache.db) for questionnaire answers.
Safety Guardrails & Application Ledger:
Audit log in SQLite (
application_ledger.db).Duplicate prevention (
is_appliedcheck).Fail-closed master switch (
AUTO_APPLY_ENABLED=false).Israel/Remote location enforcement and daily run caps (
MAX_DAILY_APPLICATIONS).
๐ ๏ธ Tool Reference (15 Tools)
Tool Name | Parameters | Description |
|
| Composite Scout Tool: Runs end-to-end multi-source aggregation, scoring, bookmarking, and safe application execution in one call. |
| none | Lists all registered job sources, capabilities, and real-time health. |
|
| Fetches matched listings across all or specified platforms with deduplication. |
|
| Scores and filters aggregated jobs against candidate CV and preferences. |
|
| Saves/favorites a job listing on the originating platform. |
|
| Dismisses/hides a job listing from view and removes it from cache. |
|
| Step 1: Inspects application modal, stages dynamic preview, maps form fields, and reports warnings. |
|
| Step 2: Executes application submission via Playwright DOM / API POST. Requires explicit confirmation or force. |
|
| Retrieves the immutable audit log of past application submissions from |
| none | Discovers and calibrates DOM selectors against live pages with self-healing heuristics. |
|
| Dedicated LinkedIn search tool returning normalized Job models. |
|
| Fetches rich job description and metadata for a specific LinkedIn posting. |
|
| Sends structured notification digest of new top-tier job opportunities. |
|
| Tests notification channel configuration. |
|
| Switches server execution mode between supervised and autonomous. |
โก Quick Start
1. Clone & Configure
git clone https://github.com/zvieli/TechJobMCP.git
cd TechJobMCP
# Copy your CV and setup environment
cp /path/to/your/resume.pdf ./cv.pdf
cp .env.example .env2. Run with Docker Compose
docker compose up -d
docker compose logs -f techjob-mcp3. Export Public HTTPS Port for AI Clients
curl -L --output cloudflared https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64
chmod +x cloudflared
./cloudflared tunnel --url http://localhost:8000Connect the generated https://<tunnel-id>.trycloudflare.com/mcp URL to your AI client. See AI Client Integrations Guide for full setup instructions.
๐งช Running Tests
Run the full automated test suite (654 unit and integration tests):
.venv/bin/pytest๐ License
This project is licensed under the MIT License.