Naukri MCP Server
Naukri MCP Server
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)Unternehmensrecherche –
naukri_research_companyplus AmbitionBox-Brücke für Gehaltsdaten und MitarbeiterbewertungenPerformance-Analysen –
naukri_search_impressions,naukri_recruiter_activity,naukri_activity_levelSmarte Automatisierung –
naukri_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 |
| Schnell, kein Browser-Tab nötig. Verwendet das JWT-Token aus Browser-Cookies. |
Browser-Intercept |
| 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 |
| Erfordert Klicks auf Schaltflächen, das Ausfüllen von Formularen und den Umgang mit SSO-Popups. Akamai blockiert PUT/DELETE über REST. |
AmbitionBox-Scraping |
| Extrahiert |
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:
REST-API – paginierte GET-Anfrage an den Historien-Endpunkt (am schnellsten und zuverlässigsten)
Browser-Intercept – zur Seite „Beworbene Jobs“ navigieren und die XHR-Antwort abfangen
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 resumeDetails 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/Passwortnaukri_verify_otp(otp)– OTP nach dem Login bestätigennaukri_auth_status()– Sitzungsgültigkeit prüfen
Jobsuche & Entdeckung
naukri_search_jobs– Stichwortsuche mit Browser-Interceptnaukri_get_recommendations– Personalisierte Job-Empfehlungennaukri_get_job(job_id)– Vollständige Jobdetailsnaukri_similar_jobs(job_id)– Ähnliche Jobs findennaukri_compare_jobs(job_ids)– Gegenüberstellung mit Fit-Scoresnaukri_bulk_fetch_jobs(job_ids)– Bis zu 20 Jobs in einem Aufrufnaukri_job_detail_v1(job_id)– Walk-in-Details, Kontaktinfosnaukri_report_fraud(job_id, reason)– Betrügerische Anzeige meldennaukri_auto_hunt– Automatisierte Jobsuche mit Fit-Scoring in einem Aufruf
Bewerbung & Tracking
naukri_apply(job_id, set_reminder_days=...)– Einzelbewerbung mit automatischer Erinnerungnaukri_batch_apply(keywords=...)– Massenbewerbung aus der Suchenaukri_assess_fit(job_id, apply_if_fit=False)– Fit-Bewertung (automatisches Bewerben optional)naukri_score_saved_jobs(min_fit_score=60)– Alle gespeicherten Jobs bewertennaukri_apply_top_fits(min_fit_score=70, limit=10)– Bewertung und automatische Bewerbung auf die besten Treffernaukri_list_applications(...)– Lokale Tracking-Daten abfragennaukri_get_application(job_id)– Detaillierter Bewerbungsstatusnaukri_purge_applications(before_date)– Alte Datensätze löschennaukri_stale_applications(...)– Veraltete Bewerbungen erkennennaukri_follow_up_priority(...)– Posteingang und Erinnerungen abgleichennaukri_draft_follow_up(job_id)– Nachverfolgungsentwurf erstellennaukri_recruiter_history()– Kommunikationshistorie pro Unternehmen
Synchronisation & Export
naukri_sync_applications(force_browser=False, days_back=365)– 3-stufiger Syncnaukri_sync_saved(force_browser=False)– Gespeicherte Jobs synchronisierennaukri_export_data(data_type, export_format="json")– Nach JSON/CSV exportieren
Gespeicherte Jobs
naukri_list_saved_jobs(limit=50, page=1)– Gespeicherte/gebookmarkte Jobs auflistennaukri_save_job(job_id, ...)– Job speichernnaukri_unsave_job(job_id)– Gespeicherten Job entfernennaukri_sync_saved_jobs()– Vom Naukri-Server abrufen
Posteingang (Recruiter-Nachrichten)
naukri_list_inbox(limit=20, unread_only=False)– Nachrichten auflistennaukri_read_message(message_id, vcard_id, unique_id)– Vollständige Nachricht lesennaukri_mark_interested(mail_id, conversation_id, interested=True)– Interesse signalisierennaukri_accept_nvite(nvite_job_id, ...)– Über NVite bewerben
Benachrichtigungen
naukri_list_notifications(limit=20, page=1, notif_type=None)– Gefilterte Listenaukri_notification_count()– Anzahl ungelesener Benachrichtigungennaukri_mark_notification_read(notification_id, date)– Einzelne Benachrichtigung als gelesen markierennaukri_mark_all_notifications_read()– Alle als gelesen markierennaukri_notification_summary()– Zusammengefasstes Dashboard
Profil
naukri_get_profile()– Vollständiges Profilnaukri_update_profile(fields, ...)– Profilfelder aktualisierennaukri_audit_profile()– Vollständigkeit plus Tippsnaukri_boost_profile(randomize=False)– Headline erneut speichern für mehr Sichtbarkeitnaukri_dashboard()– Profil-Dashboard-Datennaukri_profile_targeting()– DFP-Targeting-Ansicht
Lebenslauf & Foto
naukri_resume_info()– Metadaten des Lebenslaufsnaukri_upload_resume(file_path)– PDF/DOC/DOCX hochladennaukri_download_resume(save_path)– Herunterladen als lokale Dateinaukri_photo_info()– Metadaten des Fotosnaukri_upload_photo(file_path)– PNG/JPG/JPEG/GIF hochladennaukri_delete_photo()– Profilfoto entfernen
Insights & Analysen
naukri_application_insights(days=30)– Statusverteilung plus Geschwindigkeitnaukri_salary_position(designation=...)– Gehaltspositionierungnaukri_cached_answers(action="list|update|delete", key=..., new_answer=...)– Zwischengespeicherte Antworten verwaltennaukri_match_analytics(days=30)– Match-Score-Aufschlüsselung nach Feldnaukri_match_quality(days=30)– Aggregierte Match-Qualitätnaukri_skill_gap(...)– Skill-Lücke im Vergleich zur Marktnachfragenaukri_salary_benchmark(keywords, ...)– Gehalts-Benchmark für den Marktnaukri_taxonomy()– Rollen-Taxonomie von Naukri (37 Abteilungen × 167 Kategorien × 1461 Rollen)naukri_profile_prompts()– Offene Aktionen zur Vervollständigung des Profilsnaukri_conversion_funnel(days=30)– Trichter von Bewerbung zum Vorstellungsgesprächnaukri_status_changes(days=30)– Statuswechsel erkennen
Performance
naukri_search_impressions(days=7)– Sichtbarkeitsstatistiken in Suchennaukri_recruiter_activity(page=1, limit=100, filter_by=None)– Recruiter-Aktionen am Profilnaukri_activity_level()– Aktuelle Profilaktivität
Unternehmen
naukri_search_companies(keyword, page=1, limit=10)– Unternehmen findennaukri_company_jobs(group_id, ...)– Jobs bei einem Unternehmennaukri_company_slug(group_id)– AmbitionBox-Slug (einzein oder per Komma getrennt als Batch)naukri_research_company(keyword, ...)– Naukri + AmbitionBox kombiniertnaukri_follow_company(group_id|group_ids, action="follow|unfollow")– Unternehmen folgen/nicht mehr folgennaukri_follow_status(group_id|group_ids)– Suche den Follow-Status abnaukri_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 auflistennaukri_check_email()– E-Mail/Mobilnummer-Verifizierungsstatusnaukri_visibility()– Resdex-Sichtbarkeitsoptionennaukri_notification_prefs()– E-Mail/SMS/Push/WhatsApp-Einstellungennaukri_subscription_status()– Naukri-360-Abo plus Funktionen
Job-Alerts
naukri_list_alerts()– Alle Job-Alerts aus gespeicherten Suchennaukri_alert_detail(alert_id)– Einzelheiten zu einem Alertnaukri_create_alert(name, keywords, ...)– Neuen Alert erstellennaukri_update_alert(alert_id, ...)– Alert-Felder bearbeitennaukri_delete_alert(alert_id)– Alert löschen
Early Access (Rollen vor Veröffentlichung)
naukri_list_early_access(...)– Vorab veröffentlichte Rollen von Top-Unternehmen durchsuchennaukri_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-Stufenaukri_tailor_resume(job_id, ...)– Anpassungsvorschläge für einen bestimmten Job
Mock-Interviews (KI)
naukri_mock_interview_topics()– Verfügbare Themen plus Bearbeitungsstatusnaukri_mock_interview_history()– Vergangene Interviews mit Ergebnisse/Feedbacknaukri_start_mock_interview(job_id)– JD-basiertes Mock-Interview startennaukri_answer_mock_interview(test_id, topic_id, question_id, answer)– Antwort abgebennaukri_mock_interview_prep(job_id)– Vorbereitungspaket für das Interview
Autonomer Agent
naukri_agent_status()— Agentstatus + die letzten 5 Läufe + Konfigurationsübersichtnaukri_agent_config()— Vollständige Konfigurationnaukri_agent_update_config(updates)— Konfiguration per JSON patchennaukri_agent_run_now(ctx=None)— Führt einen Zyklus aus Beobachten → Entscheiden → Handeln → Lernen ausnaukri_agent_approve(cycle_id)— Wendet ausstehende Entscheidungen annaukri_agent_reject(cycle_id)— Lehnt ausstehende Entscheidungen abnaukri_agent_history(limit=10)— Verlauf der letzten Ausführungennaukri_agent_decisions(cycle_id)— Entscheidungen pro Job für einen Zyklus
Hintergrund-Scheduler
naukri_scheduler_status()— Scheduler-Zustand + Informationen zum letzten Lauf pro Aufgabenaukri_enable_task(task_name)— Aktiviert eine deaktivierte Aufgabenaukri_disable_task(task_name)— Deaktiviert eine Aufgabenaukri_run_task_now(task_name)— Führt eine Aufgabe sofort ausnaukri_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älligkeitsstatusnaukri_set_reminder(job_id, days=7, ...)— Erinnerung erstellen/aktualisierennaukri_interview_prep(job_id)— Vorbereitungspaket für das Vorstellungsgesprächnaukri_add_interview_round(job_id, round_type, ...)— Gesprächsrunde erfassennaukri_list_interview_rounds(job_id=None)— Runden auflistennaukri_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 dieselbecompany-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 Aktionennaukri_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 chromiumDie 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 |
| jobcore und naukri zusammen bearbeiten, keine Neuinstallation |
CI |
| der Runner hat keinen |
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.pyRufen Sie dann naukri_login(method="google") aus Ihrem MCP-Client auf. Es öffnet sich ein
sichtbares Chromium-Fenster, in dem Sie:
Google SSO (empfohlen): Klicken Sie „Login with Google“ – verwendet die im Chrome-Profil gespeicherte Google-Sitzung, keine Anmeldedaten erforderlich.
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 |
|
| Playwright-Seitennavigations-Timeout (ms) |
|
| Playwright-Element-Warte-Timeout (ms) |
|
| aiohttp-REST-API-Timeout (Sekunden) |
|
| Maximale gleichzeitige Browser-Tabs im PagePool |
Speicherorte der Datendateien
Alle Datendateien liegen im Projekt-Root und sind gitignert.
Datei | Zweck |
| Persistente Browserprofil von Playwright. Maschinenspezifisch, niemals konservieren. |
| Lokale Anwendungsverfolgung. Geschrieben von |
| Lokal gespeicherte/Lesezeichen-Job Across. Geschrieben von |
| Cache für Screening-Fragen-Antworten. Automatisch beim Bewerben befüllt, von |
| Automatisches Backup vor jeder JSON-Überschreibung (atomic schreiben: in |
Resilienz-Features
Globale aiohttp-Sitzung – eine einzige gemeinsam genutzte Sitzung für alle REST-Aufrufe, vermeidet Verbindungs-Overhead
Deduplizierte API-Ebene –
_api_requestmit@api_tool-Dekorateur normalisiert alle REST-InteraktionenRefresh-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 erstelltCache-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 blockiertProfiländerungen (
naukri_update_profile()) – PUT/DELETE von Akamai blockiert; stattdessen Browser-AutomatisierungJob-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 |
Suche liefert leer / 406 | Erwartet für direkten REST. |
Timeouts bei langsamen Verbindungen | Erhöhen Sie |
Ratenbegrenzung / tägliches Bewerbungslimit | Naukri begrenzt die täglichen Bewerbungen abhängig vom Kontotyp. Das |
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 |
|
| Normal bedeutet eine ungültige Sitzung. Zuerst einmelden. Wenn Sie bereits angemeldet sind, geben Sie |
AmbitionBox Gehälter/Bewertungen defekt |
|
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 ( |
|
Claude Desktop | Bearer ( | Unterstützt |
Claude.ai Web | OAuth ( | Web-UI verwendet OAuth ( |
Beides gleichzeitig | Bearer + OAuth (beide Umgebungsvariablen setzen) | Ein Server, |
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=1Wenn 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 Konfigurationnaukri_agent_update_config(updates)— Konfiguration per JSON patchennaukri_agent_run_now(ctx=None)— Führt einen Beobachten→Entscheiden→Handeln→Lernen-Zyklus ausnaukri_agent_approve(cycle_id)— Wendet ausstehende Entscheidungen annaukri_agent_reject(cycle_id)— Lehnt ausstehende Entscheidungen abnaukri_agent_history(limit=10)— Verlauf der letzten Ausführungennaukri_agent_decisions(cycle_id)— Entscheidungen pro Job für einen Zyklus
Hintergrund-Scheduler
naukri_scheduler_status()— Scheduler-Status + letzte Ausführung pro Aufgabenaukri_enable_task(task_name)— Aktiviert eine deaktivierte Aufgabenaukri_disable_task(task_name)— Deaktiviert eine Aufgabenaukri_run_task_now(task_name)— Führt eine Aufgabe sofort ausnaukri_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älligkeitsstatusnaukri_set_reminder(job_id, days=7, ...)— Erinnerung erstellen/aktualisierennaukri_interview_prep(job_id)— Vorbereitungspaket für das Vorstellungsgesprächnaukri_add_interview_round(job_id, round_type, ...)— Gesprächsrunde erfassennaukri_list_interview_rounds(job_id=None)— Runden auflistennaukri_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 dieselbecompany-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 Aktionennaukri_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 chromiumDie 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 |
| jobcore und naukri gemeinsam bearbeiten, keine Neuinstallation |
CI |
| der Runner hat kein |
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.pyRufen Sie dann naukri_login(method="google") von Ihrem MCP-Client auf. Es öffnet sich ein
sichtbares Chromium-Fenster, in dem Sie:
Google SSO (empfohlen): Klicken Sie „Login with Google“ – nutzt die im Chrome-Profil gespeicherte Google-Sitzung, keine Anmeldedaten erforderlich.
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 |
|
| Playwright-Seitennavigation-Timeout (ms) |
|
| Playwright-Elementwarte-Timeout (ms) |
|
| aiohttp-REST-API-Timeout (Sekunden) |
|
| Max. gleichzeitige Browser-Tabs im PagePool |
Speicherorte der Datendateien
Alle Datendateien liegen im Projektstamm und sind gitignored.
Datei | Zweck |
| Persistenter Browserprofil von Playwright. Maschinenspezifisch, niemals einchecken. |
| Lokale Bewerbungserfassung. Geschrieben von |
| Lokal gespeicherte/gespeicherte Jobs. Geschrieben von |
| Cache für Screening-Fragen-Antworten. Automatisch beim Bewerben befüllt, verwendet von |
| Automatisches Backup vor jedem Überschreiben einer JSON-Datei (atomar schreiben: in |
Resilienz-Features
Global aiohttp-Session – eine gemeinsame Sitzung für alle REST-Aufrufe, vermeidet Verbindungsaufwand
Deduplizierte API-Ebene –
_api_requestmit Decorator@api_toolnormalisiert alle REST-InteraktionenRefresh-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 erstelltCache-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 blockiertProfil-Änderungen (
naukri_update_profile()) – PUT/DELETE von Akamai blockiert; APIsJob-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 |
Suche liefert leer / 406 | Bei direkter REST-Nutzung erwartet. |
Timeouts bei langsamer Verbindung | Erhöhen Sie |
Rate-Limit / tägliches Bewerbungslimit | Naukri begrenzt die täglichen Bewerbungen pro Kontotyp. Das Feld |
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 |
| Normalerweise eine ungültige Sitzung. Zuerst einloggen. Wenn bereits angemeldet, |
AmbitionBox-Gehälter/Bewertungen defekt | Führen Sie |
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 ( |
|
Claude Desktop | Bearer( | Unterstützt die |
Claude.ai im Web | OAuth ( | Web-UI zeigt nur OAuth |
Beides gleichzeitig | Bearer + OAuth (beide Umgebungsvariablen setzen) | Ein Server, |
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=1Wenn 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:404Fü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 --httpIn 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>/mcpOAuth Client ID:
claude-ai-web(entsprichtMCP_OAUTH_CLIENT_ID)OAuth Client Secret:
MCP_OAUTH_CLIENT_SECRETeinfü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 0Verhalten | 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 |
Ü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 |
| Öffentliche Bindung | Ohne diese Variable bleibt der Server auf |
| Benutzerdefinierter Port | Standard: |
| OAuth-Issuer-/RS-Metadaten | Standardmäßig |
| Bearer-Authentifizierung | >=32 Zeichen; rotieren durch Ändern der Env-Variable + Neustart |
| OAuth-Flow | Aktiviert |
| OAuth | Vorab registrierte Client-ID für |
| OAuth | >=32 Zeichen |
| OAuth-UX |
|
This server cannot be installed
Maintenance
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
- FlicenseNot gradedqualityDmaintenanceEnables AI-driven job application automation for LinkedIn and SEEK platforms with intelligent cover letter generation, automated application submission, and application tracking management. Supports anti-detection measures and complies with platform usage policies for safe job hunting automation.
- AlicenseAqualityAmaintenanceEnables AI assistants to interact with LinkedIn by scraping profiles, companies, job postings, and getting personalized job recommendations using authenticated browser automation.173,204Apache 2.0
- AlicenseBqualityCmaintenanceProvides tools to search & auto-apply to jobs directly on company websites, generate custom resumes, get contacts of recruiters and referrals and track applications easily3510520MIT
- FlicenseNot gradedqualityDmaintenanceAutomates job application tracking and resume/cover letter generation using AI, integrating with Google Drive, Notion, and Gmail.1
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.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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