resume-parser-ats 1.2.0 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,272 @@
1
+ # Contributing to Resume Parser
2
+
3
+ First off, thank you for considering contributing! 🎉
4
+
5
+ This project is a resume parsing agent skill, npm CLI tool, and MCP server. Contributions of all kinds are welcome: bug fixes, features, documentation improvements, test cases, and more.
6
+
7
+ ## Table of Contents
8
+
9
+ - [Code of Conduct](#code-of-conduct)
10
+ - [Getting Started](#getting-started)
11
+ - [Development Setup](#development-setup)
12
+ - [Project Structure](#project-structure)
13
+ - [Making Changes](#making-changes)
14
+ - [Running Tests](#running-tests)
15
+ - [Code Style](#code-style)
16
+ - [Commit Messages](#commit-messages)
17
+ - [Pull Requests](#pull-requests)
18
+ - [Reporting Bugs](#reporting-bugs)
19
+ - [Feature Requests](#feature-requests)
20
+
21
+ ## Code of Conduct
22
+
23
+ Be respectful, constructive, and inclusive. We're all here to make resume parsing better for everyone.
24
+
25
+ ## Getting Started
26
+
27
+ 1. **Fork** the repository on GitHub
28
+ 2. **Clone** your fork locally:
29
+ ```bash
30
+ git clone https://github.com/YOUR_USERNAME/resume-parser-skill.git
31
+ cd resume-parser-skill
32
+ ```
33
+ 3. **Install** dependencies:
34
+ ```bash
35
+ npm install
36
+ ```
37
+ 4. **Build** the project:
38
+ ```bash
39
+ npm run build
40
+ ```
41
+
42
+ ## Development Setup
43
+
44
+ ### Prerequisites
45
+
46
+ - **Node.js** >= 18 (tested on 18, 20, 22)
47
+ - **npm** >= 9
48
+
49
+ ### Key Commands
50
+
51
+ | Command | Description |
52
+ |---------|-------------|
53
+ | `npm install` | Install dependencies |
54
+ | `npm run build` | Compile TypeScript to `dist/` |
55
+ | `npm test` | Run all evaluation tests |
56
+ | `npm run lint` | Lint source files |
57
+ | `npm run dev` | Run index.ts directly with ts-node |
58
+ | `npm run mcp` | Start the MCP server locally |
59
+
60
+ ### Verify Everything Works
61
+
62
+ ```bash
63
+ # Build and test
64
+ npm run build && npm test
65
+
66
+ # Verify CLI
67
+ node bin/cli.js --help
68
+
69
+ # Quick parse test
70
+ node bin/cli.js parse "John Doe
71
+ john@example.com
72
+ (555) 123-4567
73
+ Software Engineer"
74
+ ```
75
+
76
+ ## Project Structure
77
+
78
+ ```
79
+ resume-parser-skill/
80
+ ├── resume-parser-ats/ # Agent skill directory (npx skills add)
81
+ │ ├── SKILL.md # Skill manifest & agent instructions
82
+ │ └── references/
83
+ │ └── algorithm.md # Full 4-step algorithm spec
84
+ ├── src/ # TypeScript source code
85
+ │ ├── index.ts # Main entry, exports, fullPipeline()
86
+ │ ├── tools/
87
+ │ │ ├── parse-resume.ts # Step 1-4 parsing engine
88
+ │ │ ├── analyze-resume.ts # ATS scoring & analysis
89
+ │ │ └── suggest-improvements.ts # Suggestion generator
90
+ │ └── prompts/
91
+ │ ├── parser-prompt.ts # Parsing prompt templates
92
+ │ └── insights-prompt.ts # Insights prompt templates
93
+ ├── bin/
94
+ │ └── cli.js # CLI entry point (npx resume-parser-ats)
95
+ ├── mcp-server/
96
+ │ └── server.ts # MCP server implementation
97
+ ├── test/evals/ # Test suites
98
+ │ ├── parse-resume.test.mjs
99
+ │ ├── analyze-resume.test.mjs
100
+ │ └── suggest-improvements.test.mjs
101
+ ├── AGENTS.md # Agent configuration (skills spec)
102
+ ├── package.json
103
+ ├── tsconfig.json
104
+ └── README.md
105
+ ```
106
+
107
+ ## Making Changes
108
+
109
+ ### Branch Naming
110
+
111
+ Use descriptive branch names:
112
+
113
+ ```
114
+ feature/add-bullet-point-parsing
115
+ fix/education-date-extraction
116
+ docs/mcp-setup-guide
117
+ test/strict-mode-edge-cases
118
+ ```
119
+
120
+ ### Code Changes
121
+
122
+ 1. **Create a branch** from `master`:
123
+ ```bash
124
+ git checkout -b feature/your-feature
125
+ ```
126
+
127
+ 2. **Make your changes** — follow the existing code patterns
128
+
129
+ 3. **Update tests** — add or modify tests in `test/evals/`
130
+
131
+ 4. **Update documentation** — if you add a feature, update:
132
+ - `SKILL.md` if it affects agent-facing instructions
133
+ - `README.md` if it affects user-facing docs
134
+ - `references/algorithm.md` if it changes the parsing algorithm
135
+
136
+ 5. **Verify** — build and test:
137
+ ```bash
138
+ npm run build && npm test
139
+ ```
140
+
141
+ ### Important Files to Update
142
+
143
+ | If you change... | Also update |
144
+ |---|---|
145
+ | Parsing logic in `src/tools/parse-resume.ts` | `resume-parser-ats/references/algorithm.md` |
146
+ | Output format of any tool | `resume-parser-ats/SKILL.md` and `README.md` |
147
+ | CLI commands or flags | `bin/cli.js` help text and `README.md` |
148
+ | MCP tool definitions | `mcp-server/server.ts` and `README.md` |
149
+ | Scoring or grading | `resume-parser-ats/SKILL.md` scoring tables |
150
+
151
+ ## Running Tests
152
+
153
+ ```bash
154
+ # Run all 86 tests
155
+ npm test
156
+
157
+ # Run specific test suite
158
+ node --test test/evals/parse-resume.test.mjs
159
+ node --test test/evals/analyze-resume.test.mjs
160
+ node --test test/evals/suggest-improvements.test.mjs
161
+
162
+ # Run a single test with verbose output
163
+ node --test test/evals/parse-resume.test.mjs --test-name-pattern "Step 1"
164
+ ```
165
+
166
+ Tests use Node.js built-in test runner (`node:test`) and assert module (`node:assert/strict`). No additional test framework needed.
167
+
168
+ ### Writing New Tests
169
+
170
+ Add test cases in the appropriate file under `test/evals/`:
171
+
172
+ ```javascript
173
+ import { describe, it } from "node:test";
174
+ import assert from "node:assert/strict";
175
+ import { parseResume } from "../../dist/src/tools/parse-resume.js";
176
+
177
+ describe("My New Feature", () => {
178
+ it("should handle the new case correctly", () => {
179
+ const result = parseResume({ rawText: "..." });
180
+ assert.equal(result.success, true);
181
+ assert.equal(result.data.profile.name, "Expected Name");
182
+ });
183
+ });
184
+ ```
185
+
186
+ ## Code Style
187
+
188
+ - **TypeScript** for all source code (`src/` and `mcp-server/`)
189
+ - **ES modules** with CommonJS compilation output
190
+ - **2-space indentation**
191
+ - Run `npm run lint` before committing — ESLint with TypeScript plugin
192
+
193
+ Key conventions:
194
+ - Use Zod for input validation schemas
195
+ - Always return `{ success: boolean, data: T, metadata: {...} }` format
196
+ - Include `warnings` array in metadata for non-fatal issues
197
+ - Feature scoring uses additive positive and negative scores
198
+
199
+ ## Commit Messages
200
+
201
+ Follow [Conventional Commits](https://www.conventionalcommits.org/):
202
+
203
+ ```
204
+ feat: add bullet-point parsing for experience sections
205
+ fix: handle edge case in date extraction for seasonal dates
206
+ docs: add MCP setup guide for Claude Desktop
207
+ test: add strict mode edge cases for phone parsing
208
+ refactor: simplify section grouping logic
209
+ chore: update dependencies
210
+ ```
211
+
212
+ Prefixes: `feat:`, `fix:`, `docs:`, `test:`, `refactor:`, `perf:`, `chore:`, `ci:`
213
+
214
+ ## Pull Requests
215
+
216
+ 1. **Push** your branch to your fork:
217
+ ```bash
218
+ git push origin feature/your-feature
219
+ ```
220
+
221
+ 2. **Open a Pull Request** against the `master` branch
222
+
223
+ 3. **Describe your changes** — what, why, and how to test
224
+
225
+ 4. **Ensure CI passes** — all tests must pass across Node 18, 20, 22
226
+
227
+ 5. **Respond to review feedback** promptly
228
+
229
+ ### PR Checklist
230
+
231
+ - [ ] Code compiles (`npm run build` succeeds)
232
+ - [ ] All tests pass (`npm test`)
233
+ - [ ] Lint passes (`npm run lint`)
234
+ - [ ] New features have tests
235
+ - [ ] Documentation updated (SKILL.md, README.md, algorithm.md as needed)
236
+ - [ ] Commit messages follow conventional commits format
237
+
238
+ ## Reporting Bugs
239
+
240
+ Open a [GitHub Issue](https://github.com/dhanushk-offl/resume-parser-skill/issues/new) with:
241
+
242
+ 1. **What you did** — exact command or input
243
+ 2. **What happened** — actual output or error
244
+ 3. **What you expected** — desired output
245
+ 4. **Environment** — Node.js version, OS, how you're using it (CLI, library, MCP, skill)
246
+
247
+ ## Feature Requests
248
+
249
+ Open a [GitHub Issue](https://github.com/dhanushk-offl/resume-parser-skill/issues/new) with:
250
+
251
+ 1. **Use case** — what problem does this solve?
252
+ 2. **Proposed solution** — how should it work?
253
+ 3. **Alternatives considered** — other approaches you thought of
254
+ 4. **Which interface** — does this affect the skill, CLI, library, or MCP?
255
+
256
+ ## Release Process
257
+
258
+ Maintainers only:
259
+
260
+ ```bash
261
+ # Bump version
262
+ npm version patch # or minor, major
263
+
264
+ # Push with tags
265
+ git push --follow-tags
266
+
267
+ # CI automatically publishes to npm and creates a GitHub release
268
+ ```
269
+
270
+ ---
271
+
272
+ Thank you for contributing! 💛
package/README.md CHANGED
@@ -1,177 +1,383 @@
1
- # 📄 Resume Parser — Agent Skill
1
+ <div align="center">
2
2
 
3
- <p align="center">
4
- <strong>Deep resume parsing • ATS compatibility scoring • Actionable improvement insights</strong>
5
- </p>
3
+ # 📄 Resume Parser
6
4
 
7
- <p align="center">
8
- Made with ❤️ by <strong>Dhanush Kandhan</strong>
9
- </p>
5
+ **Deep resume parsing • ATS compatibility scoring • Actionable improvement insights**
10
6
 
11
- ---
7
+ An agent skill, CLI tool, npm library, and MCP server that deeply parses resumes using the **OpenResume 4-step algorithm**, extracts structured information (Name, Email, Phone, Education, Work Experience, Skills, Projects), evaluates ATS compatibility, and provides prioritized, actionable suggestions.
8
+
9
+ Made with ❤️ by **Dhanush Kandhan**
10
+
11
+ [![npm version](https://img.shields.io/npm/v/resume-parser-ats.svg)](https://www.npmjs.com/package/resume-parser-ats)
12
+ [![CI](https://github.com/dhanushk-offl/resume-parser-skill/actions/workflows/ci.yml/badge.svg)](https://github.com/dhanushk-offl/resume-parser-skill/actions/workflows/ci.yml)
13
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](./LICENSE)
12
14
 
13
- An **agent skill** that deeply parses resumes using the **OpenResume 4-step algorithm**, extracts structured information (Name, Email, Phone, Education, Work Experience, Skills, Projects), evaluates ATS (Applicant Tracking System) compatibility, and provides prioritized, actionable suggestions to improve your resume.
15
+ </div>
16
+
17
+ ---
14
18
 
15
19
  ## ✨ Features
16
20
 
17
21
  - **🔍 Deep Parsing** — Extracts 10+ fields from raw text or PDF using a feature-scoring engine
18
- - **📊 ATS Scoring** — Grades your resume A+ through F with detailed per-field confidence ratings
22
+ - **📊 ATS Scoring** — Grades your resume A+ through F with per-field confidence ratings
19
23
  - **💡 Smart Suggestions** — Prioritized, categorized fixes (critical → low) with before/after examples
20
- - **🤖 Agent Skill** — Install via `npx skills add` and use directly in your agent
21
- - **🛠️ CLI & MCP Server** — Use interactively from the command line or as an MCP tool
22
- - **⚙️ Configurable Strictness** — Lenient, moderate, or strict ATS evaluation modes
23
- - **🔒 Zero Dependencies on Proprietary APIs** — Runs entirely locally with no external calls
24
+ - **🤖 Agent Skill** — Install via `npx skills add` for pi, Claude Code, Codex, Gemini CLI, and more
25
+ - **🖥️ CLI** — Use directly from the command line
26
+ - **📡 MCP Server** — Plug into Claude Desktop, ChatGPT, and other MCP-compatible apps
27
+ - **📖 Library** — Import as an npm package for programmatic use
28
+ - **⚙️ Configurable** — Lenient, moderate, or strict ATS evaluation modes
29
+ - **🔒 Privacy-first** — Runs entirely locally, no external API calls
24
30
 
25
- ## 📦 Installation
31
+ ---
26
32
 
27
- ### As an Agent Skill (recommended)
33
+ ## 🚀 Quick Start
28
34
 
29
- ```bash
30
- npx skills add dhanushk-offl/resume-parser-skill
31
- ```
35
+ Choose how you want to use Resume Parser:
32
36
 
33
- After installing, the skill is automatically available to your agent. When the agent encounters a resume-related task, it will load the skill and use it.
37
+ | Method | Install | Best for |
38
+ |--------|---------|----------|
39
+ | **Agent Skill** | `npx skills add dhanushk-offl/resume-parser-skill` | AI agents (pi, Claude Code, Codex, Gemini CLI) |
40
+ | **CLI** | `npm install -g resume-parser-ats` | Quick one-off resume analysis |
41
+ | **Library** | `npm install resume-parser-ats` | Building apps, batch processing |
42
+ | **MCP Server** | `npm install resume-parser-ats` | Claude Desktop, ChatGPT, Cursor |
34
43
 
35
- ### Manual Setup
44
+ ---
36
45
 
37
- ```bash
38
- # Clone the repo
39
- git clone https://github.com/dhanushk-offl/resume-parser-skill.git
40
- cd resume-parser-skill
46
+ ## 🤖 1. Agent Skill
41
47
 
42
- # Install dependencies
43
- npm install
48
+ Install as an agent skill for automatic activation in AI coding assistants:
44
49
 
45
- # Build
46
- npm run build
50
+ ```bash
51
+ npx skills add dhanushk-offl/resume-parser-skill
47
52
  ```
48
53
 
49
- ## 🚀 Usage
50
-
51
- ### As an Agent Skill
52
-
53
- Once installed via `npx skills add`, the agent will automatically use this skill when you:
54
+ Once installed, the skill activates automatically when you:
54
55
 
55
56
  - Ask to parse, review, or analyze a resume
56
57
  - Ask "is my resume ATS-friendly?"
57
58
  - Ask for resume improvement suggestions
58
59
  - Upload or reference a resume PDF
59
60
 
60
- The agent can invoke three tools:
61
+ **Works with:** pi, Claude Code, OpenAI Codex, Gemini CLI, Cursor, Continue, and all [Agent Skills](https://agentskills.io) compatible tools.
62
+
63
+ ### What the Agent Gets
61
64
 
62
65
  | Tool | Description |
63
66
  |------|-------------|
64
- | `parse_resume` | Parse a resume PDF or raw text → structured data |
67
+ | `parse_resume` | Parse a resume PDF/text → structured data |
65
68
  | `analyze_resume` | Parse + compute ATS compatibility score with per-field confidence |
66
69
  | `suggest_improvements` | Parse + analyze + generate prioritized improvement suggestions |
67
70
 
68
- ### From the CLI (after manual setup)
71
+ ### Example Agent Prompts
72
+
73
+ ```
74
+ "Is my resume ATS-friendly? Here's the PDF path: ./my-resume.pdf"
75
+ "Parse this resume and extract the contact info"
76
+ "Analyze my resume for ATS compatibility with strict grading"
77
+ "What can I improve on my resume to get past ATS filters?"
78
+ ```
79
+
80
+ ---
81
+
82
+ ## 🖥️ 2. CLI
83
+
84
+ Install globally for command-line use:
85
+
86
+ ```bash
87
+ npm install -g resume-parser-ats
88
+ ```
69
89
 
70
90
  ```bash
71
91
  # Parse a resume and output structured data
72
- node resume-parser-ats/scripts/parse.mjs resume.pdf
92
+ resume-parser-ats parse resume.pdf
73
93
 
74
94
  # Parse + analyze ATS compatibility
75
- node resume-parser-ats/scripts/analyze.mjs resume.pdf
95
+ resume-parser-ats analyze resume.pdf
96
+
97
+ # Full pipeline: parse + analyze + suggestions
98
+ resume-parser-ats insights resume.pdf
76
99
 
77
- # Full pipeline: parse + analyze + actionable suggestions
78
- node resume-parser-ats/scripts/insights.mjs resume.pdf --strictness strict --focus ats,formatting
100
+ # Parse from raw text
101
+ resume-parser-ats parse "John Doe\njohn@email.com\nSoftware Engineer"
102
+
103
+ # Adjust ATS strictness
104
+ resume-parser-ats analyze resume.pdf --strictness strict
105
+
106
+ # Focus on specific areas
107
+ resume-parser-ats insights resume.pdf --focus ats,formatting
108
+
109
+ # Output as JSON
110
+ resume-parser-ats insights resume.pdf --json
111
+ ```
112
+
113
+ Or use without installing:
114
+
115
+ ```bash
116
+ npx resume-parser-ats parse resume.pdf
79
117
  ```
80
118
 
81
- ### As a Library
119
+ ---
120
+
121
+ ## 📖 3. Library (npm Package)
122
+
123
+ Install as a dependency for programmatic use:
124
+
125
+ ```bash
126
+ npm install resume-parser-ats
127
+ ```
82
128
 
83
129
  ```typescript
84
130
  import { parseResume, analyzeResume, suggestImprovements } from "resume-parser-ats";
85
131
 
86
- // Step 1: Parse
87
- const parsed = parseResume({ rawText: "..." });
88
- console.log(parsed.data.profile.name); // "Jane Doe"
89
- console.log(parsed.data.profile.email); // "jane@example.com"
132
+ // Parse extract structured data
133
+ const parsed = parseResume({ filePath: "./resume.pdf" });
134
+ // or: parseResume({ rawText: "John Doe\njohn@email.com\n..." })
135
+
136
+ console.log(parsed.data.profile.name); // "Jane Doe"
137
+ console.log(parsed.data.profile.email); // "jane@example.com"
90
138
  console.log(parsed.data.education[0]?.school); // "MIT"
91
139
 
92
- // Step 2: Analyze ATS compatibility
140
+ // Analyze ATS compatibility scoring
93
141
  const analysis = analyzeResume({
94
- rawText: "...",
142
+ filePath: "./resume.pdf",
95
143
  parsedResume: parsed.data,
96
- strictness: "moderate",
144
+ strictness: "strict",
97
145
  });
146
+
98
147
  console.log(analysis.data.atsScore); // 72
99
148
  console.log(analysis.data.atsGrade); // "B-"
149
+ console.log(analysis.data.fieldAnalyses);
150
+ console.log(analysis.data.formatIssues);
100
151
 
101
- // Step 3: Get improvement suggestions
152
+ // Suggest prioritized improvement recommendations
102
153
  const suggestions = suggestImprovements({
103
- rawText: "...",
154
+ filePath: "./resume.pdf",
104
155
  parsedResume: parsed.data,
105
156
  analysisResult: analysis.data,
106
- focusAreas: ["ats", "content", "formatting", "structure"],
157
+ focusAreas: ["ats", "content", "formatting"],
107
158
  });
108
- console.log(suggestions.data.quickWins); // ["Fix your name format...", ...]
109
- console.log(suggestions.data.suggestions[0].title); // "Name is not parseable by ATS"
159
+
160
+ console.log(suggestions.data.quickWins);
161
+ console.log(suggestions.data.suggestions);
110
162
  ```
111
163
 
112
- ### As an MCP Server
164
+ ### Full Pipeline
113
165
 
114
- ```bash
115
- npm run mcp
166
+ ```typescript
167
+ import { fullPipeline } from "resume-parser-ats";
168
+
169
+ const { parsed, analyzed, suggestions } = fullPipeline({
170
+ filePath: "./resume.pdf",
171
+ strictness: "moderate",
172
+ });
173
+
174
+ console.log(`ATS Score: ${analyzed.data.atsScore}/100 (${analyzed.data.atsGrade})`);
116
175
  ```
117
176
 
118
- Starts a Model Context Protocol server exposing three tools:
177
+ ### TypeScript Types
119
178
 
120
- | Tool | Description |
121
- |------|-------------|
122
- | `parse_resume` | Parse a resume PDF or raw text and return structured data |
123
- | `analyze_resume` | Parse + compute ATS compatibility score with per-field confidence |
124
- | `suggest_improvements` | Parse + analyze + generate prioritized improvement suggestions |
179
+ All types are exported:
180
+
181
+ ```typescript
182
+ import type {
183
+ ParseResumeInput,
184
+ ParseResumeOutput,
185
+ AnalyzeResumeInput,
186
+ AnalyzeResumeOutput,
187
+ SuggestImprovementsInput,
188
+ SuggestImprovementsOutput,
189
+ ParsedResume,
190
+ TextItem,
191
+ LineItem,
192
+ SectionItem,
193
+ } from "resume-parser-ats";
194
+ ```
195
+
196
+ ---
197
+
198
+ ## 📡 4. MCP Server
199
+
200
+ Use Resume Parser as a Model Context Protocol (MCP) server to give AI assistants direct access to the parsing tools.
201
+
202
+ ### Claude Desktop
203
+
204
+ Add to your Claude Desktop config file:
205
+
206
+ **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
207
+ **Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
208
+
209
+ ```json
210
+ {
211
+ "mcpServers": {
212
+ "resume-parser": {
213
+ "command": "npx",
214
+ "args": ["-y", "resume-parser-ats", "--mcp"]
215
+ }
216
+ }
217
+ }
218
+ ```
219
+
220
+ Restart Claude Desktop. You can now ask Claude to parse and analyze resumes:
221
+
222
+ ```
223
+ "Can you analyze my resume for ATS compatibility? The file is at ~/Documents/my-resume.pdf"
224
+ ```
225
+
226
+ ### ChatGPT / Codex (OpenAI)
227
+
228
+ Add to your OpenAI MCP configuration:
229
+
230
+ ```json
231
+ {
232
+ "mcpServers": {
233
+ "resume-parser": {
234
+ "command": "npx",
235
+ "args": ["-y", "resume-parser-ats", "--mcp"]
236
+ }
237
+ }
238
+ }
239
+ ```
240
+
241
+ ### Cursor
242
+
243
+ Add to `~/.cursor/mcp.json`:
244
+
245
+ ```json
246
+ {
247
+ "mcpServers": {
248
+ "resume-parser": {
249
+ "command": "npx",
250
+ "args": ["-y", "resume-parser-ats", "--mcp"]
251
+ }
252
+ }
253
+ }
254
+ ```
255
+
256
+ ### Other MCP-Compatible Apps
257
+
258
+ The server uses stdio transport. For any MCP-compatible application, configure:
259
+
260
+ ```json
261
+ {
262
+ "mcpServers": {
263
+ "resume-parser": {
264
+ "command": "npx",
265
+ "args": ["-y", "resume-parser-ats", "--mcp"]
266
+ }
267
+ }
268
+ }
269
+ ```
270
+
271
+ If you have `resume-parser-ats` installed globally:
272
+
273
+ ```json
274
+ {
275
+ "mcpServers": {
276
+ "resume-parser": {
277
+ "command": "resume-parser-ats",
278
+ "args": ["--mcp"]
279
+ }
280
+ }
281
+ }
282
+ ```
283
+
284
+ ### MCP Tools Available
285
+
286
+ | Tool | Description | Parameters |
287
+ |------|-------------|------------|
288
+ | `parse_resume` | Parse resume PDF/text → structured data | `filePath`, `rawText` |
289
+ | `analyze_resume` | Parse + ATS scoring | `filePath`, `rawText`, `strictness` |
290
+ | `suggest_improvements` | Parse + analyze + suggestions | `filePath`, `rawText`, `focusAreas` |
291
+
292
+ ---
125
293
 
126
294
  ## 🧠 How It Works: The 4-Step Algorithm
127
295
 
128
- The parser follows the **OpenResume algorithm**, a proven methodology used by real ATS systems:
296
+ The parser implements the **OpenResume algorithm**, the same methodology used by real ATS systems:
129
297
 
130
- ### Step 1 — Read Text Items
298
+ ### Step 1 — Read Text Items from PDF
131
299
 
132
- Extracts all text items from the resume, including:
133
- - Text content
134
- - X/Y positions (relative to bottom-left origin)
135
- - Bold metadata
136
- - Newline markers
300
+ Extract every text item with position, bold, and newline metadata:
137
301
 
138
- ### Step 2 — Group Into Lines
302
+ ```typescript
303
+ { text: "John Doe", x1: 72, x2: 144, y: 720, bold: true, newLine: true }
304
+ ```
305
+
306
+ ### Step 2 — Group Text Items into Lines
139
307
 
140
- Merges adjacent text items on the same Y-coordinate when their horizontal distance is less than the average character width. Groups by Y-coordinate to reconstruct the line-by-line reading order.
308
+ Merge adjacent items when their horizontal gap is less than average character width. Group by Y-coordinate to reconstruct the natural reading order.
141
309
 
142
- ### Step 3 — Group Into Sections
310
+ ### Step 3 — Group Lines into Sections
143
311
 
144
- Detects section titles using two heuristics:
312
+ Detect section titles using two heuristics:
145
313
  1. **Primary**: Only text item in line + bold + ALL UPPERCASE
146
- 2. **Fallback**: Keyword match against known headers (EDUCATION, EXPERIENCE, SKILLS, etc.)
314
+ 2. **Fallback**: Keyword match (EDUCATION, EXPERIENCE, SKILLS, etc.)
147
315
 
148
316
  ### Step 4 — Extract Attributes via Feature Scoring
149
317
 
150
- Each attribute (Name, Email, Phone, etc.) has **feature sets** matching functions with positive/negative scores. The text item with the highest total score wins. This is how real ATS systems rank candidates:
318
+ Each attribute has feature sets with scoring functions. The text item with the **highest total score** wins:
319
+
320
+ | Attribute | Core Pattern | Example |
321
+ |-----------|-------------|---------|
322
+ | Name | Only letters/spaces/periods | `John Doe` |
323
+ | Email | Email format | `john@email.com` |
324
+ | Phone | `(xxx) xxx-xxxx` | `(555) 123-4567` |
325
+ | Location | `City, ST` | `New York, NY` |
326
+ | School | Contains "University" etc. | `MIT` |
327
+ | Degree | Contains "B.S.", "M.A." etc. | `B.S. Computer Science` |
328
+
329
+ **Name scoring example**: Only letters (+3), bolded (+2), uppercase (+2), has @ (-4), has digit (-4)
151
330
 
152
- | Feature (Name) | Score | Feature (Email) | Score |
153
- |---|---|---|---|
154
- | Contains only letters/spaces/periods | +3 | Matches email regex | +4 |
155
- | Is bolded | +2 | Contains @ symbol | +4 |
156
- | Is ALL UPPERCASE | +2 | Looks like a name (no @) | -1 |
157
- | Contains @ (probably email) | -4 | Contains digits (no @) | -2 |
158
- | Contains numbers (probably phone) | -4 | | |
331
+ See [`resume-parser-ats/references/algorithm.md`](resume-parser-ats/references/algorithm.md) for the full specification.
332
+
333
+ ---
334
+
335
+ ## 📊 ATS Compatibility Scoring
336
+
337
+ | Dimension | Weight | What it checks |
338
+ |-----------|--------|---------------|
339
+ | Name extraction | 20 pts | Can the parser identify a full name? |
340
+ | Email extraction | 20 pts | Is there a valid email address? |
341
+ | Phone extraction | 10 pts | Is there a parseable phone number? |
342
+ | Section detection | 15 pts | Are sections properly structured? |
343
+ | Education parsing | 10 pts | Are school, degree, and date parsed? |
344
+ | Experience parsing | 15 pts | Are company, title, and date parsed? |
345
+ | Skills parsing | 10 pts | Are skills extracted correctly? |
346
+
347
+ ### Grading Scale
348
+
349
+ | Grade | Score | Meaning |
350
+ |-------|-------|---------|
351
+ | A+ | 90-100 | Excellent — ATS will parse everything correctly |
352
+ | A | 85-89 | Great — minor issues only |
353
+ | B+ | 80-84 | Good — most fields parse correctly |
354
+ | B | 75-79 | Adequate — some sections need improvement |
355
+ | B- | 70-74 | Below average — multiple parsing issues |
356
+ | C+ | 65-69 | Needs work — significant ATS problems |
357
+ | C | 60-64 | Poor — many fields fail to parse |
358
+ | D | 50-59 | Bad — critical fields missing |
359
+ | F | 0-49 | Failing — unrecognizable as a resume |
360
+
361
+ ### Issue Severity Levels
362
+
363
+ - 🔴 **CRITICAL** — Name or email cannot be parsed (ATS will discard)
364
+ - 🟠 **HIGH** — Sections missing, dates unparseable, phone not found
365
+ - 🟡 **MEDIUM** — Skills not clean, formatting merge issues
366
+ - 🟢 **LOW** — Minor inconsistencies, optional fields missing
367
+
368
+ ---
159
369
 
160
370
  ## 📊 Use Cases
161
371
 
162
- ### 1. 🎯 Job Seeker — ATS Optimization
372
+ ### 🎯 Job Seeker — ATS Optimization
163
373
 
164
- > *Before applying to jobs, run your resume through the parser to see what an ATS actually extracts.*
374
+ Before applying, see what an ATS actually extracts:
165
375
 
166
376
  ```bash
167
- node resume-parser-ats/scripts/insights.mjs my-resume.pdf --strictness strict
377
+ resume-parser-ats insights my-resume.pdf --strictness strict --json
168
378
  ```
169
379
 
170
- Identify critical issues like a missing email, unparseable name, or sections an ATS can't detect and fix them *before* you apply.
171
-
172
- ### 2. 🏢 Recruiter — Bulk Resume Screening
173
-
174
- > *Programmatically parse and score hundreds of resumes to rank candidates by ATS readability.*
380
+ ### 🏢 RecruiterBulk Resume Screening
175
381
 
176
382
  ```typescript
177
383
  import { parseResume, analyzeResume } from "resume-parser-ats";
@@ -180,110 +386,106 @@ import fs from "fs";
180
386
  const files = fs.readdirSync("resumes/");
181
387
  for (const file of files) {
182
388
  const parsed = parseResume({ filePath: `resumes/${file}` });
183
- const analysis = analyzeResume({
184
- filePath: `resumes/${file}`,
185
- parsedResume: parsed.data,
186
- strictness: "moderate",
187
- });
188
- console.log(`${file}: ATS Score ${analysis.data.atsScore}/100 (${analysis.data.atsGrade})`);
389
+ const analysis = analyzeResume({ parsedResume: parsed.data, strictness: "moderate" });
390
+ console.log(`${file}: ${analysis.data.atsScore}/100 (${analysis.data.atsGrade})`);
189
391
  }
190
392
  ```
191
393
 
192
- ### 3. 🤖 Agent Integration AI-Powered Resume Coach
394
+ ### 📈 Career Platform — Resume Health Dashboard
193
395
 
194
- > *Embed the skill into an AI agent that reviews resumes and gives personalized coaching.*
195
-
196
- ```typescript
197
- import { fullPipeline } from "resume-parser-ats";
198
-
199
- const result = fullPipeline({ rawText: resumeText, strictness: "strict" });
200
-
201
- // Feed to an LLM for natural-language coaching
202
- const prompt = `You are a resume coach. Here is the analysis:
203
- ${JSON.stringify(result.analyzed.data)}
204
- Suggest improvements in a friendly, encouraging tone.`;
205
- ```
396
+ Parse on upload store ATS score visualize suggest improvements track progress.
206
397
 
207
- ### 4. 📈 Career PlatformResume Health Dashboard
398
+ ### 🎓 University Career CenterStudent Reviews
208
399
 
209
- > *Show users a "resume health score" on your career platform dashboard.*
400
+ Batch-parse resumes, flag common issues, generate improvement templates.
210
401
 
211
- - Parse on upload → store `atsScore`, `atsGrade`, and `fieldAnalyses`
212
- - Display a visual dashboard with color-coded field ratings
213
- - Surface `quickWins` as a checklist
214
- - Track score improvements over time as users update their resumes
215
-
216
- ### 5. 🎓 University Career Center — Student Resume Reviews
217
-
218
- > *Automate initial resume screening for career centers at scale.*
219
-
220
- - Batch-parse student resumes and generate summary reports
221
- - Flag common issues (missing dates, non-standard section headers)
222
- - Provide standardized improvement templates
402
+ ---
223
403
 
224
404
  ## 🏗️ Architecture
225
405
 
226
406
  ```
227
407
  resume-parser-skill/
228
- ├── resume-parser-ats/ # Agent skill directory
408
+ ├── resume-parser-ats/ # Agent skill (npx skills add)
229
409
  │ ├── SKILL.md # Skill manifest & instructions
230
- ├── scripts/ # Executable scripts for agent use
231
- │ │ ├── parse.mjs # Parse a resume → JSON
232
- │ │ ├── analyze.mjs # Parse + ATS scoring → JSON
233
- │ │ └── insights.mjs # Full pipeline → JSON
234
- │ └── references/ # Detailed docs loaded on-demand
410
+ └── references/
235
411
  │ └── algorithm.md # Full algorithm specification
236
412
  ├── src/ # TypeScript source
237
- │ ├── index.ts # Main entry point + fullPipeline()
413
+ │ ├── index.ts # Exports + fullPipeline()
238
414
  │ ├── tools/
239
- │ │ ├── parse-resume.ts
240
- │ │ ├── analyze-resume.ts
241
- │ │ └── suggest-improvements.ts
415
+ │ │ ├── parse-resume.ts # Step 1-4 parsing engine
416
+ │ │ ├── analyze-resume.ts # ATS scoring & analysis
417
+ │ │ └── suggest-improvements.ts # Suggestion generator
242
418
  │ └── prompts/
243
- │ ├── parser-prompt.ts
244
- │ └── insights-prompt.ts
419
+ │ ├── parser-prompt.ts # Parsing prompt templates
420
+ │ └── insights-prompt.ts # Insights prompt templates
245
421
  ├── bin/
246
- │ └── cli.js # CLI entry point
422
+ │ └── cli.js # CLI entry point
247
423
  ├── mcp-server/
248
- │ └── server.ts # MCP server implementation
249
- ├── test/
250
- │ └── evals/ # Evaluation test suites
251
- ├── AGENTS.md # Agent configuration
424
+ │ └── server.ts # MCP server implementation
425
+ ├── test/evals/ # Test suites (86 tests)
426
+ ├── AGENTS.md # Agent configuration
427
+ ├── CONTRIBUTING.md # Contributing guide
252
428
  ├── package.json
253
- └── README.md
429
+ └── tsconfig.json
254
430
  ```
255
431
 
432
+ ---
433
+
256
434
  ## 🧪 Testing
257
435
 
258
436
  ```bash
259
- # Run all tests
437
+ # Run all 86 tests
260
438
  npm test
261
- ```
262
439
 
263
- 86 tests covering parsing, analysis, and suggestion generation across all strictness levels.
440
+ # Run a specific suite
441
+ node --test test/evals/parse-resume.test.mjs
442
+ node --test test/evals/analyze-resume.test.mjs
443
+ node --test test/evals/suggest-improvements.test.mjs
264
444
 
265
- ## 🤝 Contributing
445
+ # Filter by test name
446
+ node --test test/evals/parse-resume.test.mjs --test-name-pattern "Step 1"
447
+ ```
266
448
 
267
- 1. Fork the repository
268
- 2. Create a feature branch (`git checkout -b feature/amazing-feature`)
269
- 3. Commit your changes (`git commit -m 'Add amazing feature'`)
270
- 4. Push to the branch (`git push origin feature/amazing-feature`)
271
- 5. Open a Pull Request
449
+ ---
272
450
 
273
451
  ## ☁️ CI/CD
274
452
 
275
453
  | Workflow | Trigger | What it does |
276
454
  |----------|---------|-------------|
277
- | **Build & Test** | Push/PR to `master` | Lint, build, and test across Node 18/20/22 |
455
+ | **Build & Test** | Push/PR to `master` | Lint, build, and test across Node 18, 20, 22 |
278
456
  | **Publish to npm** | Tag push `v*` | Builds and publishes to npmjs with provenance |
279
457
 
458
+ To publish a new version:
459
+
460
+ ```bash
461
+ npm version patch # or minor, major
462
+ git push --follow-tags
463
+ ```
464
+
465
+ ---
466
+
467
+ ## 🤝 Contributing
468
+
469
+ See [CONTRIBUTING.md](./CONTRIBUTING.md) for:
470
+
471
+ - Development setup
472
+ - Project structure guide
473
+ - Code style and testing conventions
474
+ - Commit message format
475
+ - Pull request checklist
476
+
477
+ ---
478
+
280
479
  ## 📄 License
281
480
 
282
481
  MIT License — Copyright (c) 2025 **Dhanush Kandhan**. See [LICENSE](./LICENSE) for details.
283
482
 
284
483
  ---
285
484
 
286
- <p align="center">
287
- Made with ❤️ by <strong>Dhanush Kandhan</strong><br>
288
- <em>If this project helped you, consider giving it a ⭐ on GitHub!</em>
289
- </p>
485
+ <div align="center">
486
+
487
+ Made with ❤️ by **Dhanush Kandhan**
488
+
489
+ If this project helped you, consider giving it a ⭐ on [GitHub](https://github.com/dhanushk-offl/resume-parser-skill)!
490
+
491
+ </div>
package/bin/cli.js CHANGED
@@ -7,6 +7,7 @@
7
7
  * resume-parser-ats parse <file|text> Parse a resume and output structured data
8
8
  * resume-parser-ats analyze <file|text> Parse + analyze ATS compatibility
9
9
  * resume-parser-ats insights <file|text> Full pipeline: parse + analyze + suggestions
10
+ * resume-parser-ats --mcp Start MCP server for Claude/ChatGPT/Cursor
10
11
  */
11
12
 
12
13
  const path = require("path");
@@ -35,6 +36,7 @@ Options:
35
36
  --strictness <level> ATS strictness: lenient, moderate, strict (default: moderate)
36
37
  --focus <areas> Focus areas: ats,content,formatting,structure (default: all)
37
38
  --json Output raw JSON instead of formatted report
39
+ --mcp Start MCP server (for Claude Desktop, ChatGPT, Cursor, etc.)
38
40
  --help Show this help message
39
41
 
40
42
  Examples:
@@ -42,12 +44,37 @@ Examples:
42
44
  resume-parser-ats analyze resume.pdf --strictness strict
43
45
  resume-parser-ats insights resume.pdf --focus ats,formatting --json
44
46
  resume-parser-ats parse "John Doe\\njohn@email.com\\nSoftware Engineer"
47
+
48
+ MCP Server:
49
+ resume-parser-ats --mcp
50
+
51
+ Add to Claude Desktop config:
52
+ {
53
+ "mcpServers": {
54
+ "resume-parser": {
55
+ "command": "npx",
56
+ "args": ["-y", "resume-parser-ats", "--mcp"]
57
+ }
58
+ }
59
+ }
45
60
  `);
46
61
  }
47
62
 
48
63
  function main() {
49
64
  const args = process.argv.slice(2);
50
65
 
66
+ // Handle --mcp flag: start MCP server
67
+ if (args.includes("--mcp")) {
68
+ try {
69
+ require("../dist/mcp-server/server.js");
70
+ } catch (err) {
71
+ console.error("Error: MCP server not built. Run `npm run build` first.");
72
+ console.error(err.message);
73
+ process.exit(1);
74
+ }
75
+ return;
76
+ }
77
+
51
78
  if (args.length === 0 || args.includes("--help") || args.includes("-h")) {
52
79
  printUsage();
53
80
  process.exit(0);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "resume-parser-ats",
3
- "version": "1.2.0",
3
+ "version": "1.2.1",
4
4
  "description": "An agent skill that deeply parses resumes, extracts structured data, and provides actionable insights to improve ATS compatibility and readability.",
5
5
  "main": "dist/src/index.js",
6
6
  "types": "dist/src/index.d.ts",
@@ -20,7 +20,8 @@
20
20
  "bin/",
21
21
  "resume-parser-ats/",
22
22
  "README.md",
23
- "LICENSE"
23
+ "LICENSE",
24
+ "CONTRIBUTING.md"
24
25
  ],
25
26
  "keywords": [
26
27
  "resume",
@@ -193,11 +193,26 @@ Always provide results in this structured format:
193
193
 
194
194
  ## Programmatic Access
195
195
 
196
- For batch processing or integration, install the npm package:
196
+ ### As an npm Library
197
197
 
198
198
  ```bash
199
199
  npm install resume-parser-ats
200
- npx resume-parser-ats parse resume.pdf
201
- npx resume-parser-ats analyze resume.pdf --strictness strict
202
- npx resume-parser-ats insights resume.pdf --focus ats,formatting --json
203
- ```
200
+ ```
201
+
202
+ ```typescript
203
+ import { parseResume, analyzeResume, suggestImprovements } from "resume-parser-ats";
204
+
205
+ const result = parseResume({ filePath: "resume.pdf" });
206
+ ```
207
+
208
+ ### As an MCP Server
209
+
210
+ Start the MCP server for use with Claude Desktop, ChatGPT, Cursor, and other MCP-compatible apps:
211
+
212
+ ```bash
213
+ resume-parser-ats --mcp
214
+ # or
215
+ npx resume-parser-ats --mcp
216
+ ```
217
+
218
+ See README for full MCP configuration instructions.