Skip to main content
Glama
zvieli
by zvieli

{"type":"text"}# Универсальный многопоточный сервер поиска работы FastMCP (job-mcp)

Python 3.12+ FastMCP 2.0+ Tests Passing License: MIT

Корпоративный, ориентированный на конфиденциальность FastMCP-сервер, обеспечивающий интеллектуальную агрегацию вакансий из нескольких источников, умную дедупликацию, динамическое извлечение навыков из резюме, оценку покрытия требований и автономные рабочие процессы подачи заявок на HireMeTech, Comeet ATS и AllJobs Israel.


Обзор архитектуры

graph TD
    Client([MCP Client: Claude / Cursor / Gemini Spark / Antigravity]) --> Tools[FastMCP Server Layer]
    Tools --> Aggregator[JobAggregator]
    Aggregator --> Registry[SourceRegistry]

    subgraph Parallel Pluggable Sources Layer
        Registry --> S1[HireMeTechSource<br/>Direct REST API + Session Fallback]
        Registry --> S2[ComeetSource<br/>Direct ATS API + Concurrency Semaphore]
        Registry --> S3[AllJobsSource<br/>Category Feeds + Anti-Blocking Headers]
    end

    subgraph Processing & Normalization Engine
        S1 --> Dedup[Deduplication & Entity Merger]
        S2 --> Dedup
        S3 --> 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 --> Seniority["Inferred Seniority & Exclusions"]
        Extractor --> Roles["Target Job Roles"]
        Skills --> Scorer
        Seniority --> Scorer
    end

    Scorer --> Cache[Unified JobCache - 1h TTL]
    Cache --> Tools

Ключевые возможности

  1. Динамическое извлечение резюме и профиля кандидата:

    • Многоформатный ввод: Поддерживает файлы .pdf (через pypdf), .docx (через python-docx) и .txt.

    • NLP-разбиение навыков и динамический лексикон: Обнаруживает и извлекает 40+ технических навыков без хрупкого жесткого кодирования, поддерживая сложные многословные технологии (например, FastAPI, LangGraph, PostgreSQL, Smart Contracts, GraphRAG).

    • Автоматическое определение уровня и исключений: Точно определяет уровень кандидата (Junior, Mid, Senior, Lead, Principal, Director) и генерирует интеллектуальные негативные ключевые слова для фильтрации неподходящих позиций.

    • Фильтрация стоп-слов и шума: Тщательно отбрасывает структурные артефакты резюме, даты, образовательные титулы и нетехнические метаданные.

  2. Умная оценка покрытия требований (0–100):

    • Коэффициент покрытия требований вакансии: Вычисляет, насколько полно навыки кандидата удовлетворяют указанному технологическому стеку конкретной вакансии (matched_job_skills / total_job_skills), предотвращая штрафы для кандидатов с широкими резюме.

    • Взвешенная оценка компонентов:

      • Пересечение и покрытие технологического стека: до 40 баллов

      • Релевантность ключевых слов всего резюме: до 25 баллов

      • Соответствие режима работы и местоположения: до 20 баллов

      • Ожидания по зарплате: до 15 баллов

      • Штраф за исключение: -100 баллов за жесткие дисквалификаторы по уровню/технологиям.

    • Категоризация совпадений по уровням:

      • Лучшее совпадение ($\ge 85$): Автоподача / приоритетные кандидаты на подачу.

      • Сильное совпадение ($70 - 84$): Вакансии с высоким интересом, отмеченные для просмотра/закладок.

      • Дисквалифицировано ($< 50$): Автоматически скрыто или удалено.

  3. Подключаемая многопоточная архитектура:

    • HireMeTech: Прямая интеграция с REST API (/api/jobs/search, /api/auth/me, /api/resume/profile) с автоматическим резервным DOM-механизмом.

    • Comeet (Direct ATS): Прямая интеграция с Comeet Careers API (/careers-api/2.0/company/{id}/positions) с ограничением скорости asyncio.Semaphore(5), индексацией технического каталога и TTL-кэшированием для каждой компании.

    • AllJobs Israel: Интеграция с категорийными лентами с реалистичными заголовками браузера и изоляцией ошибок на уровне источника.

  4. Межпоточная дедупликация и объединение сущностей:

    • Устраняет дубликаты, когда вакансии появляются на нескольких досках объявлений.

    • Объединяет списки источников (sources: ["hiremetech", "comeet"]), объединяет технологические стеки, сохраняет наиболее полное описание и отдает приоритет прямым ссылкам на подачу через ATS.

  5. Автономный и контролируемый режимы работы:

    • Контролируемый режим: Стандартное подтверждение MCP для каждого инструмента.

    • Автономный режим: Безопасная цепочка чтения/фильтрации/закладок без ручных запросов; двухэтапный защитный барьер при отправке заявки.

  6. Наблюдаемость и устойчивость:

    • Структурированное JSON-логирование (structlog) в stderr с очисткой токенов/учетных данных.

    • Автоматическое отслеживание trace ID во всех полезных нагрузках ToolResponse.


Справочник инструментов (9 инструментов)

Имя инструмента

Параметры

Описание

list_job_sources

нет

Перечисляет все зарегистрированные источники вакансий (hiremetech, comeet, alljobs), их возможности и состояние в реальном времени.

get_job_matches

sources: list[str] = None, force_refresh: bool = False

Получает подходящие вакансии со всех или указанных платформ с дедупликацией.

filter_jobs_by_preferences

tech_stack: list[str], work_mode: str, location: str, min_salary: int, keywords: list[str], exclude_keywords: list[str], cv_path: str

Оценивает и фильтрует агрегированные вакансии по резюме и предпочтениям кандидата.

bookmark_job

job_id: str

Сохраняет/добавляет вакансию в избранное на исходной платформе.

delete_job

job_id: str

Скрывает/удаляет вакансию из просмотра и удаляет её из кэша.

auto_apply_job

job_id: str

Шаг 1: Проверяет модальное окно подачи, подготавливает предпросмотр, сообщает о предупреждениях.

confirm_auto_apply

job_id: str

Шаг 2: Выполняет отправку заявки. Всегда требует явного подтверждения.

calibrate_selectors

нет

Обнаруживает и калибрует DOM-селекторы на живых страницах с самовосстанавливающимися эвристиками.

set_operation_mode

mode: 'supervised' | 'autonomous'

Переключает режим выполнения сервера между контролируемым и автономным.


Быстрый старт и настройка

1. Клонирование и установка зависимостей

git clone https://github.com/zvieli/hireme_mcp.git
cd hireme_mcp

# Using uv (recommended)
uv venv .venv
uv pip install -e ".[dev]"
playwright install chromium

2. Настройка профиля кандидата и резюме

Поместите ваше резюме (cv.pdf, cv.docx или cv.txt) в корневой каталог:

cp /path/to/your/resume.pdf ./cv.pdf
cp .env.example .env

Отредактируйте .env, чтобы настроить путь к резюме по умолчанию и контактные данные:

DEFAULT_CV_PATH=./cv.pdf
CANDIDATE_EMAIL=your.email@example.com
CANDIDATE_NAME="Your Name"

3. (Необязательно) Первоначальная настройка аутентификации для HireMeTech

Comeet и AllJobs работают автоматически без входа в систему. Чтобы аутентифицировать вашу учетную запись HireMeTech для прямого доступа к API и автоподачи:

.venv/bin/python -m job_mcp.setup
  1. Откроется окно браузера Chromium.

  2. Войдите с вашими учетными данными.

  3. Вернитесь в терминал и нажмите [Enter], чтобы сохранить сеанс в ./browser_profile.


Запуск сервера

Вариант A: Использование Docker (рекомендуется)

# Build and run in background
docker compose up -d

# View live multi-source aggregation logs
docker compose logs -f hireme-mcp

Вариант B: Локальный запуск

# Streamable HTTP (Default for Web & Cloud Clients)
.venv/bin/python -m job_mcp --transport http --host 0.0.0.0 --port 8000

# Stdio (Default for Desktop Clients)
.venv/bin/python -m job_mcp --transport stdio

Визуальный конвейерный запуск CLI

Чтобы выполнить полный автономный поиск, оценку и пробную подачу заявки прямо в терминале с богатым визуальным выводом:

# Run with auto-extracted skills from your CV:
.venv/bin/python scripts/run_mock_llm_pipeline.py --cv ./cv.pdf

# Run with explicit stack override and remote filter:
.venv/bin/python scripts/run_mock_llm_pipeline.py --cv ./cv.pdf --stack "Python,FastAPI,LangGraph" --work-mode remote --location "Tel Aviv"

# Execute live application submissions (disabled by default in dry-run):
.venv/bin/python scripts/run_mock_llm_pipeline.py --cv ./cv.pdf --auto-apply

Конфигурация MCP-клиента

1. Claude Desktop (claude_desktop_config.json)

В Linux: ~/.config/Claude/claude_desktop_config.json
В macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
В Windows: %APPDATA%\Claude\claude_desktop_config.json

{
  "mcpServers": {
    "job-search-mcp": {
      "command": "/absolute/path/to/hireme_mcp/.venv/bin/python",
      "args": ["-m", "job_mcp", "--transport", "stdio"],
      "env": {
        "BROWSER_HEADLESS": "true",
        "DEFAULT_CV_PATH": "/absolute/path/to/hireme_mcp/cv.pdf",
        "CANDIDATE_EMAIL": "candidate@example.com",
        "LOG_LEVEL": "INFO"
      }
    }
  }
}

2. Gemini Spark / веб-MCP-клиенты

  • Конечная точка: https://<your-host-or-devtunnel-id>/mcp

  • Транспорт: Streamable HTTP

  • Аутентификация: Нет / Без аутентификации


Переменные окружения

Переменная

По умолчанию

Описание

DEFAULT_CV_PATH

./cv.pdf

Путь к файлу резюме по умолчанию для динамического извлечения навыков кандидата.

CANDIDATE_EMAIL

candidate@example.com

Электронная почта кандидата для автоматических модальных окон подачи.

CANDIDATE_NAME

""

Полное имя кандидата для форм подачи.

MCP_TRANSPORT

http

Транспортный протокол (http, sse, stdio).

MCP_HOST

0.0.0.0

Привязка хоста для HTTP/SSE-транспорта.

MCP_PORT

8000

Порт для HTTP/SSE-транспорта.

BROWSER_HEADLESS

true

Запуск браузера в безголовом режиме (true/false).

BROWSER_PROFILE_DIR

./browser_profile

Каталог для постоянного хранения сеанса Chromium.

CACHE_TTL_MINUTES

60

Время жизни кэша дедуплицированных вакансий в памяти (в минутах).

LOG_LEVEL

INFO

Уровень структурированного логирования (DEBUG, INFO, WARNING, ERROR).


Запуск тестов

Запустите полный автоматизированный набор тестов (542 теста):

.venv/bin/pytest tests/ -v

Лицензия

Этот проект лицензирован по лицензии MIT.

-
license - not tested
-
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/zvieli/TechJobMCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server