Skip to main content
Glama

JD-PULL · JD 爬取 · 分析 · MCP 工具

Python 3.10+ License: MIT MCP Tests

Ein Open-Source-Tool für JD-Crawling + Regelanalyse + Stellenprofile + MCP-Server. Jeder kann es lokal klonen, eigene Daten crawlen und analysieren und die Daten über MCP (Model Context Protocol) an jede MCP-fähige externe KI wie Claude / DeepSeek agent / Pi agent / Cursor usw. bereitstellen.

┌──────────────────────────┐      ┌──────────────────────────┐
│  外部 AI(任何 MCP 客户端) │ ───► │  本机 jd-mcp 服务器        │
│  Claude / DeepSeek / Pi  │  MCP  │  ┌────────────────────┐  │
│  / Cursor …              │       │  │ 只读查询 · 写操作     │  │
└──────────────────────────┘       │  └────────┬───────────┘  │
                                    └──────────┼───────────────┘
                                               │ 读写
                                    ┌──────────▼───────────────┐
                                    │  你的数据目录(JD_DATA_DIR)│
                                    │  本地文件夹 或 私有 git 仓库 │
                                    └──────────────────────────┘

Die Crawl-Ergebnisse existieren nur in deinem lokalen data/-Verzeichnis oder in einem von dir selbst festgelegten Daten-Repository.

Funktionen

  • JD-Crawling: 51job (Playwright mit echtem Browser, standardmäßig systemeigenes Edge) mit niedriger Frequenz und höflichem Abruf; Boss直聘 / 拉勾 / 猎聘 reservierte Schnittstellen (Login/Signatur erforderlich, in dieser Version nicht implementiert);

  • Regelanalyse: Einordnung von JDs in Stellenkategorien anhand von Klassifikationswörterbüchern, Extraktion von häufigen Skill- und Verantwortungsbegriffen;

  • LLM-Feinanalyse (optional, Multi-Anbieter): Claude / OpenAI / Gemini / DeepSeek / Qwen / Ollama – sechs Anbieter, automatische Anpassung an die strukturierte Ausgabe der jeweiligen Anbieter über eine „Fähigkeitsleiter";

  • Stellenprofile: Generierung von Skill-/Gehalts-/Erfahrungs-/Bildungsverteilungen und Berichten zu häufigen Verantwortungsbegriffen pro Kategorie (JSON + Markdown);

  • MCP-Server: stdio- und streamable-http-Dualtransport, schreibgeschützte Abfragetools immer verfügbar, Schreib-Tools standardmäßig aktiviert (--no-write-tools deaktiviert), HTTP optional mit Bearer-Token-Authentifizierung;

  • Daten vollständig lokal: JD_DATA_DIR kann auf ein beliebiges Verzeichnis oder Git-Repository zeigen; wenn das Datenverzeichnis kein eigenständiges Git-Repository ist, wird sync automatisch übersprungen, um zu verhindern, dass Daten versehentlich committet werden.

Related MCP server: MCP Job Search Server

Technologie-Stack

Kategorie

Technologie

Sprache

Python ≥ 3.10

Crawling

httpx + BeautifulSoup4 (statisches Parsing); Playwright mit echtem Browser (51job SPA, standardmäßig systemeigenes Edge channel=msedge, kein Chromium-Download erforderlich)

Analyse

jieba-Tokenisierung + Regelwörterbuch-Klassifikation; LLM-Feinanalyse über anthropic SDK / httpx Multi-Anbieter-Adapter

Daten

Lokale JSON-Dateispeicherung; Fingerabdruck-Deduplizierung (dedup); Verzeichnisstruktur raw → classified → reports → site

Ausgabe

Statische HTML-Berichtsseite (Inline-CSS, keine Frontend-Framework-Abhängigkeit)

MCP

mcp>=1.26 (FastMCP) · stdio + streamable-http Dualtransport · Pydantic v2 Datenvalidierung

Konfiguration

YAML (PyYAML), Sites/Wörterbücher/LLM vollständig konfigurierbar ohne Codeänderung

Tests

pytest (51 Testfälle)

Sites

51job (aktuell aktiviert); Boss直聘 / 拉勾 / 猎聘 (reserviert, nicht implementiert)

Installation

Erfordert 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

Schnellstart (erst Daten haben)

Jobbörsen haben üblicherweise Anti-Crawling-Schutzmaßnahmen. Bitte halte die Frequenz niedrig, verwende einen echten Browser und crawle nur nach tatsächlichem Bedarf; stoppe, wenn du blockiert wirst, und versuche nicht, die Schutzmaßnahmen zu umgehen.

# 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

Daten werden standardmäßig im Repository-Stammverzeichnis data/ geschrieben (durch .gitignore ausgeschlossen, wird nicht ins Repository committet).

Verwendung als MCP-Server

Nach dem Start kann externe KI über MCP auf deine Daten zugreifen.

# 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 你的token

Claude Desktop

Bearbeite 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 ausfüllen:

jd-mcp --transport stdio

MCP-Toolübersicht

Typ

Tool

Beschreibung

Schreibgeschützt

get_stats

Datenzusammenfassung (Gesamtzahl / Kategoriezählung)

Schreibgeschützt

list_categories

Stellenkategorien und deren Stichprobenanzahl auflisten

Schreibgeschützt

search_jobs

JDs nach Schlüsselwort / Kategorie / Stadt / Unternehmen durchsuchen (gibt Titel, Gehalt, Skills usw. zurück)

Schreibgeschützt

get_job

Einzelnen vollständigen JD-Datensatz per job_id abrufen

Schreibgeschützt

get_portrait

Profilbericht einer Kategorie (JSON)

Schreibgeschützt

get_portrait_markdown

Profilbericht einer Kategorie (Markdown)

Schreiben

crawl_jobs

Lokal JDs crawlen (erfordert Playwright / Browser); gibt strukturiertes Ergebnis {added, elapsed_s, per_site, warnings} zurück, Übergabe von _meta.progressToken ermöglicht Empfang von Fortschrittsbenachrichtigungen pro Aufgabe

Schreiben

run_analysis

Regelanalyse (optional mit LLM-Feinanalyse)

Schreiben

run_portrait

Profilberichte für alle Kategorien generieren

Schreiben

build_site

Statische HTML-Berichtsseite generieren

Schreiben

sync_data

Datenverzeichnis in dessen Git-Repository committen / pushen

Zusätzlich registrierte schreibgeschützte Resources: jd://stats, jd://portrait/{category}.

HTTP-Bereitstellung und Authentifizierung

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

Client verbindet sich mit http://127.0.0.1:8000/mcp, Request-Header mit Authorization: Bearer deinToken. Für die Produktion empfiehlt sich die Bereitstellung hinter einem Reverse-Proxy (Nginx / Caddy) mit aktiviertem TLS; den öffentlichen Klartext-Port nicht direkt freigeben.

Datenverzeichnis und Git-Synchronisierung

Das Datenwurzelverzeichnis wird über die Umgebungsvariable JD_DATA_DIR festgelegt, Standard: <Repository-Stamm>/data (gitignored):

Umgebungsvariable

Funktion

JD_DATA_DIR

Datenwurzelverzeichnis; kann ein normaler Ordner oder ein eigenständiges Git-Repository sein

JD_DATA_REPO

Überschreibt die Ziel-Repository-URL für sync/push (wenn nicht angegeben, wird origin des Daten-Repositories verwendet)

JD_GIT_TOKEN

HTTPS-eingebettetes Token, nur für diesen push verwendet (wird nicht in die Git-Konfiguration geschrieben)

Logik von sync_data / jdcollector sync:

  • Datenverzeichnis kein Git-Repository → nur lokal speichern, Git überspringen;

  • Datenverzeichnis in einem anderen Repository eingebettet (z. B. ./data im Tool-Repository selbst) → Git überspringen, um zu verhindern, dass Daten in ein öffentliches Repository committet werden;

  • Datenverzeichnis ist ein eigenständiges Git-Repositoryaddcommitpull --rebasepush.

Beispiel: Daten in privatem GitHub-Repository

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_xxx

LLM-Multi-Anbieter-Feinanalyse

llm:-Abschnitt in config/settings.yaml:

llm:
  enabled: true        # 关闭即纯规则分析
  provider: deepseek   # 选供应商

Anbieter

provider

Umgebungsvariable

Standardmodell

Fähigkeitsstufe

Anthropic Claude

claude

ANTHROPIC_API_KEY

claude-sonnet-5

L3 Schema strikt

OpenAI

openai

OPENAI_API_KEY

gpt-4o

L3 Schema strikt

Google Gemini

gemini

GEMINI_API_KEY

gemini-2.5-flash

L3 Schema strikt

DeepSeek

deepseek

DEEPSEEK_API_KEY

deepseek-chat

L2 JSON-Modus

通义千问

qwen

DASHSCOPE_API_KEY

qwen-plus

L2 JSON-Modus

Ollama (lokal)

ollama

keine

qwen2.5:7b

L2 JSON-Modus

Fähigkeitsleiter: Einheitliche LlmClient-Abstraktion, automatische Auswahl der strukturierten Ausgabeform basierend auf den Fähigkeiten des Anbieters – L3 verwendet den nativen Schema-Strict-Modus des jeweiligen Anbieters (Claude output_config / OpenAI response_format.json_schema / Gemini response_schema), L2 verwendet den JSON-Modus (DeepSeek / Qwen response_format.json_object, Ollama format:"json"), L1 reiner Prompt als Fallback; bei Fehlschlag der aktuellen Stufe automatische Herabstufung. Die Ausgabe wird einheitlich über Pydantic validiert, bei fehlenden / ungültigen Werten wird mit Fehlerfeedback einmal wiederholt, bei erneutem Fehlschlag Rückfall auf Regel-Ergebnisse, ohne den Prozess zu unterbrechen.

Bei provider: claude überschreiben die Top-Level-model / api_key_env weiterhin abwärtskompatibel die Voreinstellungen; für andere Anbieter bitte unter llm.providers.<name> konfigurieren (Bedeutung der Felder siehe Kommentare in der Datei).

Projektstruktur

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 单元测试

Haftungsausschluss (Disclaimer)

⚠️ Bitte lies die folgenden Bedingungen vor der Verwendung dieses Projekts sorgfältig.

  1. Nutzungsbeschränkung: Dieses Projekt dient ausschließlich dem persönlichen Lernen, der Datenanalyse und dem technischen Austausch, stellt keine kommerzielle Nutzung dar und ist keine Grundlage für Bewerbungs- / Einstellungsentscheidungen.

  2. Daten werden vom Nutzer selbst bereitgestellt und verantwortet: Das Crawling erfolgt auf deinem eigenen Rechner, die volle Verantwortung für die Datenkonformität liegt beim Nutzer. Bitte beachte die Nutzungsbedingungen und robots.txt der Ziel-Websites sowie die lokalen Gesetze und Vorschriften (z. B. das chinesische Gesetz zum Schutz personenbezogener Informationen, das Datensicherheitsgesetz, das Gesetz gegen unlauteren Wettbewerb).

  3. Crawling-Grenzen: Es werden nur öffentliche Seiten gecrawlt; keine Login-pflichtigen, nicht-öffentlichen personenbezogenen Daten; keine Captchas umgehen, kein WAF / keine Sperren umgehen, keine Proxy-Pools oder massenhafte Erfassung verwenden, den normalen Betrieb der Ziel-Websites in keiner Weise stören. Bei Blockierung sofort stoppen, niemals die Gegenmaßnahmen eskalieren.

  4. Datengenauigkeit: JD-Inhalte sind öffentliche Informationen der Websites, können veraltet oder ungenau sein; der Autor garantiert nicht deren Richtigkeit, Vollständigkeit oder Verwendbarkeit; die integrierten seed-Beispieldaten dienen nur zur Verifizierung der gesamten Kette und stellen keine echten Stelleninformationen dar.

  5. KI-Ausgaben nur als Referenz: LLM-Feinanalyse / Profil-Schlussfolgerungen werden von Drittanbieter-Modellen generiert und können Abweichungen aufweisen; bitte nach manueller Prüfung verwenden.

  6. Risiko auf eigene Verantwortung: Dieses Projekt wird unter der MIT-Lizenz als Open Source bereitgestellt; der Autor übernimmt keine Haftung für direkte oder indirekte Verluste, Datenlecks oder rechtliche Risiken, die durch die Nutzung dieses Projekts entstehen.

License

MIT © 2026 NaoYun777

A
license - permissive license
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

  • A
    license
    A
    quality
    B
    maintenance
    Enables 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.
    4
    73
    2
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables AI agents to scrape job offers and filter them based on user-defined criteria, using MCP resources, prompts, and tools.
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables job search and scraping across multiple job boards (LinkedIn, Indeed, Glassdoor, etc.) with advanced filtering, directly from Claude Desktop or other MCP clients.
    5
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    MCP 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.
    564
    3
    MIT

View all related MCP servers

Related MCP Connectors

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/NaoYUN77/JD-PULL'

If you have feedback or need assistance with the MCP directory API, please join our Discord server