수동으로 복사하여 붙여넣을 필요 없이 AI 클라이언트가 9개의 주요 ATS 플랫폼에서 구조화된 채용 공고를 직접 가져오고 읽을 수 있도록 합니다.
다른 이름 prPMDev/jd-intel, jd-intel
- 스타
- 1
- Tools
- 3
- 다운로드, 30일
- —
- 최신 버전
- 0.13.0
- 마지막 커밋
- 2026년 11월 7일
- 라이선스
- MIT
jd-intel MCP란?
jd-intel은(는) MCP server입니다. 수동으로 복사하여 붙여넣을 필요 없이 AI 클라이언트가 9개의 주요 ATS 플랫폼에서 구조화된 채용 공고를 직접 가져오고 읽을 수 있도록 합니다. 3개 도구를 제공합니다. 예: fetch_jobs, search_registry, detect_ats.
프로젝트 README에서 생성된 요약
jd-intel MCP server 정보
jd-intel-mcp를 사용하면 AI 클라이언트가 Greenhouse, Lever, Ashby, Workday를 포함한 9개의 주요 채용 관리 시스템(ATS)에서 구조화된 채용 공고를 직접 가져올 수 있습니다. 텍스트를 수동으로 복사하여 붙여넣는 대신, 사용자는 AI에게 특정 기업이나 산업 분야의 원시 데이터를 가져오도록 지시할 수 있습니다. 이 도구는 급여, 근무 형태, 부서와 같이 정규화된 정보를 제공하여 데이터 전송 과정에서 중요한 세부 정보가 누락되지 않도록 보장합니다.
이 서버는 로컬 머신에서 실행되며 Claude Desktop, Claude Code, Cursor, Windsurf, VS Code와 같은 MCP 지원 클라이언트와 함께 작동합니다. 대부분의 클라이언트에는 Node.js 18 이상의 버전이 필요하지만, Claude Desktop 사용자는 더 간편한 설정을 위해 원클릭 .mcpb 확장을 사용할 수 있습니다. 공개 API를 기반으로 하므로 서비스를 사용하는 데 API 키나 계정이 필요하지 않습니다. 데스크톱 환경을 위해 설계되었으며 모바일 애플리케이션에서는 사용할 수 없습니다.
활용 사례
- 1자동 채용 공고 탐색AI에게 특정 기간 내에 게시된 특정 엔지니어링 또는 디자인 직무를 찾아달라고 요청하세요.
- 2이력서 맞춤화가져온 채용 공고를 활용하여 AI 어시스턴트가 사용자의 경력을 여러 채용 공고에 맞춰 조정하도록 하세요.
- 3산업 분야 조사산업 전체를 스캔하여 여러 기업의 채용 중인 포지션을 동시에 식별하세요.
프로젝트의 README를 바탕으로 작성되었습니다. 모든 활용 사례는 해당 내용의 인용문과 대조하여 확인합니다.
jd-intel MCP 설치 방법
형식 확인: 2026년 11월 10일Claude Code에 jd-intel MCP 설치
$ claude mcp add jd-intel -- npx -y jd-intel-mcpCursor에 jd-intel MCP 설치
~/.cursor/mcp.json
{
"mcpServers": {
"jd-intel": {
"command": "npx",
"args": [
"-y",
"jd-intel-mcp"
]
}
}
}VS Code에 jd-intel MCP 설치
.vscode/mcp.json
{
"servers": {
"jd-intel": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"jd-intel-mcp"
]
}
}
}Claude Desktop에 jd-intel MCP 설치
claude_desktop_config.json
{
"mcpServers": {
"jd-intel": {
"command": "npx",
"args": [
"-y",
"jd-intel-mcp"
]
}
}
}Codex에 jd-intel MCP 설치
~/.codex/config.toml
[mcp_servers.jd-intel] command = "npx" args = ["-y", "jd-intel-mcp"]
Gemini CLI에 jd-intel MCP 설치
~/.gemini/settings.json
{
"mcpServers": {
"jd-intel": {
"command": "npx",
"args": [
"-y",
"jd-intel-mcp"
]
}
}
}jd-intel MCP 도구 3
README에서 감지됨fetch_jobssearch_registrydetect_ats
| fetch_jobs | — | |
| search_registry | — | |
| detect_ats | — |
자동 검사
2026년 11월 13일에 실행됨전체 보고서 →자동 검사를 통과했습니다. 이는 보안 감사가 아닙니다. 코드를 직접 읽고 서버에 필요한 최소한의 권한만 부여하십시오. 검사 방식
- 소스 저장소 연결 및 접근 가능prpmdev/jd-intel is public and reachablegithub.com/prpmdev/jd-intel ↗통과
- 패키지가 이 저장소를 소스로 지정jd-intel-mcp names prpmdev/jd-intel as sourcenpmjs.com/package/jd-intel-mcp ↗통과
- 빌드 출처(Sigstore 증명)No build attestation published for this release검사되지 않음
- 오픈 소스 라이선스 (OSI)MITspdx.org/licenses/MIT.html ↗통과
- 최근 1년 내 커밋 또는 릴리스Last commit or release 2026-11-07github.com/prpmdev/jd-intel ↗통과
- OpenSSF Scorecard검사되지 않음
- 패키지 이름이 인기 패키지와 유사하지 않음No popular package one edit away from jd-intel-mcp통과
- 패키지와 의존성에 심각한 보안 권고 없음100 resolved dependencies checked; no critical advisoryosv.dev ↗통과
- 모델에 대한 숨겨진 지침 없음3 tool descriptions and the README read; no override phrases, credential paths or hidden characters통과
- 파괴적인 도구에 라벨 표시됨No tool named like delete, drop or exec통과
- 원격 endpoint가 MCP 핸드셰이크에 응답검사되지 않음
README
GitHub에서 보기jd-intel
Stop pasting job descriptions into AI assistants. Let your AI fetch them directly.
Full text. Clean structure. Across nine major ATS. No copy-paste. No context loss.
Why this exists
Your AI assistant already knows a lot about you. Your resume is in its memory. Your target roles, your past projects, your background. Ready to help the moment you feed it a job description.
So you copy-paste.
A JD from one company. Another from the next. A half-dozen more from your target list. Half have broken HTML. Salary info dies in translation. Links get stripped. And for every role, the dance starts over.
You could wait for the job boards to ship their own MCPs. They'll get there eventually. On their timeline. Filtered through their priorities, not yours. Tied to their query abstractions.
jd-intel skips that wait. Raw JDs, fetched directly by your AI, on your terms. One level below the curated layer.
Try asking your AI:
"Find AI/ML engineering jobs posted this week." "What product designer roles are open at fintechs right now?" "Pull the staff PM roles posted in the last 7 days."
Done.
Why not just scrape?
Because scraping breaks where jd-intel doesn't:
- Full JDs when browsing fails. SPA-rendered boards, slow loads, auth walls, and geo-restrictions block a browser. They don't block a public API call.
- Structured data, not HTML soup. Salary, location type, department, and clean markdown, normalized across nine ATS.
- No keys, no browser. Public APIs only. Runs anywhere your AI does.
- One schema, every platform. Greenhouse, Lever, Ashby, SmartRecruiters, Teamtailor, Recruitee, Personio, Workable, Workday return the same shape.
What you can do with it
- Look up open roles at any company directly from your AI, no copy-paste
- Tailor your resume across ten roles in one conversation
- Rank openings by fit with your background
- Scan a whole sector: "Pull open roles at fintech companies posted this week"
- Research teams by reading their JDs in bulk
The toolkit fetches. Your AI thinks.
Install
Works with MCP-aware AI clients: Claude Desktop, Claude Code, Cursor, Windsurf, VS Code. ChatGPT, Gemini, and other non-MCP clients don't support this yet. They use different tool-calling systems. (We wish they did. The protocol works the same way regardless of which AI you talk to.)
Everything runs locally on your machine. That also means desktop only: mobile apps can't run a local MCP server, so jd-intel isn't available on phones or tablets.
Claude Desktop (one-file install, no terminal)
The simplest path. No Node.js, no terminal: Claude Desktop runs the server on its own bundled runtime.
- Download the extension: jd-intel.mcpb.
- In Claude Desktop, open Settings, then Extensions, then Advanced settings, and click Install Extension. Pick the file you downloaded.
- Review the access summary, click Install, then start a new chat. The tools appear automatically.
Shortcuts: drag the .mcpb onto the Settings window, or double-click it when your system opens .mcpb files with Claude Desktop. The extension is open source and unsigned, so Claude Desktop shows an "unverified" notice. Choose Install Anyway.
Prefer the terminal, or on an older Claude Desktop? Install Node.js 18+, run npx jd-intel-mcp install, then reopen Claude Desktop. Or edit the config file directly, see Manual install.
Other clients (Claude Code, Cursor, Windsurf, VS Code)
One-file .mcpb install is a Claude Desktop feature; these clients run the same server via npx and need Node.js 18+.
Claude Code
claude mcp add jd-intel -- npx -y jd-intel-mcp
Cursor (Settings, then Tools & MCP, then New MCP Server, or edit ~/.cursor/mcp.json):
{
"mcpServers": {
"jd-intel": { "command": "npx", "args": ["-y", "jd-intel-mcp"] }
}
}
Windsurf (Settings, then Tools, then Windsurf Settings, then Add Server, or View Raw Config to edit mcp_config.json). Use the same mcpServers block as Cursor, then press refresh.
VS Code (Copilot agent mode): run the MCP: Add Server command, or create .vscode/mcp.json. The key is servers and the type is stdio:
{
"servers": {
"jd-intel": { "type": "stdio", "command": "npx", "args": ["-y", "jd-intel-mcp"] }
}
}
Confirm it's working
Start a new chat and ask: "What fintech companies are in your jd-intel registry?" If it lists companies, you're set. Then try the real thing: "Find senior PM roles open right now that I'd be a fit for."
Tools not appearing?
- Fully quit and reopen the client (quit, do not just close the window). Claude Desktop: system tray then Quit (Windows), or ⌘Q (macOS).
- For npx clients (Claude Code, Cursor, Windsurf, VS Code), run
npx clear-npx-cache, then restart. - Confirm
node --versionis 18 or newer for the npx paths. The one-click.mcpbdoes not need Node.
For developers
npm install jd-intel
import { fetchJobs } from 'jd-intel';
const jobs = await fetchJobs({
company: '<your-target-company>',
titleFilter: 'designer',
postedWithinDays: 14,
limit: 50,
});
Results come back newest first by postedAt, undated last (order: 'board' keeps the ATS's own order). fetchJobs returns the page as an array. fetchJobsDetailed returns the same page plus total_matched, the number of matches before offset and limit, so you can tell a small board from a cut and page through the rest:
import { fetchJobsDetailed } from 'jd-intel';
const { jobs, total_matched } = await fetchJobsDetailed({
company: '<your-target-company>',
titleFilter: 'engineer',
limit: 20,
offset: 20, // second page
});
The same result says how the company was resolved and which boards answered:
match:registry(a known company, one adapter call),probe(not in the registry, every adapter asked) orworkday_override(an explicit Workday config).company:{ key, name }from the registry row on a registry match, null otherwise.boards: one entry per board that answered,{ ats, slug, name, site, board_url, org_name, org_url, jobs_found, matched, selected, scan }.jobs_foundcounts the rows the board listed before any filter. Workday and SmartRecruiters filter their list before fetching details, so for them it is the list count, not the rows that came back (a lower bound when the list scan caps).matchedis the rows left after filters and beforeoffsetandlimit, so a board whose rows were all cut from the page still shows up.board_urlis built from the slug.org_nameandorg_urlare what the board states about itself, the organization name in the ATS response and the careers or company host its links point at, and they are null where the platform exposes nothing (Lever and Ashby expose neither); nothing is filled in from the slug or the registry name. Aprobematch is a slug match, not a confirmed identity: compareorg_nameandorg_urlwith the company you meant, and openboard_urlwhen they are null, before treating the jobs as that company's.failed: adapters that threw during discovery,{ ats, slug, name, code, message }, withcodeeitherrate_limitedorats_unreachable. When no board answered and a check failed,fetchJobsthrows that error instead of returning[], so an outage never reads as "not found".total_before_filters: the sum ofjobs_found. Zero matches with a positivetotal_before_filtersmeans the company is hiring and nothing passed the filters, on every ATS.
detectAtsDetailed(company) returns { boards, failed }: registry rows first (source: 'registry', never probed), then every live probe that answered (source: 'probe'), in platform order; failed lists the probes that could not be checked, with the same codes. detectAts keeps returning [{ ats, slug }].
A call the library cannot make throws ArgumentError (code: 'invalid_args'): no company, an unknown ats, or a titleFilter or filter that does not compile as a regex. It is thrown before any request goes out.
CLI usage: npx jd-intel fetch <company-slug> --title-filter "engineer" --posted-within-days 14. Full filter reference below.
Each ATS request gives the server 10 seconds to start responding. A 429, a 5xx or a network error is retried up to three attempts with backoff (1s, 2s), honoring Retry-After when the ATS sends one, and at most 4 requests run at a time per host. A failure that outlasts the retries throws an AtsError whose code is rate_limited or ats_unreachable.
Node.js 18+. No API keys. No configuration.
Manual install (fallback)
If npx jd-intel-mcp install fails, edit the config directly.
Config file location:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"jd-intel": {
"command": "npx",
"args": ["-y", "jd-intel-mcp"]
}
}
}
Restart Claude Desktop.
Updating
- Claude Desktop extension (
.mcpb): install a newer.mcpbover the current one, or manage it in Settings, then Extensions. Remove and reinstall to reset. - npx clients (Claude Code, Cursor, Windsurf, VS Code):
npx -y jd-intel-mcppicks up new versions from npm's cache (within ~24h). Force it now withnpx clear-npx-cache, then restart the client. - Library or CLI:
npm install jd-intel@latest(force latest) ornpm update jd-intel(respect semver).
The company registry refreshes on its own: jd-intel fetches the current list at startup and falls back to the bundled copy offline, so new companies show up without reinstalling.
MCP tools
| Tool | Purpose |
|---|---|
fetch_jobs |
Get open roles at a company with filters for role type, topic, location, and recency |
search_registry |
Find companies by name or sector |
detect_ats |
Identify which ATS platform a company uses |
Plus one Resource: registry://jd-intel/all. Full company registry, grouped by ATS. Fetched lazily for broad catalog surveys.
What you get back
Every job normalizes to one schema, across every platform:
{
"id": "a1b2c3d4e5f6",
"company": "Example Co",
"title": "Senior Software Engineer, Platform",
"department": "Engineering",
"location": "Remote - US",
"locations": ["Remote - US", "Toronto, Canada"],
"locationType": "remote",
"workplace": { "type": "remote", "source": "ats" },
"salary": { "min": 180000, "max": 240000, "currency": "USD", "period": "year", "source": "text" },
"description": "Design and build the API surface our customers integrate against...",
"url": "https://boards.example.com/jobs/12345",
"postedAt": "2026-04-10T14:30:00Z"
}
No custom parsing per company.
Data model
| Field | Description |
|---|---|
title |
Full job title |
company |
Normalized company name |
department |
Team or department (when provided) |
location |
Primary location: city, state, country, or remote |
locations |
Every location the posting is open in, primary first. The location filters check each entry |
locationType |
remote, hybrid, onsite, or unknown when neither the platform nor the location text says |
workplace |
{ type, source }. type repeats locationType; source is ats when the platform stated it, text when read from the location string, null when unknown |
salary |
Min-max range with currency, plus period (year, month, hour, or null) and source (ats when the platform supplied it, text when parsed from the posting). Null when nothing is stated |
description |
Full JD in clean markdown. Empty when content.status is missing |
content |
{ status, reason }. complete when the posting was read. missing when Workday or SmartRecruiters listed the job but its detail request failed (reason: http_503, http_429, network_error), so description and salary are unknown |
url |
Direct link to the posting |
postedAt |
Publication date (when provided) |
Platforms supported
| Platform | Status | Typical use |
|---|---|---|
| Greenhouse | Shipped | Most widely used ATS in tech |
| Ashby | Shipped | Growing fast with startups |
| Lever | Shipped | Common at mid-stage companies |
| SmartRecruiters | Shipped | Enterprise and mid-market |
| Teamtailor | Shipped | European startups and scale-ups |
| Recruitee | Shipped | Dutch / EU SMBs and scale-ups |
| Personio | Shipped | German / EU mid-market |
| Workable | Shipped | SMBs worldwide |
| Workday | Shipped | Large enterprises (registry-keyed) |
Adding a new ATS is a single adapter file. See Contributing.
Filters (quick reference)
| Flag | What it matches | Use for |
|---|---|---|
--title-filter |
Title only | Role identity (PM, engineer, designer) |
--filter |
Title + department + description | Topic or scope (integrations, growth) |
--posted-within-days |
Recent postings | Recency cuts |
--location-include |
Location contains any keyword | Region targeting |
--location-exclude |
Location contains no keyword | Drop geographic noise |
--limit |
First N results | Cap output size |
All filters AND together. Deep dive on patterns and gotchas: docs/filters.md.
Roadmap
Shipped
- Library, CLI, and MCP server (three surfaces of one toolkit)
- Greenhouse, Ashby, Lever, SmartRecruiters, Teamtailor, Recruitee, Personio, Workable, Workday adapters
- Title, topic, location, and date filters
- Salary extraction from JD text
- Verified company registry (1,100+ companies)
Next
- Anthropic MCP marketplace submission
Planned
- Temporal tracking (when roles open, close, reopen)
- Change detection
- Resume-aware fit scoring
Contributing
Full details in CONTRIBUTING.md. The short version:
Add companies to the registry: don't hand-edit registry/*.json. Stage your candidates in tmp/candidates.json, then run the live gate, which calls every board for real and keeps only the ones returning live jobs:
node scripts/verify-registry.mjs --candidates tmp/candidates.json --limit 50
node scripts/append-registry.mjs
npm run sync:registry-pages
node --test test/*.test.js
Entries that haven't passed the gate can't be merged. A board that looks right but returns nothing fails silently inside someone's search, which is worse than the company simply being absent. Workday needs a config of {tenant, env, site} read off the company's real careers URL, never constructed by pattern. CONTRIBUTING.md covers how to find and confirm those.
Add an ATS adapter: new file in src/adapters/. One adapter, one file. Follow the pattern of the existing adapters.
Request a company: open an issue. Tell me who's missing. That's a useful contribution on its own.
Built by
Prashant R. PM who builds. I try out and build what really matters below the AI hype.
- Portfolio and writing: prashantrana.xyz
License
MIT
jd-intel MCP 질문
jd-intel MCP를 Claude Code에 추가하려면 어떻게 하나요?
터미널에서 claude mcp add jd-intel -- npx -y jd-intel-mcp를 실행합니다. 모든 프로젝트에서 사용할 수 있게 하려면 --scope user를 추가합니다.
jd-intel MCP를 Cursor에 추가하려면 어떻게 하나요?
~/.cursor/mcp.json를 열고 mcpServers 아래에 서버를 추가합니다. 위 설치 섹션에 표시된 Cursor 구성을 사용합니다.
jd-intel MCP는 어떤 도구를 제공하나요?
3개 도구를 제공합니다. 예: fetch_jobs, search_registry, detect_ats.
어떤 ATS 플랫폼을 지원하나요?
Greenhouse, Lever, Ashby, SmartRecruiters, Teamtailor, Recruitee, Personio, Workable, Workday를 포함한 9개의 주요 플랫폼을 지원합니다.
사용하려면 API 키가 필요한가요?
아니요, 공개 API만 사용하므로 별도의 설정이나 키가 필요하지 않습니다.
모바일에서도 사용할 수 있나요?
아니요, 서버가 로컬 머신에서 실행되므로 데스크톱 클라이언트에서만 사용할 수 있습니다.
어떤 AI 클라이언트와 호환되나요?
Claude Desktop, Claude Code, Cursor, Windsurf, VS Code와 같은 MCP 지원 클라이언트에서 작동합니다.