Skip to main content
Glama

Naukri MCP Server

CI

Атомарный MCP-сервер на 117 инструментов для автоматизации Naukri.com — крупнейшего индийского портала по поиску работы. Поиск вакансий, массовые отклики, управление профилем, отслеживание откликов, исследование компаний и мониторинг активности рекрутеров — всё из вашего MCP-клиента. Сервер спроектирован под прогрессивную загрузку Tool Search в Claude Code (по умолчанию с января 2026 года), поэтому каждый инструмент узкоспециализирован и обнаруживается по требованию.

Технологический стек: Python 3.10+, FastMCP, Playwright (персистентный Chromium), aiohttp

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

  • Поиск и отклик — поиск по ключевым словам, персональные рекомендации, одиночный или массовый отклик с автоматическими ответами на скрининговые вопросы

  • Отслеживание откликов — локальное хранение в JSON + трёхуровневая синхронизация с бэкендом Naukri (REST, перехват браузером, HTML-скрейпинг)

  • Управление профилем — просмотр/редактирование профиля (naukri_get_profile, naukri_update_profile), повышение видимости (naukri_boost_profile)

  • Исследование компанийnaukri_research_company плюс мост к AmbitionBox для данных о зарплатах и отзывах сотрудников

  • Аналитика эффективностиnaukri_search_impressions, naukri_recruiter_activity, naukri_activity_level

  • Умная автоматизацияnaukri_auto_hunt (поиск работы в один вызов с оценкой соответствия), naukri_daily_brief (утренняя панель), naukri_tailor_resume, naukri_apply_top_fits (автоотклик на лучшие совпадения)


Архитектура

naukri.py                    # Entry point (FastMCP run)
naukri_server/
  __init__.py                # FastMCP setup + lifespan (browser start/stop)
  config.py                  # Constants, API endpoints, timeouts
  browser.py                 # PagePool (3 tabs) + TokenManager (JWT caching)
  api.py                     # Deduplicated _api_request, @api_tool decorator
  cache.py                   # Answer cache for auto-apply screening questions
  scoring.py                 # Alias-aware fit scoring
  validation.py              # Response validators (job lists, profiles, etc.)
  utils.py                   # Shared helpers
  tools/                     # 27 tool modules (117 tools)
    auth.py                  # Login, OTP verification, login status
    search.py                # Job search, recommendations
    jobs.py                  # Job detail, similar, compare, bulk, report fraud
    apply.py                 # Applications: list, detail, apply, batch, purge, stale, follow-up
    tracking.py              # Saved jobs: list, save, unsave, sync
    smart_apply.py           # Smart apply with fit scoring
    auto_hunt.py             # One-call automated job hunting
    profile.py               # Profile CRUD, dashboard, boost, audit
    resume_photo.py          # Resume/photo info, upload, download, delete
    resume_builder.py        # Resume templates, builder status, tailor
    sync.py                  # Sync applications/saved jobs, export
    insights.py              # Application insights, salary, match analytics, skill gap, taxonomy
    performance.py           # Search impressions, recruiter activity
    companies.py             # Company search, jobs, slug, research, follow/unfollow
    ambitionbox.py           # Salary data, reviews, interviews (AmbitionBox)
    inbox.py                 # Recruiter messages, NVites, mark_interested
    notifications.py         # Notification feed, mark read, count, summary
    settings.py              # Account settings, blocked companies, email, visibility, subscription
    alerts.py                # Job alert CRUD
    early_access.py          # Pre-posted roles from top companies
    mock_interview.py        # AI mock interview topics, sessions, history
    reminders.py             # Follow-up reminders
    daily_brief.py           # Morning dashboard summary
    health.py                # Endpoint validation, browser pool, AmbitionBox checks
    debug/                   # Multi-action debug tool (16 actions)

Гибридная стратегия «Браузер + REST»

CDN Akamai у Naukri блокирует прямые REST-запросы к ряду эндпоинтов. Сервер использует гибридный подход:

Стратегия

Где используется

Зачем

Прямой REST API

naukri_apply(), naukri_get_profile(), naukri_get_recommendations, naukri_sync, большинство операций чтения

Быстро, вкладка браузера не нужна. Использует JWT-токен, извлечённый из cookie браузера.

Перехват браузером

naukri_search_jobs, naukri_company_jobs(), naukri_jobs (запасной вариант)

Поисковый API при прямом REST-запросе возвращает 406. Браузер переходит на страницу и перехватывает XHR-ответ.

Автоматизация UI браузера

naukri_login(method="google"), naukri_boost_profile(), naukri_update_profile(), naukri_update_alert(), naukri_delete_alert()

Требуются клики по кнопкам, заполнение форм и обработка SSO-попапов. Akamai блокирует методы PUT/DELETE через REST.

Скрейпинг AmbitionBox

naukri_company_intel (зарплаты, отзывы, собеседования)

Извлекает __NEXT_DATA__ из серверно-отрисованных страниц Next.js.

PagePool

Сервер поддерживает пул из 3 вкладок браузера (настраивается через NAUKRI_MAX_TABS). Вкладки выдаются через семафор, автоматически восстанавливаются при сбое и возвращаются после использования. Благодаря этому конкурентные операции, например массовый отклик, выполняются параллельно без открытия лишних вкладок.

TokenManager

JWT-токен аутентификации (cookie nauk_at) извлекается из контекста браузера Playwright и кэшируется в памяти. При ошибках 401 блокировка обновления с единственным «писателем» предотвращает параллельный «шторм» обновлений — один запрос обновляет токен, остальные ждут и переиспользуют результат.

Трёхуровневый резервный механизм синхронизации

naukri_sync_applications() последовательно пробует три стратегии:

  1. REST API — постраничный GET к эндпоинту истории (самый быстрый и надёжный способ)

  2. Перехват браузером — переход на страницу откликов и захват XHR-ответа

  3. HTML-скрейпинг — извлечение карточек вакансий из серверно-отрисованного DOM с помощью адаптивных CSS-селекторов


Related MCP server: LinkedIn MCP Server

Быстрый старт для ИИ-клиентов

1.  naukri_auth_status()             # Check session
    naukri_login(method="google")              # Authenticate (Google SSO or email)
2.  naukri_daily_brief()                     # Morning dashboard: recommendations + analytics
3.  naukri_auto_hunt(keywords="...", location="...")  # One-call job hunt with fit scoring
4.  naukri_assess_fit(job_id=...)           # Pre-flight check before applying
    naukri_apply(job_id=...)   # Submit application
5.  naukri_compare_jobs(job_ids=[id1, id2, id3])  # Side-by-side with fit scores
6.  naukri_accept_nvite(nvite_job_id="...")  # Respond to recruiter NVites
7.  naukri_sync_applications()       # Pull latest from Naukri backend
    naukri_list_applications()       # Query local tracking
8.  naukri_research_company(keyword="...")  # Unified: Naukri + AmbitionBox data
    naukri_company_intel(company="slug", intel_type="interviews")  # Interview tips
9.  naukri_tailor_resume(job_id=...)  # Get tailoring suggestions
    naukri_update_profile(...)     # Apply them
10. naukri_download_resume(save_path="...")  # Download resume

Детали процесса отклика: Если у вакансии есть скрининговые вопросы, первый вызов naukri_apply() возвращает их. Ответы передаются вторым вызовом. Ключи ответов сопоставляются нечётко — "current ctc" соответствует "What is your current CTC?". Ответы кэшируются в questions.json, поэтому каждый тип вопросов достаточно ответить один раз.


Инструменты (117 атомарных)

Почти каждый инструмент следует атомарному паттерну «одна операция» — один MCP-инструмент на операцию. Исключение — naukri_company_intel и naukri_debug: они сохраняют параметр action/intel_type (почему — см. подраздел «Инструменты-диспетчеры» ниже). Каталог рассчитан на прогрессивную загрузку Tool Search в Claude Code (по умолчанию с января 2026 года), поэтому большое количество узкоспециализированных инструментов стоит не дороже, чем несколько универсальных.

Аутентификация

  • naukri_login(method=...) — вход через Google SSO или по email/паролю

  • naukri_verify_otp(otp) — отправка OTP после входа

  • naukri_auth_status() — проверка действительности сессии

Поиск и подбор вакансий

  • naukri_search_jobs — поиск по ключевым словам с перехватом браузером

  • naukri_get_recommendations — персональные рекомендации вакансий

  • naukri_get_job(job_id) — полные сведения о вакансии

  • naukri_similar_jobs(job_id) — поиск похожих вакансий

  • naukri_compare_jobs(job_ids) — сравнение бок о бок с оценками соответствия

  • naukri_bulk_fetch_jobs(job_ids) — до 20 вакансий за один вызов

  • naukri_job_detail_v1(job_id) — информация о day/walk-in собеседованиях, контактные данные

  • naukri_report_fraud(job_id, reason) — жалоба на мошенническую вакансию

  • naukri_auto_hunt — автоматический поиск работы в один вызов с оценкой соответствия

Отклик и отслеживание

  • naukri_apply(job_id, set_reminder_days=...) — одиночный отклик с автонапоминанием

  • naukri_batch_apply(keywords=...) — массовый отклик из поиска

  • naukri_assess_fit(job_id, apply_if_fit=False) — оценка соответствия (автоотлик опционален)

  • naukri_score_saved_jobs(min_fit_score=60) — оценка всех сохранённых вакансий

  • naukri_apply_top_fits(min_fit_score=70, limit=10) — оценка + автоотлик на лучшие совпадения

  • naukri_list_applications(...) — запрос локальной истории

  • naukri_get_application(job_id) — детальный статус отклика

  • naukri_purge_applications(before_date) — удаление устаревших записей

  • naukri_stale_applications(...) — выявление устаревших откликов

  • naukri_follow_up_priority(...) — сопоставление входящих и напоминаний

  • naukri_draft_follow_up(job_id) — генерация сообщения для повторного контакта

  • naukri_recruiter_history() — история общения с рекрутерами по компаниям

Синхронизация и экспорт

  • naukri_sync_applications(force_browser=False, days_back=365) — трёхуровневая синхронизация

  • naukri_sync_saved(force_browser=False) — синхронизация сохранённых вакансий

  • naukri_export_data(data_type, export_format="json") — экспорт в JSON/CSV

Сохранённые вакансии

  • naukri_list_saved_jobs(limit=50, page=1) — список сохранённых/добавленных в закладки вакансий

  • naukri_save_job(job_id, ...) — сохранить вакансию

  • naukri_unsave_job(job_id) — удалить сохранённую вакансию

  • naukri_sync_saved_jobs() — загрузка с сервера Naukri

Входящие (сообщения рекрутеров)

  • naukri_list_inbox(limit=20, unread_only=False) — список сообщений

  • naukri_read_message(message_id, vcard_id, unique_id) — прочитать полное сообщение

  • naukri_mark_interested(mail_id, conversation_id, interested=True) — отметить заинтересованность

  • naukri_accept_nvite(nvite_job_id, ...) — отклик через NVite

Уведомления

  • naukri_list_notifications(limit=20, page=1, notif_type=None) — список с фильтрами

  • naukri_notification_count() — количество непрочитанных

  • naukri_mark_notification_read(notification_id, date) — отметить одно уведомление прочитанным

  • naukri_mark_all_notifications_read() — отметить все как прочитанные

  • naukri_notification_summary() — единая сводная панель

Профиль

  • naukri_get_profile() — полный профиль

  • naukri_update_profile(fields, ...) — обновление полей профиля

  • naukri_audit_profile() — полнота профиля + подсказки

  • naukri_boost_profile(randomize=False) — повторное сохранение заголовка для повышения видимости

  • naukri_dashboard() — данные панели профиля

  • naukri_profile_targeting() — представление таргетинга DFP

Резюме и фото

  • naukri_resume_info() — метаданные резюме

  • naukri_upload_resume(file_path) — загрузка PDF/DOC/DOCX

  • naukri_download_resume(save_path) — скачивание в локальный файл

  • naukri_photo_info() — метаданные фото

  • naukri_upload_photo(file_path) — загрузка PNG/JPG/JPEG/GIF

  • naukri_delete_photo() — удаление фото профиля

Инсайты и аналитика

  • naukri_application_insights(days=30) — разбивка по статусам + скорость откликов

  • naukri_salary_position(designation=...) — позиционирование по зарплате

  • naukri_cached_answers(action="list|update|delete", key=..., new_answer=...) — управление кэшированными ответами

  • naukri_match_analytics(days=30) — разбивка оценок соответствия по полям

  • naukri_match_quality(days=30) — обобщённое качество соответствия

  • naukri_skill_gap(...) — разрыв навыков относительно рыночного спроса

  • naukri_salary_benchmark(keywords, ...) — рыночный ориентир зарплат

  • naukri_taxonomy() — таксономия ролей Naukri (37 отделов × 167 категорий × 1461 ролей)

  • naukri_profile_prompts() — незавершённые действия по заполнению профиля

  • naukri_conversion_funnel(days=30) — воронка «отклик → собеседование»

  • naukri_status_changes(days=30) — выявление переходов между статусами

Эффективность

  • naukri_search_impressions(days=7) — статистика показов в поиске

  • naukri_recruiter_activity(page=1, limit=100, filter_by=None) — действия рекрутеров с профилем

  • naukri_activity_level() — текущий уровень активности профиля

Компании

  • naukri_search_companies(keyword, page=1, limit=10) — поиск компаний

  • naukri_company_jobs(group_id, ...) — вакансии компании

  • naukri_company_slug(group_id) — slug для AmbitionBox (одиночный или массовый через запятую)

  • naukri_research_company(keyword, ...) — комбинированно Naukri + AmbitionBox

  • naukri_follow_company(group_id|group_ids, action="follow|unfollow") — подписка/отписка

  • naukri_follow_status(group_id|group_ids) — проверка статуса подписки

  • naukri_company_intel(company, intel_type="salary|reviews|interviews") — аналитика AmbitionBox

Настройки

  • naukri_get_settings() — все текущие настройки аккаунта (статус поиска работы, уведомления, флаги согласий)

  • naukri_update_settings(...) — изменение настроек (передавайте только подлежащие изменению поля)

  • naukri_blocked_companies() — список заблокированных компаний

  • naukri_check_email() — статус проверки email/мобильного номера

  • naukri_visibility() — переключатели видимости в Resdex

  • naukri_notification_prefs() — предпочтения Email/SMS/push/WhatsApp

  • naukri_subscription_status() — подписка Naukri 360 и доступные функции

Оповещения о вакансиях

  • naukri_list_alerts() — все оповещения по сохранённым поискам

  • naukri_alert_detail(alert_id) — детали отдельного оповещения

  • naukri_create_alert(name, keywords, ...) — создание нового оповещения

  • naukri_update_alert(alert_id, ...) — редактирование полей оповещения

  • naukri_delete_alert(alert_id) — удаление оповещения

Ранний доступ (неопубликованные роли)

  • naukri_list_early_access(...) — просмотр ролей до публикации от крупных компаний

  • naukri_share_early_access(job_id) — выразить заинтересованность (мгновенно, без скрининга)

Конструктор резюме

  • naukri_resume_templates() — доступные шаблоны (бесплатные + pro)

  • naukri_resume_builder_status() — остаток попыток ИИ-переписывания, тариф подписки

  • naukri_tailor_resume(job_id, ...) — рекомендации по подгонке резюме под вакансию

Тренировочное собеседование (ИИ)

  • naukri_mock_interview_topics() — доступные темы + статус выполнения

  • naukri_mock_interview_history() — прошлые собеседования, оценки и отзывы

  • naukri_start_mock_interview(job_id) — начало собеседования на основе вакансии

  • naukri_answer_mock_interview(test_id, topic_id, question_id, answer) — отправка ответа

  • naukri_mock_interview_prep(job_id) — комплект для подготовки к собеседованию

Автономный агент

  • naukri_agent_status() — Состояние агента + последние 5 запусков + сводка конфигурации

  • naukri_agent_config() — Полная конфигурация

  • naukri_agent_update_config(updates) — Обновить конфигурацию JSON-патчем

  • naukri_agent_run_now(ctx=None) — Выполнить один цикл «наблюдение → решение → действие → обучение»

  • naukri_agent_approve(cycle_id) — Применить ожидающие решения

  • naukri_agent_reject(cycle_id) — Отклонить ожидающие решения

  • naukri_agent_history(limit=10) — История последних запусков

  • naukri_agent_decisions(cycle_id) — Решения по каждой вакансии за один цикл

Фоновый планировщик

  • naukri_scheduler_status() — Состояние планировщика + информация о последнем запуске каждой задачи

  • naukri_enable_task(task_name) — Включить отключённую задачу

  • naukri_disable_task(task_name) — Отключить задачу

  • naukri_run_task_now(task_name) — Выполнить задачу немедленно

  • naukri_task_history(task_name=None, limit=20) — История последних запусков

Напоминания и собеседования

  • naukri_list_reminders(include_past=True, include_app_status=True) — Все напоминания со статусом срока

  • naukri_set_reminder(job_id, days=7, ...) — Создать/обновить напоминание

  • naukri_interview_prep(job_id) — Пакет подготовки к собеседованию

  • naukri_add_interview_round(job_id, round_type, ...) — Отслеживать этап собеседования

  • naukri_list_interview_rounds(job_id=None) — Список этапов

  • naukri_compare_offers(job_ids) — Сравнить несколько офферов

Инструменты диспетчера (осталось только 2 — оставлены намеренно)

  • naukri_company_intel(company, intel_type="salary|reviews|interviews") — Три действия используют общее разрешение company и общий процесс аутентификации AmbitionBox; разделение продублировало бы эту оркестрацию.

  • naukri_debug(action=...) — 16 отладочных действий только для разработчиков в областях браузера/API/обнаружения; цена каталога здесь реальна даже с прогрессивной загрузкой, поскольку большинство пользователей никогда их не вызывает.

Прочее

  • naukri_daily_brief — Утренняя панель: 16 источников + рекомендуемые действия

  • naukri_health_check — Проверка конечных точек + пул браузеров + AmbitionBox


Установка

Предварительные требования

  • Python 3.10+

  • Playwright Chromium (устанавливается через playwright install chromium)

Установка

python -m venv venv
source venv/bin/activate  # Windows: venv\Scripts\activate
pip install -r requirements.txt
pip install -e ../jobcore     # shared scoring engine - see below
playwright install chromium

Зависимость jobcore

Таксономия навыков, оценка соответствия и разбор зарплат находятся в соседнем пакете jobcore; naukri_server/scoring.py и модули оценки в domain/ — это тонкие обёртки переэкспорта над ним. Пакет не опубликован на PyPI, поэтому он устанавливается одним из двух способов, и эти два способа намеренно разделены:

где

как

почему

локальная разработка

pip install -e ../jobcore

редактировать jobcore и naukri вместе, без переустановки

CI

requirements-ci.txt, привязанный к точному коммиту

у сборщика нет каталога ../jobcore

Не добавляйте git-URL в requirements.txt. Он затирает редактируемую установку: после pip install -e ../jobcore последующий install install -r requirements.txt удаляет редактируемый пакет и заменяет его git-копией — молча, так как pip не печатает строку «already satisfied» для требования с прямым URL. Проверено в чистом venv 2026-08-20 и воспроизведено дважды. Локальная итерация здесь важнее удобства сборки, поэтому именно сторона сборки устанавливается из git.

Если вы пересоздаёте venv или видите ошибку ModuleNotFoundError: jobcore, повторно выполните pip install -e ../jobcore из этого каталога.

Обновление версии в requirements-ci.txt — это способ принять изменение jobcore: намеренно наглядный, отслеживаемый коммит, а не динамический @master, который мог бы привести CI этого репозитория в красный статус без изменений в нём.

perёмое — First Login.

Первый вход

Запустите сервер:

python naukri.py

Затем вызовите медиа из MCP-клиента. Он открывает видимое окно Chromium, где вы можете:

  1. Google SSO (рекомендуется): нажмите «Login with Google» — использует сохранённую в профиле Chrome сессию Google, учётные данные не требуются.

  2. Электронная почта / пароль: передайте method="email", email="...", password="...".

Сессия браузера хранится в chrome-profile/ (создаётся автоматически, игнорируется git). Эта каталог привязан к конкретной машине — он содержит cookies, локальное хранилище и кэшированные учётные данные. Не нужно его переносить между машинами.

Время жизни сеанса

Сеансы сохраняются примерно в течение 30 дней. После истечения сервер обнаружит это при запуске или на первом API-вызове и вернёт ошибку "Not logged in". Повторно аутентифицируйтесь через `mpt".

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

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

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

{
  "mcpServers": {
    "naukri": {
      "command": "python",
      "args": ["naukri.py"],
      "cwd": "/path/to/mcp-servers/naukri"
    }
  }
}

Переменные среды

Все переменные необязательны. Задаются в окружении или в файле .env.

Переменная

По умолчанию

Описание

NAUKRI_NAV_TIMEOUT

20000

Таймаут навигации страницы Playwright (мс)

NAUKRI_ELEMENT_TIMEOUT

5000

Таймаут ожидания элемента Playwright (мс)

NAUKRI_API_TIMEOUT

30

Таймаут REST API aiohttp (секунд)

NAUKRI_MAX_TABS

3

Максимум одновременных вкладок браузера в PagePool

Расположение файлов данных

Все файлы данных находятся в корне проекта и игнорируются git.

Файл

Назначение

chrome-profile/

Постоянный профиль браузера Playwright. Привязан к машине, никогда не отправлять в git.

applications.json

Локальный учёт откликов. Записывается apply, batch_apply и read.

saved_jobs.json

Локальные сохранённые/в избранное вакансии. Записывается saved_jobs и read.

questions.json

Кэш ответов на вопросы анкеты. Автоматически заполняется при отклике, используется batch в процессе для автозаполнения.

*.backup

Автоматическая резервная копия перед любой перезаписью JSON (атомарная запись: запись в .tmp, копия существующего, переименование).


Механизмы отказоустойчивости

  • Глобальная aiohttp-сессия — единая общая сессия для всех REST-вызовов, без накладных расходов на соединение

  • Дедублицированный API-слой_api_request с декоратором @api_tool нормализует все взаимодействия с REST

  • Блокировка обновления токена — обновление JWT одним писателем предотвращает параллельные «шторма» 401

  • Проверка при запуске — состояние браузера и токена проверяется до принятия вызовов инструментов

  • Отменяемость массового отклика — если пакетная прервётся, частичный прогресс сохраняется

  • Резервное копирование данных — файлы .backup создаются перед каждой перезаписью JSON

  • Автоочистка кэша времени жизни — устаревшие записи кэша ответов истекают автоматически

  • Атомарные записи — состояние синхронизации пишется через временный файл + переименование, чтобы избежать повреждений

  • TTL-кэш профиля — данные профиля кэшируются на 30 секунд, сокращая повторные одновременные вызовы API


Известные ограничения

Блокировки Akamai CDN

Naukri использует Akamai Bot Manager. Некоторые конечные точки возвращают 406 Not Acceptable или 403 Forbidden при прямом вызове REST без браузерной сессии:

  • Поиск (naukri_search_jobs) — всегда используется перехват браузера; прямой REST заблокирован

  • Изменение профиля (naukri_update_profile()) — PUT/DELETE блокируются Akamai; вместо этого используется товарная браузерная

  • Оповещения о вакансиях — операции CRUD выполняются через браузерную UI-автоматизацию по той же причине

Это ожидаемое поведение. Инструменты, требующие взаимодействия с браузером, описаны как таковые. Если вы видите ошибки 406 у инструментов, которые должны использовать REST, проверьте статус входа через naukri_auth_status() — по исчётившему токену Akamai classifyрует запросы как ботовый трафик.

Парсинг AmbitionBox

AmbitionBox — это сайт на Next.js SSR. Инструменты зарплат и обзоров извлекают __NEXT_DATA__ из серверного рендера. Если AmbitionBox меняет структуру страниц, эти инструменты могут возвращать ошибки. naukri_health_check включает проверку AmbitionBox — статус «warn» там периодически ожидаемый и не является препятствием для основной функциональности Naukri.


Поиск неисправностей

Проблема

Решение

Ошибки «Not logged in»

Срок сессии истёк (~30 дней). Вызовите mpt для повторной аутентификации.

Поиск пустой / 406

Для прямого REST ожидаемо. naukri_search_jobs использует перехват браузера и должен работать. Если нет — запустите naukri_health_check.

Таймауты при медленном соединении

Увеличьте NAUKRI_NAV_TIMEOUT (например, 30000). Варианты.

Лимиты скорости / дневной лимит откликов

Naukri ограничивает дневное число откликов в зависимости от типа аккаунта. Поле daily_applied в ответах apply показывает ваш счётчик. У подписчиков Naukri 360 лимит выше.

Сбои вкладок браузера

PagePool автосвапе упавшие вкладки при следующем acquire(). Если повторяется, перезагрузите сервер.

Петля обновления токена

Удалите chrome-profile/ и пройдите аутентификацию полностью заново.

naukri_syncзаваливается всех 3 уровнем

Обычно означает невалидную сессию. Сначала войдите. Если уже вошли, передайте force_browser=True, чтобы пропустить REST-уровень.

AmbitionBox зарплаты/обзоры не работают

Запустите naukri_health_check для подтверждения. Если будет «warn», основные инструменты Naukri это не касается.

Проверка работоспособности

Запустите naukri_health_check() для проверки всех интеграций сразу. Он проверяет сессию входа, API профиля, поисковый API (ошибка 406 здесь нормальна), рекомендации, дашборденость, пул браузеров и пар Is in dreams command. Возвращает try with per-check timing.


Удалённый доступ

Запустите сервер на постоянного включённой машине и подключайтесь откуда угодно (например, веб Claude в командных окружениях, мобильные устройства и т.д.). Поддерживаются два режима аутентификации, они могут работать параллельно на одном сервере.

Порядок действий

Клиент

Режим аутентификации

ПОЧЕМУ

Claude Code CLI

Bearer (MCP_SHARED_SECRET)

claude mcp add --transport http ... --header "Authorization: Bearer ..." работает напрямую

Claude Desktop

Bearer (MCP_SHARED_SECRET)

Поддерживает конфигурацию headers в claude_desktop_config.json

Claude.ai web

OAuth (MCP_OAUTH_ENABLED=1)

Веб-интерфейс предлагает только поля OAuth client_id/secret, не bearer-поле

Оба одновременно

Bearer + OAuth (установите обе переменные среды)

На одном сервере load_access_token OAuth-провайдера резервно использует общий секрет

Шаг 1 — Создание секретов

# Bearer secret (for Claude Code / Desktop)
python -c "import secrets; print(secrets.token_urlsafe(48))"

# OAuth client_id + client_secret (for Claude.ai web)
python -c "import secrets; print('client_id=claude-ai-web')"
python -c "import secrets; print('client_secret=' + secrets.token_urlsafe(48))"

Шаг 2 — Настройка .env

Скопируйте .env.example в .env и заполните. Файл .env игнорируется git. Минимальная конфигурация для включения ОБОИХ режимов аутентификации:

MCP_REMOTE=1
MCP_PORT=8321
MCP_PUBLIC_URL=https://naukri.<your-domain>

# Bearer (Claude Code + Desktop)
MCP_SHARED_SECRET=<paste output from token_urlsafe(48)>

# OAuth (claude.ai web)
MCP_OAUTH_ENABLED=1
MCP_OAUTH_CLIENT_ID=claude-ai-web
MCP_OAUTH_CLIENT_SECRET=<paste output from token_urlsafe(48)>
MCP_OAUTH_AUTO_APPROVE=1

Если MCP_REMOTE=1, но переменная окружения для аутентификации не задана, сервер отказывается запускаться — это защитная проверка, не допускающая публичного доступа к неаутентифицированному MCP.

Шаг 3 — Публичное имя хоста (Cloudflare Tunnel рекомендуется)

Cloudflare Tunnel предоставляет стабильный публичный HTTPS-URL без открытия портов брандмауэра. Бесплатный тариф, безлимитный трафик.

winget install Cloudflare.cloudflared
cloudflared tunnel login
cloudflared tunnel create naukri-mcp
cloudflared tunnel route dns naukri-mcp naukri.<your-domain>

Отредактируйте %USERPROFILE%\.cloudflared\config.yml:

tunnel: <UUID-from-create-command>
credentials-file: C:\Users\<you>\.cloudflared\<UUID>.json
ingress:
  - hostname: naukri.<your-domain>
    service: http://localhost:8321
  - service: http_status:404

Запустите туннель: cloudflared tunnel run naukri-mcp (или cloudflared service install для автозапуска).

Альтернативы: Tailscale Funnel (peer-to-peer, более низкая задержка для доверенных устройств) или ngrok (проще, но у бесплатного тарифа есть ограничения).

Шаг 4 — Запустите сервер

# Load env vars from .env (PowerShell — use a one-liner or a helper script)
Get-Content .env | Where-Object { $_ -match '^[A-Z_]+=.+' } | ForEach-Object {
    $name, $val = $_ -split '=', 2
    [Environment]::SetEnvironmentVariable($name, $val, "Process")
}

python naukri.py --http

В логах должно быть видно Auth: OAuth provider enabled (issuer=https://naukri.<your-domain>, bearer-fallback=yes) и HTTP mode: 0.0.0.0:8321.

Шаг 5 — Подключение клиентов

Claude Code CLI (использует bearer):

claude mcp add --transport http naukri https://naukri.<your-domain>/mcp `
  --header "Authorization: Bearer <MCP_SHARED_SECRET>"

Claude Desktop (использует bearer):

В claude_desktop_config.json:

{
  "mcpServers": {
    "naukri": {
      "url": "https://naukri.<your-domain>/mcp",
      "transport": "http",
      "headers": { "Authorization": "Bearer <MCP_SHARED_SECRET>" }
    }
  }
}

Claude.ai web (использует OAuth):

Настройки → Коннекторы → Добавить пользовательский коннектор

  • URL: https://naukri.<your-domain>/mcp

  • OAuth Client ID: claude-ai-web (соответствует MCP_OAUTH_CLIENT_ID)

  • OAuth Client Secret: вставьте MCP_OAUTH_CLIENT_SECRET

Claude.ai автоматически обнаружит метаданные OAuth (FastMCP предоставляет .well-known/oauth-authorization-server и конечные точки /authorize + /token).

Smoke-тест (curl)

# 401 expected — no auth header
curl -i https://naukri.<your-domain>/mcp

# Bearer flow — should return MCP JSON-RPC instead of 401
curl -i -H "Authorization: Bearer <MCP_SHARED_SECRET>" `
  https://naukri.<your-domain>/mcp

# OAuth metadata discovery
curl https://naukri.<your-domain>/.well-known/oauth-authorization-server | jq .

Укрепление Windows-хоста

MCP-серверу требуется сеанс Chrome с графическим интерфейсом, поэтому хост-машина должна оставаться включённой и с активной пользовательской сессией.

# Disable sleep / hibernate while plugged in
powercfg /change standby-timeout-ac 0
powercfg /change hibernate-timeout-ac 0
# Disable screen-off (optional — Chrome stays alive when display sleeps,
# but this avoids GPU pauses)
powercfg /change monitor-timeout-ac 0

Поведение

Результат

Блокировка экрана

Chrome остаётся запущенным, MCP работает

Выход из системы

Chrome завершается, MCP не работает — сохраняйте пользовательскую сессию активной

Отключение RDP

Процесс продолжает работу на хосте, MCP работает

Сон системы

Chrome возобновляет работу, но выполняемые запросы могут завершиться с ошибкой — отключите спящий режим

Использование Chrome вручную

Chrome в Windows не может запустить два экземпляра с разными --user-data-dir. Не открывайте тот же профиль вручную, пока работает MCP.

Мониторинг

Статус Cloudflare «tunnel healthy» отражает только связь edge↔cloudflared, но не работоспособность origin-сервера. Добавьте внешний аптайм-пробу (например, UptimeRobot, бесплатно), которая запрашивает https://naukri.<your-domain>/.well-known/oauth-authorization-server (ожидается ответ 200), и вы будете уведомлены, когда хост-машина реально недоступна.

Справочник по режимам аутентификации

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

Требуется для

Примечания

MCP_REMOTE=1

Публичного доступа

Без этого сервер остаётся на 127.0.0.1

MCP_PORT

Своего порта

По умолчанию 8321

MCP_PUBLIC_URL

OAuth issuer / RS metadata

По умолчанию http://localhost:8321

MCP_SHARED_SECRET

Bearer-аутентификации

Минимум 32 символа; ротируйте через изменение env и перезапуск сервера

MCP_OAUTH_ENABLED=1

OAuth-потока

Включает /authorize, /token, /register, /revoke

MCP_OAUTH_CLIENT_ID

OAuth

Предрегистрированный client id для claude.ai

MCP_OAUTH_CLIENT_SECRET

OAuth

Минимум 32 символа

MCP_OAUTH_AUTO_APPROVE

UX OAuth

1 скрывает экран согласия (по умолчанию), 0 показывает страницу Approve/Deny на /oauth/consent

F
license - not found
Not graded
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 Servers

View all related MCP servers

Related MCP Connectors

  • Give AI agents the LinkedIn tools to find, qualify, engage, and follow up with prospects.

  • Search AI-native jobs, inspect application forms, and fetch free interview-prep resources.

  • AI-powered browser automation — navigate, click, fill forms, and extract data from any website.

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/Sundeepg98/naukri-mcp'

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