Skip to main content
Glama

HH Career Monitor

Монитор вакансий HH.ru с уведомлениями в Telegram и анализом по кнопке через Mistral API. Дополнительно: MCP-инструменты для DeepSeek Harness — чтение вакансий, текстовых PDF и управление монитором.

Статус: экспериментальный pet-проект для Windows. Уведомления не зависят от оценки нейросети: каждая новая вакансия из выбранной выдачи попадает в Telegram. Модель вызывается только по кнопке. Автоматических откликов работодателям нет.

Что делает

  • Проверяет сохранённую выдачу каждые 15 минут, включая пагинацию.

  • На первом запуске запоминает существующие ID без рассылки старых вакансий.

  • Хранит очередь уведомлений и историю на диске; повторная проверка не рассылает те же ID.

  • Принимает кнопку анализа только от владельца настроенного личного Telegram-чата.

  • Отправляет текст вакансии и краткий профиль кандидата в Mistral: возвращает название, ссылку, короткий вывод и, при положительном выводе, черновик письма.

  • Читает локальные PDF по страницам без загрузки документа во внешний сервис. OCR не реализован.

  • Хранит API-ключи через Windows DPAPI, отдельно от кода и промптов.

Related MCP server: HeadHunter API MCP Server

Как устроено

flowchart LR
    HH[Выдача HH] --> Browser[Playwright / Chromium]
    Browser --> Queue[Новые ID и очередь на диске]
    Queue --> TG[Telegram: название и ссылка]
    TG -->|Кнопка владельца| Job[Очередь анализа]
    Profile[Локальный профиль] --> Job
    Job --> Mistral[Mistral API]
    Mistral --> Result[Вывод и условное письмо в Telegram]
    Harness[DeepSeek Harness / MCP] --> Browser
    Harness --> PDF[Локальный PDF → текст]

Модель не управляет расписанием и не решает, отправлять ли уведомление. Один процесс монитора использует отдельный постоянный профиль браузера HH. Telegram, Chromium и Mistral работают на компьютере пользователя; отдельного сервера нет.

Требования

  • Windows 10/11, Node.js 22+, npm, Windows PowerShell 5.1.

  • Интернет, отдельный Telegram-бот и личный чат с ним.

  • Ключ Mistral — только для анализа, мониторинг работает без него.

  • Для PDF: Python 3.10+ и зависимости из requirements.txt.

  • Для режима пресета: установленный DeepSeek Harness с dsh-persona и dsh-mcp-client.

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

Установка

git clone https://github.com/oziksman/hh-career-monitor.git
cd hh-career-monitor
npm ci
npx playwright install chromium
npm run init
# Необязательно, для PDF:
python -m pip install -r requirements.txt

init создаёт личные настройки в src/ и пресет в .local/career-review/. Существующие настройки не перезаписываются. Эти файлы исключены из Git. Если перемещаете папку проекта, повторите npm run init и заново скопируйте пресет.

  1. В src/monitor-config.json укажите свою ссылку поиска HH. Начните с enabled: false.

  2. Заполните src/profile-summary.txt: подтверждённый опыт, образование, языки, условия работы. Именно этот файл отправляется в Mistral. Не добавляйте паспорт, телефон, адрес и секреты.

  3. src/profile.txt — более подробный профиль для локального инструмента read_profile; используйте заголовки ПРОФИЛЬ, ОПЫТ, ОГРАНИЧЕНИЯ. Он не отправляется в Mistral автоматически.

Telegram и Mistral

Создайте отдельного бота через BotFather, откройте его личный чат и отправьте /start. Затем в PowerShell:

& .\src\setup-telegram.ps1

Введите токен в скрытое поле. Выбирайте номер пункта меню, а не числовой chat ID. Скрипт отправит тестовое сообщение. На время настройки остановите другие процессы этого бота: один бот должен иметь только одного обработчика getUpdates, без webhook.

Для анализа:

& .\src\setup-mistral.ps1 -Model ministral-14b-2512

Скрипт проверяет ключ коротким запросом, затем сохраняет его и выбранную модель. Поддерживается также mistral-small-latest; доступность зависит от аккаунта. При HTTP 429 изучите квоту и ограничение конкретной модели. Автоматического переключения на платную модель нет. Не меняйте execution policy всей системы ради установки; используйте разрешённый в своей среде способ запуска локальных скриптов.

Запуск без Harness

npm run console

В открытой консоли последовательно введите:

login

В открывшемся Chromium вручную войдите в HH, убедитесь, что нужная выдача доступна. Затем в консоли:

login_done
start
status

Команды: status, start, stop, check, login, login_done, quit. check запускает проверку в фоне; её результат смотрите повторным status. Оставьте процесс запущенным. quit завершает процесс; stop выключает расписание поиска, но обработчик уже имеющихся кнопок Telegram остаётся активным до выхода.

Подключение к DeepSeek Harness

Используйте один способ запуска: консоль или MCP внутри Harness, иначе второй процесс получит ошибку блокировки.

Скопируйте два сгенерированных файла в новый каталог пресета. Существующий Career Review не перезаписывайте без резервной копии:

$presetPath = Join-Path $env:USERPROFILE '.dsh/.agent-presets/hh-career-monitor'
New-Item -ItemType Directory -Path $presetPath -Force
Copy-Item .\.local\career-review\preset.yml $presetPath
Copy-Item .\.local\career-review\agent.cordis.yml $presetPath
dsh web

При нестандартном DSH_HOME используйте соответствующий каталог. Выберите пресет Career Review. Модель чата может быть локальной; анализ Telegram использует отдельный Mistral API.

Примеры запросов в чат:

Вызови mcp__career_monitor__monitor с action="login".
Я вошёл в HH. Вызови action="login_done".
Запусти монитор: action="start".
Покажи полный результат action="status" без предположений.

После изменения кода перезапустите процесс целиком. Обновление страницы браузера не перезапускает MCP.

Проверка состояния

Из другой консоли в каталоге проекта:

npm run status

Команда читает heartbeat и время последнего успеха; не создаёт второй монитор и не отправляет сообщений. running: false означает отсутствие текущей операции, а не остановленное расписание.

Статус

Значение

waiting_for_next_check

Включён, ожидает очередной проверки

busy

Выполняет проверку или анализ

waiting_for_login

Открыто окно ручного входа

stale

Успешных проверок не было более двух интервалов

heartbeat_stale

Процесс существует, но heartbeat устарел

process_not_running

Процесс из heartbeat не найден

error

Зафиксирована ошибка проверки

disabled

Расписание выключено

Есть отдельные поля analysisError, pendingErrors (в MCP/консольном status) и lastError. Само наличие процесса или enabled: true не доказывает работоспособность. Heartbeat не является watchdog и не перезапускает зависший процесс.

Пример результата

Условный пример формата, не настоящая вакансия или оценка:

Аналитик отчётности
https://hh.ru/vacancy/<ID>

Вывод: Скорее подходит. Задачи по Excel и отчётности соответствуют
подтверждённому опыту. Условия работы из другой страны нужно уточнить.

Сопроводительное письмо:
Здравствуйте! Меня заинтересовала ваша вакансия. В предыдущей работе
я готовил регулярную отчётность и автоматизировал обработку данных...

Ограничения и наблюдения

  • LLM может выдумать требования, перепутать зарплатные ориентиры или слишком строго отклонить смежную роль. Промпт уменьшает эти ошибки, но не исключает их. Решение об отклике принимает человек.

  • HH может запросить CAPTCHA/повторный вход или изменить разметку. Защита не обходится. Соблюдайте правила сайта; проект не является официальной интеграцией HH.

  • ПК должен работать и не спать. После простоя вакансии могут исчезнуть из суточной выдачи. Полного восстановления пропущенных публикаций нет.

  • В исходном локальном использовании наблюдалась остановка успешных проверок при живом процессе. Причина не установлена; публичная версия добавляет диагностику, но не заявляет, что устранила зависание.

  • При сбое между отправкой сообщения и сохранением состояния возможны дубли. Exactly-once доставка не гарантируется.

  • Анализ выполняется последовательно. Во время длинного анализа новые нажатия могут обрабатываться с задержкой. Повторное нажатие для уже обработанной вакансии не генерирует новый ответ.

  • До 10 страниц выдачи и 20 уведомлений за проверку по умолчанию. При неполной выдаче первоначальная база не сохраняется. Лимиты доступны в конфигурации.

  • Проверки тестами не требуют живых ключей и не доказывают доступность внешних сервисов. Публичная переносимая сборка требует отдельной проверки на чистой машине.

Разработка

npm run check
npm test

Тесты проверяют очередь при ошибке доставки, дедупликацию, авторизацию кнопки и интерпретацию статусов. CI выполняет их на Windows. Полезные настройки окружения: CAREER_BROWSER_PATH (свой Chrome), CAREER_PYTHON (Python для PDF), CAREER_POWERSHELL (PowerShell). По умолчанию используются Chromium Playwright, python и powershell.exe.

Код в src/, настройка пресета в scripts/init.cjs, шаблоны в examples/. Локальные конфиги, профили браузеров, ключи DPAPI и результаты анализа не должны попадать в Git. Подробности — SECURITY.md.

Проект развивается с использованием AI-инструментов. Лицензия исходного кода — MIT; зависимости имеют собственные лицензии.

Available Tools

1 tool
monitorA

Control the HH new-vacancy notifications (no model analysis): status, start every 15 minutes, stop, check now, login (open separate Chrome for manual HH login), login_done (close login window after user confirms). Requires local Telegram setup. First scan establishes a baseline without old-vacancy notifications. Works only while this MCP process is alive.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the disclosure burden and does so well: it reveals side effects (starting a 15-minute timer, opening a separate Chrome window, closing the login window), the baseline first-scan behavior, and the process-lifetime restriction. It omits only minor details like failure/error behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences pack the purpose, action meanings, prerequisites, and lifecycle caveat with no filler. The core action list is front-loaded, and every sentence adds necessary information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter control tool with no annotations and no output schema, the description is nearly complete: it covers the parameter domain, prerequisites, baseline behavior, and runtime constraint. It could add expected return values or failure conditions, but those are less critical for this simple action enum.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must explain the 'action' parameter. It does: each enum value is given operational meaning (start every 15 minutes, stop, check now, login opens Chrome, login_done closes window, status is self-explanatory). This fully compensates for the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific resource ('HH new-vacancy notifications') and a clear control verb, then enumerates the exact actions. It distinguishes itself from a model-analysis tool via the parenthetical '(no model analysis)', but has no sibling tools to differentiate against.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides strong operational context: the tool controls notification lifecycle rather than analysis, requires local Telegram setup, and only works while the MCP process is alive. It does not explicitly state 'use when X, not when Y', but the context is clear and there are no sibling alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 1 tool updatev0.1.0
    • First observedmonitor

TDQS

A4.2/5.0

Scored across 1 tool

Disambiguation5/5

Only one tool exists, so there is no possibility of ambiguity or overlap between tools. The single 'monitor' tool clearly bundles all control actions, making selection trivial.

Naming Consistency5/5

With a single tool, there are no naming conventions to compare or contradict. The name 'monitor' is a simple verb that broadly reflects its purpose, though it is somewhat vague, consistency is perfect.

Tool Count3/5

A single tool for a niche monitoring purpose is borderline; it works but feels thin for the variety of actions (start, stop, login, etc.) it claims to handle. The server could benefit from separating concerns into distinct tools, but the count is not extreme.

Completeness3/5

The tool covers the main lifecycle actions (start, stop, check, login), but lacks configuration options such as customizing the search query or notification filters. It also depends on external setup, leaving gaps that could cause agent failures when specific monitoring needs arise.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to search job vacancies, manage resumes, and apply to jobs on HeadHunter (hh.ru), Russia's largest job search platform. Includes OAuth 2.0 integration for secure job applications and an automated vacancy hunter agent with intelligent matching.
    30
    MIT
  • A
    license
    Not graded
    quality
    F
    maintenance
    Enables AI assistants to access and manage HeadHunter job platform data, including vacancies, resumes, negotiations, and employer settings via 167+ tools.
    165 npm
    5
    MIT
  • F
    license
    A
    quality
    D
    maintenance
    Enables to interact with hh.ru (a Russian job platform) through browser automation, allowing users to search for jobs, manage resumes, apply to vacancies with cover letters, and track application statuses via natural language.
    9
    3
    -