Skip to main content
Glama

Naukri MCP Server

CI

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_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 戦略

Naukri の Akamai CDN は、一部のエンドポイントへの直接 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 が REST 経由の PUT/DELETE をブロックします。

AmbitionBox スクレイピング

naukri_company_intel(salary、reviews、interviews)

サーバーサイドレンダリングされた Next.js ページから __NEXT_DATA__ を抽出します。

PagePool

サーバーは 3 つのブラウザタブのプールを管理しています(NAUKRI_MAX_TABS で設定可能)。MULTIPLE タブはセマフォでチェックアウトされ、落ちた場合は自動復旧され、使用後に返却されます。これにより、バッチようや一括応募のような同時実行処理も、タブをいくつも開きすぎずに並列で行えます。

TokenManager

JWT 認証トークン(nauk_at Cookie)はブラウザコンテキストから抽出され、メモリにキャッシュされます。401 エラー時は、単一ライターの更新ロックが並列更新ストームを防ぎます。1 つのリクエストが更新し、他のリクエストは待機してその結果を再利用します。

3 層同期フォールバック

naukri_sync_applications() は次の 3 つの戦略を順に試します。

  1. REST API -- 履歴エンドポイントへのページ割り GET(最速・最信頼)

  2. ブラウザインターセプト -- 応募済み求人ページへ移動し、XHR レスポンスを捕捉

  3. HTML スクレイピング -- サーバーレンダリングされた DOM から適応的 CSS セレクタで求人カードを抽出


Related MCP server: JobGPT 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() 呼び出しで質問が返されます。2 回目の呼び出しで回答を渡します。回答キーはあいまい一致です。たとえば "current ctc" の答えは "What is your current CTC?" にマッチします。回答は questions.json にキャッシュされるため、各質問タイプは一度だけ答えれば済みます。


ツール(117 個のアトミックツール)

ほぼすべてのツールは、単一目的のアトミックパターンに従っています(1 操作に 1 ソフトウェアツール)。naukri_company_intel と naukri_debug だけが action/intel_type パラメータを保持しています(その理由は後述の「ディスパッチャ型ツール」の節を参照)。このカタログは 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_ids) -- 適合度スコア付きの比較表示

  • naukri_bulk_fetch_jobs(job_ids) -- 1 回の呼び出しで最大 20 件の求人を取得

  • naukri_job_detail_v1(job_id) -- ウォークイン情報、連絡先詳細

  • 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_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) -- 1 件を既読に

  • 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) -- 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() -- メール・モバイル認証の状態

  • 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(...) -- 大手企業の未公開求人を閲覧

  • naukri_share_early_access(job_id) -- 興味表明(即時、質問なし)

履歴書ビルダー

  • naukri_resume_templates() -- 利用可能なテンプレート(無料 + 有料)

  • naukri_resume_builder_status() -- AI リライトの残り回数、サブスクリプション層

  • naukri_tailor_resume(job_id, ...) -- 指定求人向けのカスタマイズ提案

模擬面接(AI)

  • naukri_mock_interview_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) — observe→decide→act→learn サイクルを1回実行

  • naukri_agent_approve(cycle_id) — 保留中の決定を適用

  • naukri_agent_reject(cycle_id) — 保留中の決定を却下

  • naukri_agent_history(limit=10) — 直近の実行履歴

  • naukri_agent_decisions(cycle_id) — 1サイクル分のジョブ別決定

バックグラウンドスケジューラ

  • 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") — 3つのアクションは同じ 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.py と domain/ のスコアリングモジュールはそれを再エクスポートする薄いシムです。これは PyPI にはないため、次の2つの方法のいずれかでインストールされ、この2つは意図的に区別されています。

場所

方法

理由

ローカル開発

pip install -e ../jobcore

jobcore と naukri を一緒に編集でき、再インストール不要

CI

requirements-ci.txt(特定のコミットに固定)

ランナーには ../jobcore のチェックアウトがない

git URL を requirements.txt に追加しないでください。 追加すると editable インストールが壊れます。pip install -e ../jobcore の後に pip install -r requirements.txt を実行すると、editable パッケージがアンインストールされ、静かに git チェックアウトに置き換えられます。direct-URL の要件には "already satisfied" の行が表示されないためです。クリーンな venv で 2026-08-20 に計測し、2回再現しました。ここでは CI の利便性よりもローカルでの反復が重要なので、git からインストールするのは CI 側です。

venv を再構築した場合、または ModuleNotFoundError: jobcore が表示された場合は、このディレクトリから pip install -e ../jobcore を再実行してください。

requirements-ci.txt のピンを更新することが、jobcore の変更を取り込む方法です。これは意図的に、このリポジトリの CI をここでの変更なしに赤くする可能性のある動く @master ではなく、可視でレビュー可能なコミットです。

初回ログイン

サーバーを起動します:

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 in" エラーを返します。naukri_login(method="google") で再認証してください。

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

aiohttp REST API タイムアウト(秒)

NAUKRI_MAX_TABS

3

PagePool 内の同時ブラウザタブの最大数

データファイルの場所

すべてのデータファイルはプロジェクトルートに置かれ、gitignore されています。

ファイル

目的

CustomProfile/

Playwright の永続的ブラウザプロファイル。マシン固有のため、コミットしないでください。

issuance.json

ローカルの応募状態の追跡。apply、batch_apply、sync によって書き込まれます。

saved_jobs.json

ローカルの保存・ブックマーク済み求人。saved_jobs と sync によって書き込まれます。

questions.json

スクリーニング質問の回答キャッシュ。応募時に自動生成され、バッチ応募の自動回答に使用されます。

*.backup

JSON ファイルが上書きされる前の自動バックアップ(原子的書き込み: .tmp に書き込み → 既存をバックアップ → リネーム)。-----


高可用性機能

  • グローバル aiohttp セッション — すべての REST 呼び出しで単一の共有セッションを使い、接続オーバーヘッドを回避

  • 重複排除 API レイヤー — _api_request と @api_tool デコレータによる REST 操作の正規化

  • リフレッシュロック — 単一書き込みの JWT リフレッシュで並列 401 ストームを防止

  • 起動時検証 — ツール呼び出しを受け入れる前にブラウザとトークンの状態を検証

  • バッチ応募のキャンセル安全性 — バッチが中断されても部分的な進捗を維持

  • データバックアップ — JSON の上書き前に .backup ファイルを作成

  • キャッシュTTL自動パージ — 古くなった回答キャッシュエントリを自動的に失効

  • 原子的書き込み — 一時ファイル + リネームによる同期状態の書き込みで破損を回避

  • プロフィールTTLキャッシュ — プロフィールデータを30秒間キャッシュし、冗長なAPI呼び出しを削減


既知の制限事項

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)を増やす。

レート制限 / 1日の応募上限

Naukri はアカウントタイプごとに1日の応募数を制限しています。daily_applied フィールドで自分の回数を確認できます。Naukri 360 サブスクライバーは高い上限を得られます。

ブラウザタブのクラッシュ

PagePool は次の acquire() でクラッシュしたタブを自動回復します。継続する場合はサーバーを再起動してください。

トークンのリフレッシュループ

Chrome フォルダ/ を削除して、最初から再認証してください。

naukri_sync が3段階すべてで失敗

通常は無効なセッションを意味します。まずログインしてください。すでにログインしている場合は force_browser=True を渡して REST 段階をスキップしてください。

AmbitionBox の給与/レビューが機能しない

naukri_health_check を実行して確認してください。AmbitionBox が "warn" を返しても、コアの Naukri ツールには影響しません。

ヘルスチェック

naukri_health_check() を実行すると、すべての統合を一度に検証できます。ログインセッション、プロフィールAPI、検索API(ここでは 406 は正常)、レコメンデーション、ダッシュボード、ブラウザプールの活性、AmbitionBox スクレイピングをテストします。

{summary: {ok: N, warn: N, fail: N}, checks: [...]} を、各チェックの所要時間とともに返します。


リモートアクセス

常時稼働のマシンでサーバーを実行し、どこからでも接続します(共同作業環境、モバイルなどの web Claude)。2つの認証モードがサポートされて、同じサーバーで並行して実行できます。

簡単な判断

クライアント

認証モード

理由

Claude Code CLI

Bearer (MCP_SHARED_SECRET)

claude mcp add --transport http ... --header "Authorization: Bearer ..." が直接動作する

Claude Desktop

Bearer (MCP_SHARED_SECRET)

claude_desktop_config.json の headers 設定をサポート

Claude.ai web

OAuth (MCP_OAUTH_ENABLED=1)

Web UI は OAuth の client_id/secret フィールドのみ公開し、Bearer は公開しない

両方を一度に

Bearer + OAuth(両方の env 変数を設定)

単一サーバーで、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 ファイルは gitignore されています。両方の認証モードを有効にする最小限の設定:

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 web(OAuthを使用):

Settings → Connectors → Add custom connector

  • 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エンドポイントを提供します)。

スモークテスト(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で2つのインスタンスを実行できません。MCP動作中に同じプロファイルを手動で開かないでください。

監視

Cloudflareの「tunnel healthy」ステータスはedge↔cloudflared間のリンクのみを反映しており、オリジン(配信元)は反映されません。外部の稼働監視プローブ(例: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発行者/RSメタデータ

デフォルトはhttp://localhost:8321

MCP_SHARED_SECRET

Bearer認証

32文字以上。環境変数の変更+再起動でローテーション

MCP_OAUTH_ENABLED=1

OAuthフロー

/authorize、/token、/register、/revokeを有効にする

MCP_OAUTH_CLIENT_ID

OAuth

claude.ai用に事前登録されたクライアントID

MCP_OAUTH_CLIENT_SECRET

OAuth

32文字以上

MCP_OAUTH_AUTO_APPROVE

OAuth UX

1は同意画面をスキップ(デフォルト)、0は/oauth/consentにApprove/Denyページを表示する

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

Appeared in Searches