jd-mcp
JD-PULL · Сбор JD · Анализ · MCP-инструмент
Открытый инструмент сбора вакансий JD + анализа по правилам + портрета должностей + MCP-сервер. Любой может склонировать его локально, собрать и проанализировать собственные данные и через MCP (Model Context Protocol) предоставить данные любому внешнему ИИ, поддерживающему MCP: Claude / DeepSeek agent / Pi agent / Cursor и другим.
┌──────────────────────────┐ ┌──────────────────────────┐
│ 外部 AI(任何 MCP 客户端) │ ───► │ 本机 jd-mcp 服务器 │
│ Claude / DeepSeek / Pi │ MCP │ ┌────────────────────┐ │
│ / Cursor … │ │ │ 只读查询 · 写操作 │ │
└──────────────────────────┘ │ └────────┬───────────┘ │
└──────────┼───────────────┘
│ 读写
┌──────────▼───────────────┐
│ 你的数据目录(JD_DATA_DIR)│
│ 本地文件夹 或 私有 git 仓库 │
└──────────────────────────┘Результаты сбора хранятся только в вашей локальной директории data/ или в указанном вами хранилище данных.
Возможности
Сбор JD: 51job (Playwright с реальным браузером, по умолчанию системный Edge) — вежливый сбор с низкой частотой; для Boss直聘 / 拉勾 / 猎聘 зарезервированы интерфейсы (требуют входа/подписи, в этой версии не реализованы);
Анализ по правилам: классификация JD по категориям на основе словарей, извлечение частотных слов навыков и обязанностей;
LLM-анализ (опционально, несколько провайдеров): шесть провайдеров — Claude / OpenAI / Gemini / DeepSeek / Qwen / Ollama, автоматическая адаптация структурированного вывода каждого из них через «лестницу возможностей»;
Портрет должностей: генерация отчётов по распределению навыков / зарплат / опыта / образования и частотным словам обязанностей по категориям (JSON + Markdown);
MCP-сервер: два транспорта — stdio и streamable-http; инструменты только для чтения доступны всегда, инструменты записи включены по умолчанию (отключаются флагом
--no-write-tools), для HTTP опциональна аутентификация по Bearer token;Данные полностью локальны:
JD_DATA_DIRможет указывать на любую директорию или git-репозиторий; если директория данных не является отдельным git-репозиторием,syncавтоматически пропускается, что защищает данные от случайной публикации.
Related MCP server: MCP Job Search Server
Технологический стек
Категория | Технология |
Язык | Python ≥ 3.10 |
Сбор | httpx + BeautifulSoup4 (статический парсинг); Playwright с реальным браузером (SPA 51job, по умолчанию системный Edge |
Анализ | jieba для сегментации + классификация по словарям правил; LLM-анализ через anthropic SDK / httpx с адаптацией под разных провайдеров |
Данные | Локальное хранение в JSON-файлах; дедупликация по отпечаткам ( |
Вывод | Статический HTML-сайт отчётов (встроенный CSS, без зависимостей от фронтенд-фреймворков) |
MCP |
|
Конфигурация | YAML (PyYAML), сайты/словари/LLM полностью настраиваются без изменения кода |
Тесты | pytest (51 тест) |
Сайты | 51job (включён); Boss直聘 / 拉勾 / 猎聘 (зарезервированы, не реализованы) |
Установка
Требуется Python ≥ 3.10.
git clone https://github.com/NaoYUN77/JD-PULL.git
cd JD-PULL
python -m venv .venv && .venv\Scripts\activate # Windows;macOS/Linux 用 source .venv/bin/activate
pip install -e .[dev]
# 51job 爬取走真实浏览器(默认系统 Edge,无需额外下载 chromium)
# 若想用捆绑 chromium:删除 config/settings.yaml 中 crawl.browser.channel 一行后
# playwright install chromiumБыстрый старт (сначала получите данные)
На сайтах вакансий повсеместно действует антибот-защита. Соблюдайте низкую частоту, используйте реальный браузер, собирайте только то, что действительно нужно; при блокировке немедленно прекращайте, не пытайтесь обойти защиту.
# 1) 生成样本 JD(验证全链路;51job 被 WAF 拦截时用)
jdcollector seed
# 2) 真实爬取(按 config/sites.yaml 的关键词/城市;51job 需本机有 Edge 且有头窗口)
jdcollector crawl
# 3) 规则分析(可选加 LLM 精分,见下文「LLM 多供应商精分」)
jdcollector analyze
# 4) 岗位群像报告
jdcollector portrait
# 5) 静态 HTML 报告站(输出到数据目录 site/)
jdcollector viewДанные по умолчанию записываются в data/ в корне репозитория (исключено через .gitignore, в репозиторий не попадает).
Использование в качестве MCP-сервера
После запуска внешний ИИ сможет обращаться к вашим данным через MCP.
# stdio(默认,给本地桌面客户端用)
jd-mcp
# 只读模式(只暴露查询,不暴露爬取/分析等写工具)
jd-mcp --no-write-tools
# HTTP(streamable-http,给远程客户端 / 其它进程用,可带 Bearer token)
jd-mcp --transport http --host 0.0.0.0 --port 8000 --token 你的tokenClaude Desktop
Отредактируйте claude_desktop_config.json:
{
"mcpServers": {
"jdcollector": {
"command": "jd-mcp",
"args": ["--transport", "stdio"]
}
}
}Claude Code
claude mcp add jdcollector -- jd-mcp --transport stdio
claude mcp list # 验证已连接Cursor
Settings → MCP → + Add global MCP server, в поле command укажите:
jd-mcp --transport stdioОбзор MCP-инструментов
Тип | Инструмент | Описание |
Только чтение |
| Сводная статистика данных (всего / количество по категориям) |
Только чтение |
| Список категорий должностей и количество образцов в каждой |
Только чтение |
| Поиск JD по ключевым словам / категории / городу / компании (возвращает заголовок, зарплату, навыки и т.д.) |
Только чтение |
| Полная запись одного JD по job_id |
Только чтение |
| Отчёт-портрет категории (JSON) |
Только чтение |
| Отчёт-портрет категории (Markdown) |
Запись |
| Локальный сбор JD (требуется Playwright / браузер); возвращает структурированный результат |
Запись |
| Анализ по правилам (опционально с LLM-анализом) |
Запись |
| Генерация отчётов-портретов по категориям |
Запись |
| Генерация статического HTML-сайта отчётов |
Запись |
| Коммит / push директории данных в её git-репозиторий |
Также зарегистрированы ресурсы только для чтения: jd://stats, jd://portrait/{category}.
HTTP-развёртывание и аутентификация
jd-mcp --transport http --host 0.0.0.0 --port 8000 --token 你的token
# 环境变量亦可:JD_MCP_TRANSPORT / JD_MCP_HOST / JD_MCP_PORT / JD_MCP_TOKENКлиент подключается к http://127.0.0.1:8000/mcp, в заголовке запроса — Authorization: Bearer ваш_токен.
В production рекомендуется размещать за обратным прокси (Nginx / Caddy) с включённым TLS; не открывайте незашифрованный порт напрямую в интернет.
Директория данных и синхронизация с git
Корневая директория данных задаётся переменной окружения JD_DATA_DIR, по умолчанию <корень_репозитория>/data (в gitignored):
Переменная окружения | Назначение |
| Корневая директория данных; может быть обычной папкой или отдельным git-репозиторием |
| Переопределяет URL целевого репозитория для sync/push (если не указано, используется |
| Встроенный токен для HTTPS, используется только для текущего push (не записывается в конфигурацию git) |
Логика определения в sync_data / jdcollector sync:
Директория данных не является git-репозиторием → только локальное сохранение, git пропускается;
Директория данных вложена в другой репозиторий (например,
./dataвнутри репозитория инструмента) → git пропускается, чтобы данные не попали в публичный репозиторий;Директория данных — отдельный git-репозиторий →
add→commit→pull --rebase→push.
Пример: данные в приватном GitHub-репозитории
set JD_DATA_DIR=D:\jd-data
cd D:\jd-data && git init && git remote add origin git@github.com:you/jd-data.git
# 推送时可用
set JD_GIT_TOKEN=ghp_xxxLLM-анализ с несколькими провайдерами
Секция llm: в config/settings.yaml:
llm:
enabled: true # 关闭即纯规则分析
provider: deepseek # 选供应商Провайдер |
| Переменная окружения | Модель по умолчанию | Уровень возможностей |
Anthropic Claude |
|
|
| L3 строгая схема |
OpenAI |
|
|
| L3 строгая схема |
Google Gemini |
|
|
| L3 строгая схема |
DeepSeek |
|
|
| L2 JSON-режим |
通义千问 |
|
|
| L2 JSON-режим |
Ollama (локально) |
| нет |
| L2 JSON-режим |
Лестница возможностей: единая абстракция LlmClient, автоматический выбор формы структурированного вывода по возможностям провайдера — L3 использует нативные строгие режимы схем (Claude output_config / OpenAI response_format.json_schema / Gemini response_schema), L2 — JSON-режим (DeepSeek / Qwen response_format.json_object, Ollama format:"json"), L1 — чистый prompt как запасной вариант; при сбое текущего уровня происходит автоматический переход на уровень ниже. Вывод единообразно валидируется через Pydantic; при отсутствии / некорректности выполняется одна повторная попытка с сообщением об ошибке, при повторном сбое — возврат к результатам правил, без прерывания процесса.
При provider: claude верхнеуровневые model / api_key_env по-прежнему переопределяют настройки для обратной совместимости; для остальных провайдеров настраивайте в llm.providers.<name> (значения полей см. в комментариях в файле).
Структура проекта
config/ # YAML 配置:settings / sites / categories / skills
src/jdcollector/
crawler/ # 各站点爬虫
analysis/ # 规则分类 + llm_client 能力梯子 + llm 精分
portrait/ # 岗位群像报告
view/ # 静态 HTML 报告站
mcp_server.py # MCP 服务器(工具注册 + CLI 入口)
sync_github.py # 数据目录 git 同步(独立仓库保护)
tests/ # pytest 单元测试Отказ от ответственности (Disclaimer)
⚠️ Перед использованием этого проекта обязательно ознакомьтесь со следующими условиями.
Ограничение назначения: проект предназначен только для личного обучения, анализа данных и технического обмена; не является коммерческим использованием и не служит основанием для решений о трудоустройстве / найме.
Данные предоставляет и несёт за них ответственность пользователь: сбор происходит на вашей собственной машине, вся ответственность за соответствие данных требованиям законодательства лежит на пользователе. Соблюдайте условия обслуживания целевых сайтов и robots.txt, а также местные законы и нормативные акты (например, «Закон о защите персональной информации», «Закон о безопасности данных», «Закон о противодействии недобросовестной конкуренции»).
Границы сбора: собираются только публичные страницы; не собираются данные, требующие входа, и непубличная персональная информация; не взламываются капчи, не обходится WAF / блокировки, не используются прокси-пулы или массовый сбор, не допускается какое-либо вмешательство в нормальную работу целевых сайтов. При блокировке немедленно прекращайте, никогда не эскалируйте методы противодействия.
Точность данных: содержимое JD — публичная информация сайтов, может быть устаревшей или неточной; автор не гарантирует её достоверность, полноту и пригодность; встроенные образцы данных
seedпредназначены только для проверки полного конвейера и не представляют реальную информацию о вакансиях.Вывод ИИ — только для справки: LLM-анализ / выводы портретов генерируются сторонними моделями и могут содержать отклонения; используйте после ручной проверки.
Риск на свой страх: проект предоставляется по лицензии MIT License; автор не несёт ответственности за любые прямые или косвенные убытки, утечки данных или юридические риски, возникшие при использовании проекта.
License
MIT © 2026 NaoYun777
This server cannot be deployed
Maintenance
Related MCP Connectors
JobsPipe — data pipeline of every job posting on the web. Search live, normalized job postings from 30+ ATS feeds and job boards for AI agents via MCP.
MCP for 8,700+ current AI jobs. 13 tools: search, match, salaries, companies, commerce quotes.
CareerProof MCP gives AI agents direct access to a professional-grade career and workforce intelligence platform. Two namespaces: atlas_* for HR/TA teams (candidate evaluation, batch shortlisting, competency scoring, interview generation, JD analysis, custom eval frameworks, research reports) and ceevee_* for professionals (CV optimization, career positioning, salary intelligence, market reports). Backed by RAG knowledge from 50+ premium research sources (McKinsey, BCG, HBR, Gartner, WEF)
Jobs, ads, SEO, keywords, YouTube and AliExpress data for AI agents. Runs on Apify.
Related MCP Servers
- AlicenseAqualityCmaintenanceEnables searching over 1 million enriched job listings from 20,000+ companies directly from MCP-compatible AI tools. Provides tools for job search, company profiles, and AI-powered similar job recommendations with real-time data updates.476 npm2MIT
- FlicenseNot gradedqualityDmaintenanceEnables AI agents to scrape job offers and filter them based on user-defined criteria, using MCP resources, prompts, and tools.-

trackly-cliofficial
AlicenseNot gradedqualityBmaintenanceMCP server for job search and application tracking, enabling AI agents to search jobs, get details, manage applications, and find contacts across 128K+ jobs and 1,900+ companies.849 npm3MIT- AlicenseNot gradedqualityBmaintenanceEnables AI clients to serve as a personal career analyst by searching, matching, and explaining job recommendations, managing job applications, and syncing public job boards through standardized MCP tools.MIT