Skip to main content
Glama

Naukri MCP Server

CI

一个由 117 个原子化工具组成的 MCP 服务器,用于自动化 Naukri.com(印度最大的求职门户网站)。搜索职位、批量投递、管理个人资料、跟踪投递记录、调研公司、监控招聘方动态——所有操作都可以在 MCP 客户端中完成。专为 Claude Code 的渐进式 Tool Search 加载(自 2026 年 1 月起默认启用)而设计,因此每个工具都是单一用途,可按需发现。

技术栈: Python 3.10+、FastMCP、Playwright(持久化 Chromium)、aiohttp

关键能力:

  • 搜索与投递 -- 关键词搜索、个性化推荐、单次或批量投递,自动回答筛选问题

  • 投递跟踪 -- 本地 JSON 持久化 + 从 Naukri 后端进行 3 层同步(REST、浏览器拦截、HTML 抓取)

  • 个人资料管理 -- 查看/编辑个人资料(naukri_get_profile、naukri_update_profile),提升曝光度(naukri_boost_profile)

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

  • 效果分析 -- naukri_search_impressions、naukri_recruiter_activity、naukri_activity_level

  • 智能自动化 -- naukri_auto_hunt(一键求职并带匹配度评分)、naukri_daily_brief(每日晨间面板)、naukri_tailor_resume、naukri_apply_top_fits(自动投递最佳匹配)


架构

naukri.py                    # Entry point (FastMCP run)
naukri_server/
  __init__.py                # FastMCP setup + lifespan (browser start/stop)
  config.py                  # Constants, API endpoints, timeouts
  browser.py                 # PagePool (3 tabs) + TokenManager (JWT caching)
  api.py                     # Deduplicated _api_request, @api_tool decorator
  cache.py                   # Answer cache for auto-apply screening questions
  scoring.py                 # Alias-aware fit scoring
  validation.py              # Response validators (job lists, profiles, etc.)
  utils.py                   # Shared helpers
  tools/                     # 27 tool modules (117 tools)
    auth.py                  # Login, OTP verification, login status
    search.py                # Job search, recommendations
    jobs.py                  # Job detail, similar, compare, bulk, report fraud
    apply.py                 # Applications: list, detail, apply, batch, purge, stale, follow-up
    tracking.py              # Saved jobs: list, save, unsave, sync
    smart_apply.py           # Smart apply with fit scoring
    auto_hunt.py             # One-call automated job hunting
    profile.py               # Profile CRUD, dashboard, boost, audit
    resume_photo.py          # Resume/photo info, upload, download, delete
    resume_builder.py        # Resume templates, builder status, tailor
    sync.py                  # Sync applications/saved jobs, export
    insights.py              # Application insights, salary, match analytics, skill gap, taxonomy
    performance.py           # Search impressions, recruiter activity
    companies.py             # Company search, jobs, slug, research, follow/unfollow
    ambitionbox.py           # Salary data, reviews, interviews (AmbitionBox)
    inbox.py                 # Recruiter messages, NVites, mark_interested
    notifications.py         # Notification feed, mark read, count, summary
    settings.py              # Account settings, blocked companies, email, visibility, subscription
    alerts.py                # Job alert CRUD
    early_access.py          # Pre-posted roles from top companies
    mock_interview.py        # AI mock interview topics, sessions, history
    reminders.py             # Follow-up reminders
    daily_brief.py           # Morning dashboard summary
    health.py                # Endpoint validation, browser pool, AmbitionBox checks
    debug/                   # Multi-action debug tool (16 actions)

混合浏览器 + REST 策略

Naukri 的 Akamai CDN 会拦截某些端点的直接 REST 调用。因此这台服务器采用混合策略:

策略

使用方

原因

直接 REST API

naukri_apply()、naukri_get_profile()、naukri_get_recommendations、naukri_sync、大多数读取操作

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

浏览器拦截

naukri_search_jobs、naukri_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: JobGPT MCP Server

AI 用户快速入门

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

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


工具(117 个原子化工具)

几乎所有工具都遵循单一用途原子模式——每个操作对应一个 MCP 工具。只有 naukri_company_intel 和 naukri_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.py 和 domain/ 评分模块只是其瘦层再导出。它不在 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

本地职位申请跟踪。由 apply、batch_apply 和 sync 写入。

saved_jobs.json

本地保存/收藏职位。由 saved_jobs 和 sync 写入。

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 Acceptable 或 403 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 页

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

Appeared in Searches