Skip to main content
Glama

Naukri MCP Server

CI

Ein atomarer MCP-Server mit 117 Tools zur Automatisierung von Naukri.com (Indiens größtem Jobportal). Suche Jobs, bewerbe dich massenweise, verwalte dein Profil, verfolge Bewerbungen, recherchiere Unternehmen und überwache Recruiter-Aktivitäten – alles aus deinem MCP-Client. Entwickelt für das progressive Tool-Search-Laden von Claude Code (Standard seit Jan. 2026), sodass jedes Tool nur einem Zweck dient und bei Bedarf auffindbar ist.

Tech-Stack: Python 3.10+, FastMCP, Playwright (persistent Chromium), aiohttp

Wichtigste Funktionen:

  • Suche & Bewerbung – Keyword-Suche, personalisierte Empfehlungen, Einzel- oder Massenbewerbung mit automatisch beantworteten Screening-Fragen

  • Bewerbungsverfolgung – lokale JSON-Persistenz + 3-stufiger Sync mit dem Naukri-Backend (REST, Browser-Intercept, HTML-Scraping)

  • Profilverwaltung – Profil ansehen/bearbeiten (naukri_get_profile, naukri_update_profile), Sichtbarkeit erhöhen (naukri_boost_profile)

  • Unternehmensrecherchenaukri_research_company plus AmbitionBox-Brücke für Gehaltsdaten und Mitarbeiterbewertungen

  • Performance-Analysennaukri_search_impressions, naukri_recruiter_activity, naukri_activity_level

  • Smarte Automatisierungnaukri_auto_hunt (Jobsuche per Aufruf mit Fit-Scoring), naukri_daily_brief (morgendliches Dashboard), naukri_tailor_resume, naukri_apply_top_fits (automatische Bewerbung auf die besten Treffer)


Architektur

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)

Hybride Browser- und REST-Strategie

Akamai, das CDN von Naukri, blockiert direkte REST-Aufrufe mehrerer Endpunkte. Der Server verwendet einen hybriden Ansatz:

Strategie

Verwendet von

Grund

Direkte REST-API

naukri_apply(), naukri_get_profile(), naukri_get_recommendations, naukri_sync, viele Lesevorgänge

Schnell, kein Browser-Tab nötig. Verwendet das JWT-Token aus Browser-Cookies.

Browser-Intercept

naukri_search_jobs, naukri_company_jobs(), naukri_jobs (Fallback)

Die Such-API liefert bei direktem REST-Aufruf den Fehler 406. Der Browser navigiert zur Seite und fängt die XHR-Antwort ab.

Browser-UI-Automatisierung

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

Erfordert Klicks auf Schaltflächen, das Ausfüllen von Formularen und den Umgang mit SSO-Popups. Akamai blockiert PUT/DELETE über REST.

AmbitionBox-Scraping

naukri_company_intel (Gehalt, Bewertungen, Interviews)

Extrahiert __NEXT_DATA__ aus serverseitig gerenderten Next.js-Seiten.

PagePool

Der Server verwaltet einen Pool aus 3 Browser-Tabs (konfigurierbar über NAUKRI_MAX_TABS). Die Tabs werden mit einem Semaphor ausgeliehen, bei Absturz automatisch wiederhergestellt und nach der Verwendung zurückgegeben. Dadurch können parallele Vorgänge wie Massenbewerbungen ausgeführt werden, ohne unnötig viele Tabs zu öffnen.

TokenManager

Das JWT-Authentifizierungstoken (nauk_at-Cookie) wird aus dem Playwright-Browserkontext extrahiert und im Speicher zwischengespeichert. Bei 401-Fehlern verhindert eine Single-Writer-Refresh-Lock einen parallelen Refresh-Sturm – eine Anfrage aktualisiert das Token, die anderen warten und nutzen das Ergebnis erneut.

3-stufiger Sync-Fallback

naukri_sync_applications() versucht drei Strategien nacheinander:

  1. REST-API – paginierte GET-Anfrage an den Historien-Endpunkt (am schnellsten und zuverlässigsten)

  2. Browser-Intercept – zur Seite „Beworbene Jobs“ navigieren und die XHR-Antwort abfangen

  3. HTML-Scraping – Job-Karten mit adaptiven CSS-Selektoren aus dem serverseitig gerenderten DOM extrahieren


Related MCP server: LinkedIn MCP Server

Schnellstart für KI-Nutzer

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

Details zum Bewerbungsablauf: Wenn ein Job Screening-Fragen enthält, liefert der erste Aufruf von naukri_apply() diese zurück. Gib die Antworten im zweiten Aufruf erneut an. Antwort-Schlüssel werden per Fuzzy-Abgleich zugeordnet – "current ctc" passt auf "What is your current CTC?". Die Antworten werden in questions.json zwischengespeichert, sodass du jeden Fragetyp nur einmal beantworten musst.


Tools (117 atomare) und Einzeltools

Fast jedes Tool folgt dem atomaren Einzweck-Muster – ein MCP-Tool pro Operation. Nur naukri_company_intel und naukri_debug behalten einen action- oder intel_type-Parameter (siehe Unterabschnitt „Dispatcher-Werkzeuge“ weiter unten). Dieser Katalog ist für Claude Codes progressives Tool-Search-Laden ausgelegt (Standard seit Jan. 2026), sodass viele fokussierte Tools nicht mehr kosten als wenige multifunktionale Werkzeuge.

Authentifizierung

  • naukri_login(method=...) – Google-SSO oder E-Mail/Passwort

  • naukri_verify_otp(otp) – OTP nach dem Login bestätigen

  • naukri_auth_status() – Sitzungsgültigkeit prüfen

Jobsuche & Entdeckung

  • naukri_search_jobs – Stichwortsuche mit Browser-Intercept

  • naukri_get_recommendations – Personalisierte Job-Empfehlungen

  • naukri_get_job(job_id) – Vollständige Jobdetails

  • naukri_similar_jobs(job_id) – Ähnliche Jobs finden

  • naukri_compare_jobs(job_ids) – Gegenüberstellung mit Fit-Scores

  • naukri_bulk_fetch_jobs(job_ids) – Bis zu 20 Jobs in einem Aufruf

  • naukri_job_detail_v1(job_id) – Walk-in-Details, Kontaktinfos

  • naukri_report_fraud(job_id, reason) – Betrügerische Anzeige melden

  • naukri_auto_hunt – Automatisierte Jobsuche mit Fit-Scoring in einem Aufruf

Bewerbung & Tracking

  • naukri_apply(job_id, set_reminder_days=...) – Einzelbewerbung mit automatischer Erinnerung

  • naukri_batch_apply(keywords=...) – Massenbewerbung aus der Suche

  • naukri_assess_fit(job_id, apply_if_fit=False) – Fit-Bewertung (automatisches Bewerben optional)

  • naukri_score_saved_jobs(min_fit_score=60) – Alle gespeicherten Jobs bewerten

  • naukri_apply_top_fits(min_fit_score=70, limit=10) – Bewertung und automatische Bewerbung auf die besten Treffer

  • naukri_list_applications(...) – Lokale Tracking-Daten abfragen

  • naukri_get_application(job_id) – Detaillierter Bewerbungsstatus

  • naukri_purge_applications(before_date) – Alte Datensätze löschen

  • naukri_stale_applications(...) – Veraltete Bewerbungen erkennen

  • naukri_follow_up_priority(...) – Posteingang und Erinnerungen abgleichen

  • naukri_draft_follow_up(job_id) – Nachverfolgungsentwurf erstellen

  • naukri_recruiter_history() – Kommunikationshistorie pro Unternehmen

Synchronisation & Export

  • naukri_sync_applications(force_browser=False, days_back=365) – 3-stufiger Sync

  • naukri_sync_saved(force_browser=False) – Gespeicherte Jobs synchronisieren

  • naukri_export_data(data_type, export_format="json") – Nach JSON/CSV exportieren

Gespeicherte Jobs

  • naukri_list_saved_jobs(limit=50, page=1) – Gespeicherte/gebookmarkte Jobs auflisten

  • naukri_save_job(job_id, ...) – Job speichern

  • naukri_unsave_job(job_id) – Gespeicherten Job entfernen

  • naukri_sync_saved_jobs() – Vom Naukri-Server abrufen

Posteingang (Recruiter-Nachrichten)

  • naukri_list_inbox(limit=20, unread_only=False) – Nachrichten auflisten

  • naukri_read_message(message_id, vcard_id, unique_id) – Vollständige Nachricht lesen

  • naukri_mark_interested(mail_id, conversation_id, interested=True) – Interesse signalisieren

  • naukri_accept_nvite(nvite_job_id, ...) – Über NVite bewerben

Benachrichtigungen

  • naukri_list_notifications(limit=20, page=1, notif_type=None) – Gefilterte Liste

  • naukri_notification_count() – Anzahl ungelesener Benachrichtigungen

  • naukri_mark_notification_read(notification_id, date) – Einzelne Benachrichtigung als gelesen markieren

  • naukri_mark_all_notifications_read() – Alle als gelesen markieren

  • naukri_notification_summary() – Zusammengefasstes Dashboard

Profil

  • naukri_get_profile() – Vollständiges Profil

  • naukri_update_profile(fields, ...) – Profilfelder aktualisieren

  • naukri_audit_profile() – Vollständigkeit plus Tipps

  • naukri_boost_profile(randomize=False) – Headline erneut speichern für mehr Sichtbarkeit

  • naukri_dashboard() – Profil-Dashboard-Daten

  • naukri_profile_targeting() – DFP-Targeting-Ansicht

Lebenslauf & Foto

  • naukri_resume_info() – Metadaten des Lebenslaufs

  • naukri_upload_resume(file_path) – PDF/DOC/DOCX hochladen

  • naukri_download_resume(save_path) – Herunterladen als lokale Datei

  • naukri_photo_info() – Metadaten des Fotos

  • naukri_upload_photo(file_path) – PNG/JPG/JPEG/GIF hochladen

  • naukri_delete_photo() – Profilfoto entfernen

Insights & Analysen

  • naukri_application_insights(days=30) – Statusverteilung plus Geschwindigkeit

  • naukri_salary_position(designation=...) – Gehaltspositionierung

  • naukri_cached_answers(action="list|update|delete", key=..., new_answer=...) – Zwischengespeicherte Antworten verwalten

  • naukri_match_analytics(days=30) – Match-Score-Aufschlüsselung nach Feld

  • naukri_match_quality(days=30) – Aggregierte Match-Qualität

  • naukri_skill_gap(...) – Skill-Lücke im Vergleich zur Marktnachfrage

  • naukri_salary_benchmark(keywords, ...) – Gehalts-Benchmark für den Markt

  • naukri_taxonomy() – Rollen-Taxonomie von Naukri (37 Abteilungen × 167 Kategorien × 1461 Rollen)

  • naukri_profile_prompts() – Offene Aktionen zur Vervollständigung des Profils

  • naukri_conversion_funnel(days=30) – Trichter von Bewerbung zum Vorstellungsgespräch

  • naukri_status_changes(days=30) – Statuswechsel erkennen

Performance

  • naukri_search_impressions(days=7) – Sichtbarkeitsstatistiken in Suchen

  • naukri_recruiter_activity(page=1, limit=100, filter_by=None) – Recruiter-Aktionen am Profil

  • naukri_activity_level() – Aktuelle Profilaktivität

Unternehmen

  • naukri_search_companies(keyword, page=1, limit=10) – Unternehmen finden

  • naukri_company_jobs(group_id, ...) – Jobs bei einem Unternehmen

  • naukri_company_slug(group_id) – AmbitionBox-Slug (einzein oder per Komma getrennt als Batch)

  • naukri_research_company(keyword, ...) – Naukri + AmbitionBox kombiniert

  • naukri_follow_company(group_id|group_ids, action="follow|unfollow") – Unternehmen folgen/nicht mehr folgen

  • naukri_follow_status(group_id|group_ids) – Suche den Follow-Status ab

  • naukri_company_intel(company, intel_type="salary|reviews|interviews") – AmbitionBox-Intelligenz

Einstellungen

  • naukri_get_settings() – Alle aktuellen Kontoeinstellungen (Jobsuch-Status, Benachrichtigungen, Einwilligungsfunktionen)

  • naukri_update_settings(...) – Einstellungen ändern (nur zu ändernde Felder übergeben)

  • naukri_blocked_companies() – Blockierte Unternehmen auflisten

  • naukri_check_email() – E-Mail/Mobilnummer-Verifizierungsstatus

  • naukri_visibility() – Resdex-Sichtbarkeitsoptionen

  • naukri_notification_prefs() – E-Mail/SMS/Push/WhatsApp-Einstellungen

  • naukri_subscription_status() – Naukri-360-Abo plus Funktionen

Job-Alerts

  • naukri_list_alerts() – Alle Job-Alerts aus gespeicherten Suchen

  • naukri_alert_detail(alert_id) – Einzelheiten zu einem Alert

  • naukri_create_alert(name, keywords, ...) – Neuen Alert erstellen

  • naukri_update_alert(alert_id, ...) – Alert-Felder bearbeiten

  • naukri_delete_alert(alert_id) – Alert löschen

Early Access (Rollen vor Veröffentlichung)

  • naukri_list_early_access(...) – Vorab veröffentlichte Rollen von Top-Unternehmen durchsuchen

  • naukri_share_early_access(job_id) – Intereste signalisieren (sofort, ohne Screening)

Lebenslauf-Builder

  • naukri_resume_templates() – Verfügbare Vorlagen (kostenlos + Pro)

  • naukri_resume_builder_status() – Verbleibende KI-Umschreibversuche, Abo-Stufe

  • naukri_tailor_resume(job_id, ...) – Anpassungsvorschläge für einen bestimmten Job

Mock-Interviews (KI)

  • naukri_mock_interview_topics() – Verfügbare Themen plus Bearbeitungsstatus

  • naukri_mock_interview_history() – Vergangene Interviews mit Ergebnisse/Feedback

  • naukri_start_mock_interview(job_id) – JD-basiertes Mock-Interview starten

  • naukri_answer_mock_interview(test_id, topic_id, question_id, answer) – Antwort abgeben

  • naukri_mock_interview_prep(job_id) – Vorbereitungspaket für das Interview

Autonomer Agent

  • naukri_agent_status() — Agentstatus + die letzten 5 Läufe + Konfigurationsübersicht

  • naukri_agent_config() — Vollständige Konfiguration

  • naukri_agent_update_config(updates) — Konfiguration per JSON patchen

  • naukri_agent_run_now(ctx=None) — Führt einen Zyklus aus Beobachten → Entscheiden → Handeln → Lernen aus

  • naukri_agent_approve(cycle_id) — Wendet ausstehende Entscheidungen an

  • naukri_agent_reject(cycle_id) — Lehnt ausstehende Entscheidungen ab

  • naukri_agent_history(limit=10) — Verlauf der letzten Ausführungen

  • naukri_agent_decisions(cycle_id) — Entscheidungen pro Job für einen Zyklus

Hintergrund-Scheduler

  • naukri_scheduler_status() — Scheduler-Zustand + Informationen zum letzten Lauf pro Aufgabe

  • naukri_enable_task(task_name) — Aktiviert eine deaktivierte Aufgabe

  • naukri_disable_task(task_name) — Deaktiviert eine Aufgabe

  • naukri_run_task_now(task_name) — Führt eine Aufgabe sofort aus

  • naukri_task_history(task_name=None, limit=20) — Verlauf der letzten Ausführungen

Erinnerungen & Vorstellungsgespräche

  • naukri_list_reminders(include_past=True, include_app_status=True) — Alle Erinnerungen mit Fälligkeitsstatus

  • naukri_set_reminder(job_id, days=7, ...) — Erinnerung erstellen/aktualisieren

  • naukri_interview_prep(job_id) — Vorbereitungspaket für das Vorstellungsgespräch

  • naukri_add_interview_round(job_id, round_type, ...) — Gesprächsrunde erfassen

  • naukri_list_interview_rounds(job_id=None) — Runden auflisten

  • naukri_compare_offers(job_ids) — Mehrere Jobangebote vergleichen

Dispatcher-Tools (nur noch 2 übrig — bewusst beibehalten)

  • naukri_company_intel(company, intel_type="salary|reviews|interviews") — Drei Aktionen teilen sich dieselbe company-Auflösung und den AmbitionBox-Auth-Ablauf; eine Aufteilung würde diese Orchestrierung duplizieren.

  • naukri_debug(action=...) — 16 Nur-Entwickler-Debug-Aktionen in den Bereichen Browser/API/Discovery; die Katalogkosten sind hier selbst bei progressivem Laden real, da die meisten Benutzer diese nie verwenden.

Sonstiges

  • naukri_daily_brief — Morgen-Dashboard: 16 Quellen + empfohlene Aktionen

  • naukri_health_check — Endpunktvalidierung + Browser-Pool + AmbitionBox


Einrichtung

Voraussetzungen

  • Python 3.10+

  • Playwright Chromium (installiert über playwright install chromium)

Installation

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

Die jobcore-Abhängigkeit

Die Skill-Taxonomie, das Fit-Scoring und das Gehalts-Parsing leben in einem Schwesterpaket, jobcore; naukri_server/scoring.py und die domain/-Scoring-Module sind dünne Re-Export-Shims darüber. Es ist nicht auf PyPI, daher wird es auf eine von zwei Arten installiert, und die beiden werden bewusst getrennt gehalten:

wo

wie

warum

lokale Entwicklung

pip install -e ../jobcore

jobcore und naukri zusammen bearbeiten, keine Neuinstallation

CI

requirements-ci.txt, gepinnt auf einen exakten Commit

der Runner hat keinen ../jobcore-Checkout

Fügen Sie die Git-URL nicht zu requirements.txt hinzu. Sie überschreibt damit die Editable-Installation: Nach pip install -e ../jobcore deinstalliert ein späteres pip install -r requirements.txt das Editable-Paket und ersetzt es durch einen Git-Checkout — stillschweigend, da pip keine „already satisfied“-Zeile für eine Direct-URL-Anforderung ausgibt. Gemessen auf einer sauberen venv am 20.08.2026 und zweimal reproduziert. Hier zählt die lokale Iteration mehr als der CI-Komfort, also ist CI die Seite, die von Git und installiert.

Wenn du die venv neu erstellst oder ModuleNotFoundError: jobcore siehst, führe s base-Verzeichnis erneut aus.

Das Anheben des Pins in requirements-ci.txt ist die Art und Weise, wie eine jobcore-Änderung übernommen wird — bewusst ein sichtbarer, überprüfbarer Commit statt eines beweglichen @master, das die CI dieses Repos rot färben könnte, ohne dass sich hier etwas ändert.

Erste Anmeldung

Starten Sie den Server:

python naukri.py

Rufen Sie dann naukri_login(method="google") aus Ihrem MCP-Client auf. Es öffnet sich ein sichtbares Chromium-Fenster, in dem Sie:

  1. Google SSO (empfohlen): Klicken Sie „Login with Google“ – verwendet die im Chrome-Profil gespeicherte Google-Sitzung, keine Anmeldedaten erforderlich.

  2. E-Mail/Passwort: Übergeben Sie method="email", email="...", password="...".

Die Browser-Sitzung wird in chrome-profile/ gespeichert (automatisch erstellt, gitignored). Dieses Verzeichnis ist maschinenspezifisch – es enthält Cookies, localStorage und zwischengespeicherte Anmeldedaten. Kopieren Sie es nicht zwischen Maschinen.

Sitzungsdauer

Sitzungen bleiben ca. 30 Tage bestehen. Wenn die Sitzung abgelaufen ist, erkennt der Server das beim Start oder beim ersten API-Aufruf und gibt einen "Not logged in"-Fehler zurück. Authentifizieren Sie sich erneut mit naukri_login(method="google").

MCP-Client-Konfiguration

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

Umgebungsvariablen

Alle optional. In der Shell oder in einer .env-Datei festgelegt.

Variable

Default

Beschreibung

NAUKRI_NAV_TIMEOUT

20000

Playwright-Seitennavigations-Timeout (ms)

NAUKRI_ELEMENT_TIMEOUT

5000

Playwright-Element-Warte-Timeout (ms)

NAUKRI_API_TIMEOUT

30

aiohttp-REST-API-Timeout (Sekunden)

NAUKRI_MAX_TABS

3

Maximale gleichzeitige Browser-Tabs im PagePool

Speicherorte der Datendateien

Alle Datendateien liegen im Projekt-Root und sind gitignert.

Datei

Zweck

chrome-profile/

Persistente Browserprofil von Playwright. Maschinenspezifisch, niemals konservieren.

applications.json

Lokale Anwendungsverfolgung. Geschrieben von apply, batch_apply und sync.

saved_jobs.json

Lokal gespeicherte/Lesezeichen-Job Across. Geschrieben von saved_jobs und sync.

questions.json

Cache für Screening-Fragen-Antworten. Automatisch beim Bewerben befüllt, von batch_apply zum automatischen Antworten verlangt.

*.backup

Automatisches Backup vor jeder JSON-Überschreibung (atomic schreiben: in .tmp, bestehende, umbenennen).


Resilienz-Features

  • Globale aiohttp-Sitzung – eine einzige gemeinsam genutzte Sitzung für alle REST-Aufrufe, vermeidet Verbindungs-Overhead

  • Deduplizierte API-Ebene_api_request mit @api_tool-Dekorateur normalisiert alle REST-Interaktionen

  • Refresh-Schutz – Single-Writer-JWT-Refresh verhindert parallele 401-Stürme

  • Startup-Verifizierung – der Browser- und Token-Zustand wird vor der Annahme von Tool-Aufrufen validiert

  • Batch-Apply-Abbruchsicherheit – Teilfortschritt bleibt bei Unterbrechung erhalten

  • Datensicherung.backup-Dateien werden vor jedem JSON-Überschreiben erstellt

  • Cache-TTL-Auto-Feuen – abgelaufene Antwort-Cache-Einträge veralten automatisch

  • Atomare Schreibvorgänge – Synchron-Zustand über temporäre Datei + Umbenennen, um Korruption zu vermeiden

  • Profile-SAA-Cache – Profildaten für 30 Sekunden gecacht, um redundante API-Aufrufe zu reduzieren


Bekannte Einschränkungen

Akamai CDN-Sperren

Naukri verwendet Akamai Bot Manager. Einige Endpoint liefern 406 Not Acceptable oder 403 Forbidden, wenn sie direkt per REST ohne Browser-Sitzung aufgerufen werden:

  • Suche (naukri_search_jobs) – verwendet immer Browser-Intercept; direktes REST ist blockiert

  • Profiländerungen (naukri_update_profile()) – PUT/DELETE von Akamai blockiert; stattdessen Browser-Automatisierung

  • Job-Benachrichtigungen – CRUD-Operationen laufen aus demselben Grund über die Browser-UI-Automatisierung

Das ist erwartetes Verhalten. Werkzeug, die eine Browser-Interaktion benötigen, sind als solche dokumentiert. Wenn du 406-Fehler bei Werkzeuge Sieh, die REST verwenden sollten, prüfe den Anmeldestatus mit naukri_auth_status() – ein abgelaufener Token führt dazu, dass Akamai Anfragen als Bot-Verbindungen einstuft.

AmbitionBox-Suchabreibung

AmbitionBox ist eine Next.js-SSR-Site. Gehalts- und Bewertungs-Tools extrahieren __NEXT_DATA__ aus serverseitig gerenderten Seiten. Wenn AmbitionBox die Seitenstruktur ändert, könnten diese Tools Fehler liefern. naukri_health_check enthält auch eine AmbitionBox-Prüfung – ein „warn“-Status dort ist periodisch zu erwarten und kein Blocker für die Naukri-Kernfunktionen.


Fehlerbehebung

Problem

Lösung

„Not logged in“-Fehler

Sitzung abgelaufen (~30 Tage). Mit naukri_login(method="google") neu authentifizieren.

Suche liefert leer / 406

Erwartet für direkten REST. naukri_search_jobs nutzt Browser-Interrupt und sollte funktionieren. Wenn der Fehler bleibt, naukri_health_check ausführen.

Timeouts bei langsamen Verbindungen

Erhöhen Sie NAUKRI_NAV_TIMEOUT (z. B. 30000) und NAUKRI_API_TIMEOUT (z. B. 60).

Ratenbegrenzung / tägliches Bewerbungslimit

Naukri begrenzt die täglichen Bewerbungen abhängig vom Kontotyp. Das daily_applied-Feld in Apply-Antworten zeigt Ihren Zähler. Naukri 360-Abonnenten erhalten höhere Limits.

Browser-Tab-Abstürze

Die PagePool stellt abgestürzte Tabs beim nächsten Start wieder her. Wenn das Problem persistiert, Server neu starten.

Token-Refresh-Schleifen

chrome-profile/ löschen und komplett neu authentifizieren.

naukri_sync scheitert in allen 3 Stufen

Normal bedeutet eine ungültige Sitzung. Zuerst einmelden. Wenn Sie bereits angemeldet sind, geben Sie porte=True ein.

AmbitionBox Gehälter/Bewertungen defekt

naukri_health_check ausführen, um zu bestätigen. Wenn AmbitionBox einen „warn“-Status liefert, sind die Naukri-Kern-Tools nicht betroffen.

Health Check / Gesundheitsprüfung

Führen Sie naukri_health_check() aus, um alle Integrationen gleichzeitig zu validieren. Es testet die Anmeldesitzung, die Profil-API, die Such-API (406 ist hier normal), Empfehlungen, Dashboard, Browser-Pool-Erreichbarkeit und AmbitionBox-Endpunkte.

Gibt {summary: {ok: N, warn: N, fail: N}, checks: [...]} mit Timing pro Prüfung zurück.


Remote-Zugriff

Führen Sie den Server auf Ihrer dauerhaften Maschine aus und verbinden Sie sich (dezentral) und überall (Web Claude in Coworking-Umgebungen, mobile Anwendungen, usw.). Zwei Authentifizierungsmodi werden unterstützt und können parallel auf demselben Server betrieben werden.

Schnellübersicht

Client

Authentifizierungsmodus

Begründung

Claude Code CLI

Bearer (MCP_SHARED_SECRET)

claude mcp add --transport http ... --header "Authorization: Bearer ..." funktioniert direkt

Claude Desktop

Bearer (MCP_SHARED_SECRET)

Unterstützt headers-Konfiguration in claude_desktop_config.json

Claude.ai Web

OAuth (MCP_OAUTH_ENABLED=1)

Web-UI verwendet OAuth (client_id/secret) – kein Bearer aus

Beides gleichzeitig

Bearer + OAuth (beide Umgebungsvariablen setzen)

Ein Server, load_access_token des OAuth-Anbieters fällt auf das gemeinsame shared_secret zurück

Schritt 1 — Geheimnisse erzeugen

# 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))"

Schritt 2 — .env konfigurieren

Kopieren Sie .env.example in .env und füllen Sie es aus. Die .env-Datei ist gitignored. Minimale Konfiguration für BEIDE Authentifizierungsmodi:

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

Wenn MCP_REMOTE=1 gesetzt, aber keine Authentifizierungsvariable, weigert sich der Server zu starten – das ist die Sicherheitsprüfung, die verhindert, dass ein unauthentifizierter MCP versehentlich öffentlich ins Internet gestellt wird.

Schritt 3 — Öffentlicher Hostname (Cloudflare Tunnel empfohlen)

Note: I notice that in my draft I accidentally had some places: "neue" etc. Let me review the output for accuracy — there are some errors in my draft above already. For instance:

  • "requirements-ci.txt, pinned to an exact commit" — my translation has "„gepinnt auf...“" etc.

  • There's a typo "das Editable Pakete deinstallation". Need to write "das editiere Paket deinstalliert".

Also my output contains "Starten den Server" (should be "Starten Sie den Server"). I must correct.

Also in the Resilience section, I wrote "Deduplizierte" with "?"? I must fix.

Given the final output I need to be clean and accurate. Let me write the final output carefully from scratch, verifying each sentence.

I will now produce the final answer. Note: Do not wrap in code fence. Only text. Need to be precise with punctuation and preserve the tables and bullets.

I need to consider the term "Playwright Chromium (installed via playwright int)" etc.

Also "applications.json" description "Written by apply, batch_apply, and sync." — keep "Trak" translation.

Also "Telefon" no.

Let me create a clean final output* naukri_agent_status() — Agent-Status + die letzten 5 Läufe + Konfigurationsübersicht

  • naukri_agent_config() — Vollständige Konfiguration

  • naukri_agent_update_config(updates) — Konfiguration per JSON patchen

  • naukri_agent_run_now(ctx=None) — Führt einen Beobachten→Entscheiden→Handeln→Lernen-Zyklus aus

  • naukri_agent_approve(cycle_id) — Wendet ausstehende Entscheidungen an

  • naukri_agent_reject(cycle_id) — Lehnt ausstehende Entscheidungen ab

  • naukri_agent_history(limit=10) — Verlauf der letzten Ausführungen

  • naukri_agent_decisions(cycle_id) — Entscheidungen pro Job für einen Zyklus

Hintergrund-Scheduler

  • naukri_scheduler_status() — Scheduler-Status + letzte Ausführung pro Aufgabe

  • naukri_enable_task(task_name) — Aktiviert eine deaktivierte Aufgabe

  • naukri_disable_task(task_name) — Deaktiviert eine Aufgabe

  • naukri_run_task_now(task_name) — Führt eine Aufgabe sofort aus

  • naukri_task_history(task_name=None, limit=20) — Verlauf der letzten Ausführungen

Erinnerungen & Vorstellungsgespräche

  • naukri_list_reminders(include_past=True, include_app_status=True) — Alle Erinnerungen mit Fälligkeitsstatus

  • naukri_set_reminder(job_id, days=7, ...) — Erinnerung erstellen/aktualisieren

  • naukri_interview_prep(job_id) — Vorbereitungspaket für das Vorstellungsgespräch

  • naukri_add_interview_round(job_id, round_type, ...) — Gesprächsrunde erfassen

  • naukri_list_interview_rounds(job_id=None) — Runden auflisten

  • naukri_compare_offers(job_ids) — Mehrere Jobangebote vergleichen

Dispatcher-Tools (nur noch 2 übrig — bewusst beibehalten)

  • naukri_company_intel(company, intel_type="salary|reviews|interviews") — Drei Aktionen teilen sich dieselbe company-Auflösung und den AmbitionBox-Auth-Ablauf; eine Aufteilung würde diese Orchestrierung duplizieren.

  • naukri_debug(action=...) — 16 Nur-Entwickler-Debug-Aktionen in den Bereichen Browser/API/Discovery; die Katalogkosten sind hier selbst mit progressivem Laden real, da die meisten Benutzer sie nie aufrufen.

Sonstiges

  • naukri_daily_brief — Morgen-Dashboard: 16 Quellen + empfohlene Aktionen

  • naukri_health_check — Endpoint-Validierung + Browser-Pool + AmbitionBox


Einrichtung

Voraussetzungen

  • Python 3.10+

  • Playwright Chromium (installiert über playwright install chromium)

Installation

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

Die jobcore-Abhängigkeit

Die Skill-Taxonomie, das Fit-Scoring und das Gehalts-Parsing leben in einem Schwesterpaket, jobcore; naukri_server/scoring.py und die domain/-Scoring-Module sind dünne Re-Export-Shims darüber. Es ist nicht auf PyPI, daher wird es auf eine von zwei Arten installiert, und die beiden Varianten werden bewusst getrennt gehalten:

wo

wie

warum

lokale Entwicklung

pip install -e ../jobcore

jobcore und naukri gemeinsam bearbeiten, keine Neuinstallation

CI

requirements-ci.txt, gepinnt auf einen exakten Commit

der Runner hat kein ../jobcore-Checkout

Fügen Sie die Git-URL nicht zu requirements.txt hinzu. Sie zerstört die Editable-Installation: Nach pip install -e ../jobcore deinstalliert ein späteres pip install -r requirements.txt das Editable-Paket und ersetzt es durch einen Git-Checkout – stillschweigend, da pip für eine Direkt-URL-Anforderung keine „already satisfied“-Zeile ausgibt. Gemessen auf einer sauberen venv am 20.08.2026 und zweimal reproduziert. Hier zählt die lokale Iteration mehr als der CI-Komfort, also ist die CI die Seite, die von Git installiert.

Wenn Sie die venv neu aufbauen oder ModuleNotFoundError: jobcore sehen, führen Sie pip install -e ../jobcore aus diesem Verzeichnis erneut aus.

Das Anheben des Pins in requirements-ci.txt ist die Art, wie eine jobcore-Änderung übernommen wird – bewusst ein sichtbarer, überprüfbarer Commit statt eines beweglichen @master, das die CI dieses Repos rot färben könnte, ohne dass sich hier etwas ändert.

Erste Anmeldung

Starten Sie den Server:

python naukri.py

Rufen Sie dann naukri_login(method="google") von Ihrem MCP-Client auf. Es öffnet sich ein sichtbares Chromium-Fenster, in dem Sie:

  1. Google SSO (empfohlen): Klicken Sie „Login with Google“ – nutzt die im Chrome-Profil gespeicherte Google-Sitzung, keine Anmeldedaten erforderlich.

  2. E-Mail/Passwort: Übergeben Sie method="email", email="...", password="...".

Die Browser-Sitzung wird in chrome-profile/ gespeichert (automatisch erstellt, gitignored). Dieses Verzeichnis ist maschinenspezifisch – es enthält Cookies, lokalen Speicher und zwischengespeicherte Anmeldedaten. Kopieren Sie es nicht zwischen Maschinen.

Sitzungsdauer

Sitzungen bleiben etwa 30 Tage bestehen. Bei Ablauf erkennt der Server das beim Start oder beim ersten API-Aufruf und gibt einen "Not logged in"-Fehler zurück. Authentifizieren Sie sich erneut mit naukri_login(method="google").

MCP-Client-Konfiguration

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

Umgebungsvariablen

Alle optional. In der Shell oder in einer .env-Datei setzen.

Variable

Default

Beschreibung

NAUKRI_NAV_TIMEOUT

20000

Playwright-Seitennavigation-Timeout (ms)

NAUKRI_ELEMENT_TIMEOUT

5000

Playwright-Elementwarte-Timeout (ms)

NAUKRI_API_TIMEOUT

30

aiohttp-REST-API-Timeout (Sekunden)

NAUKRI_MAX_TABS

3

Max. gleichzeitige Browser-Tabs im PagePool

Speicherorte der Datendateien

Alle Datendateien liegen im Projektstamm und sind gitignored.

Datei

Zweck

chrome-profile/

Persistenter Browserprofil von Playwright. Maschinenspezifisch, niemals einchecken.

applications.json

Lokale Bewerbungserfassung. Geschrieben von apply, batch_apply und sync.

saved_jobs.json

Lokal gespeicherte/gespeicherte Jobs. Geschrieben von saved_jobs und sync.

questions.json

Cache für Screening-Fragen-Antworten. Automatisch beim Bewerben befüllt, verwendet von batch_apply für automatische Antworten.

*.backup

Automatisches Backup vor jedem Überschreiben einer JSON-Datei (atomar schreiben: in .tmp, Backup erstellen, umbenennen).


Resilienz-Features

  • Global aiohttp-Session – eine gemeinsame Sitzung für alle REST-Aufrufe, vermeidet Verbindungsaufwand

  • Deduplizierte API-Ebene_api_request mit Decorator @api_tool normalisiert alle REST-Interaktionen

  • Refresh-Lock – Single-Writer-JWT-Refresh verhindert parallele 401-Stürme

  • Startvalidierung – Browser- und Token-Zustand werden vor der Annahme von Tool-Aufrufen validiert

  • Batch-Apply-Abbruchsicherheit – Teilfortschritt bleibt bei Unterbrechung erhalten

  • Datensicherung.backup-Dateien werden vor jedem JSON-Überschreiben erstellt

  • Cache-TTL-Automatik – veraltete Antwort-Cache-Einträge laufen automatisch ab

  • Atomare Schreibvorgänge – Sync-Zustand über temporäre Datei + Umbenennen, um Korruption zu vermeiden

  • Profil-TTL-Cache – Profildaten werden für 30 Sekunden zwischengespeichert, um redundante API-Aufrufe zu reduzieren


Bekannte Einschränkungen

Akamai-CDN-Sperren

Naukri verwendet Akamai Bot Manager. Einige Endpunkte geben 406 Not Acceptable oder 403 Forbidden zurück, wenn sie ohne Browser-Session direkt per REST aufgerufen werden:

  • Suche (naukri_search_jobs) – immer Browser-Intercept; direktes REST ist blockiert

  • Profil-Änderungen (naukri_update_profile()) – PUT/DELETE von Akamai blockiert; APIs

  • Job-Alerts – CRUD-Operationen laufen aus demselben Grund über die Browser-UI-Automatisierung

Das ist erwartetes Verhalten. Tools, die eine Browser-Interaktion erfordern, sind als solche dokumentiert. Falls Sie 406-Gründe von Tools sehen, die REST verwenden sollten, prüfen Sie Ihr Login mit naukri_auth_status() – ein abgelaufener Token führt dazu, dass Akamai die Anfragen als Bot-Traffic einstuft.

AmbitionBox-Scraping

AmbitionBox ist eine Next.js-SSR-Seite. Gehalts- und Bewertungs-Tools extrahieren __NEXT_DATA__ aus serverseitig gerenderten Seiten. Wenn AmbitionBox die Seitenstruktur ändert, können diese Tools Fehler zurückgeben. naukri_health_check enthält eine AmbitionBox-Prüfung – ein „warn“-Status dort ist gelegentlich zu erwarten und blockiert die Naukri-Kernfunktionen nicht.


Fehlerbehebung

Problem

Lösung

„Not logged in“-Fehler

Sitzung abgelaufen (~30 Tage). Führen Sie naukri_login(method="google") erneut aus, um sich zu authentifizieren.

Suche liefert leer / 406

Bei direkter REST-Nutzung erwartet. naukri_search_jobs verwendet Browser-Intercept und sollte funktionieren. Wenn es fehlschlägt, führen Sie naukri_health_check aus.

Timeouts bei langsamer Verbindung

Erhöhen Sie NAUKRI_NAV_TIMEOUT (z. B. 30000) und NAUKRI_API_TIMEOUT (z. B. 60).

Rate-Limit / tägliches Bewerbungslimit

Naukri begrenzt die täglichen Bewerbungen pro Kontotyp. Das Feld daily_job in Bewerbungsantworten zeigt Ihren Zähler. Naukri-360-Kunden haben höhere Limits.

Browser-Tab-Absturz

Das PagePool stellt beim Abruf einen Tab automatisch wieder her. Wenn das Problem bleibt, Server neu starten.

Token-Aktualisierungsschleifen

Löschen Sie chrome-profile/ und authentifizieren Sie sich neu von Null an.

naukri_sync scheitert auf allen 3 Ebenen

Normalerweise eine ungültige Sitzung. Zuerst einloggen. Wenn bereits angemeldet, force_browser=True verwenden.

AmbitionBox-Gehälter/Bewertungen defekt

Führen Sie naukri_health_check aus, um zu bestätigen. Wenn AmbitionBox „warn“ meldet, funktionieren die Naukri-Kern-Tools unabhängig weiter.

Health Check

Führen Sie naukri_health_check() aus, um alle Integrationen gleichzeitig zu überprüfen. Er testet Login-Sitzung, Profil-API, Such-API (406 hier normal), Empfehlungen, Dashboard, Browser-Pool-Erreichbarkeit und AmbitionBox-Scraping.

Gibt {summary: {ok: N, warn: N, fail: N}, checks: [...]} und die Zeit pro Check zurück.


Remote-Zugriff

Starten Sie den Server auf Ihrer ständig eingeschalteten Maschine und verbinden Sie sich von überall aus (Web Claude in coworking-Umgebungen, Mobilgerät usw.). Zwei Authentifizierungsmodi werden unterstützt und können parallel auf demselben Server laufen.

Schnellentscheidung

Client

Authentifizierungsmodus

Grund

Claude Code CLI

Bearer (MCP_SHARED_SECTRET)

claude mcp add --transport http ... --header "Authorization: Bearer ..." funktioniert direkt

Claude Desktop

Bearer(MCP_SHARED_SECRET)

Unterstützt die headers-Konfiguration in claude_desktop_config.json

Claude.ai im Web

OAuth (MCP_OAT_HE_ENABLED=1)

Web-UI zeigt nur OAuth client_id/secret-Felder an, kein Bearer-Token.

Beides gleichzeitig

Bearer + OAuth (beide Umgebungsvariablen setzen)

Ein Server, load_access_token des OAuth-Anbieters fällt auf das gemeinsame Secret zurück.

Step 1 — Geheimnisse erzeugen

# 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))"

Schritt 2 — .env konfigurieren

Kopieren Sie .env.example nach .env und füllen Sie es aus. .env-Datei ist gitignored. Minimale Konfiguration, um BEIDE Auth-Modi zu aktivieren:

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

Wenn MCP_REMOTE=1 gesetzt, aber keine Auth-Umgebungsvariable vorhanden ist, verweigert weder der Server den Start – das ist die Sicherheitsprüfung, die verhindert, versehentlich einen unauthentifizierten MCP im Internet öffentlich zu machen.

Schritt 3 — Öffentlicher Hostname (Cloudflare Tunnel empfohlen)

Cloudflare Tunnel bietet Ihnen eine stabile öffentliche HTTPS-URL, ohne Firewall-Ports öffnen zu müssen. Kostenlose Stufe, unbegrenzte Bandbreite.

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

Bearbeiten Sie %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

Führen Sie den Tunnel aus: cloudflared tunnel run naukri-mcp (oder cloudflared service install für Autostart).

Alternativen: Tailscale Funnel (Peer-to-Peer, geringere Latenz für vertrauenswürdige Geräte) oder ngrok (einfacher, aber die kostenlose Stufe hat Limits).

Schritt 4 — Server starten

# 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

In den Logs sollten Auth: OAuth provider enabled (issuer=https://naukri.<your-domain>, bearer-fallback=yes) und HTTP mode: 0.0.0.0:8321 erscheinen.

Schritt 5 — Clients verbinden

Claude Code CLI (verwendet Bearer):

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

Claude Desktop (verwendet Bearer):

In claude_desktop_config.json:

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

Claude.ai Web (verwendet OAuth):

Einstellungen → Connectors → Benutzerdefinierten Connector hinzufügen

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

  • OAuth Client ID: claude-ai-web (entspricht MCP_OAUTH_CLIENT_ID)

  • OAuth Client Secret: MCP_OAUTH_CLIENT_SECRET einfügen

Claude.ai erkennt die OAuth-Metadaten automatisch (FastMCP stellt .well-known/oauth-authorization-server sowie die Endpunkte /authorize + /token bereit).

Smoke-Test (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 .

Härtung des Windows-Hosts

Das MCP benötigt eine sichtbare Chrome-Sitzung (headed), daher muss der Host-Rechner eingeschaltet und angemeldet bleiben.

# 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

Verhalten

Ergebnis

Sperrbildschirm

Chrome bleibt aktiv, MCP funktioniert

Abmeldung

Chrome wird beendet, MCP schlägt fehl — Benutzersitzung aktiv halten

RDP-Trennung

Prozess läuft auf dem Host weiter, MCP funktioniert

Standbymodus

Chrome genießt, aber laufende Anfragen schlagen fehl — Standbymodus deaktivieren

Manuelle Chrome-Nutzung

Chrome unter Windows kann nicht zwei Instanzen mit unterschiedlichem --user-data-dir ausführen. Öffnen Sie dasselbe Profil nicht manuell, während das MCP läuft.

Überwachung

Cloudflares Status „tunnel healthy“ gibt nur die Verbindung zwischen Edge und cloudflared wider, nicht den Origin. Fügen Sie einen externen Uptime-Probe hinzu (z. B. UptimeRobot, kostenlos), der https://naukri.<your-domain>/.well-known/oauth-authorization-server abruft (200 erwartet), damit Sie benachrichtigt werden, wenn der Host-Rechner tatsächlich nicht erreichbar ist.

Referenz der Auth-Modi

Umgebungsvariable

Erforderlich für

Hinweise

MCP_REMOTE=1

Öffentliche Bindung

Ohne diese Variable bleibt der Server auf 127.0.0.1

MCP_PORT

Benutzerdefinierter Port

Standard: 8321

MCP_PUBLIC_URL

OAuth-Issuer-/RS-Metadaten

Standardmäßig http://localhost:8321

MCP_SHARED_SECRET

Bearer-Authentifizierung

>=32 Zeichen; rotieren durch Ändern der Env-Variable + Neustart

MCP_OAUTH_ENABLED=1

OAuth-Flow

Aktiviert /authorize, /token, /register, /revoke

MCP_OAUTH_CLIENT_ID

OAuth

Vorab registrierte Client-ID für claude.ai

MCP_OAUTH_CLIENT_SECRET

OAuth

>=32 Zeichen

MCP_OAUTH_AUTO_APPROVE

OAuth-UX

1 überspringt den Zustimmungsbildschirm (Standard), 0 zeigt die Seite „Genehmigen/Ablehnen“ unter /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