Skip to main content
Glama

Naukri MCP Server

CI

원자 단위(atomic) 도구 117개로 구성된 MCP 서버로 Naukri.com(인도 최대 구직 포털)을 자동화합니다. 채용공고 검색, 대량 지원, 프로필 관리, 지원 내역 추적, 기업 조사, 채용 담당자 활동 모니터링까지 모두 MCP 클라이언트에서 처리할 수 있습니다. Claude Code의 점진적 도구 검색(Tool Search) 로딩(2026년 1월부터 기본 제공)에 맞게 설계되어, 각 도구는 단일 목적을 가지며 필요할 때마다 발견됩니다.

기술 스택: Python 3.10+, FastMCP, Playwright(영구 Chromium), aiohttp

주요 기능:

  • 검색 및 지원 — 키워드 검색, 개인 맞춤 추천, 스크리닝 질문 자동 응답이 포함된 단일 또는 일괄 지원

  • 지원 내역 추적 — 로컬 JSON 저장 + Naukri 백엔드와의 3계층 동기화(REST, 브라우저 인터셉트, HTML 스크레이핑)

  • 프로필 관리 — 프로필 조회/수정(naukri_get_profile, naukri_update_profile), 노출 강화(naukri_boost_profile)

  • 기업 조사naukri_research_company 및 연봉 데이터와 직원 리뷰를 제공하는 AmbitionBox 브리지

  • 성과 분석naukri_search_discover, naukri_recruiter_activity_of, 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 전략

Naukri의 Akamai CDN은 여러 엔드포인트에 대한 직접 REST 호출을 차단합니다. 서버는 하이브리드 접근 방식을 사용합니다.

전략

사용되는 도구

이유

직접 REST API

naukri_apply(), profile(), naukri_get_profile(), naukri_get_recommendations, naukri_sync, 대부분의 조회 동작

빠르고 브라우저 탭이 필요 없습니다. 브라우저 쿠키에서 추출한 JWT 토큰을 사용합니다.

브라우저 인터셉트

naukri_search_jobs, company_jobs(), naukri_company_jobs(), naukri_job (fallback)

직접 REST 호출 시 검색 API가 406을 반환합니다. 브라우저가 해당 페이지로 이동한 후 XHR 응답을 가로챕니다.

브라우저 UI 자동화

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

버튼 클릭, 폼 작성, SSO 팝업 처리가 필요합니다. REST로는 PUT/DELETE를 Akamai가 차단합니다.

AmbitionBox 스크레이핑

naukri_company_intel (연봉, 리뷰, 면접)

서버 사이드 렌더링된 Next.js 페이지에서 __NEXT_DATA__를 추출합니다.

PagePool

서버는 3개의 브라우저 탭 풀을 유지합니다(NAUKRI_MAX_TABS로 설정 가능). 탭은 세마포어를 통해 체크아웃되고, 충돌 시 자동 복구되며, 사용 후 반환됩니다. 이를 통해 일괄 지원과 같은 동시 작업이 필요한 탭을 과도하게 생성하지 않고도 병렬로 실행될 수 있습니다.

TokenManager

JWT 인증 토큰(nauk_at 쿠키)은 Playwright 브라우저 컨텍스트에서 추출되어 메모리에 캐시됩니다. 401 오류 발생 시 단일 작성자 갱신 잠금(single-writer refresh lock)이 병렬 갱신 폭주를 방지합니다. 즉 하나의 요청만 갱신하고 나머지 요청은 대기한 후 그 결과를 재사용합니다.

3계층 동기화 폴백

naukri_sync_applications()은 세 가지 전략을 순서대로 시도합니다.

  1. REST API — 히스토리 엔드포인트에 대한 페이징 GET(가장 빠르고 안정적)

  2. 브라우저 인터셉트 — 지원한 공고 페이지로 이동하여 XHR 응답 캡처

  3. HTML 스크래이핑 — 적응형 CSS 선택자를 사용하여 서버가 렌더링한 DOM에서 공고 카드 추출


Related MCP server: LinkedIn MCP Server

AI 사용자를 위한 빠른 시작

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_intelnaukri_debug만이 action/intel_type 매개변수를 유지합니다(이유는 아래 "Dispatcher tools" 하위 섹션 참조). 이 카탈로그는 Claude Code의 점진적 Tool Search 로딩(2026년 1월부터 기본 설정)을 위해 설계되어, 다목적 도구 몇 개와 비용이 비슷하면서도 더 많은 특화 도구를 제공할 수 있습니다.

인증

  • naukri_login(method=...) — Google SSO 또는 이메일/비밀번호 로그인

  • 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_id) — 적합성 점수와 함께병렬 비교

  • naukri_bulk_fetch_jobs(job_ids) — 한 호출에서 최대 20건 공고

  • naukri_job_detail_v1(job_id) — 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) — 3계층 동기화

  • naukri_sync_saved(force_browser=False) — 저장된 공고 동기화

  • naukri_export_data(data_format="저장..." — 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_answer(action="list|dictionary|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, company_group_id...) — 해당 기업의 공고

  • naukri_company_slug(group_id) — AmbitionBox 슬러그(단일 또는 콤마 구분 일괄)

  • naukri_research_company(keyword, ...) — Naukri + AmbitionBox 통합 조사

  • naukri_follow_company(group_id|group_ids, action="follow|unfollow") — 팔로우/팔로우 해지

  • naukri_flick_follow_status — 팔로우 상태 확인

  • naukri_company_intel(company, intel_type="salary|reviews|interviews") — AmbitionBox 정보 조회

설정

  • naukri_get_settings() — 현재 계정의 전체 설정(구직 상태, 알림, 동의 플래그)

  • naukri_update_settings(...) — 설정 변경(변경할 필드만 전달)

  • naukri_blocked_companies() — 차단한 기업 목록

  • naukri_check_email() — 이메일/휴대폰 인증 상태

  • naukri_visibility() — Resdex 가시성 토글

  • naukri_notification_prefs() — 이메일/SMS/푸시/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(...) — 상위 기업들이 소개하는 사전 공개 역할 살Frac12;보기

  • naukri_share_early_access(job_id) — 관심 표현 (즉시 진행, 스크리닝 없음)

이력서 빌더

  • naukri_resume_templates() — 사용 가능한 템플릿(무료 + 프로)

  • naukri_resume_builder_status() — 남은 AI 재작성 기회 및 구독 등급

  • naukri_tailor_resume(job_id, ...) — 특정 공고에 맞춘 이력서 수정 제안

모의 면접채 (AI)

  • naukri_mock_interview_do_topics() — 지원 주제 및 완료 상태

  • naukri_mock_interview_history() — 점수/피드백이 포함된 과거 면접 기록

  • naukri_start_mock_interview(job_id) — JD 기반 모의 면접 시작

  • 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) — 관찰→결정→행동→학습 사이클 1회 실행

  • 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=...) — 브라우저/API/디스커버리 영역의 개발 전용 디버그 동작 16개; 대부분의 사용자가 호출하지 않기 때문에 프로그레시브 로딩을 써도 카탈로그 비용은 실질적으로 발생합니다.

기타

  • 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.pydomain/ 스코어링 모듈은 단순한 재-export 셔로 그 위에 있습니다. PyPI에는 없으므로 두 가지 방법 중 하나로 설치하며, 두 방법은 의도적으로 분리됩니다:

적용 대상

방법

이유

로컬 개발

pip install -e ../jobcore

jobcore와 naukri를 재설치 없이 함께 편집

CI

requirements-ci.txt, 특정 커밋에 고정

실행기에 ../jobcore 체크아웃이 없음

requirements.txt에 git URL을 추가하지 마세요. 그렇게 하면 editable 설치를 덮어씁니다. pip install -e ../jobcore 이후에 pip install -r requirements.txt를 실행하면 editable 패키지를 지우고 git 체크아웃으로 대체합니다. 이때 direct-URL 요구사항에는 pip가 "already satisfied" 출력이 없어서 조용히 일어납니다. 2026-08-20에 깨끗한 venv에서 측정했고 두 번 재현했습니다. 여기서 중시하는 것은 CI 편의성보다 로컬 반복 작업이므로, git에서 설치하는 쪽은 CI 쪽입니다.

venv를 다시 만들거나 ModuleNotFoundError: jobcore가 뜨면 이 디렉터리에서 pip install -e ../jobcore를 다시 실행하세요.

requirements-ci.txt의 고정 버전을 올리는 것이 jobcore 변경을 채택하는 방식입니다. 움직이는 @master가 아무 변경 없이 CI를 빨갛게 불이지 않도록, 이는 의도적으로 눈에 보이고 검토 가능한 커밋으로 남깁니다.

첫 번째 로그인

서버를 시작하세요:

python naukri.py

그 다음 MCP 클라이언트에서 naukri_login(method="google")을 호출하세요. 보이는 Chromium 창이 열리며 다음을 할 수 있습니다:

  1. Google SSO(권장): "Login with Google" 클릭 — Chrome 프로필에 저장된 Google 세션을 사용하므로 별도 인증 정보가 필요 없습니다.

  2. 이메일/비밀번호 method="email", email="...", password="..."를 전달하세요.

브라우저 세션은 chrome-profile/에 저장됩니다(자동 생성, gitignore됨). 이 디렉터리는 시스템별로 다릅니다 — 쿠키, 로컬 저장소, 캐시된 자격 증명이 들어 있습니다. 다른 시스템 사이에 복사하지 마세요.

세션 수명

세션은 약 30일간 유지됩니다. 만료된 경우 서버는 시작 시점이나 첫 번째 API 호출에서 이를 감지하고 "Not logged" 오류를 반환합니다. naukri_login(method="google")로 다시 인증하세요.

MCP 클라이언트 설정

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

환경 변수

모두 선택 사항입니다. 셸 또는 .env 파일에 설정하세요.

변수

기본값

설명

NAUKRI_NAV_TIMEOUT

20000

Playwright 페이지 탐색 시간(ms)

NAUKRI_ELEMENT_TIMEOUT

5000

Playwright 요소 대기 시간(ms)

NAUKRI_API_TIMEOUT

30

aiohttp REST API 시간(초)

NAUKRI_MAX_TABS

3

PagePool의 최대 동시 브라우저 탭 수

데이터 파일 위치

모든 데이터 파일은 프로젝트 루트에 있으며 gitignore됩니다.

파일

용도

chrome-profile/

Playwright 영구 브라우저 프로필. 시스템별 파일이므로 커밋하지 마세요.

applications.json

로컬 지원 추적. apply, batch_apply, sync가 기록합니다.

saved_jobs.json

로컬 저장/북마크된 채용 정보. saved_jobssync가 기록합니다.

questions.json

문항 답변 캐시. apply 중 자동으로 채워지며 batch apply의 자동 응답에 사용됩니다.

*.backup

JSON 파일을 덮어쓰기 전 자동 백업(원자적 쓰기: .tmp에 쓰고 기존 것을 백업한 후 rename)


회복 탄력성

  • 전역 aiohttp 세션 — 모든 REST 호출에 단일 공유 세션, 연결 오버헤드 절감

  • 중복 제거된 API 레이어_api_request@api_tool 데코레이터로 감싸 모든 REST 상호작용을 정규화

  • 갱신 잠금(Refresh lock) — 단일 작성자 JWT 갱신으로 401 storm을 동시에 방지

  • 시작 시 검증 — 브라우저 및 토큰 상태를 호출 이전에 검증

  • 일괄 지원(배치) 취소 안전장치 — 일괄 작업이 중단되어도부분 진행 상태를 보존

  • 데이터 백업 — JSON을 덮어쓰기 전에 .backup 파일 생성

  • 캐시 TTL 자동 정리 — 오래된 응답 캐시 항목이 만료되자 자동 삭제

  • 원자적 쓰기 — 동기화 상태를 임시 파일 + rename 방식으로 기록해 손상 방지

  • 프로필 TTL 캐시 — 중복 API 호출 감소를 위해 프로필 데이터를 30초 동안 캐시


알려진 제한 사항

Akamai CDN 차단

Naukri는 Akamai Bot Manager를 사용합니다. 브라우저 세션 없이 REST로 직접 호출하면 몇몇 엔드포인트가 406 Not Acceptable이나 403 Forbidden을 반환합니다:

  • 검색 (naukri_search_jobs) — 항상 브라우저 인터셉트 사용, 직접 REST는 차단됨

  • 프로필 수정 (naukri_update_profile()) — PUT/DELETE가 Akamai에 차단되어 브라우저 자동화로 대체

  • 채용 알림 — CRUD 조작이 같은 이유로 브라우저 UI 자동화를 통함

이는 예상된 동작입니다. 브라우저 상호작용이 필요한 도구는 그렇게 문서화되어 있습니다. REST를 사용해야 하는 도구에서 406 오류가 보이면 naukri_auth_status()로 로그인 상태를 확인하세요. 토큰이 만료되면 Akamai가 그 요청을 봇으로 분류합니다.

AmbitionBox 스크래핑

AmbitionBox는 Next.js SSR 사이트입니다. 급여 및 리뷰 도구는 서버 렌더링 페이지에서 __NEXT_DATA__ 를 추출합니다. AmbitionBox가 페이지 구조를 바꾸면 이 도구가 오류를 반환할 수 있습니다. naukri_health_check에는 AmbitionBox 점검이 포함되어 있으며 여기서 "warn" 상태가 나와도 핵심 Naukri 기능에는 지장이 없습니다.


문제 해결

문제

해결 방법

"Not logged in" 오류

세션 만료(~30일). naukri_login(method="google")를 호출해 재인증합니다.

검색 결과가 비어 있거나 406

직접 REST에서는 예상된 동작. naukri_search_jobs는 브라우저 인터셉트를 사용해 정상 작동합니다. 실패하면 naukri_health_check 실행.

느린 연결에서 타임아웃

NAUKRI_NAV_TIMEOUT(예: 30000)와 NAUKRI_API_TIMEOUT(예: 60)을 늘리세요.

속도 제한 / 일일 지원 상한

Naukri는 계정 유형별로 일일 지원 수를 제한합니다. 응답 차분 daily_applied 필드에 현재 신청 횟수가 표시됩니다. Naukri 360 구독자는 더 높은 제한을 받습니다.

브라우저 탭 충돌

PagePool은 다음 acquire() 시 손상된 탭을 자동으로 복구합니다. 문제가 지속되면 서버를 재시작하세요.

토큰 갱신 반복

chrome-profile/을 삭제하고 처음부터 다시 인증하세요.

naukri_sync가 세 계층 모두 실패

보통 유효하지 않은 세션입니다. 먼저 로그인하세요. 이미 로그인했다면 force_browser=True를 전달해 REST 계층을 건너뛰세요.

AmbitionBox 급여/리뷰가 동작 안 함

naukri_health_check를 실행해 확인하세요. AmbitionBox에서 "warn"이 나와도 핵심 Naukri 도구에는 영향을 주지 않습니다.

Health Check

naukri_health_check()를 실행하면 모든 통합을 한 번에 검증합니다. 로그인 세션, 프로필 API, 검색 API(여기서 406은 정상), 추천, 대시보드, 브라우저 풀 활성 상태, AmbitionBox 스크래핑을 확인합니다.

각 체크의 소요 시간과 함께 {summary: {ok: N, warn: N, fail: N}, checks: [...]}를 반환합니다.


원격 접근

항상 켜져 있는 머신에서 서버를 실행하고, 어디서든 연결하세요(함께 사용하는 환경의 웹 Claude, 모바일 등). 두 가지 인증 모드를 지원하며 같은 서버에서 동시에 실행할 수 있습니다.

빠른 결정

클라이언트

인증 모드

이유

Claude Code CLI

Bearer (MCP_SHARED_SECRET)

claude mcp add --transport http ... --header "Authorization: Bearer ..."가 바로 동작

Claude Desktop

Bearer (MCP_SHARED_SECRET)

claude_desktop_config.jsonheaders 설정 지원

Claude.ai 웹

OAuth (MCP_OAUTH_ENABLED=1)

웹 UI에서는 bearer가 아닌 OAuth client_id/secret 필드만 표시됨

둘 모두 동시

Bearer + OAuth (두 환경 변수 모두)

단일 서버에서 OAuth 프로바이더의 load_access_token가 공유 시크릿으로 대체됨

단계 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 파일은 gitignored입니다. 두 인증 모드를 모두 활성화하는 최소 구성:

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(피어-투-피어 방식이라 신뢰할 수 있는 기기에서는 지연 시간이 낮음) 또는 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 웹(OAuth 사용):

설정 → 커넥터 → 사용자 지정 커넥터 추가

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

  • OAuth 클라이언트 ID: claude-ai-web (MCP_OAUTH_CLIENT_ID와 일치)

  • OAuth 클라이언트 시크릿: MCP_OAUTH_CLIENT_SECRET 값을 붙여넣기

Claude.ai는 OAuth 메타데이터를 자동으로 검색합니다(FastMCP가 .well-known/oauth-authorization-server/authorize/token 엔드포인트를 제공).

스모크 테스트 (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는 화면이 있는(headed) 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 사용

Windows에서 Chrome은 서로 다른 --user-data-dir로 두 인스턴스를 실행할 수 없으므로, MCP 실행 중에는 같은 프로필을 수동으로 열지 마십시오.

모니터링

Cloudflare의 "tunnel healthy" 상태는 엣지↔cloudflared 구간의 연결만 반영하며, 오리진(실제 서버)의 상태는 반영하지 않습니다. 호스트 머신이 실제로 접근 불가능할 때 알림을 받으려면, https://naukri.<your-domain>/.well-known/oauth-authorization-server(이 200 응답 예상)에 접속을 확인하는 외부 업타임 프로브(예: UptimeRobot, 무료)를 설정하세요.

인증 모드 참조

환경 변수

필요한 용도

참고

MCP_REMOTE=1

공개 바인딩

이 값이 없으면 서버는 127.0.0.1에만 유지됨

MCP_PORT

사용자 지정 포트

기본값 8321

MCP_PUBLIC_URL

OAuth 발급자 / RS 메타데이터

기본값은 http://localhost:8321

MCP_SHARED_SECRET

Bearer 인증

32자 이상; 환경 변수를 바꾸고 재시작하면 교체됨

MCP_OAUTH_ENABLED=1

OAuth 흐름

/authorize, /token, /register, /revoke 엔드포인트를 활성화

MCP_OAUTH_CLIENT_ID

OAuth

클라이언트의 사전 등록된 클라이언트 ID

MCP_OAUTH_CLIENT_SECRET

OAuth

32자 이상

MCP_OAUTH_AUTO_APPROVE

OAuth UX

1은 동의 화면을 건너뜀(기본값), 0/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