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_profilenaukri_update_profile),提升曝光度(naukri_boost_profile

  • 公司调研 -- naukri_research_company 加 AmbitionBox 桥接,获取薪资数据与员工评价

  • 效果分析 -- naukri_search_impressionsnaukri_recruiter_activitynaukri_activity_level

  • 智能自动化 -- naukri_auto_hunt(一键求职并带匹配度评分)、naukri_daily_brief(每日晨间面板)、naukri_tailor_resumenaukri_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_recommendationsnaukri_sync、大多数读取操作

速度快,不需要打开浏览器标签页。使用从浏览器 cookie 中提取的 JWT 令牌。

浏览器拦截

naukri_search_jobsnaukri_company_jobs()naukri_jobs(备用)

直接 REST 请求搜索 API 会返回 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(薪资、评价、面试)

从服务端渲染的 Next.js 页面中提取 __NEXT_DATA__

PagePool

服务器维护一个包含 3 个浏览器标签页的池(可通过 NAUKRI_MAX_TABS 配置)。标签页通过信号量借出,崩溃后自动恢复,使用后归还。这使得批量投递等并发操作可以并行运行,而无需打开过多标签页。

TokenManager

JWT 认证令牌(nauk_at cookie)从 Playwright 浏览器上下文中提取并缓存到内存。遇到 401 错误时,单写入者刷新锁可防止并行刷新风暴——一个请求负责刷新,其他请求等待并复用结果。

3 层同步回退

naukri_sync_applications() 会按顺序尝试三种策略:

  1. REST API -- 对历史记录端点进行分页 GET(最快、最可靠)

  2. 浏览器拦截 -- 导航到已投递职位页面并捕获 XHR 响应

  3. HTML 抓取 -- 使用自适应 CSS 选择器从服务端渲染的 DOM 中提取职位卡片


Related MCP server: LinkedIn MCP Server

AI 用户快速入门

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

**投递流程详情:**如果职位带筛选问题,第一次调用 naukri_apply() 会返回这些问题;在第二次调用时把答案传回。答案键采用模糊匹配——"current ctc" 能够匹配 "What is your current CTC?"。答案会缓存在 questions.json 中,因此每种类型的问题你只需要回答一次。


工具(117 个原子化工具)

几乎所有工具都遵循单一用途原子模式——每个操作对应一个 MCP 工具。只有 naukri_company_intelnaukri_debug 保留了 action/intel_type 参数(原因见下方“Dispatcher 工具”小节)。这个目录是为 Claude Code 的渐进式 Tool Search 加载(自 2026 年 1 月起默认)设计的,因此大量专注单一职责的工具在成本上并不比少数多用途工具更高。

认证

  • naukri_login(method=...) — Google 单点登录或邮箱/密码

  • naukri_verify_otp(otp) — 登录后提交 OTP

  • naukri_auth_status() — 检查会话是否有有效

职位搜索与发现

  • naukri_search_jobs — 通过浏览器拦截实现关键词搜索

  • naukri_get_recommendations — 个性化职位推荐

  • naukri_get_job(job_id) — 完整职位详情

  • naukri_similar_jobs(job_id) — 查找类似职位

  • naukri_compare_jobs(job_ids) — 并排比较并附匹配度评分

  • naukri_bulk_fetch_jobs(job_ids) — 一次调用最多获取 20 个职位

  • naukri_job_detail_v1(job_id) — Walk-in 信息、联系方式

  • naukri_report_fraud(job_id, reason) — 举报虚假职位信息

  • naukri_auto_hunt — 一键自动求职并带匹配度评分

投递与跟踪

  • naukri_apply(job_id, set_reminder_days=...) — 单次投递并自动设置提醒

  • naukri_batch_apply(keywords=...) — 根据搜索条件批量投递

  • naukri_assess_fit(job_id, apply_if_fit=False) — 匹配度评估(可选自动投递)

  • naukri_score_saved_jobs(min_fit_score=60) — 对全部收藏职位评分

  • naukri_apply_top_fits(min_fit_score=70, limit=10) — 评分并自动投递最佳匹配

  • naukri_list_applications(...) — 查询本地投递记录

  • naukri_get_application(job_id) — 详细投递状态

  • naukri_purge_applications(before_date) — 删除旧记录

  • naukri_stale_applications(...) — 检测失效投递

  • naukri_follow_up_priority(...) — 结合收件箱与提醒计算跟进优先级

  • naukri_draft_follow_up(job_id) — 生成跟进消息

  • naukri_recruiter_history() — 按公司的沟通历史

同步与导出

  • naukri_sync_applications(force_browser=False, days_back=365) — 3 层同步

  • naukri_sync_saved(force_browser=False) — 同步收藏职位

  • naukri_export_data(data_type, export_format="json") — 导出为 JSON/CSV

收藏职位

  • naukri_list_saved_jobs(limit=50, page=1) — 列出已收藏/书签职位

  • naukri_save_job(job_id, ...) — 收藏职位

  • naukri_unsave_job(job_id) — 取消收藏职位

  • naukri_sync_saved_jobs() — 从 Naukri 服务器拉取

收件箱(招聘方消息)

  • naukri_list_inbox(limit=20, unread_only=False) — 列出消息

  • naukri_read_message(message_id, vcard_id, unique_id) — 阅读完整消息

  • naukri_mark_interested(mail_id, conversation_id, interested=True) — 标记为感兴趣

  • naukri_accept_nvite(nvite_job_id, ...) — 通过 NVite 投递

通知

  • naukri_list_notifications(limit=20, page=1, notif_type=None) — 筛选列表

  • naukri_notification_count() — 未读数量

  • naukri_mark_notification_read(notification_id, date) — 标记单个已读

  • naukri_mark_all_notifications_read() — 全部标记为已读

  • naukri_notification_summary() — 统一摘要面板

个人资料

  • naukri_get_profile() — 完整个人资料

  • naukri_update_profile(fields, ...) — 更新个人资料字段

  • naukri_audit_profile() — 完整度检查与建议

  • naukri_boost_profile(randomize=False) — 重新保存标题以提升可见性

  • naukri_dashboard() — 个人资料面板数据

  • naukri_profile_targeting() — DFP 定向视图

简历与照片

  • naukri_resume_info() — 简历元数据

  • naukri_upload_resume(file_path) — 上传 PDF/DOC/DOCX

  • naukri_download_resume(save_path) — 下载到本地文件

  • naukri_photo_info() — 照片元数据

  • naukri_upload_photo(file_path) — 上传 PNG/JPG/JPEG/GIF

  • naukri_delete_photo() — 删除个人资料照片

洞察与分析

  • naukri_application_insights(days=30) — 状态细分与节奏

  • naukri_salary_position(designation=...) — 薪资定位

  • naukri_cached_answers(action="list|update|delete", key=..., new_answer=...) — 管理缓存答案

  • naukri_match_analytics(days=30) — 各字段匹配度细分

  • naukri_match_quality(days=30) — 整体匹配质量

  • naukri_skill_gap(...) — 技能与市场需求差距分析

  • naukri_salary_benchmark(keywords, ...) — 市场薪资基准

  • naukri_taxonomy() — Naukri 职位分类体系(37 部门 × 167 类 × 1461 个角色)

  • naukri_profile_prompts() — 待完成的资料完善动作

  • naukri_conversion_funnel(days=30) — 从投递到面试的转化漏斗

  • naukri_status_changes(days=30) — 检测状态变化

效果表现

  • naukri_search_impressions(days=7) — 搜索结果展示统计

  • naukri_recruiter_activity(page=1, limit=100, filter_by=None) — 招聘方在您资料上的操作

  • naukri_activity_level() — 当前资料活跃度

公司

公司

  • naukri_search_companies(keyword, page=1, limit=10) — 查找公司

  • naukri_company_jobs(group_id, ...) — 某公司的职位

  • naukri_company_slug(group_id) — AmbitionBox slug(单个或逗号分隔的批量)

  • 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) — 执行一次“观察→决策→行动→学习”循环

  • naukri_agent_approve(cycle_id) — 批准待处理的决策

  • naukri_agent_reject(cycle_id) — 拒绝待处理的决策

  • naukri_agent_history(limit=10) — 最近的运行历史

  • naukri_agent_decisions(cycle_id) — 单次循环中每个职位的决策

后台调度器

  • naukri_scheduler_status() — 调度器状态 + 每个任务最近运行的信息

  • naukri_enable_task(task_name) — 启用已禁用的任务

  • naukri_disable_task(task_name) — 禁用任务

  • naukri_run_task_now(task_name) — 立即执行任务

  • naukri_task_history(task_name=None, limit=20) — 最近运行历史

提醒与面试

  • naukri_list_reminders(include_past=True, include_app_status=True) — 所有提醒及到期状态

  • naukri_set_reminder(job_id, days=7, ...) — 创建/更新提醒

  • naukri_interview_prep(job_id) — 面试准备资料包

  • naukri_add_interview_round(job_id, round_type, ...) — 跟踪面试轮次

  • naukri_list_interview_rounds(job_id=None) — 列出面谈轮次

  • naukri_compare_offers(job_ids) — 比较多个职位录用条件

分发工具(仅剩 2 个——按设计保留)

  • naukri_company_intel(company, intel_type="salary|reviews|interviews") — 三种操作共享同一个 company 解析和 AmbitionBox 认证流程;拆分会导致编排逻辑重复。

  • naukri_debug(action=...) — 16 个仅限开发环境使用的调试操作,分布在浏览器/API/发现模块;即使使用渐进加载,目录开销仍然真实存在,因为大多数用户不会调用它们。

其他

  • naukri_daily_brief — 晨间仪表板:16 个数据源 + 推荐操作

  • naukri_health_check — 端点检查 + 浏览器池 + AmbitionBox


设置

前置条件

  • Python 3.10+

  • Playwright Chromium(通过 playwright install chromium 安装)

安装

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

jobcore 依赖

技能分类、匹配度评分和薪资解析位于同级包 jobcore 中;naukri_server/scoring.pydomain/ 评分模块只是其瘦层再导出。它不在 PyPI 上,因此有两种安装方式,且二者有意加以区分:

环境

方式

原因

本地开发

pip install -e ../jobcore

可同时修改 jobcore 和 Naukri 代码,无需重新安装

CI

requirements-ci.txt,固定到指定 commit

CI 运行环境没有 ../jobcore 目录

不要把 git URL 添加到 requirements.txt 这会破坏可编辑安装:在 pip install -e ../jobcore 之后,后再执行 pip install -r requirements.txt 会卸载可编辑安装包并用 git 检出替换,而且过程是静默的, 因为 pip 不会为直接 URL 依赖打印 “already satisfied”。该行为已在干净的 venv 环境中 2026-08-20 验证并复现两次。这里本地迭代优先于 CI 便利性, 因此 CI 端才从 git 安装依赖。

如果你重建了 venv,或看到 ModuleNotFoundError: jobcore,请在本目录下重新运行 pip install -e ../jobcore

升级 requirements-ci.txt 中的固定版本是采纳 jobcore 变更的方式—— 有意选择一个可见、可审查的提交,而不是指向不特定 @master 的动态引用, 这可能在不修改任何本仓库代码的情况下导致 CI 变红。

首次登录

启动服务器:

python naukri.py

然后从 MCP 客户端调用 naukri_login(method="google") 方法。它会打开一个可见的 Chromium 窗口,你可以在其中:

  1. Google SSO(推荐): 点击 “Login with Google” -- 使用 Chrome 配置文件中保存的 Google 会话,无需凭据。

  2. 邮箱/密码: 传入 method="email"email="..."password="..."

浏览器会话存储在 chrome-profile/(自动创建,已 gitignore)。该目录与特定机器绑定:它包含 cookies、本地存储和缓存凭据。请勿在不同机器间复制。

会话有效期

会话大约持续 30 天。失效时,服务器会在启动时或首次 API 调用时检测到并返回 "Not logged in" 错误。使用 naukri_login(method="google") 重新身份验证。

MCP 客户端配置

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

环境变量

所有变量都是可选的。可在 shell 或者 .env 文件中设置。

变量

默认值

说明

NAUKRI_NAV_TIMEOUT

20000

Playwright 页面导航超时(毫秒)

NAUKRI_ELEMENT_TIMEOUT

5000

Playwright 元素等待超时(毫秒)

NAUKRI_API_TIMEOUT

30

aiohttp REST API 超时(秒)

NAUKRI_MAX_TABS

3

PagePool 中最大并发浏览器标签页数

数据文件位置

所有数据文件都位于项目根目录,且已被 gitignore。

文件

说明

chrome-profile/

Playwright 持久化浏览器配置文件。与机器绑定,切勿提交。

applications.json

本地职位申请跟踪。由 applybatch_applysync 写入。

saved_jobs.json

本地保存/收藏职位。由 saved_jobssync 写入。

questions.json

筛选问题答案缓存。执行申请时自动生成,用于批处理自动答题。

*.backup

在任何 JSON 文件写入前自动备份(原子写入:先写入 .tmp,备份现有文件,再重命名)。


可靠性特性

  • 全局 aiohttp 会话 -- 所有 REST 调用共享一个会话,避免连接开销

  • API 层去重 -- 通过 @api_tool 修饰的 _api_request 统一所有 REST 交互

  • 刷新锁 -- 单写者 JWT 刷新,避免并发的 401 风暴

  • 启动验证 -- 在接收工具调用前验证浏览器和令牌状态

  • 批量申请取消安全 -- 即使批量操作被中断,也会保留部分完成的进度

  • 数据备份 -- 每次 JSON 覆盖前创建 .backup 文件

  • 缓存 TTL 自动清理 -- 过期答案缓存条目自动失效

  • 原子写入 -- 同步状态通过临时文件 + 重命名写入,避免文件损坏

  • Profile TTL 缓存 -- 资料数据缓存 30 秒,减少重复 API 调用


已知限制

Akamai CDN 拦截

Naukri 使用 Akamai Bot Manager。当直接通过 REST 调用且没有浏览器会话时,几个端点会返回 406 Not Acceptable403 Forbidden

  • 搜索 (naukri_search_jobs) -- 始终使用浏览器拦截;直接 REST 被拦截

  • 资料变更 (naukri_update_profile()) -- PUT/DELETE 被 Akamai 阻止;改用葡萄串浏览器自动化

  • 职位提醒 -- CRUD 操作出于同样原因走浏览器 UI 自动化

这是预期行为。需要浏览器与 UI 交互的工具都已相应做过说明。如果你看到本应使用 REST 的工具返回 406 错误,请用 naukri_auth_status() 检查登录状态——过期的令牌会导致 Akamai 将请求归类为僵尸流量。

AmbitionBox 爬取

AmbitionBox 是一个 Next.js SSR 网站。薪资和评论工具会从服务端渲染的页面中提取 __NEXT_DATA__ 数据。如果 AmbitionBox 改变页面结构,这些工具可能返回错误。naukri_health_check 包含 AmbitionBox 检查;那里出现“warn”状态是周期性正常的,且不影响 Naukri 核心功能。


故障排查

问题

解决方法

“Not logged in” 错误

会话已过期(约 30 天)。调用 naukri_login(method="google") 重新认证。

搜索返回空 / 406

对直接 REST 调用来说是预期行为。naukri_search_jobs 使用浏览器拦截,应该可以正常工作。若失败,可运行 naukri_health_check

慢连接超时

调高 NAUKRI_NAV_TIMEOUT(例如 30000)和 NAUKRI_API_TIMEOUT(例如 60)。

速率限制 / 每日申请上限

Naukri 根据账号类型限制每日申请数。申请响应中的 daily_applied 字段显示你的已用数。Naukri 360 订阅用户拥有更高上限。

浏览器页面崩溃

PagePool 会在下一次 acquire() 时自动恢复崩溃的页面。若持续崩溃,请重启服务器。

令牌刷新死循环

删除 chrome-profile/ 并从零开始重新登录。

naukri_sync 三个层级全部失败

通常意味着会话无效。先登录。如果已登录,可传 force_browser=True 跳过 REST 层。

AmbitionBox 薪资/评论失效

运行 naukri_health_check 确认。如果 AmbitionBox 显示“warn”,核心 Naukri 工具不受影响。

健康检查

运行 naukri_health_check() 一次性验证所有集成。它会测试登录会话、资料 API、搜索 API(此处 406 属正常)、推荐、仪表盘、浏览器池活性,以及 AmbitionBox 爬取。

该函数返回 {summary: {ok: N, warn: N, fail: N}, checks: [...]} 并附带每个检查的耗时。


远程访问

在长期运行的服务器上运行服务,并从任何位置(例如协作环境中的 Web Claude、移动端等)进行连接。支持两种认证模式,且它们可以在同一服务器上同时运行。

快速决策

客户端

认证方式

原因

Claude Code CLI

Bearer (MCP_SHARED_SECRET)

claude mcp add --transport http ... --header "Authorization: Bearer ..." 直接可用

Claude Desktop

Bearer (MCP_SHARED_SECRET)

支持 claude_desktop_config.json 中的 headers 配置

Claude.ai 网页

OAuth (MCP_OAUTH_ENABLED=1)

Web UI 仅暴露 OAuth client_id/client_secret 字段,不暴露 token

二者同时

Bearer + OAuth(同时设置两个环境变量)

同一个服务器上,OAuth 提供方的 load_access_token 会回退到共享密钥

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

Step 2 — 配置 .env

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

Step 3 — 公网主机名(推荐 Cloudflare Tunnel)

Cloudflare Tunnel 为您提供一个稳定的公共 HTTPS URL,无需开放防火墙端口。免费方案,不限带宽。

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

编辑 %USERPROFILE%\.cloudflared\config.yml

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

运行隧道:cloudflared tunnel run naukri-mcp(或使用 cloudflared service install 实现开机自启)。

备选方案:Tailscale Funnel(点对点,对受信任设备延迟更低)或 ngrok(更简单,但免费版有限制)。

步骤 4 — 启动服务器

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

python naukri.py --http

日志应显示 Auth: OAuth provider enabled (issuer=https://naukri.<your-domain>, bearer-fallback=yes)HTTP mode: 0.0.0.0:8321

步骤 5 — 连接客户端

Claude Code CLI(使用 Bearer):

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

Claude Desktop(使用 Bearer):

claude_desktop_config.json 中:

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

Claude.ai 网页版(使用 OAuth):

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 需要一个有界面(headed)的 Chrome 会话,因此主机必须保持开机并处于登录状态。

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

Behavior

Result

锁屏

Chrome 保持运行,MCP 正常工作

注销

Chrome 退出,MCP 失败 — 请保持用户会话处于活动状态

RDP 断开

进程在主机上继续运行,MCP 正常工作

系统休眠

Chrome 会恢复,但进行中的调用失败 — 请保留禁用休眠

手动使用 Chrome

Windows 上的 Chrome 无法使用不同的 --user-data-dir 同时运行两个实例。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 体验

1 跳过授权页面(默认),0 显示 /oauth/consent 页面的 Approve/Deny 页

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